summaryrefslogtreecommitdiff
path: root/benchmark/loop_for.rb
diff options
context:
space:
mode:
Diffstat (limited to 'benchmark/loop_for.rb')
-rw-r--r--benchmark/loop_for.rb3
1 files changed, 3 insertions, 0 deletions
diff --git a/benchmark/loop_for.rb b/benchmark/loop_for.rb
new file mode 100644
index 0000000000..0fc4cc1511
--- /dev/null
+++ b/benchmark/loop_for.rb
@@ -0,0 +1,3 @@
+for i in 1..30_000_000
+ #
+end
stat' width='100%'> -rw-r--r--ChangeLog22583
-rw-r--r--LEGAL75
-rw-r--r--Makefile.in54
-rw-r--r--NEWS487
-rw-r--r--README166
-rw-r--r--README.EXT93
-rw-r--r--README.EXT.ja56
-rw-r--r--README.ja192
-rw-r--r--README.ja.md163
-rw-r--r--README.md161
-rw-r--r--addr2line.c426
-rw-r--r--addr2line.h2
-rw-r--r--array.c434
-rw-r--r--benchmark/bm_app_aobench.rb5
-rw-r--r--benchmark/bm_app_lc_fizzbuzz.rb52
-rw-r--r--benchmark/bm_hash_aref_miss.rb5
-rw-r--r--benchmark/bm_hash_aref_str.rb4
-rw-r--r--benchmark/bm_hash_aref_sym.rb4
-rw-r--r--benchmark/bm_hash_aref_sym_long.rb8
-rw-r--r--benchmark/bm_hash_ident_num.rb4
-rw-r--r--benchmark/bm_hash_ident_obj.rb4
-rw-r--r--benchmark/bm_hash_ident_str.rb4
-rw-r--r--benchmark/bm_hash_ident_sym.rb4
-rw-r--r--benchmark/bm_securerandom.rb5
-rw-r--r--benchmark/bm_so_meteor_contest.rb12
-rw-r--r--benchmark/bm_vm2_newlambda.rb5
-rw-r--r--benchmark/bm_vm_thread_close.rb6
-rw-r--r--benchmark/driver.rb24
-rw-r--r--benchmark/prepare_so_k_nucleotide.rb2
-rw-r--r--benchmark/prepare_so_reverse_complement.rb2
-rw-r--r--bignum.c662
-rwxr-xr-xbin/testrb3
-rwxr-xr-xbootstraptest/runner.rb44
-rw-r--r--bootstraptest/test_fork.rb28
-rw-r--r--bootstraptest/test_io.rb12
-rw-r--r--bootstraptest/test_literal.rb2
-rw-r--r--bootstraptest/test_thread.rb56
-rw-r--r--ccan/build_assert/build_assert.h40
-rw-r--r--ccan/check_type/check_type.h63
-rw-r--r--ccan/container_of/container_of.h142
-rw-r--r--ccan/licenses/BSD-MIT17
-rw-r--r--ccan/licenses/CC028
-rw-r--r--ccan/list/list.h635
-rw-r--r--ccan/str/str.h16
-rw-r--r--class.c169
-rw-r--r--common.mk120
-rw-r--r--compar.c15
-rw-r--r--compile.c335
-rw-r--r--complex.c55
-rw-r--r--configure.in421
-rw-r--r--constant.h7
-rw-r--r--cont.c46
-rw-r--r--coverage/README17
-rw-r--r--debug.c5
-rw-r--r--defs/default_gems3
-rw-r--r--defs/gmake.mk42
-rw-r--r--defs/id.def13
-rw-r--r--defs/opt_operand.def2
-rw-r--r--dir.c150
-rw-r--r--dln.c43
-rw-r--r--dln_find.c11
-rw-r--r--doc/ChangeLog-1.9.32
-rw-r--r--doc/ChangeLog-2.1.018060
-rw-r--r--doc/NEWS-2.0.02
-rw-r--r--doc/NEWS-2.1.0376
-rw-r--r--doc/contributing.rdoc13
-rw-r--r--doc/globals.rdoc1
-rw-r--r--doc/keywords.rdoc158
-rw-r--r--doc/regexp.rdoc9
-rw-r--r--doc/syntax/assignment.rdoc12
-rw-r--r--doc/syntax/literals.rdoc3
-rw-r--r--doc/syntax/methods.rdoc59
-rw-r--r--doc/syntax/refinements.rdoc2
-rw-r--r--enc/big5.c6
-rw-r--r--enc/depend3
-rw-r--r--enc/euc_jp.c45
-rw-r--r--enc/iso_8859_1.c2
-rw-r--r--enc/iso_8859_10.c4
-rw-r--r--enc/iso_8859_13.c4
-rw-r--r--enc/iso_8859_14.c4
-rw-r--r--enc/iso_8859_15.c4
-rw-r--r--enc/iso_8859_16.c4
-rw-r--r--enc/iso_8859_2.c2
-rw-r--r--enc/iso_8859_3.c4
-rw-r--r--enc/iso_8859_4.c4
-rw-r--r--enc/iso_8859_5.c4
-rw-r--r--enc/iso_8859_7.c4
-rw-r--r--enc/iso_8859_9.c4
-rw-r--r--enc/jis/props.h227
-rw-r--r--enc/jis/props.h.blt227
-rw-r--r--enc/jis/props.kwd52
-rw-r--r--enc/jis/props.src52
-rw-r--r--enc/koi8_r.c4
-rw-r--r--enc/koi8_u.c4
-rw-r--r--enc/shift_jis.c45
-rw-r--r--enc/trans/escape.trans6
-rw-r--r--enc/trans/gb18030.trans8
-rw-r--r--enc/unicode.c185
-rwxr-xr-xenc/unicode/case-folding.rb196
-rw-r--r--enc/unicode/casefold.h7831
-rw-r--r--enc/unicode/name2ctype.h9915
-rw-r--r--enc/us_ascii.c6
-rw-r--r--enc/utf_16be.c4
-rw-r--r--enc/utf_16le.c4
-rw-r--r--enc/utf_8.c4
-rw-r--r--enc/windows_1251.c4
-rw-r--r--encoding.c55
-rw-r--r--enum.c479
-rw-r--r--enumerator.c27
-rw-r--r--error.c130
-rw-r--r--eval.c156
-rw-r--r--eval_error.c31
-rw-r--r--eval_intern.h25
-rw-r--r--eval_jump.c1
-rw-r--r--ext/-test-/bignum/bigzero.c5
-rw-r--r--ext/-test-/bignum/intpack.c4
-rw-r--r--ext/-test-/bignum/mul.c4
-rw-r--r--ext/-test-/file/fs.c60
-rw-r--r--ext/-test-/float/depend3
-rw-r--r--ext/-test-/float/extconf.rb7
-rw-r--r--ext/-test-/float/init.c11
-rw-r--r--ext/-test-/float/nextafter.c36
-rw-r--r--ext/-test-/old_thread_select/depend4
-rw-r--r--ext/-test-/old_thread_select/extconf.rb4
-rw-r--r--ext/-test-/old_thread_select/old_thread_select.c75
-rw-r--r--ext/-test-/printf/printf.c4
-rw-r--r--ext/-test-/string/coderange.c21
-rw-r--r--ext/-test-/symbol/extconf.rb1
-rw-r--r--ext/-test-/symbol/init.c7
-rw-r--r--ext/-test-/symbol/intern.c14
-rw-r--r--ext/-test-/symbol/type.c30
-rw-r--r--ext/-test-/win32/console/attribute.c56
-rw-r--r--ext/-test-/win32/console/depend1
-rw-r--r--ext/-test-/win32/console/extconf.rb8
-rw-r--r--ext/-test-/win32/console/init.c11
-rw-r--r--ext/-test-/win32/dln/libdlntest.c2
-rw-r--r--ext/-test-/win32/fd_setsize/depend3
-rw-r--r--ext/.document4
-rw-r--r--ext/Setup.nacl2
-rw-r--r--ext/bigdecimal/bigdecimal.c81
-rw-r--r--ext/bigdecimal/bigdecimal.gemspec2
-rw-r--r--ext/bigdecimal/bigdecimal.h4
-rw-r--r--ext/bigdecimal/depend2
-rw-r--r--ext/bigdecimal/lib/bigdecimal/jacobian.rb2
-rw-r--r--ext/bigdecimal/lib/bigdecimal/math.rb16
-rw-r--r--ext/bigdecimal/sample/linear.rb20
-rw-r--r--ext/bigdecimal/sample/nlsolve.rb21
-rw-r--r--ext/coverage/depend2
-rw-r--r--ext/date/date_core.c29
-rw-r--r--ext/date/date_parse.c6
-rw-r--r--ext/date/date_strptime.c10
-rw-r--r--ext/date/lib/date.rb1
-rw-r--r--ext/date/lib/date/format.rb1
-rw-r--r--ext/dbm/dbm.c19
-rw-r--r--ext/digest/digest.c16
-rw-r--r--ext/digest/digest.h6
-rw-r--r--ext/digest/lib/digest/hmac.rb302
-rw-r--r--ext/digest/md5/md5.c6
-rw-r--r--ext/digest/md5/md5.h4
-rw-r--r--ext/digest/rmd160/rmd160.c6
-rw-r--r--ext/digest/rmd160/rmd160.h4
-rw-r--r--ext/digest/sha1/sha1.c6
-rw-r--r--ext/digest/sha1/sha1.h4
-rw-r--r--ext/digest/sha2/sha2.c24
-rw-r--r--ext/digest/sha2/sha2.h30
-rw-r--r--ext/dl/callback/extconf.rb2
-rw-r--r--ext/dl/dl.c4
-rw-r--r--ext/etc/depend8
-rw-r--r--ext/etc/etc.c272
-rw-r--r--ext/etc/extconf.rb59
-rw-r--r--ext/etc/mkconstants.rb331
-rwxr-xr-xext/extmk.rb60
-rw-r--r--ext/fiddle/fiddle.c4
-rw-r--r--ext/fiddle/function.c45
-rw-r--r--ext/fiddle/lib/fiddle/import.rb2
-rw-r--r--ext/fiddle/pointer.c11
-rw-r--r--ext/gdbm/gdbm.c12
-rw-r--r--ext/io/console/console.c2
-rw-r--r--ext/io/console/io-console.gemspec2
-rw-r--r--ext/io/wait/wait.c2
-rw-r--r--ext/json/fbuffer/fbuffer.h9
-rw-r--r--ext/json/generator/generator.c4
-rw-r--r--ext/nkf/nkf-utf8/nkf.c12
-rw-r--r--ext/objspace/object_tracing.c5
-rw-r--r--ext/objspace/objspace.c2
-rw-r--r--ext/objspace/objspace_dump.c11
-rw-r--r--ext/openssl/depend2
-rw-r--r--ext/openssl/lib/openssl/ssl.rb71
-rw-r--r--ext/openssl/ossl.c27
-rw-r--r--ext/openssl/ossl.h4
-rw-r--r--ext/openssl/ossl_asn1.c4
-rw-r--r--ext/openssl/ossl_bio.c2
-rw-r--r--ext/openssl/ossl_bn.c24
-rw-r--r--ext/openssl/ossl_cipher.c48
-rw-r--r--ext/openssl/ossl_config.c2
-rw-r--r--ext/openssl/ossl_digest.c2
-rw-r--r--ext/openssl/ossl_engine.c17
-rw-r--r--ext/openssl/ossl_hmac.c2
-rw-r--r--ext/openssl/ossl_ocsp.c500
-rw-r--r--ext/openssl/ossl_pkcs7.c16
-rw-r--r--ext/openssl/ossl_ssl.c42
-rw-r--r--ext/openssl/ossl_x509cert.c38
-rw-r--r--ext/openssl/ossl_x509name.c5
-rw-r--r--ext/pathname/extconf.rb1
-rw-r--r--ext/pathname/lib/pathname.rb17
-rw-r--r--ext/pathname/pathname.c21
-rw-r--r--ext/psych/lib/psych.rb6
-rw-r--r--ext/psych/lib/psych/nodes/sequence.rb2
-rw-r--r--ext/psych/lib/psych/scalar_scanner.rb2
-rw-r--r--ext/psych/lib/psych/visitors/to_ruby.rb10
-rw-r--r--ext/psych/lib/psych/visitors/yaml_tree.rb32
-rw-r--r--ext/psych/psych.gemspec10
-rw-r--r--ext/psych/yaml/scanner.c2
-rw-r--r--ext/pty/pty.c5
-rw-r--r--ext/rbconfig/sizeof/extconf.rb1
-rw-r--r--ext/readline/depend1
-rw-r--r--ext/readline/extconf.rb4
-rw-r--r--ext/readline/readline.c8
-rw-r--r--ext/sdbm/_sdbm.c5
-rw-r--r--ext/sdbm/init.c12
-rw-r--r--ext/socket/ancdata.c10
-rw-r--r--ext/socket/basicsocket.c2
-rw-r--r--ext/socket/extconf.rb57
-rw-r--r--ext/socket/getaddrinfo.c1
-rw-r--r--ext/socket/ifaddr.c4
-rw-r--r--ext/socket/init.c67
-rw-r--r--ext/socket/mkconstants.rb59
-rw-r--r--ext/socket/option.c434
-rw-r--r--ext/socket/raddrinfo.c8
-rw-r--r--ext/socket/rubysocket.h22
-rw-r--r--ext/socket/socket.c85
-rw-r--r--ext/socket/udpsocket.c2
-rw-r--r--ext/socket/unixsocket.c17
-rw-r--r--ext/stringio/stringio.c15
-rw-r--r--ext/strscan/strscan.c21
-rw-r--r--ext/syslog/syslog.c6
-rw-r--r--ext/thread/thread.c63
-rw-r--r--ext/tk/README.tcltklib2
-rw-r--r--ext/tk/extconf.rb16
-rw-r--r--ext/tk/lib/multi-tk.rb2
-rw-r--r--ext/tk/lib/tcltk.rb4
-rw-r--r--ext/tk/lib/tkextlib/tcllib/plotchart.rb6
-rw-r--r--ext/tk/lib/tkextlib/tkDND/tkdnd.rb2
-rw-r--r--ext/tk/stubs.c14
-rw-r--r--ext/tk/tcltklib.c170
-rw-r--r--ext/tk/tkutil/extconf.rb7
-rw-r--r--ext/tk/tkutil/tkutil.c62
-rw-r--r--ext/win32ole/depend13
-rw-r--r--ext/win32ole/sample/excel2.rb7
-rw-r--r--ext/win32ole/win32ole.c6007
-rw-r--r--ext/win32ole/win32ole.h161
-rw-r--r--ext/win32ole/win32ole_error.c82
-rw-r--r--ext/win32ole/win32ole_error.h8
-rw-r--r--ext/win32ole/win32ole_event.c1258
-rw-r--r--ext/win32ole/win32ole_event.h6
-rw-r--r--ext/win32ole/win32ole_method.c928
-rw-r--r--ext/win32ole/win32ole_method.h15
-rw-r--r--ext/win32ole/win32ole_param.c418
-rw-r--r--ext/win32ole/win32ole_param.h8
-rw-r--r--ext/win32ole/win32ole_record.c577
-rw-r--r--ext/win32ole/win32ole_record.h10
-rw-r--r--ext/win32ole/win32ole_type.c901
-rw-r--r--ext/win32ole/win32ole_type.h8
-rw-r--r--ext/win32ole/win32ole_typelib.c832
-rw-r--r--ext/win32ole/win32ole_typelib.h11
-rw-r--r--ext/win32ole/win32ole_variable.c366
-rw-r--r--ext/win32ole/win32ole_variable.h8
-rw-r--r--ext/win32ole/win32ole_variant.c707
-rw-r--r--ext/win32ole/win32ole_variant.h13
-rw-r--r--ext/win32ole/win32ole_variant_m.c148
-rw-r--r--ext/win32ole/win32ole_variant_m.h7
-rw-r--r--ext/zlib/zlib.c33
-rw-r--r--file.c201
-rw-r--r--gc.c4427
-rw-r--r--gc.h6
-rw-r--r--gems/bundled_gems3
-rw-r--r--goruby.c6
-rw-r--r--hash.c254
-rw-r--r--include/ruby/backward/rubysig.h5
-rw-r--r--include/ruby/defines.h85
-rw-r--r--include/ruby/encoding.h33
-rw-r--r--include/ruby/intern.h131
-rw-r--r--include/ruby/io.h10
-rw-r--r--include/ruby/missing.h7
-rw-r--r--include/ruby/oniguruma.h52
-rw-r--r--include/ruby/ruby.h260
-rw-r--r--include/ruby/st.h3
-rw-r--r--include/ruby/thread_native.h56
-rw-r--r--include/ruby/util.h7
-rw-r--r--include/ruby/version.h2
-rw-r--r--include/ruby/win32.h8
-rw-r--r--inits.c2
-rw-r--r--insns.def90
-rw-r--r--internal.h244
-rw-r--r--io.c436
-rw-r--r--iseq.c162
-rw-r--r--iseq.h35
-rw-r--r--lib/English.rb4
-rw-r--r--[-rwxr-xr-x]lib/abbrev.rb95
-rw-r--r--lib/benchmark.rb37
-rw-r--r--lib/cgi.rb2
-rw-r--r--lib/cgi/core.rb45
-rw-r--r--lib/cgi/html.rb2
-rw-r--r--lib/cgi/session.rb2
-rw-r--r--lib/cgi/session/pstore.rb13
-rw-r--r--lib/cgi/util.rb16
-rw-r--r--lib/cmath.rb112
-rw-r--r--lib/complex.rb28
-rw-r--r--lib/csv.rb18
-rw-r--r--lib/delegate.rb42
-rw-r--r--lib/drb/acl.rb20
-rw-r--r--lib/drb/drb.rb18
-rw-r--r--lib/drb/extserv.rb30
-rw-r--r--lib/drb/ssl.rb2
-rw-r--r--lib/e2mmap.rb4
-rw-r--r--lib/erb.rb6
-rw-r--r--lib/fileutils.rb151
-rw-r--r--lib/find.rb7
-rw-r--r--lib/gserver.rb310
-rw-r--r--lib/ipaddr.rb277
-rw-r--r--lib/irb.rb33
-rw-r--r--lib/irb/cmd/chws.rb6
-rw-r--r--lib/irb/cmd/fork.rb29
-rw-r--r--lib/irb/cmd/load.rb48
-rw-r--r--lib/irb/cmd/nop.rb11
-rw-r--r--lib/irb/cmd/pushws.rb10
-rw-r--r--lib/irb/cmd/subirb.rb8
-rw-r--r--lib/irb/completion.rb264
-rw-r--r--lib/irb/context.rb175
-rw-r--r--lib/irb/ext/change-ws.rb34
-rw-r--r--lib/irb/ext/history.rb58
-rw-r--r--lib/irb/ext/loader.rb118
-rw-r--r--lib/irb/ext/math-mode.rb8
-rw-r--r--lib/irb/ext/multi-irb.rb175
-rw-r--r--lib/irb/ext/save-history.rb67
-rw-r--r--lib/irb/ext/tracer.rb26
-rw-r--r--lib/irb/ext/use-loader.rb28
-rw-r--r--lib/irb/ext/workspaces.rb26
-rw-r--r--lib/irb/extend-command.rb218
-rw-r--r--lib/irb/frame.rb4
-rw-r--r--lib/irb/help.rb18
-rw-r--r--lib/irb/init.rb212
-rw-r--r--lib/irb/input-method.rb36
-rw-r--r--lib/irb/inspector.rb14
-rw-r--r--lib/irb/locale.rb71
-rw-r--r--lib/irb/notifier.rb80
-rw-r--r--lib/irb/output-method.rb6
-rw-r--r--lib/irb/ruby-lex.rb701
-rw-r--r--lib/irb/ruby-token.rb29
-rw-r--r--lib/irb/slex.rb261
-rw-r--r--lib/irb/workspace.rb114
-rw-r--r--lib/irb/xmp.rb38
-rw-r--r--lib/logger.rb199
-rw-r--r--lib/mathn.rb151
-rw-r--r--lib/matrix.rb51
-rw-r--r--lib/matrix/eigenvalue_decomposition.rb6
-rw-r--r--lib/minitest/.document2
-rw-r--r--lib/minitest/autorun.rb19
-rw-r--r--lib/minitest/hell.rb20
-rw-r--r--lib/minitest/parallel_each.rb80
-rw-r--r--lib/minitest/pride.rb119
-rw-r--r--lib/minitest/spec.rb551
-rw-r--r--lib/mkmf.rb86
-rw-r--r--lib/net/ftp.rb12
-rw-r--r--lib/net/http.rb19
-rw-r--r--lib/net/http/generic_request.rb59
-rw-r--r--lib/net/http/requests.rb2
-rw-r--r--lib/net/http/response.rb15
-rw-r--r--lib/net/http/responses.rb4
-rw-r--r--lib/net/imap.rb438
-rw-r--r--lib/net/smtp.rb15
-rw-r--r--lib/net/telnet.rb2
-rw-r--r--lib/observer.rb2
-rw-r--r--lib/open-uri.rb5
-rw-r--r--lib/open3.rb36
-rw-r--r--lib/optionparser.rb1
-rw-r--r--lib/optparse.rb49
-rw-r--r--lib/optparse/version.rb2
-rw-r--r--lib/prettyprint.rb22
-rw-r--r--lib/prime.rb7
-rw-r--r--lib/pstore.rb22
-rw-r--r--lib/racc/parser.rb2
-rw-r--r--lib/rake.rb7
-rw-r--r--lib/rake/alt_system.rb8
-rw-r--r--lib/rake/application.rb175
-rw-r--r--lib/rake/backtrace.rb7
-rw-r--r--lib/rake/clean.rb23
-rw-r--r--lib/rake/cloneable.rb8
-rw-r--r--lib/rake/contrib/.document1
-rw-r--r--lib/rake/contrib/ftptools.rb8
-rw-r--r--lib/rake/contrib/publisher.rb16
-rw-r--r--lib/rake/contrib/rubyforgepublisher.rb4
-rw-r--r--lib/rake/contrib/sshpublisher.rb23
-rw-r--r--lib/rake/contrib/sys.rb2
-rw-r--r--lib/rake/cpu_counter.rb110
-rw-r--r--lib/rake/default_loader.rb4
-rw-r--r--lib/rake/dsl_definition.rb78
-rw-r--r--lib/rake/early_time.rb5
-rw-r--r--lib/rake/ext/core.rb7
-rw-r--r--lib/rake/ext/module.rb1
-rw-r--r--lib/rake/ext/pathname.rb25
-rw-r--r--lib/rake/ext/string.rb65
-rw-r--r--lib/rake/ext/time.rb2
-rw-r--r--lib/rake/file_list.rb38
-rw-r--r--lib/rake/file_task.rb6
-rw-r--r--lib/rake/file_utils.rb20
-rw-r--r--lib/rake/gempackagetask.rb4
-rw-r--r--lib/rake/invocation_chain.rb3
-rw-r--r--lib/rake/lib/.document1
-rw-r--r--lib/rake/lib/project.rake21
-rw-r--r--lib/rake/linked_list.rb4
-rw-r--r--lib/rake/name_space.rb59
-rw-r--r--lib/rake/packagetask.rb30
-rw-r--r--lib/rake/pathmap.rb2
-rw-r--r--lib/rake/pseudo_status.rb4
-rw-r--r--lib/rake/rake_module.rb11
-rw-r--r--lib/rake/rdoctask.rb2
-rw-r--r--lib/rake/ruby182_test_unit_fix.rb2
-rw-r--r--lib/rake/runtest.rb7
-rw-r--r--lib/rake/scope.rb2
-rw-r--r--lib/rake/task.rb23
-rw-r--r--lib/rake/task_arguments.rb29
-rw-r--r--lib/rake/task_manager.rb31
-rw-r--r--lib/rake/tasklib.rb2
-rw-r--r--lib/rake/testtask.rb29
-rw-r--r--lib/rake/thread_pool.rb23
-rw-r--r--lib/rake/trace_output.rb2
-rw-r--r--lib/rake/version.rb2
-rw-r--r--lib/rake/win32.rb2
-rw-r--r--lib/rational.rb23
-rw-r--r--lib/rbconfig/obsolete.rb38
-rw-r--r--lib/rdoc.rb4
-rw-r--r--lib/rdoc/any_method.rb10
-rw-r--r--lib/rdoc/context.rb11
-rw-r--r--lib/rdoc/encoding.rb4
-rw-r--r--lib/rdoc/generator.rb1
-rw-r--r--lib/rdoc/generator/pot.rb97
-rw-r--r--lib/rdoc/generator/pot/message_extractor.rb67
-rw-r--r--lib/rdoc/generator/pot/po.rb83
-rw-r--r--lib/rdoc/generator/pot/po_entry.rb140
-rw-r--r--lib/rdoc/generator/template/darkfish/_head.rhtml17
-rw-r--r--[-rwxr-xr-x]lib/rdoc/generator/template/darkfish/images/add.pngbin733 -> 733 bytes-rw-r--r--[-rwxr-xr-x]lib/rdoc/generator/template/darkfish/images/arrow_up.pngbin372 -> 372 bytes-rw-r--r--[-rwxr-xr-x]lib/rdoc/generator/template/darkfish/images/delete.pngbin715 -> 715 bytes-rw-r--r--[-rwxr-xr-x]lib/rdoc/generator/template/darkfish/images/tag_blue.pngbin1880 -> 1880 bytes-rw-r--r--lib/rdoc/generator/template/darkfish/js/darkfish.js43
-rw-r--r--lib/rdoc/generator/template/darkfish/rdoc.css12
-rw-r--r--lib/rdoc/i18n.rb9
-rw-r--r--lib/rdoc/i18n/locale.rb101
-rw-r--r--lib/rdoc/i18n/text.rb125
-rw-r--r--lib/rdoc/markup.rb4
-rw-r--r--lib/rdoc/markup/attribute_manager.rb2
-rw-r--r--lib/rdoc/method_attr.rb14
-rw-r--r--lib/rdoc/options.rb58
-rw-r--r--lib/rdoc/parser.rb2
-rw-r--r--lib/rdoc/parser/c.rb10
-rw-r--r--lib/rdoc/parser/changelog.rb10
-rw-r--r--lib/rdoc/parser/ruby.rb24
-rw-r--r--lib/rdoc/rd/block_parser.rb6
-rw-r--r--lib/rdoc/rd/inline_parser.rb2
-rw-r--r--lib/rdoc/rdoc.rb8
-rw-r--r--lib/rdoc/ruby_lex.rb6
-rw-r--r--lib/rdoc/ruby_token.rb14
-rw-r--r--lib/rdoc/rubygems_hook.rb8
-rw-r--r--lib/rdoc/stats/normal.rb33
-rw-r--r--lib/rdoc/task.rb2
-rw-r--r--lib/rdoc/text.rb13
-rw-r--r--lib/rdoc/token_stream.rb2
-rw-r--r--lib/resolv.rb54
-rw-r--r--lib/rexml/attribute.rb2
-rw-r--r--lib/rexml/document.rb6
-rw-r--r--lib/rexml/dtd/dtd.rb5
-rw-r--r--lib/rexml/element.rb6
-rw-r--r--lib/rexml/entity.rb7
-rw-r--r--lib/rexml/functions.rb2
-rw-r--r--lib/rexml/parsers/xpathparser.rb2
-rw-r--r--lib/rexml/source.rb2
-rw-r--r--lib/rexml/streamlistener.rb2
-rw-r--r--lib/rexml/xmltokens.rb76
-rw-r--r--lib/rexml/xpath_parser.rb20
-rw-r--r--lib/rinda/ring.rb56
-rw-r--r--lib/rss/maker/base.rb2
-rw-r--r--lib/rss/rss.rb4
-rw-r--r--lib/rss/utils.rb2
-rw-r--r--lib/rss/xmlparser.rb2
-rw-r--r--lib/rubygems.rb48
-rw-r--r--lib/rubygems/available_set.rb2
-rw-r--r--lib/rubygems/basic_specification.rb30
-rw-r--r--lib/rubygems/command.rb5
-rw-r--r--lib/rubygems/command_manager.rb3
-rw-r--r--lib/rubygems/commands/cert_command.rb24
-rw-r--r--lib/rubygems/commands/cleanup_command.rb4
-rw-r--r--lib/rubygems/commands/contents_command.rb25
-rw-r--r--lib/rubygems/commands/dependency_command.rb4
-rw-r--r--lib/rubygems/commands/environment_command.rb7
-rw-r--r--lib/rubygems/commands/help_command.rb219
-rw-r--r--lib/rubygems/commands/install_command.rb58
-rw-r--r--lib/rubygems/commands/list_command.rb4
-rw-r--r--lib/rubygems/commands/open_command.rb74
-rw-r--r--lib/rubygems/commands/owner_command.rb4
-rw-r--r--lib/rubygems/commands/search_command.rb10
-rw-r--r--lib/rubygems/commands/setup_command.rb2
-rw-r--r--lib/rubygems/commands/uninstall_command.rb14
-rw-r--r--lib/rubygems/commands/update_command.rb23
-rw-r--r--lib/rubygems/commands/yank_command.rb21
-rw-r--r--lib/rubygems/config_file.rb17
-rw-r--r--lib/rubygems/core_ext/kernel_gem.rb9
-rwxr-xr-xlib/rubygems/core_ext/kernel_require.rb34
-rw-r--r--lib/rubygems/defaults.rb24
-rw-r--r--lib/rubygems/dependency.rb57
-rw-r--r--lib/rubygems/dependency_installer.rb59
-rw-r--r--lib/rubygems/doctor.rb2
-rw-r--r--lib/rubygems/errors.rb30
-rw-r--r--lib/rubygems/exceptions.rb24
-rw-r--r--lib/rubygems/ext/builder.rb2
-rw-r--r--lib/rubygems/ext/ext_conf_builder.rb24
-rw-r--r--lib/rubygems/gemcutter_utilities.rb2
-rw-r--r--lib/rubygems/install_update_options.rb17
-rw-r--r--lib/rubygems/installer.rb75
-rw-r--r--lib/rubygems/installer_test_case.rb2
-rw-r--r--lib/rubygems/local_remote_options.rb4
-rw-r--r--lib/rubygems/name_tuple.rb6
-rw-r--r--lib/rubygems/package.rb41
-rw-r--r--lib/rubygems/package/file_source.rb33
-rw-r--r--lib/rubygems/package/io_source.rb45
-rw-r--r--lib/rubygems/package/old.rb10
-rw-r--r--lib/rubygems/package/source.rb3
-rw-r--r--lib/rubygems/package/tar_reader/entry.rb2
-rw-r--r--lib/rubygems/platform.rb3
-rw-r--r--lib/rubygems/rdoc.rb3
-rw-r--r--lib/rubygems/remote_fetcher.rb69
-rw-r--r--lib/rubygems/request.rb172
-rw-r--r--lib/rubygems/request/connection_pools.rb79
-rw-r--r--lib/rubygems/request/http_pool.rb38
-rw-r--r--lib/rubygems/request/https_pool.rb10
-rw-r--r--lib/rubygems/request_set.rb114
-rw-r--r--lib/rubygems/request_set/gem_dependency_api.rb319
-rw-r--r--lib/rubygems/request_set/lockfile.rb101
-rw-r--r--lib/rubygems/requirement.rb3
-rw-r--r--lib/rubygems/resolver.rb65
-rw-r--r--lib/rubygems/resolver/activation_request.rb7
-rw-r--r--lib/rubygems/resolver/api_set.rb14
-rw-r--r--lib/rubygems/resolver/api_specification.rb6
-rw-r--r--lib/rubygems/resolver/best_set.rb28
-rw-r--r--lib/rubygems/resolver/composed_set.rb16
-rw-r--r--lib/rubygems/resolver/conflict.rb52
-rw-r--r--lib/rubygems/resolver/dependency_request.rb21
-rw-r--r--lib/rubygems/resolver/git_set.rb2
-rw-r--r--lib/rubygems/resolver/git_specification.rb26
-rw-r--r--lib/rubygems/resolver/index_set.rb6
-rw-r--r--lib/rubygems/resolver/installed_specification.rb20
-rw-r--r--lib/rubygems/resolver/installer_set.rb94
-rw-r--r--lib/rubygems/resolver/local_specification.rb25
-rw-r--r--lib/rubygems/resolver/lock_set.rb22
-rw-r--r--lib/rubygems/resolver/lock_specification.rb28
-rw-r--r--lib/rubygems/resolver/set.rb14
-rw-r--r--lib/rubygems/resolver/spec_specification.rb2
-rw-r--r--lib/rubygems/resolver/specification.rb25
-rw-r--r--lib/rubygems/resolver/vendor_set.rb4
-rw-r--r--lib/rubygems/resolver/vendor_specification.rb2
-rw-r--r--lib/rubygems/security/policy.rb1
-rw-r--r--lib/rubygems/server.rb37
-rw-r--r--lib/rubygems/source.rb12
-rw-r--r--lib/rubygems/source/git.rb6
-rw-r--r--lib/rubygems/source/installed.rb7
-rw-r--r--lib/rubygems/source/specific_file.rb7
-rw-r--r--lib/rubygems/spec_fetcher.rb19
-rw-r--r--lib/rubygems/specification.rb195
-rw-r--r--lib/rubygems/ssl_certs/AddTrustExternalCARoot-2048.pem25
-rw-r--r--lib/rubygems/ssl_certs/AddTrustExternalCARoot.pem32
-rw-r--r--lib/rubygems/stub_specification.rb14
-rw-r--r--lib/rubygems/test_case.rb20
-rw-r--r--lib/rubygems/test_utilities.rb2
-rw-r--r--lib/rubygems/text.rb20
-rw-r--r--lib/rubygems/uninstaller.rb5
-rw-r--r--lib/rubygems/user_interaction.rb18
-rw-r--r--lib/rubygems/util.rb15
-rw-r--r--lib/rubygems/version.rb6
-rw-r--r--lib/scanf.rb2
-rw-r--r--lib/securerandom.rb40
-rw-r--r--lib/set.rb34
-rw-r--r--lib/shell.rb47
-rw-r--r--lib/shell/builtin-command.rb14
-rw-r--r--lib/shell/command-processor.rb5
-rw-r--r--lib/shell/process-controller.rb9
-rw-r--r--lib/shell/system-command.rb1
-rw-r--r--lib/shellwords.rb18
-rw-r--r--lib/tempfile.rb20
-rw-r--r--lib/test/unit/test-unit.gemspec14
-rw-r--r--lib/thwait.rb4
-rw-r--r--lib/time.rb96
-rw-r--r--lib/tmpdir.rb4
-rw-r--r--lib/uri/common.rb555
-rw-r--r--lib/uri/ftp.rb21
-rw-r--r--lib/uri/generic.rb260
-rw-r--r--lib/uri/http.rb10
-rw-r--r--lib/uri/mailto.rb138
-rw-r--r--lib/uri/rfc2396_parser.rb543
-rw-r--r--lib/uri/rfc3986_parser.rb105
-rw-r--r--lib/weakref.rb11
-rw-r--r--lib/webrick/httpproxy.rb4
-rw-r--r--lib/webrick/httpresponse.rb2
-rw-r--r--lib/webrick/httpserver.rb4
-rw-r--r--lib/webrick/httpservlet/cgihandler.rb3
-rw-r--r--lib/webrick/httpservlet/erbhandler.rb2
-rw-r--r--lib/webrick/httpservlet/filehandler.rb3
-rw-r--r--lib/webrick/server.rb31
-rw-r--r--lib/webrick/ssl.rb2
-rw-r--r--lib/webrick/utils.rb11
-rw-r--r--lib/xmlrpc/client.rb2
-rw-r--r--lib/xmlrpc/httpserver.rb173
-rw-r--r--lib/yaml.rb40
-rw-r--r--load.c12
-rw-r--r--localeinit.c13
-rw-r--r--man/rake.19
-rw-r--r--man/ruby.117
-rw-r--r--marshal.c276
-rw-r--r--math.c57
-rw-r--r--method.h6
-rw-r--r--misc/README2
-rw-r--r--misc/rdoc-mode.el40
-rw-r--r--misc/ruby-additional.el13
-rw-r--r--missing/nextafter.c77
-rwxr-xr-x[-rw-r--r--]nacl/nacl-config.rb2
-rw-r--r--node.c207
-rw-r--r--node.h7
-rw-r--r--numeric.c250
-rw-r--r--object.c345
-rw-r--r--pack.c105
-rw-r--r--parse.y2404
-rw-r--r--prelude.rb6
-rw-r--r--probes_helper.h2
-rw-r--r--proc.c321
-rw-r--r--process.c786
-rw-r--r--random.c21
-rw-r--r--range.c33
-rw-r--r--rational.c31
-rw-r--r--re.c80
-rw-r--r--regcomp.c219
-rw-r--r--regenc.c66
-rw-r--r--regenc.h25
-rw-r--r--regerror.c26
-rw-r--r--regexec.c49
-rw-r--r--regint.h79
-rw-r--r--regparse.c465
-rw-r--r--regparse.h4
-rw-r--r--ruby.c194
-rw-r--r--safe.c10
-rw-r--r--sample/benchmark.rb19
-rw-r--r--sample/cgi-session-pstore.rb11
-rw-r--r--sample/delegate.rb31
-rw-r--r--sample/drb/acl.rb15
-rw-r--r--sample/drb/ring_place.rb6
-rw-r--r--sample/net-imap.rb167
-rw-r--r--sample/open3.rb12
-rw-r--r--sample/pstore.rb19
-rw-r--r--sample/rinda-ring.rb22
-rw-r--r--sample/tempfile.rb8
-rw-r--r--sample/trick2013/kinaba/entry.rb2
-rw-r--r--sample/trick2013/mame/entry.rb2
-rw-r--r--sample/weakref.rb9
-rw-r--r--signal.c144
-rw-r--r--siphash.c1
-rw-r--r--spec/default.mspec4
-rw-r--r--sprintf.c214
-rw-r--r--st.c134
-rw-r--r--string.c1080
-rw-r--r--struct.c49
-rw-r--r--symbian/README.SYMBIAN93
-rw-r--r--symbian/configure.bat123
-rw-r--r--symbian/missing-aeabi.c18
-rw-r--r--symbian/missing-pips.c65
-rw-r--r--symbian/pre-build83
-rw-r--r--symbian/setup440
-rw-r--r--symbol.c1156
-rw-r--r--symbol.h54
-rw-r--r--template/Doxyfile.tmpl2
-rw-r--r--template/fake.rb.in39
-rw-r--r--template/id.h.tmpl21
-rw-r--r--template/opt_sc.inc.tmpl2
-rw-r--r--template/optinsn.inc.tmpl2
-rw-r--r--template/optunifs.inc.tmpl2
-rw-r--r--template/verconf.h.tmpl (renamed from template/verconf.h.in)0
-rw-r--r--template/vm.inc.tmpl2
-rw-r--r--test/-ext-/bignum/test_big2str.rb2
-rw-r--r--test/-ext-/bignum/test_div.rb2
-rw-r--r--test/-ext-/bignum/test_mul.rb2
-rw-r--r--test/-ext-/bignum/test_pack.rb24
-rw-r--r--test/-ext-/bignum/test_str2big.rb2
-rw-r--r--test/-ext-/float/test_nextafter.rb57
-rw-r--r--test/-ext-/old_thread_select/test_old_thread_select.rb103
-rw-r--r--test/-ext-/string/test_coderange.rb59
-rw-r--r--test/-ext-/symbol/test_inadvertent_creation.rb24
-rw-r--r--test/-ext-/symbol/test_type.rb4
-rw-r--r--test/-ext-/tracepoint/test_tracepoint.rb4
-rw-r--r--test/-ext-/win32/test_console_attr.rb43
-rw-r--r--test/benchmark/test_benchmark.rb136
-rw-r--r--test/bigdecimal/test_bigmath.rb18
-rw-r--r--test/cgi/test_cgi_core.rb65
-rw-r--r--test/cgi/test_cgi_header.rb8
-rw-r--r--test/cgi/test_cgi_multipart.rb59
-rw-r--r--test/cgi/test_cgi_tag_helper.rb12
-rw-r--r--test/cgi/test_cgi_util.rb23
-rw-r--r--test/csv/base.rb2
-rwxr-xr-xtest/csv/test_data_converters.rb4
-rwxr-xr-xtest/csv/test_encodings.rb30
-rwxr-xr-xtest/csv/test_features.rb46
-rwxr-xr-xtest/csv/test_headers.rb34
-rwxr-xr-xtest/csv/test_interface.rb12
-rwxr-xr-xtest/csv/test_row.rb44
-rwxr-xr-xtest/csv/test_table.rb24
-rw-r--r--test/date/test_date.rb3
-rw-r--r--test/date/test_date_arith.rb30
-rw-r--r--test/date/test_date_attr.rb9
-rw-r--r--test/date/test_date_parse.rb13
-rw-r--r--test/date/test_date_strptime.rb22
-rw-r--r--test/dbm/test_dbm.rb16
-rw-r--r--test/digest/test_digest_extend.rb2
-rw-r--r--test/digest/test_digest_hmac.rb2
-rw-r--r--test/dl/test_func.rb6
-rw-r--r--test/drb/drbtest.rb11
-rw-r--r--test/drb/ignore_test_drb.rb3
-rw-r--r--test/drb/test_acl.rb4
-rw-r--r--test/drb/test_drb.rb35
-rw-r--r--test/drb/test_drbssl.rb14
-rw-r--r--test/drb/test_drbunix.rb13
-rw-r--r--test/drb/ut_array.rb1
-rw-r--r--test/drb/ut_array_drbssl.rb11
-rw-r--r--test/drb/ut_array_drbunix.rb1
-rw-r--r--test/drb/ut_drb.rb6
-rw-r--r--test/drb/ut_drb_drbssl.rb13
-rw-r--r--test/drb/ut_drb_drbunix.rb3
-rw-r--r--test/drb/ut_eq.rb8
-rw-r--r--test/drb/ut_eval.rb7
-rw-r--r--test/drb/ut_large.rb7
-rw-r--r--test/drb/ut_port.rb1
-rw-r--r--test/drb/ut_safe1.rb1
-rw-r--r--test/drb/ut_timerholder.rb6
-rw-r--r--test/erb/test_erb_m17n.rb2
-rw-r--r--test/etc/test_etc.rb51
-rw-r--r--test/fiddle/test_function.rb11
-rw-r--r--test/fiddle/test_handle.rb10
-rw-r--r--test/fiddle/test_import.rb1
-rw-r--r--test/fileutils/fileasserts.rb18
-rw-r--r--test/fileutils/test_fileutils.rb395
-rw-r--r--test/gdbm/test_gdbm.rb8
-rw-r--r--test/io/console/test_io_console.rb72
-rw-r--r--test/io/nonblock/test_flush.rb14
-rw-r--r--test/io/wait/test_io_wait.rb10
-rw-r--r--test/irb/test_raise_no_backtrace_exception.rb14
-rwxr-xr-xtest/json/test_json.rb2
-rw-r--r--test/lib/leakchecker.rb163
-rw-r--r--test/lib/minitest/README.txt (renamed from lib/minitest/README.txt)0
-rw-r--r--test/lib/minitest/autorun.rb13
-rw-r--r--test/lib/minitest/benchmark.rb (renamed from lib/minitest/benchmark.rb)6
-rw-r--r--test/lib/minitest/mock.rb (renamed from lib/minitest/mock.rb)5
-rw-r--r--test/lib/minitest/unit.rb (renamed from lib/minitest/unit.rb)41
-rw-r--r--test/lib/profile_test_all.rb (renamed from test/profile_test_all.rb)0
-rw-r--r--test/lib/test/unit.rb (renamed from lib/test/unit.rb)24
-rw-r--r--test/lib/test/unit/assertions.rb (renamed from lib/test/unit/assertions.rb)76
-rw-r--r--test/lib/test/unit/parallel.rb (renamed from lib/test/unit/parallel.rb)7
-rw-r--r--test/lib/test/unit/testcase.rb (renamed from lib/test/unit/testcase.rb)0
-rw-r--r--test/lib/tracepointchecker.rb118
-rw-r--r--test/lib/with_different_ofs.rb (renamed from test/with_different_ofs.rb)0
-rw-r--r--test/logger/test_logdevice.rb420
-rw-r--r--test/logger/test_logger.rb404
-rw-r--r--test/logger/test_severity.rb15
-rw-r--r--test/matrix/test_matrix.rb62
-rw-r--r--test/minitest/metametameta.rb5
-rw-r--r--test/minitest/test_minitest_benchmark.rb5
-rw-r--r--test/minitest/test_minitest_mock.rb9
-rw-r--r--test/minitest/test_minitest_spec.rb811
-rw-r--r--test/minitest/test_minitest_unit.rb64
-rw-r--r--test/misc/test_ruby_mode.rb5
-rw-r--r--test/mkmf/base.rb13
-rw-r--r--test/mkmf/test_flags.rb21
-rw-r--r--test/mkmf/test_framework.rb6
-rw-r--r--test/monitor/test_monitor.rb13
-rw-r--r--test/net/ftp/test_ftp.rb16
-rw-r--r--test/net/http/test_http.rb19
-rw-r--r--test/net/http/test_httpresponse.rb59
-rw-r--r--test/net/http/test_https.rb34
-rw-r--r--test/net/http/utils.rb7
-rw-r--r--test/net/imap/test_imap.rb63
-rw-r--r--test/net/imap/test_imap_response_parser.rb22
-rw-r--r--test/net/pop/test_pop.rb2
-rw-r--r--test/objspace/test_objspace.rb2
-rw-r--r--test/open-uri/test_open-uri.rb41
-rw-r--r--test/open-uri/test_ssl.rb14
-rw-r--r--test/openssl/test_cipher.rb7
-rw-r--r--test/openssl/test_config.rb2
-rw-r--r--test/openssl/test_hmac.rb9
-rw-r--r--test/openssl/test_pair.rb41
-rw-r--r--test/openssl/test_partial_record_read.rb36
-rw-r--r--test/openssl/test_pkcs7.rb141
-rw-r--r--test/openssl/test_ssl.rb272
-rw-r--r--test/openssl/test_ssl_session.rb52
-rw-r--r--test/openssl/test_x509cert.rb4
-rw-r--r--test/openssl/utils.rb13
-rw-r--r--test/pathname/test_pathname.rb54
-rw-r--r--test/psych/test_engine_manager.rb47
-rw-r--r--test/psych/test_exception.rb6
-rw-r--r--test/psych/test_hash.rb5
-rw-r--r--test/psych/test_merge_keys.rb30
-rw-r--r--test/psych/test_object_references.rb4
-rw-r--r--test/psych/test_string.rb6
-rw-r--r--test/psych/test_symbol.rb8
-rw-r--r--test/psych/test_yaml.rb3
-rw-r--r--test/psych/test_yamldbm.rb4
-rw-r--r--test/psych/test_yamlstore.rb2
-rw-r--r--test/rake/helper.rb10
-rw-r--r--test/rake/support/rakefile_definitions.rb34
-rw-r--r--test/rake/support/ruby_runner.rb11
-rw-r--r--test/rake/test_rake_application.rb188
-rw-r--r--test/rake/test_rake_application_options.rb17
-rw-r--r--test/rake/test_rake_backtrace.rb8
-rw-r--r--test/rake/test_rake_clean.rb15
-rw-r--r--test/rake/test_rake_cpu_counter.rb50
-rw-r--r--test/rake/test_rake_directory_task.rb19
-rw-r--r--test/rake/test_rake_file_list.rb28
-rw-r--r--test/rake/test_rake_file_task.rb79
-rw-r--r--test/rake/test_rake_functional.rb18
-rw-r--r--test/rake/test_rake_multi_task.rb6
-rw-r--r--test/rake/test_rake_name_space.rb14
-rw-r--r--test/rake/test_rake_path_map.rb4
-rw-r--r--test/rake/test_rake_pathname_extensions.rb15
-rw-r--r--test/rake/test_rake_rules.rb26
-rw-r--r--test/rake/test_rake_task.rb19
-rw-r--r--test/rake/test_rake_task_argument_parsing.rb16
-rw-r--r--test/rake/test_rake_task_arguments.rb6
-rw-r--r--test/rake/test_rake_task_manager.rb20
-rw-r--r--test/rake/test_rake_task_with_arguments.rb1
-rw-r--r--test/rake/test_rake_test_task.rb24
-rw-r--r--test/rake/test_rake_thread_pool.rb4
-rw-r--r--test/rdoc/test.ja.large.rdoc3
-rw-r--r--test/rdoc/test_attribute_manager.rb120
-rw-r--r--test/rdoc/test_rdoc_any_method.rb29
-rw-r--r--test/rdoc/test_rdoc_constant.rb30
-rw-r--r--test/rdoc/test_rdoc_context.rb2
-rw-r--r--test/rdoc/test_rdoc_encoding.rb23
-rw-r--r--test/rdoc/test_rdoc_generator_pot.rb91
-rw-r--r--test/rdoc/test_rdoc_generator_pot_po.rb51
-rw-r--r--test/rdoc/test_rdoc_generator_pot_po_entry.rb139
-rw-r--r--test/rdoc/test_rdoc_i18n_locale.rb73
-rw-r--r--test/rdoc/test_rdoc_i18n_text.rb123
-rw-r--r--test/rdoc/test_rdoc_markup_attribute_manager.rb3
-rw-r--r--test/rdoc/test_rdoc_markup_pre_process.rb2
-rw-r--r--test/rdoc/test_rdoc_method_attr.rb32
-rw-r--r--test/rdoc/test_rdoc_normal_class.rb8
-rw-r--r--test/rdoc/test_rdoc_options.rb19
-rw-r--r--test/rdoc/test_rdoc_parser.rb17
-rw-r--r--test/rdoc/test_rdoc_parser_c.rb73
-rw-r--r--test/rdoc/test_rdoc_parser_changelog.rb2
-rw-r--r--test/rdoc/test_rdoc_parser_markdown.rb2
-rw-r--r--test/rdoc/test_rdoc_parser_rd.rb2
-rw-r--r--test/rdoc/test_rdoc_parser_ruby.rb62
-rw-r--r--test/rdoc/test_rdoc_parser_simple.rb2
-rw-r--r--test/rdoc/test_rdoc_rd_block_parser.rb4
-rw-r--r--test/rdoc/test_rdoc_rdoc.rb27
-rw-r--r--test/rdoc/test_rdoc_ruby_lex.rb11
-rw-r--r--test/rdoc/test_rdoc_rubygems_hook.rb3
-rw-r--r--test/rdoc/test_rdoc_task.rb50
-rw-r--r--test/rdoc/test_rdoc_text.rb3
-rw-r--r--test/readline/test_readline.rb1
-rw-r--r--test/resolv/test_addr.rb3
-rw-r--r--test/resolv/test_dns.rb33
-rw-r--r--test/resolv/test_resource.rb21
-rw-r--r--test/rexml/listener.rb94
-rw-r--r--test/rexml/parse/test_document_type_declaration.rb56
-rw-r--r--test/rexml/parse/test_notation_declaration.rb118
-rw-r--r--test/rexml/parser/test_sax2.rb2
-rw-r--r--test/rexml/parser/test_tree.rb2
-rw-r--r--test/rexml/parser/test_ultra_light.rb2
-rw-r--r--test/rexml/test_attributes.rb342
-rw-r--r--test/rexml/test_attributes_mixin.rb48
-rw-r--r--test/rexml/test_changing_encoding.rb67
-rw-r--r--test/rexml/test_comment.rb2
-rw-r--r--test/rexml/test_contrib.rb881
-rw-r--r--test/rexml/test_core.rb2457
-rw-r--r--test/rexml/test_doctype.rb190
-rw-r--r--test/rexml/test_document.rb468
-rw-r--r--test/rexml/test_elements.rb196
-rw-r--r--test/rexml/test_encoding.rb152
-rw-r--r--test/rexml/test_encoding_2.rb59
-rw-r--r--test/rexml/test_entity.rb326
-rw-r--r--test/rexml/test_functions.rb401
-rw-r--r--test/rexml/test_functions_number.rb52
-rw-r--r--test/rexml/test_jaxen.rb209
-rw-r--r--test/rexml/test_light.rb170
-rw-r--r--test/rexml/test_lightparser.rb17
-rw-r--r--test/rexml/test_listener.rb201
-rw-r--r--test/rexml/test_martin_fowler.rb40
-rw-r--r--test/rexml/test_namespace.rb54
-rw-r--r--test/rexml/test_order.rb174
-rw-r--r--test/rexml/test_preceding_sibling.rb56
-rw-r--r--test/rexml/test_pullparser.rb160
-rw-r--r--test/rexml/test_rexml_issuezilla.rb20
-rw-r--r--test/rexml/test_sax.rb483
-rw-r--r--test/rexml/test_stream.rb194
-rw-r--r--test/rexml/test_text.rb28
-rw-r--r--test/rexml/test_ticket_80.rb46
-rw-r--r--test/rexml/test_validation_rng.rb616
-rw-r--r--test/rexml/test_xml_declaration.rb42
-rw-r--r--test/rexml/test_xpath.rb1079
-rw-r--r--test/rexml/test_xpath_attribute_query.rb89
-rw-r--r--test/rexml/test_xpath_msw.rb38
-rw-r--r--test/rexml/test_xpath_pred.rb80
-rw-r--r--test/rexml/test_xpathtext.rb72
-rw-r--r--test/rexml/xpath/test_attribute.rb29
-rw-r--r--test/rexml/xpath/test_axis_preceding_sibling.rb39
-rw-r--r--test/rexml/xpath/test_base.rb1089
-rw-r--r--test/rexml/xpath/test_node.rb42
-rw-r--r--test/rexml/xpath/test_predicate.rb82
-rw-r--r--test/rexml/xpath/test_text.rb74
-rw-r--r--test/rinda/test_rinda.rb40
-rw-r--r--test/ripper/test_parser_events.rb25
-rw-r--r--test/ripper/test_ripper.rb4
-rw-r--r--test/ripper/test_scanner_events.rb12
-rw-r--r--test/rss/rss-assertions.rb2
-rw-r--r--test/rss/test_maker_itunes.rb4
-rw-r--r--test/rss/test_setup_maker_itunes.rb1
-rw-r--r--test/ruby/envutil.rb59
-rw-r--r--test/ruby/find_executable.rb21
-rw-r--r--test/ruby/memory_status.rb9
-rw-r--r--test/ruby/test_argf.rb7
-rw-r--r--test/ruby/test_array.rb23
-rw-r--r--test/ruby/test_assignment.rb65
-rw-r--r--test/ruby/test_autoload.rb54
-rw-r--r--test/ruby/test_backtrace.rb22
-rw-r--r--test/ruby/test_beginendblock.rb5
-rw-r--r--test/ruby/test_class.rb22
-rw-r--r--test/ruby/test_comparable.rb13
-rw-r--r--test/ruby/test_complex.rb385
-rw-r--r--test/ruby/test_defined.rb2
-rw-r--r--test/ruby/test_dir.rb38
-rw-r--r--test/ruby/test_dir_m17n.rb8
-rw-r--r--test/ruby/test_econv.rb3
-rw-r--r--test/ruby/test_encoding.rb4
-rw-r--r--test/ruby/test_enum.rb208
-rw-r--r--test/ruby/test_enumerator.rb2
-rw-r--r--test/ruby/test_env.rb90
-rw-r--r--test/ruby/test_eval.rb29
-rw-r--r--test/ruby/test_exception.rb92
-rw-r--r--test/ruby/test_fiber.rb6
-rw-r--r--test/ruby/test_file.rb32
-rw-r--r--test/ruby/test_fixnum.rb7
-rw-r--r--test/ruby/test_float.rb66
-rw-r--r--test/ruby/test_gc.rb88
-rw-r--r--test/ruby/test_hash.rb37
-rw-r--r--test/ruby/test_io.rb230
-rw-r--r--test/ruby/test_io_m17n.rb57
-rw-r--r--test/ruby/test_iseq.rb2
-rw-r--r--test/ruby/test_keyword.rb37
-rw-r--r--test/ruby/test_lambda.rb17
-rw-r--r--test/ruby/test_lazy_enumerator.rb9
-rw-r--r--test/ruby/test_literal.rb10
-rw-r--r--test/ruby/test_m17n_comb.rb23
-rw-r--r--test/ruby/test_marshal.rb57
-rw-r--r--test/ruby/test_math.rb18
-rw-r--r--test/ruby/test_method.rb101
-rw-r--r--test/ruby/test_module.rb44
-rw-r--r--test/ruby/test_numeric.rb37
-rw-r--r--test/ruby/test_object.rb26
-rw-r--r--test/ruby/test_objectspace.rb12
-rw-r--r--test/ruby/test_optimization.rb67
-rw-r--r--test/ruby/test_pack.rb2
-rw-r--r--test/ruby/test_parse.rb21
-rw-r--r--test/ruby/test_proc.rb38
-rw-r--r--test/ruby/test_process.rb142
-rw-r--r--test/ruby/test_rand.rb5
-rw-r--r--test/ruby/test_range.rb8
-rw-r--r--test/ruby/test_rational.rb362
-rw-r--r--test/ruby/test_refinement.rb235
-rw-r--r--test/ruby/test_regexp.rb18
-rw-r--r--test/ruby/test_require.rb22
-rw-r--r--test/ruby/test_rubyoptions.rb34
-rw-r--r--test/ruby/test_rubyvm.rb1
-rw-r--r--test/ruby/test_settracefunc.rb149
-rw-r--r--test/ruby/test_signal.rb22
-rw-r--r--test/ruby/test_sleep.rb14
-rw-r--r--test/ruby/test_sprintf.rb36
-rw-r--r--test/ruby/test_string.rb38
-rw-r--r--test/ruby/test_struct.rb8
-rw-r--r--test/ruby/test_super.rb18
-rw-r--r--test/ruby/test_symbol.rb16
-rw-r--r--test/ruby/test_syntax.rb53
-rw-r--r--test/ruby/test_system.rb2
-rw-r--r--test/ruby/test_thread.rb25
-rw-r--r--test/ruby/test_threadgroup.rb9
-rw-r--r--test/ruby/test_time.rb22
-rw-r--r--test/ruby/test_time_tz.rb103
-rw-r--r--test/ruby/test_variable.rb4
-rw-r--r--test/ruby/test_weakmap.rb8
-rw-r--r--test/ruby/test_yield.rb4
-rw-r--r--test/rubygems/test_gem.rb182
-rw-r--r--test/rubygems/test_gem_available_set.rb19
-rw-r--r--test/rubygems/test_gem_command.rb55
-rw-r--r--test/rubygems/test_gem_commands_cert_command.rb1
-rw-r--r--test/rubygems/test_gem_commands_contents_command.rb49
-rw-r--r--test/rubygems/test_gem_commands_environment_command.rb1
-rw-r--r--test/rubygems/test_gem_commands_help_command.rb7
-rw-r--r--test/rubygems/test_gem_commands_install_command.rb107
-rw-r--r--test/rubygems/test_gem_commands_open_command.rb46
-rw-r--r--test/rubygems/test_gem_commands_setup_command.rb9
-rw-r--r--test/rubygems/test_gem_commands_uninstall_command.rb36
-rw-r--r--test/rubygems/test_gem_commands_update_command.rb63
-rw-r--r--test/rubygems/test_gem_commands_yank_command.rb4
-rw-r--r--test/rubygems/test_gem_config_file.rb26
-rw-r--r--test/rubygems/test_gem_dependency.rb138
-rw-r--r--test/rubygems/test_gem_dependency_installer.rb238
-rw-r--r--test/rubygems/test_gem_ext_builder.rb15
-rw-r--r--test/rubygems/test_gem_ext_ext_conf_builder.rb4
-rw-r--r--test/rubygems/test_gem_gemcutter_utilities.rb9
-rw-r--r--test/rubygems/test_gem_impossible_dependencies_error.rb32
-rw-r--r--test/rubygems/test_gem_install_update_options.rb34
-rw-r--r--test/rubygems/test_gem_installer.rb83
-rw-r--r--test/rubygems/test_gem_local_remote_options.rb13
-rw-r--r--test/rubygems/test_gem_name_tuple.rb7
-rw-r--r--test/rubygems/test_gem_package.rb21
-rw-r--r--test/rubygems/test_gem_package_tar_header.rb2
-rw-r--r--test/rubygems/test_gem_package_tar_reader.rb12
-rw-r--r--test/rubygems/test_gem_package_tar_reader_entry.rb19
-rw-r--r--test/rubygems/test_gem_package_tar_writer.rb1
-rw-r--r--test/rubygems/test_gem_remote_fetcher.rb92
-rw-r--r--test/rubygems/test_gem_request.rb136
-rw-r--r--test/rubygems/test_gem_request_connection_pools.rb120
-rw-r--r--test/rubygems/test_gem_request_set.rb254
-rw-r--r--test/rubygems/test_gem_request_set_gem_dependency_api.rb184
-rw-r--r--test/rubygems/test_gem_request_set_lockfile.rb383
-rw-r--r--test/rubygems/test_gem_requirement.rb13
-rw-r--r--test/rubygems/test_gem_resolver.rb132
-rw-r--r--test/rubygems/test_gem_resolver_activation_request.rb10
-rw-r--r--test/rubygems/test_gem_resolver_api_set.rb4
-rw-r--r--test/rubygems/test_gem_resolver_api_specification.rb40
-rw-r--r--test/rubygems/test_gem_resolver_best_set.rb57
-rw-r--r--test/rubygems/test_gem_resolver_composed_set.rb27
-rw-r--r--test/rubygems/test_gem_resolver_conflict.rb32
-rw-r--r--test/rubygems/test_gem_resolver_dependency_request.rb64
-rw-r--r--test/rubygems/test_gem_resolver_git_set.rb26
-rw-r--r--test/rubygems/test_gem_resolver_git_specification.rb12
-rw-r--r--test/rubygems/test_gem_resolver_index_set.rb30
-rw-r--r--test/rubygems/test_gem_resolver_installer_set.rb155
-rw-r--r--test/rubygems/test_gem_resolver_lock_set.rb18
-rw-r--r--test/rubygems/test_gem_resolver_lock_specification.rb13
-rw-r--r--test/rubygems/test_gem_resolver_specification.rb32
-rw-r--r--test/rubygems/test_gem_resolver_vendor_set.rb18
-rw-r--r--test/rubygems/test_gem_security_policy.rb4
-rw-r--r--test/rubygems/test_gem_server.rb73
-rw-r--r--test/rubygems/test_gem_silent_ui.rb5
-rw-r--r--test/rubygems/test_gem_source.rb18
-rw-r--r--test/rubygems/test_gem_source_git.rb27
-rw-r--r--test/rubygems/test_gem_source_installed.rb8
-rw-r--r--test/rubygems/test_gem_source_lock.rb4
-rw-r--r--test/rubygems/test_gem_source_specific_file.rb4
-rw-r--r--test/rubygems/test_gem_source_vendor.rb4
-rw-r--r--test/rubygems/test_gem_specification.rb153
-rw-r--r--test/rubygems/test_gem_stub_specification.rb94
-rw-r--r--test/rubygems/test_gem_uninstaller.rb23
-rw-r--r--test/rubygems/test_gem_unsatisfiable_dependency_error.rb32
-rw-r--r--test/rubygems/test_kernel.rb6
-rw-r--r--test/rubygems/test_require.rb60
-rw-r--r--test/runner.rb17
-rw-r--r--test/scanf/test_scanf.rb38
-rw-r--r--test/socket/test_socket.rb22
-rw-r--r--test/socket/test_sockopt.rb14
-rw-r--r--test/socket/test_tcp.rb51
-rw-r--r--test/socket/test_unix.rb175
-rw-r--r--test/stringio/test_stringio.rb12
-rw-r--r--test/strscan/test_stringscanner.rb3
-rw-r--r--test/test_find.rb47
-rw-r--r--test/test_ipaddr.rb274
-rw-r--r--test/test_mathn.rb16
-rw-r--r--test/test_open3.rb19
-rw-r--r--test/test_prime.rb4
-rw-r--r--test/test_pstore.rb20
-rw-r--r--test/test_pty.rb44
-rw-r--r--test/test_securerandom.rb2
-rw-r--r--test/test_set.rb77
-rw-r--r--test/test_syslog.rb98
-rw-r--r--test/test_time.rb113
-rw-r--r--test/test_tracer.rb2
-rw-r--r--test/testunit/test4test_hideskip.rb2
-rw-r--r--test/testunit/test4test_redefinition.rb2
-rw-r--r--test/testunit/test4test_sorting.rb2
-rw-r--r--test/testunit/test_parallel.rb6
-rw-r--r--test/testunit/test_rake_integration.rb1
-rw-r--r--test/testunit/test_redefinition.rb4
-rw-r--r--test/testunit/tests_for_parallel/runner.rb3
-rw-r--r--test/thread/test_cv.rb6
-rw-r--r--test/thread/test_queue.rb31
-rw-r--r--test/thread/test_sync.rb6
-rw-r--r--test/uri/test_common.rb60
-rw-r--r--test/uri/test_generic.rb45
-rw-r--r--test/uri/test_mailto.rb4
-rw-r--r--test/webrick/test_filehandler.rb11
-rw-r--r--test/webrick/test_httprequest.rb2
-rw-r--r--test/webrick/test_httpresponse.rb84
-rw-r--r--test/webrick/test_httpserver.rb23
-rw-r--r--test/webrick/utils.rb1
-rw-r--r--test/win32ole/test_err_in_callback.rb4
-rw-r--r--test/win32ole/test_win32ole.rb44
-rw-r--r--test/win32ole/test_win32ole_event.rb19
-rw-r--r--test/win32ole/test_win32ole_method.rb8
-rw-r--r--test/win32ole/test_win32ole_record.rb313
-rw-r--r--test/win32ole/test_win32ole_typelib.rb2
-rw-r--r--test/win32ole/test_win32ole_variant.rb64
-rw-r--r--test/win32ole/test_win32ole_variant_outarg.rb2
-rw-r--r--test/win32ole/test_word.rb1
-rw-r--r--test/xmlrpc/test_client.rb1
-rw-r--r--test/xmlrpc/test_cookie.rb1
-rw-r--r--test/xmlrpc/test_webrick_server.rb2
-rw-r--r--test/zlib/test_zlib.rb2
-rw-r--r--thread.c495
-rw-r--r--thread_native.h23
-rw-r--r--thread_pthread.c179
-rw-r--r--thread_pthread.h10
-rw-r--r--thread_win32.c37
-rw-r--r--thread_win32.h9
-rw-r--r--time.c166
-rw-r--r--timev.h20
-rw-r--r--tool/compile_prelude.rb1
-rw-r--r--tool/config_files.rb8
-rw-r--r--tool/downloader.rb11
-rwxr-xr-xtool/enc-unicode.rb6
-rwxr-xr-xtool/expand-config.rb7
-rw-r--r--tool/fake.rb30
-rwxr-xr-xtool/get-config_files12
-rwxr-xr-xtool/instruction.rb2
-rwxr-xr-xtool/make-snapshot93
-rwxr-xr-xtool/merger.rb49
-rwxr-xr-xtool/mkconfig.rb23
-rwxr-xr-xtool/mkrunnable.rb8
-rwxr-xr-xtool/rbinstall.rb72
-rwxr-xr-xtool/redmine-backporter.rb411
-rwxr-xr-xtool/release.sh38
-rw-r--r--tool/vcs.rb32
-rw-r--r--transcode.c27
-rw-r--r--util.c20
-rw-r--r--variable.c93
-rw-r--r--version.c3
-rw-r--r--version.h13
-rw-r--r--vm.c370
-rw-r--r--vm_backtrace.c49
-rw-r--r--vm_core.h167
-rw-r--r--vm_dump.c266
-rw-r--r--vm_eval.c244
-rw-r--r--vm_exec.c14
-rw-r--r--vm_insnhelper.c106
-rw-r--r--vm_insnhelper.h40
-rw-r--r--vm_method.c113
-rw-r--r--vm_trace.c64
-rw-r--r--vsnprintf.c6
-rw-r--r--win32/Makefile.sub58
-rwxr-xr-xwin32/configure.bat5
-rw-r--r--win32/file.c164
-rwxr-xr-xwin32/rmall.bat6
-rw-r--r--win32/setup.mak11
-rw-r--r--win32/win32.c205
1162 files changed, 86564 insertions, 57773 deletions
diff --git a/.gdbinit b/.gdbinit
index 17be7d8779..e2a34f3715 100644
--- a/.gdbinit
+++ b/.gdbinit
@@ -50,7 +50,7 @@ define rp
end
else
set $flags = ((struct RBasic*)($arg0))->flags
- if ($flags & RUBY_FL_PROMOTED)
+ if ($flags & RUBY_FL_PROMOTED) == RUBY_FL_PROMOTED
printf "[PROMOTED] "
end
if ($flags & RUBY_T_MASK) == RUBY_T_NONE
@@ -211,7 +211,35 @@ define rp
else
if ($flags & RUBY_T_MASK) == RUBY_T_SYMBOL
printf "%sT_SYMBOL%s: ", $color_type, $color_end
- print (struct RBasic *)($arg0)
+ print (struct RSymbol *)($arg0)
+ set $id_type = ((struct RSymbol *)($arg0))->type
+ if $id_type == RUBY_ID_LOCAL
+ printf "l"
+ else
+ if $id_type == RUBY_ID_INSTANCE
+ printf "i"
+ else
+ if $id_type == RUBY_ID_GLOBAL
+ printf "G"
+ else
+ if $id_type == RUBY_ID_ATTRSET
+ printf "a"
+ else
+ if $id_type == RUBY_ID_CONST
+ printf "C"
+ else
+ if $id_type == RUBY_ID_CLASS
+ printf "c"
+ else
+ printf "j"
+ end
+ end
+ end
+ end
+ end
+ end
+ set $id_fstr = ((struct RSymbol *)($arg0))->fstr
+ rp_string $id_fstr
else
if ($flags & RUBY_T_MASK) == RUBY_T_UNDEF
printf "%sT_UNDEF%s: ", $color_type, $color_end
@@ -731,7 +759,7 @@ define rb_numtable_entry
end
end
else
- set $rb_numtable_p = $rb_numtable_tbl->as.big.bins[$rb_numtable_id % $rb_numtable_tbl->num_bins]
+ set $rb_numtable_p = $rb_numtable_tbl->as.big.bins[st_numhash($rb_numtable_id) % $rb_numtable_tbl->num_bins]
while $rb_numtable_p
if $rb_numtable_p->key == $rb_numtable_id
set $rb_numtable_key = $rb_numtable_p->key
@@ -761,7 +789,7 @@ define rb_method_entry
rb_numtable_entry $rb_method_entry_klass->m_tbl_wrapper->tbl $rb_method_entry_id
set $rb_method_entry_me = (rb_method_entry_t *)$rb_numtable_rec
if !$rb_method_entry_me
- set $rb_method_entry_klass = (struct RClass *)$rb_method_entry_klass->ptr->super
+ set $rb_method_entry_klass = (struct RClass *)RCLASS_SUPER($rb_method_entry_klass)
end
end
if $rb_method_entry_me
@@ -790,7 +818,7 @@ define rb_ancestors
set $rb_ancestors_module = $arg0
while $rb_ancestors_module
rp_class $rb_ancestors_module
- set $rb_ancestors_module = ((struct RClass *)($rb_ancestors_module))->ptr.super
+ set $rb_ancestors_module = RCLASS_SUPER($rb_ancestors_module)
end
end
document rb_ancestors
diff --git a/.gitignore b/.gitignore
index dee365b3c6..9515852837 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,10 +29,11 @@ y.output
y.tab.c
# /
+/*-fake.rb
/*.pc
/*_prelude.c
/COPYING.LIB
-/ChangeLog-1.8.0
+/ChangeLog-*
/ChangeLog.pre-alpha
/ChangeLog.pre1_1
/Doxyfile
@@ -46,6 +47,7 @@ y.tab.c
/autom4te*.cache
/automake
/beos
+/bmlog-*
/breakpoints.gdb
/config.cache
/config.h
@@ -53,6 +55,11 @@ y.tab.c
/config.status
/config.status.lineno
/configure
+/coverage/simplecov
+/coverage/.last_run.json
+/coverage/.resultset.json*
+/coverage/assets
+/coverage/index.html
/doc/capi
/enc.mk
/encdb.h
@@ -95,6 +102,8 @@ y.tab.c
# /benchmark/
/benchmark/bmx_*.rb
+/benchmark/fasta.output.*
+/benchmark/wc.input
# /enc/trans/
/enc/trans/*.c
@@ -106,6 +115,9 @@ y.tab.c
/ext/dl/callback/callback-*.c
/ext/dl/callback/callback.c
+# /ext/etc/
+/ext/etc/constdefs.h
+
# /ext/rbconfig/
/ext/rbconfig/sizeof/sizes.c
@@ -124,6 +136,9 @@ y.tab.c
# /ext/tk/
/ext/tk/config_list
+# /gems
+/gems/*.gem
+
# /spec/
/spec/mspec
/spec/rubyspec
diff --git a/.travis.yml b/.travis.yml
index 8db00587d6..d39c72b0f9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -38,6 +38,9 @@ install: "sudo apt-get -qq build-dep ruby1.9.1 2>/dev/null"
# 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:
+ - "uname -a"
+ - "uname -r"
+ - "rm -fr .ext autom4te.cache"
- "make -f common.mk BASERUBY=ruby srcdir=. update-config_files"
- "autoconf"
- "mkdir config_1st config_2nd"
@@ -50,13 +53,16 @@ before_script:
- "make -sj exts"
script:
- "make test OPTS=-v"
-# - "make test-all TESTS='-v'"
+ - "make test-all TESTS='-qv -j2'"
# Branch matrix. Not all branches are Travis-ready so we limit branches here.
branches:
only:
- trunk
- ruby_1_9_3
+ - ruby_2_0_0
+ - ruby_2_1
+ - ruby_2_2
# We want to be notified when something happens.
notifications:
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000000..ffdf2dd4b8
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,4 @@
+Please see the [official issue tracker] and wiki [HowToContribute].
+
+[official issue tracker]: https://bugs.ruby-lang.org
+[HowToContribute]: https://bugs.ruby-lang.org/projects/ruby/wiki/HowToContribute
diff --git a/ChangeLog b/ChangeLog
index 54a4bbbd3f..dc0c1aed39 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,605 +1,40 @@
-Mon Apr 13 22:17:59 2015 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+Wed Sep 17 23:12:36 2014 NARUSE, Yui <naruse@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.
+ * lib/uri/rfc3986_parser.rb: specify a regexp for :OPAQUE; generic.rb
+ assumes it is present, and will refuse all values otherwise.
+ by Matthew Draper <matthew@trebex.net>
+ https://github.com/ruby/ruby/pull/718 fix GH-718
-Mon Apr 13 17:09:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Sep 17 16:22:58 2014 Eric Wong <e@80x24.org>
- * win32/win32.c (different_device_p): compare by volume serial
- numbers, not by path names. [ruby-core:68162] [Bug #10865]
+ * ext/zlib/zlib.c (zlib_mem_alloc): check overflow
-Mon Apr 13 17:09:06 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Sep 17 11:33:35 2014 Laurent Arnoud <laurent@spkdev.net>
- * 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]
+ * test/fiddle/test_import.rb (Fiddle::TestImport#test_sizeof):
+ added test for long long [fix GH-716]
-Mon Apr 13 17:02:25 2015 Scott Francis <scott.francis@shopify.com>
+Wed Sep 17 11:09:21 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.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]
+ * tool/rbinstall.rb: fixed invalid options with latest rubygems.
+ https://github.com/rubygems/rubygems/issues/1013
-Mon Apr 13 16:52:14 2015 Koichi Sasada <ko1@atdot.net>
+Tue Sep 16 19:19:00 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * class.c (rb_prepend_module): need a WB for klass -> origin.
+ * benchmark/bm_app_aobench.rb: update outdated links to the
+ original program. [ruby-dev:48550] [Feature #10247]
-Mon Apr 13 16:48:14 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Sep 16 01:06:40 2014 NARUSE, Yui <naruse@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]
+ * reg*.c: Merge Onigmo 5.15.0 38a870960aa7370051a3544
-Mon Apr 13 16:39:57 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Sep 15 16:21:10 2014 Eric Wong <e@80x24.org>
- * parse.y (arg): fix segfault by null caused by syntax error.
- [ruby-core:68851] [Bug #10957]
+ * io.c (struct io_advise_struct): 32 => 24 bytes on 64-bit
+ * io.c (struct io_internal_writev_struct): 24 => 16 bytes on 64-bit
+ * process.c (struct waitpid_arg): ditto
-Tue Mar 31 00:49:23 2015 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]
-
-Tue Mar 31 00:38:14 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]
-
-Tue Mar 31 00:34:39 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]
-
-Tue Mar 31 00:32:04 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]
-
-Tue Mar 31 00:18:12 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (primary): empty parentheses at cmdarg can be null.
- [ruby-core:68477] [Bug #10957]
-
-Mon Mar 30 23:30:57 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/io/console/console.c (console_dev): id_console is not a
- constant name, use rb_const_remove() to get rid of NameError.
-
-Sun Mar 22 04:15:39 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/thread/thread.c (Init_thread): ConditionVariable and Queue
- are not able to copy. [ruby-core:59961] [Bug #9440]
-
-Wed Mar 18 02:42:37 2015 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/win32.c (w32_spawn): `v2` is used not only for `shell` but also
- `cmd`, so must not free before using `cmd`.
- [ruby-core:66648] [Bug #10563]
-
-Wed Mar 18 02:40:18 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/win32.c (constat_reset): do nothing on non-standard
- console emulators. [ruby-core:66471] [Bug #10546]
-
-Wed Mar 18 02:03:02 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.
-
-Wed Mar 18 01:58:18 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 Mar 18 01:45:12 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]
-
-Wed Mar 18 00:58:43 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 Mar 18 00:58:43 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]
-
-Wed Mar 18 00:32:08 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]
-
-Tue Mar 10 02:40:11 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * thread.c: Improve documentation for Thread#value
- [Bug #10694][ruby-core:67324][ci skip]
-
-Tue Mar 10 02:37:55 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * string.c: [DOC] Add missing documentation around String#chomp.
- Patch by @stderr [ci skip][fix GH-780]
-
-Mon Mar 9 22:30:50 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * spec/default.mspec: use default configuration file name.
- https://github.com/ruby/rubyspec/commit/cc69f337b06362e5607ffa3e3ad40ef7494960cf
-
-Mon Mar 9 22:30:50 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * spec/default.mspec: remove specific version number.
- https://github.com/ruby/rubyspec/commit/7a909e925c1baa9c700bd44af9241aef6e596714
-
-Mon Mar 9 22:27:47 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * common.mk: use ruby organization for rubyspec.
-
-Mon Mar 9 21:52:41 2015 NARUSE, Yui <naruse@ruby-lang.org>
-
- * lib/uri/generic.rb (URI::Generic.build):
- use hostname= to detect and wrap IPv6 hosts.
- Build is accepting URI components and users may not expect
- that a host component needs to be wrapped with square brackets
- since it's not providing a URI.
- Note: initialize with arg_check => true does not wrap IPv6 hosts.
- by Joe Rafaniello <jrafanie@redhat.com>
- https://github.com/ruby/ruby/pull/765 fix GH-765
-
- * test/uri/test_generic.rb: Add more tests
-
-Tue Mar 3 02:42:27 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 02:30:23 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]
-
-Sun Mar 1 01:17:24 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]
-
-Sun Mar 1 01:14:59 2015 Eric Wong <e@80x24.org>
-
- * lib/resolv.rb: consider ENETUNREACH as ResolvTimeout
- [ruby-core:67411] [Bug #10712]
-
-Sun Mar 1 01:01:21 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]
-
-Sun Mar 1 01:01:21 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.
-
-Sun Mar 1 00:58:30 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * ext/zlib/zlib.c: fix document of method signatures.
- [Bug #10668][ruby-core:67186][ci skip]
-
-Sat Feb 28 02:13:17 2015 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb (Resolv::DNS::Name#==): Compare an array of Label:Str
- objects. Label#Str#== is case-insensitive.
-
-Sat Feb 28 02:13:17 2015 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]
-
-Sat Feb 28 02:13:17 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/resolv.rb (Resolv::DNS::Name): names with different dots
- should be different.
-
-Thu Feb 19 19:14:34 2015 NARUSE, Yui <naruse@ruby-lang.org>
-
- * lib/net/http/response.rb (Net::HTTPResponse): require one or more
- spaces [Bug #10591].
- by leriksen <leif.eriksen.au@gmail.com>
- https://github.com/ruby/ruby/pull/782 fix GH-782
- NOTE: graph.facebook.com returns without SP Reason-Phrase.
-
-Thu Feb 19 19:10:53 2015 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]
-
-Wed Feb 18 00:27:57 2015 Eric Hodel <drbrain@segment7.net>
-
- * lib/net/http.rb: Do not attempt SSL session resumption when the
- session is expired. [Bug #10533]
-
-Wed Feb 18 00:20:36 2015 Eric Wong <e@80x24.org>
-
- * vm_eval.c (rb_yield_splat): add missing GC guard
- [Bug #10509]
-
-Wed Feb 18 00:18:12 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]
-
-Tue Feb 17 22:59:31 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]
-
-Sun Feb 15 07:29:12 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.
-
-Mon Feb 2 22:57:30 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/etc/etc.c (etc_getlogin): set login name encoding properly.
- [ruby-core:66163] [Bug #10493]
-
-Mon Feb 2 22:47:35 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (method_proc): the receiver of binding from method should
- be same as the receiver of the method.
- [ruby-core:65917] [Bug #10432]
-
-Mon Feb 2 22:43:42 2015 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * lib/resolv.rb: fall back if canonicalization fails.
- Thanks Vit Ondruch for the patch! [ruby-core:65836]
-
- * test/resolv/test_dns.rb: test for patch
-
-Mon Feb 2 22:38:53 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (rb_cv_binary_elf): get rid of -e option of cat
- which is not available on BusyBox, use tr instead.
- [ruby-core:64824] [Bug #10210]
-
-Thu Jan 22 20:40:36 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/openssl/ossl_cipher.c (ossl_cipher_update_long): update huge
- data gradually not to exceed INT_MAX. workaround of OpenSSL API
- limitation. [ruby-core:67043] [Bug #10633]
-
-Thu Jan 22 01:14:12 2015 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * signal.c (ruby_signal): since SIGKILL is not supported by MSVCRT,
- should be treated before calling signal(3).
- [Bug #10615]
-
-Thu Jan 22 01:02:16 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * thread.c (exec_recursive): use the same last method name as
- recursive_push in the error message when recursive_pop failed.
- [ruby-core:66742] [Bug #10579]
-
-Thu Jan 22 01:02:16 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * eval.c (rb_frame_last_func): return the most recent frame method
- name.
-
- * thread.c (recursive_list_access): use the last method name,
- instead of the current method name which can be unset in some
- cases, not to use a symbol by the invalid ID.
- [ruby-core:66742] [Bug #10579]
-
-Thu Jan 22 00:54:00 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (symbol_list): fix the node type of literal symbol list
- with no interpolation. [ruby-core:66343]
-
-Thu Jan 22 00:49:52 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * object.c: [DOC] Revise documentation by Marcus Stollsteimer at
- [ruby-core:66368]. [Bug #10526]
-
- * #inspect: be more specific about generated string, remove
- obsolete example.
- * #nil?: use code examples instead of different call-seq's.
- * #tap: clarify what is yielded.
- * Integer(): be more specific about to_int and to_i, remove
- reference to Ruby 1.8.
- * Array(): fix error.
- * Class: fix variable name style and indentation in example.
- * improve consistency, fix typos and formatting.
-
-Thu Jan 22 00:49:52 2015 Benoit Daloze <eregontp@gmail.com>
-
- * object.c (Module#const_defined?): [DOC] Revise the documentation.
- Patch by Xavier Noria.
- [Fixes GH-754] https://github.com/ruby/ruby/pull/754
-
-Thu Jan 22 00:49:52 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * object.c: fix document of Kernel.Stirng by @suzukaze
- [fix GH-743][ci skip]
-
-Thu Jan 22 00:25:15 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * load.c (rb_f_load): path name needs to be transcoded to OS path
- encoding. [ruby-list:49994]
-
-Wed Jan 21 04:36:27 2015 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]
-
-Wed Jan 21 04:36:27 2015 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (NET_LUID): include also ifdef.h as a workaround of
- a bug in mingw-w64 header. [ruby-core:67103] [Bug #10640]
-
-Wed Jan 7 22:34:52 2015 NARUSE, Yui <naruse@ruby-lang.org>
-
- * tool/config_files.rb: use config.guess in gcc repo.
-
-Tue Jan 6 00:04:38 2015 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * test/ruby/test_io.rb: added timeout for AIX environment.
- [ruby-core:62983][Bug #9917]
-
-Mon Jan 5 23:58:50 2015 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * test/ruby/test_string.rb(test_LSHIFT_neary_long_max):
- increase timeout for Arch Linux CI environment.
-
-Wed Dec 31 00:00:09 2014 NARUSE, Yui <naruse@ruby-lang.org>
-
- * lib/net/http.rb (Net::HTTP.proxy_uri): use initializer instead
- of parser to handle IPv6 address. [Bug #9129]
-
-Tue Dec 30 23:46:26 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * lib/rubygems/*: upgrade to RubyGems 2.2.3. [Backport #10515]
-
-Thu Nov 13 22:32:34 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * lib/rexml/document.rb: add REXML::Document#document.
- reported by Tomas Hoger <thoger@redhat.com> and patched by nahi.
-
-Thu Nov 6 22:57:43 2014 Naohisa Goto <ngotogenome@gmail.com>
-
- * bignum.c (absint_numwords_generic): set an array element after
- definition of a variable to fix compile error with older version
- of fcc (Fujitsu C Compiler) 5.6 on Solaris 10 on Sparc.
- [Bug #10350] [ruby-dev:48608]
-
-Thu Nov 6 22:36:55 2014 Naohisa Goto <ngotogenome@gmail.com>
-
- * compile.c (compile_data_alloc): add padding when strict alignment
- is required for memory access. Currently, the padding is enabled
- only when the CPU is 32-bit SPARC and the compiler is GCC.
- [Bug #9681] [ruby-core:61715]
-
- * compile.c (STRICT_ALIGNMENT): defined if strict alignment is required
-
- * compile.c (ALIGNMENT_SIZE, ALIGNMENT_SIZE_MASK, PADDING_SIZE_MAX):
- new macros for alignemnt word size, bit mask, max size of padding.
-
- * compile.c (calc_padding): new function to calculate padding size.
-
-Wed Nov 5 00:18:22 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (__builtin_setjmp): disable with gcc/clang earlier
- than 4.3 on Mac OS X. [ruby-core:65174] [Bug #10272]
-
-Wed Nov 5 00:01:04 2014 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_mul_balance_with_mulfunc): Fix free work area
- location.
- [ruby-dev:48723] [Bug #10464]
- [ruby-core:66044] [Bug #10465]
- Reported by Kohji Nishihama.
-
-Tue Oct 28 22:30:21 2014 NARUSE, Yui <naruse@ruby-lang.org>
-
- * configure.in: remove apple-gcc4.2 from CC candidates.
-
-Tue Oct 28 22:19:44 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * version.h (RUBY_VERSION): bump RUBY_VERSION to 2.1.5.
-
-Mon Oct 27 20:20:14 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * lib/rexml/entity.rb: keep the entity size within the limitation.
- reported by Willis Vandevanter <will@silentrobots.com> and
- patched by nahi.
-
-Sun Oct 26 03:31:46 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_method.c (rb_method_entry_make): warn redefinition only for
- already defined methods, but not for undefined methods.
- [ruby-dev:48691] [Bug #10421]
-
-Sun Oct 26 03:21:30 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * class.c (unknown_keyword_error): delete expected keywords
- directly from raw table, so that the given block is not called.
- [ruby-core:65837] [Bug #10413]
-
-Wed Oct 22 23:02:49 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * ext/openssl/lib/openssl/ssl.rb (DEFAULT_PARAMS): override
- options even if OpenSSL::SSL::OP_NO_SSLv3 is not defined.
- this is pointed out by Stephen Touset. [ruby-core:65711] [Bug #9424]
-
-Wed Oct 22 23:02:49 2014 Martin Bosslet <Martin.Bosslet@gmail.com>
-
- * test/openssl/test_ssl.rb: Reuse TLS default options from
- OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.
-
-Wed Oct 22 23:02:49 2014 Martin Bosslet <Martin.Bosslet@gmail.com>
-
- * lib/openssl/ssl.rb: Explicitly whitelist the default
- SSL/TLS ciphers. Forbid SSLv2 and SSLv3, disable
- compression by default.
- Reported by Jeff Hodges.
- [ruby-core:59829] [Bug #9424]
-
-Sun Oct 19 03:22:53 2014 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * vm_core.h, vm.c, proc.c: fix GC mark miss on bindings.
- [ruby-dev:48616] [Bug #10368]
-
- * test/ruby/test_eval.rb: add a test code.
-
-Sun Oct 19 03:13:38 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_here_document): do not append already appended
- and disposed code fragment. [ruby-dev:48647] [Bug #10392]
-
-Thu Oct 16 22:10:11 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/stringio/stringio.c (strio_write): ASCII-8BIT StringIO
- should be writable any encoding strings, without conversion.
- [ruby-core:65240] [Bug #10285]
-
-Thu Oct 16 22:06:03 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_eval.c (eval_string_with_cref): fix super from eval with
- scope. set klass in the current control frame to the class of
- the receiver in the context to be evaluated, this class/module
- must match the actual receiver to call super.
- [ruby-core:65122] [Bug #10263]
-
-Thu Oct 16 00:30:30 2014 Tanaka Akira <akr@fsij.org>
-
- * lib/find.rb (Find.find): Call to_path for arguments to obtain
- strings.
- [ruby-core:63713] [Bug #10035] Reported by Herwin.
-
-Thu Oct 16 00:20:12 2014 Eric Wong <e@80x24.org>
-
- * object.c (rb_class_real): do not dereference 0 VALUE
-
- * test/ruby/test_module.rb (test_inspect_segfault):
- Test case and bug report by Thomas Stratmann.
- [ruby-core:65214] [Bug #10282]
-
-Thu Oct 16 00:10:45 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * signal.c (rb_f_kill): get rid of deadlock as unhandled and
- discarded signals do not make interrupt_cond signaled.
- based on the patch by Kazuki Tsujimoto at [ruby-dev:48606].
- [Bug #9820]
-
-Thu Oct 16 00:10:45 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * signal.c (rb_f_kill): should not ignore signal unless the
- default handler is registered. [ruby-dev:48592] [Bug #9820]
-
-Wed Oct 15 23:58:13 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- merge r47598 partially. extracted commits are as follows. [Bug #9728]
- https://github.com/k-takata/Onigmo/commit/15ddec6d18e27fdc1988236764e766fd5892ecf5
-
-Wed Oct 15 23:50:33 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * lib/fileutils.rb: handle ENOENT error with symlink targeted to
- non-exists file. [ruby-dev:45933] [Bug #6716]
-
-Wed Oct 15 23:25:24 2014 NARUSE, Yui <naruse@ruby-lang.org>
-
- * configure.in: NetBSD's ksh, used by configure, needs escapes.
-
-Wed Oct 15 23:13:43 2014 Eric Wong <e@80x24.org>
-
- * array.c (ary_recycle_hash): add RB_GC_GUARD
- (rb_ary_diff): remove volatile
- [Bug #10369]
-
-Wed Oct 15 23:10:07 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * dir.c (dir_s_aref): fix rdoc. `Dir.glob` allows an array but
- `Dir[]` not. the former accepts an optional parameter `flags`,
- while the latter accepts arbitrary number of arguments but no
- `flags`. [ruby-core:65265] [Bug #10294]
-
-Wed Oct 15 23:08:02 2014 Rei Odaira <Rei.Odaira@gmail.com>
-
- * configure.in: Fix typo. [Bug #9914]
-
-Wed Oct 15 22:46:52 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * error.c: update exception tree. [DOC]
- reported by @hemge via twitter.
-
-Wed Sep 24 02:30:55 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parse_ident): just after a label, new expression should
- start, cannot be a modifier. [ruby-core:65211] [Bug #10279]
-
-Wed Sep 24 02:21:41 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/Makefile.sub (VCSUP): nothing to do if this worktree is not
- under any VCS (it means that the worktree may be from the release
- package).
-
-Wed Sep 24 02:06:33 2014 Tanaka Akira <akr@fsij.org>
-
- * test/ruby/test_time_tz.rb: Fix test error with tzdata-2014g.
- [ruby-core:65058] [Bug #10245] Reported by Vit Ondruch.
-
-Wed Sep 24 02:06:33 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * test/minitest/test_minitest_unit.rb: removed obsoleted condition
- for Ruby 1.8.
- * test/ruby/test_time_tz.rb: ditto.
-
-Wed Sep 24 01:43:13 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * version.h (RUBY_VERSION): bump RUBY_VERSION to 2.1.4.
-
-Fri Sep 19 00:58:34 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * version.h (RUBY_VERSION): bump RUBY_VERSION to 2.1.3.
-
-Mon Sep 15 23:12:47 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * signal.c (check_stack_overflow): drop the last tag too close to
- the fault page, to get rid of stack overflow deadlock.
- [Bug #9971]
-
-Mon Sep 15 22:34:39 2014 Natalie Weizenbaum <nweiz@google.com>
+Mon Sep 15 10:29:25 2014 Natalie Weizenbaum <nweiz@google.com>
* ext/pathname/lib/pathname.rb (SAME_PATHS):
Pathname#relative_path_from uses String#casecmp to compare strings
@@ -607,19857 +42,8155 @@ Mon Sep 15 22:34:39 2014 Natalie Weizenbaum <nweiz@google.com>
return nil for strings with different encodings, and the code
previously assumed that it always returned a Fixnum. [Fix GH-713]
-Mon Sep 15 22:31:33 2014 Sho Hashimoto <sho.hsmt@gmail.com>
+Mon Sep 15 09:43:18 2014 Sho Hashimoto <sho.hsmt@gmail.com>
* ext/fiddle/lib/fiddle/import.rb (Fiddle::Importer#sizeof): fix typo,
SIZEOF_LONG_LON. [Fix GH-714]
-Mon Sep 15 11:08:23 2014 Shota Fukumori <her@sorah.jp>
-
- * lib/mkmf.rb (configuration): Make CXXFLAGS customizable.
- Patch by Kohei Suzuki (eagletmt). [Fixes GH-492]
-
-Mon Sep 15 01:06:35 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb (MakeMakefile#pkg_config): append --cflags to also
- $CXXFLAGS, as they are often used by C++ compiler.
- [ruby-core:54532] [Bug #8315]
-
-Mon Sep 15 00:02:20 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/csv.rb (CSV#<<): honor explicitly given encoding. based on
- the patch by DAISUKE TANIWAKI <daisuketaniwaki AT gmail.com> at
- [ruby-core:62113]. [Bug #9766]
-
-Wed Sep 10 23:36:38 2014 Koichi Sasada <ko1@atdot.net>
-
- * test/ruby/test_object.rb: extend timeout.
-
-Wed Sep 10 23:36:38 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * object.c (rb_obj_copy_ivar): allocate no memory for empty
- instance variables. [ruby-core:64700] [Bug #10191]
-
-Wed Sep 10 23:36:38 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * object.c (rb_obj_copy_ivar): extract function to copy instance
- variables only for T_OBJECT from init_copy.
-
-Wed Sep 10 23:14:42 2014 NARUSE, Yui <naruse@ruby-lang.org>
-
- merge r46831 partially. extracted commits are as follows. [Bug #9344]
- https://github.com/k-takata/Onigmo/commit/bdfc1997aa15b6baddaf9a482c6610b32504bd86
-
- * regcomp.c: Merge Onigmo 5.14.1 25a8a69fc05ae3b56a09.
- this includes Support for Unicode 7.0 [Bug #9092].
-
-Wed Sep 10 22:58:25 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * common.mk (Doxyfile): revert r43888, not to require preinstalled
- ruby. [ruby-core:64488] [Bug #10161]
-
-Wed Sep 10 03:29:48 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * io.c (io_close): ignore only "closed stream" IOError and
- NoMethodError, do not swallow other exceptions at the end of
- block. [ruby-core:64463] [Bug #10153]
-
-Wed Sep 10 03:17:13 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * enc/trans/euckr-tbl.rb (EUCKR_TO_UCS_TBL): add missing euro and
- registered signs. [ruby-core:64452] [Bug #10149]
-
-Wed Sep 10 03:01:31 2014 Eric Wong <e@80x24.org>
-
- * time.c (time_timespec): fix tv_nsec overflow
- [Bug #10144]
-
-Wed Sep 10 02:51:38 2014 Koichi Sasada <ko1@atdot.net>
-
- * iseq.c (rb_iseq_clone): Should not insert write barrier from
- non-RVALUE data (to non-RVALUE data, of course).
-
- Ruby 2.1 also has a same problem.
-
-Wed Sep 10 02:33:08 2014 Koichi Sasada <ko1@atdot.net>
-
- * parse.y (setup_fake_str): fake strings should not set class by
- RBASIC_SET_CLASS() because it insert write barriers to fake
- (non-RVALUE) structure.
-
- It can cause unexpected behaviour.
-
-Fri Sep 5 17:01:38 2014 Zachary Scott <e@zzak.io>
-
- * lib/rdoc/generator/template/darkfish/js/jquery.js: Backport
- rdoc/rdoc@74f60fcb04fee1778fe2694d1a0ea6513f8e67b7
-
-Sat Sep 6 00:57:07 2014 Eric Wong <e@80x24.org>
-
- * ext/zlib/zlib.c (gzfile_reset): preserve ZSTREAM_FLAG_GZFILE
- [Bug #10101]
-
- * test/zlib/test_zlib.rb (test_rewind): test each_byte
-
-Sat Sep 6 00:47:32 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (rb_cv_broken_backtrace): exit with failure
- normally, no needs to abort. [ruby-core:63678] [Bug #10008]
-
-Sat Sep 6 00:05:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/win32.h, win32/win32.c (rb_w32_inet_pton): add a
- wrapper function for inet_pton minimum supported client is
- Vista, as well as inet_ntop.
-
-Sat Sep 6 00:05:02 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-
- * ext/socket/raddrinfo.c (rb_getaddrinfo): second argument of
- MEMZERO is type. Coverity Scan found this bug.
-
-Sat Sep 6 00:05:02 2014 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/raddrinfo.c (numeric_getaddrinfo): Use xcalloc.
- Suggested by Eric Wong.
- https://bugs.ruby-lang.org/issues/9525#note-14
-
-Sat Sep 6 00:05:02 2014 Tanaka Akira <akr@fsij.org>
-
- * ext/socket: Bypass getaddrinfo() if node and serv are numeric.
- Reporeted by Naotoshi Seo. [ruby-core:60801] [Bug #9525]
-
- * ext/socket/extconf.rb: Detect struct sockaddr_in6.sin6_len.
-
- * ext/socket/sockport.h (SET_SIN6_LEN): New macro.
- (INIT_SOCKADDR_IN6): Ditto.
-
- * ext/socket/rubysocket.h (struct rb_addrinfo): Add
- allocated_by_malloc field.
-
- * ext/socket/raddrinfo.c (numeric_getaddrinfo): New function.
- (rb_getaddrinfo): Call numeric_getaddrinfo at first.
- (rb_freeaddrinfo): Free struct addrinfo properly when it is
- allocated by numeric_getaddrinfo.
-
-Sat Sep 6 00:05:02 2014 Tanaka Akira <akr@fsij.org>
-
- * ext/socket: Wrap struct addrinfo by struct rb_addrinfo.
-
-Thu Sep 4 00:31:23 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/thread/thread.c (get_array): check instance variables are
- initialized properly. [ruby-core:63826][Bug #10062]
-
-Thu Sep 4 00:29:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * io.c (rb_io_initialize): [DOC] fix rdoc of append mode. it does
- not move the pointer at open. [ruby-core:63747] [Bug #10039]
-
-Thu Sep 4 00:23:15 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * sprintf.c (GETASTER): should not use the numbered argument to be
- formatted, raise ArgumentError instead.
- [ruby-dev:48330] [Bug #9982]
-
-Thu Sep 4 00:21:05 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * test/openssl/test_pkey_rsa.rb (OpenSSL#test_sign_verify_memory_leak):
- added timeout into testcase for low performance environment.
- [Bug #9984][ruby-core:63367]
-
-Tue Sep 2 02:21:58 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (env_aset, env_has_key, env_assoc, env_has_value),
- (env_rassoc, env_key): prohibit tainted strings if $SAFE is
- non-zero. [Bug #9976]
-
-Tue Sep 2 02:08:12 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * signal.c (rb_f_kill): directly enqueue an ignored signal to self,
- except for SIGSEGV and SIGBUS. [ruby-dev:48203] [Bug #9820]
-
-Sun Aug 31 01:13:21 2014 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: change full GC timing to keep lower memory usage.
-
- Extend heap only at
- (1) after major GC
- or
- (2) after several (two times, at current) minor GC
-
- Details in https://bugs.ruby-lang.org/issues/9607#note-9
- [Bug #9607]
-
-Sun Aug 31 01:07:05 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-
- * ext/win32ole/win32ole.c (ole_create_dcom): use the converted
- result if the argument can be converted to a string, to get rid
- of invalid access. Thanks to nobu. [ruby-dev:48467] [Bug #10127]
-
-Sun Aug 31 00:54:47 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * process.c (open): use UTF-8 version function to support
- non-ascii path properly. [ruby-core:63185] [Bug #9946]
-
-Tue Aug 26 00:08:40 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (RUBY_SETJMP_TYPE): check for setjmp type after
- CCDLFLAGS is appended to CFLAGS, since __builtin_setjmp can be
- affected. [ruby-core:62469] [Bug #9818]
-
-Tue Aug 26 00:07:20 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: get rid of __builtin_setjmp/__builtin_longjmp on
- x64-mingw, which causes SEGV with callcc.
- [ruby-core:61887] [Bug #9710]
-
-Tue Aug 26 00:06:05 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (ac_cv_func___builtin_setjmp): should not skip
- flags restoration in RUBY_WERROR_FLAG by `break`.
- [ruby-dev:48086] [Bug #9698]
-
-Tue Aug 26 00:02:51 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (ac_cv_func___builtin_setjmp): __builtin_longjmp()
- in Apple LLVM 5.1 (LLVM 3.4svn) uses `void**`, not `jmp_buf`.
- [Bug #9692]
-
-Tue Aug 26 00:02:51 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (ac_cv_func___builtin_setjmp): gcc 4.9 disallows a
- variable as the second argument of __builtin_longjmp().
- [ruby-core:61800] [Bug #9692]
-
-Mon Aug 25 00:36:56 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_yylex): fix invalid char in eval, should raise
- an syntax error too, as well as directly coded.
- [ruby-core:64243] [Bug #10117]
-
-Mon Aug 25 00:26:12 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_yyerror): preserve source code encoding in
- syntax error messages. [ruby-core:64228] [Bug #10114]
-
-Sat Aug 23 02:39:20 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_insnhelper.c (vm_call_method): unusable super class should cause
- method missing when BasicObject is refined but not been using.
- [ruby-core:64166] [Bug #10106]
-
-Sat Aug 23 02:22:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (rb_str_count): fix wrong single-byte optimization.
- 7bit ascii can be a trailing byte in Shift_JIS.
- [ruby-dev:48442] [Bug #10078]
-
-Thu Aug 21 01:44:46 2014 Tanaka Akira <akr@fsij.org>
-
- * gc.c (mark_current_machine_context): Call SET_STACK_END.
- This reverts a hunk of r40703 by ko1.
- This fixes [ruby-dev:48098] [Bug #9717].
-
-Thu Aug 21 01:41:09 2014 Tanaka Akira <akr@fsij.org>
-
- * lib/time.rb (Time.parse): [DOC] Fix an example in the documentation
- to use EST.
- Reported by Marcus Stollsteimer.
- [ruby-core:60778] [Bug #9521] and [ruby-core:61718] [Bug #9682]
-
-Thu Aug 21 01:41:09 2014 Zachary Scott <e@zzak.io>
-
- * lib/time.rb: [DOC] Fix timezone in example of Time.parse [Bug #9521]
- Based on patch by @stomar
-
-Tue Aug 19 23:31:48 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- merge r46831 partially. extracted commits are as follows.
- https://github.com/k-takata/Onigmo/commit/b9fba1dc63ccb42a86e934011b468e6022fabb74
- https://github.com/k-takata/Onigmo/commit/c1fc76b9bd463948ffc5058bc352bf93732f0314
- https://github.com/k-takata/Onigmo/commit/a0efc0a200f7108ca3d5ac3039c8f952e0051619
- https://github.com/k-takata/Onigmo/commit/c7cda4ed5676167b0d01bb5555724f6164fbdb13
- [Bug #8716]
-
- * include/ruby/oniguruma.h (ONIG_MAX_CAPTURE_GROUP_NUM,
- ONIGERR_TOO_MANY_CAPTURE_GROUPS): add cheking the number of capture
- groups.
-
- * regerror.c (onig_error_code_to_format): ditto.
-
- * regparse.c (scan_env_add_mem_entry): ditto.
-
- * regexec.c (onig_region_copy, match_at): fix: segmation fault occurs
- when many groups are used.
-
-Mon Aug 18 23:38:21 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * encoding.c (enc_find): [DOC] never accepted a symbol.
- [ruby-dev:48308] [Bug #9966]
-
-Mon Aug 18 23:22:03 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (rb_str_resize): update capa only when buffer get
- reallocated.
- http://d.hatena.ne.jp/nagachika/20140613/ruby_trunk_changes_46413_46420#r46413
-
-Mon Aug 18 23:22:03 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (rb_str_resize): should consider the capacity instead
- of the old length, as pointed out by nagachika.
-
-Mon Aug 18 23:22:03 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * file.c (expand_path): shrink expanded path which no longer needs
- rooms to append. [ruby-core:63114] [Bug #9934]
-
-Mon Aug 11 23:55:32 2014 Mark Lorenz <mlorenz@covermymeds.com>
-
- * lib/erb.rb (result): [DOC] no longer accepts a Proc, as
- Kernel.eval does not. [fix GH-619]
-
-Mon Aug 11 23:38:20 2014 Tanaka Akira <akr@fsij.org>
-
- * io.c (rb_io_autoclose_p): Don't raise on frozen IO.
-
-Mon Aug 11 23:38:20 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * io.c (rb_io_fileno, rb_io_inspect): non-modification does not
- error on frozen IO. [ruby-dev:48241] [Bug #9865]
-
-Mon Aug 11 22:34:47 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (posix_fadvise): disable use of posix_fadvise
- itself on 32-bit AIX. [ruby-core:62968] [Bug #9914]
-
-Mon Aug 11 22:34:47 2014 <kanemoto@ruby-lang.org>
-
- * io.c (rb_io_advise): AIX currently does not support a 32-bit call to
- posix_fadvise() if _LARGE_FILES is defined. Patch by Rei Odaira.
- [ruby-core:62968] [Bug #9914]
-
-Mon Aug 11 22:14:28 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_insnhelper.c (vm_callee_setup_keyword_arg): adjust VM stack
- pointer to get rid of overwriting splat arguments by arguments
- for `to_hash` conversion. [ruby-core:63593] [Bug #10016]
-
-Fri Aug 8 23:36:01 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/stringio/stringio.c (strio_write): use rb_str_append to
- reuse coderange bits other than ASCII-8BIT, and keep
- taintedness. [ruby-dev:48118] [Bug #9769]
-
-Mon Aug 4 01:29:57 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (env_shift): fix memory leak on Windows, free environment
- strings block always. [ruby-dev:48332] [Bug #9983]
-
-Mon Aug 4 01:26:46 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (env_select): fix memory leak and crash on Windows, make
- keys array first instead of iterating on environ directly.
- [ruby-dev:48325] [Bug #9978]
-
-Mon Aug 4 01:24:09 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (ruby_setenv): fix memory leak on Windows, free
- environment strings block after check for the size.
- [ruby-dev:48323] [Bug #9977]
-
-Mon Aug 4 01:11:07 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * re.c (match_aref, rb_reg_regsub): consider encoding of captured
- names, encoding-incompatible should not match.
- [ruby-dev:48278] [Bug #9903]
-
-Mon Aug 4 00:52:42 2014 Koichi Sasada <ko1@atdot.net>
-
- * vm_eval.c (rb_catch_protect): fix same problem of [Bug #9961].
-
- * vm_eval.c (rb_iterate): ditto.
-
-Mon Aug 4 00:52:42 2014 Koichi Sasada <ko1@atdot.net>
-
- * vm.c (rb_vm_rewind_cfp): add new function to rewind specified cfp
- with invoking RUBY_EVENT_C_RETURN.
- [Bug #9961]
-
- * vm_core.h: ditto.
-
- * eval.c (rb_protect): use it.
-
- * eval.c (rb_rescue2): ditto.
-
- * vm_eval.c (rb_iterate): ditto.
-
- * test/ruby/test_settracefunc.rb: add a test.
-
- * vm_core.h (rb_vm_rewind_cfp): add the prototype declaration.
-
-Sun Aug 3 00:06:10 2014 Charlie Somerville <charliesome@ruby-lang.org>
-
- * node.c (dump_node): handle nd_value == (NODE *)-1 to mean this
- keyword argument is required
-
-Thu Jul 31 01:56:11 2014 Koichi Sasada <ko1@atdot.net>
-
- * compile.c (rb_iseq_compile_node): put start label of block after
- trace (b_call).
- [Bug #9964]
-
- * test/ruby/test_settracefunc.rb: add a test.
-
- added assert_consistent_call_return() method check call/return
- consistency.
-
-Thu Jul 31 01:22:43 2014 Koichi Sasada <ko1@atdot.net>
-
- * vm.c (invoke_block_from_c): move call/return event timing for
- bmethod. It can invoke inconsistent call event if this call raises
- argument error.
- [Bug #9959]
-
- * vm_insnhelper.c (vm_call_bmethod_body): ditto.
-
- * test/ruby/test_settracefunc.rb: add a test.
-
-Thu Jul 31 01:12:55 2014 Koichi Sasada <ko1@atdot.net>
-
- * vm_core.h: add VM_FRAME_MAGIC_RESCUE to recognize normal block or
- rescue clause.
-
- * vm.c (vm_exec): use VM_FRAME_MAGIC_RESCUE on at rescue/ensure.
-
- * test/ruby/test_settracefunc.rb: should not invoke b_return at rescue
- clause.
- [Bug #9957]
-
- * vm_dump.c (control_frame_dump): check VM_FRAME_MAGIC_RESCUE.
-
- * vm_dump.c (vm_stack_dump_each): ditto.
-
-Thu Jul 31 00:44:34 2014 Koichi Sasada <ko1@atdot.net>
-
- * vm_trace.c: clear and restore recursive checking thread local data
- to avoid unexpected throw from TracePoint.
- [Bug #9940]
-
- * test/ruby/test_settracefunc.rb: add a test.
-
- * thread.c: added
- * rb_threadptr_reset_recursive_data(rb_thread_t *th);
- * rb_threadptr_restore_recursive_data(rb_thread_t *th, VALUE old);
-
- * vm_core.h: ditto.
-
-Wed Jul 23 23:49:59 2014 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-
- * lib/test/unit/parallel.rb: fix test-all parallel failure if a test
- is skipped after raise.
- DL::TestFunc#test_sinf is skipped after raise on mingw ruby.
- But it causes Marshal.load failure due to undefined class/module
- DL::DLError when doing test-all parallel and test-all doesn't
- complete. We create new MiniTest::Skip object to avoid Marshal.load
- failure.
- [ruby-core:62133] [Bug #9767]
-
- * test/testunit/test_parallel.rb (TestParallel): add a test.
-
- * test/testunit/tests_for_parallel/ptest_forth.rb: ditto.
-
-Wed Jul 23 23:11:28 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * test/socket/test_socket.rb: unix socket is required by test case.
-
-Wed Jul 23 23:11:28 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * test/socket/test_addrinfo.rb: remove unused variables.
- * test/socket/test_nonblock.rb: ditto.
- * test/socket/test_socket.rb: ditto.
- * test/socket/test_unix.rb: ditto.
- * test/testunit/test_parallel.rb: ditto.
- * test/webrick/test_filehandler.rb: ditto.
- * test/xmlrpc/test_features.rb: ditto.
- * test/zlib/test_zlib.rb: ditto.
-
-Wed Jul 23 23:05:19 2014 Tanaka Akira <akr@fsij.org>
-
- * ext/pathname/lib/pathname.rb (cleanpath_aggressive): make all
- separators File::SEPARATOR from File::ALT_SEPARATOR.
- Reported by Daniel Rikowski.
- Fixed by Nobuyoshi Nakada. [Bug #9618]
-
- * ext/pathname/lib/pathname.rb (cleanpath_conservative): ditto.
-
-Wed Jul 23 22:51:34 2014 Naohisa Goto <ngotogenome@gmail.com>
-
- * lib/fileutils.rb (rmdir): rescue Errno::EEXIST in addition to
- ENOTEMPTY (and ENOENT), because SUSv3 describes that "If the
- directory is not an empty directory, rmdir() shall fail and set
- errno to [EEXIST] or [ENOTEMPTY]" and Solaris uses EEXIST.
- [Bug #9571] [ruby-dev:48017]
-
-Wed Jul 23 22:43:50 2014 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb (bind_random_port): Rescue EPERM for FreeBSD which
- security.mac.portacl.port_high is changed.
- See mac_portacl(4) for details.
- Reported by Jakub Szafranski. [ruby-core:60917] [Bug #9544]
-
-Wed Jul 23 22:24:26 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * test/openssl/test_x509cert.rb: split assertions into algorithms.
- CentOS 7 seems finish MD5 support
- http://chkbuild005.hsbt.org/chkbuild/ruby-trunk/log/20140722T140010Z.fail.html.gz
-
- * test/openssl/test_x509req.rb: ditto.
-
-Sat Jul 19 01:44:34 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * re.c (match_aref): should not ignore name after NUL byte.
- [ruby-dev:48275] [Bug #9902]
-
-Sun Jul 13 23:28:41 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * test/test_timeout.rb (test_timeout): inverted test condition.
- [Bug #8523]
-
-Sun Jul 13 23:18:11 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/digest/digest.c (rb_digest_instance_equal): no need to call
- `to_s` twice. [Bug #9913]
-
-Sun Jul 13 23:18:11 2014 Benoit Daloze <eregontp@gmail.com>
-
- * ext/digest/digest.c (rb_digest_instance_equal):
- fix #== for non-string arguments. [ruby-core:62967] [Bug #9913]
-
- * test/digest/test_digest.rb: add test for above.
-
-Sun Jul 13 23:10:03 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * array.c (yield_indexed_values): extract from permute0(),
- rpermute0(), and rcombinate0().
-
-Sun Jul 13 23:02:36 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * array.c (rb_ary_permutation): `p` is the array of size `r`, as
- commented at permute0(). since `n >= r` here, buffer overflow
- never happened, just reduce unnecessary allocation though.
-
-Sun Jul 13 22:52:43 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * pack.c (encodes): fix buffer overrun by tail_lf. Thanks to
- Mamoru Tasaka and Tomas Hoger. [ruby-core:63604] [Bug #10019]
-
-Sun Jul 13 22:44:05 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/thread/thread.c (undumpable): ConditionVariable and Queue
- are not dumpable. [ruby-core:61677] [Bug #9674]
-
-Fri Jul 11 23:07:09 2014 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-
- * lib/matrix.rb: Fix sign for cross_product [#9499]
-
-Sun Jul 6 23:16:30 2014 Masaya Tarui <tarui@ruby-lang.org>
-
- * st.c (st_foreach_check): change start point of search at check
- from top to current. [ruby-dev:48047] [Bug #9646]
-
-Sun Jul 6 22:56:03 2014 Zachary Scott <e@zzak.io>
-
- * lib/gserver.rb: [DOC] Fixed typo in example by @stomar [Bug #9543]
-
-Fri Jul 4 00:46:03 2014 Zachary Scott <e@zzak.io>
-
- * enumerator.c: [DOC] Fix example to show Enumerator#peek behavior
- Patch by Erik Hollembeak [Bug #9814]
-
-Fri Jul 4 00:44:43 2014 Zachary Scott <e@zzak.io>
-
- * enum.c: [DOC] Use #find in example to clarify alias by @rachellogie
- Patch submitted via documenting-ruby/ruby#34
-
-Fri Jul 4 00:42:57 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * man/ruby.1: remove deadlink. [ruby-core:62145][Bug #9773]
-
-Fri Jul 4 00:25:16 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * struct.c (not_a_member): extract name error and use same error
- messages. based on the patch by Marcus Stollsteimer <sto.mar AT
- web.de> at [ruby-core:61721]. [Bug #9684]
-
-Thu Jul 3 01:19:50 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * numeric.c (num_step_scan_args): table argument of rb_get_kwargs() is
- array of IDs, not Symbols. [ruby-dev:48353] [Bug #9811]
-
-Thu Jul 3 01:19:50 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * numeric.c (num_step_scan_args): check keyword arguments and fail
- if they conflict with positional arguments.
- [ruby-dev:48177] [Bug #9811]
-
-Tue Jul 1 03:05:22 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * io.c (read_all): truncate the buffer before appending read data,
- instead of truncating before reading.
- [ruby-core:55951] [Bug #8625]
-
-Tue Jul 1 03:05:22 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * io.c (io_setstrbuf, io_read): should not shorten the given buffer until
- read succeeds. [ruby-core:55951] [Bug #8625]
-
-Mon Jun 30 03:15:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm.c (core_hash_merge_kwd): should return the result hash, which
- may be converted from and differ from the given argument.
- [ruby-core:62921] [Bug #9898]
-
-Mon Jun 30 03:07:22 2014 Shugo Maeda <shugo@ruby-lang.org>
-
- * lib/net/ftp.rb (gets, readline): read lines without LF properly.
- [ruby-core:63205] [Bug #9949]
-
- * test/net/ftp/test_buffered_socket.rb: related test.
-
-Mon Jun 30 02:59:08 2014 Shugo Maeda <shugo@ruby-lang.org>
-
- * lib/net/imap.rb (body_type_1part): Gmail IMAP reports a body
- type as "MIXED" followed immediately by params
- [ruby-core:62864] [Bug #9885]
- Patch by @rayners (David Raynes). [Fixes GH-622]
- https://github.com/ruby/ruby/pull/622
-
-Mon Jun 30 02:46:44 2014 Rei Odaira <Rei.Odaira@gmail.com>
-
- * signal.c (ruby_signal): should return either `old.sa_sigaction`
- or `old.sa_handler`, depending on whether `SA_SIGINFO` is set in
- `old.sa_flags`, because they may not be a union.
- [ruby-core:62836] [Bug #9878]
-
-Mon Jun 30 02:36:08 2014 Eric Wong <e@80x24.org>
-
- * process.c (proc_getgroups, proc_setgroups): use ALLOCV_N
- [Bug #9856]
-
-Mon Jun 30 02:28:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * io.c (io_setstrbuf): always check if the buffer is modifiable.
- [ruby-core:62643] [Bug #9847]
+Mon Sep 15 08:13:40 2014 Matthew Draper <matthew@trebex.net>
-Mon Jun 30 02:25:00 2014 Tanaka Akira <akr@fsij.org>
+ * sprintf.c (rb_str_format): rational 'f' format works for more
+ values. [fix GH-717]
- * ext/openssl/lib/openssl/ssl.rb (OpenSSL::SSL::SSLServer#accept):
- Consider Socket#accept as well as TCPServer#accept.
- Reported by Sam Stelfox. [ruby-core:62064] [Bug #9750]
+Sun Sep 14 16:57:27 2014 Eric Wong <e@80x24.org>
-Mon Jun 30 02:18:47 2014 Eric Wong <e@80x24.org>
+ * template/vm.inc.tmpl: "insns.c" => "insns.def"
+ * tool/instruction.rb: typo fix
- * complex.c (parse_comp): replace ALLOCA_N with ALLOCV_N/ALLOCV_END
- [Bug #9608]
- * rational.c (read_digits): ditto
+Sun Sep 14 12:29:52 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Mon Jun 30 02:10:34 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/test_tracer.rb: fixed testcase for rubygems update.
- * vsnprintf.c (BSD_vfprintf): fix string width when precision is
- given. as the result of `memchr` is NULL or its offset from the
- start cannot exceed the size, the comparison was always false.
- [ruby-core:62737] [Bug #9861]
+Sun Sep 14 12:29:02 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Mon Jun 30 01:46:19 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/rubygems: Update to RubyGems 2.4.1 master(713ab65)
+ Complete history at:
+ https://github.com/rubygems/rubygems/blob/master/History.txt#L3-L216
- * ext/fiddle/extconf.rb: supply 0 to fill RUBY_LIBFFI_MODVERSION
- with 3-digit. libffi 3.1 returns just 2-digit.
- [ruby-core:62920] [Bug #9897]
-
-Mon Jun 30 00:57:05 2014 Koichi Sasada <ko1@atdot.net>
-
- * vm.c (rb_vm_pop_cfunc_frame): added. It cares c_return event.
- The patch base by drkaes (Stefan Kaes).
- [Bug #9321]
-
- * variable.c (rb_mod_const_missing): use rb_vm_pop_cfunc_frame()
- instead of rb_frame_pop().
-
- * vm_eval.c (raise_method_missing): ditto.
-
- * vm_eval.c (rb_iterate): ditto.
-
- * internal.h (rb_vm_pop_cfunc_frame): add decl.
-
- * test/ruby/test_settracefunc.rb: add tests.
- provided by drkaes (Stefan Kaes).
-
- * vm.c, eval.c, include/ruby/intern.h (rb_frame_pop):
- move definition of rb_frame_pop() and deprecate it.
- It doesn't care about `return' events.
-
-Sun Jun 29 01:34:06 2014 Tanaka Akira <akr@fsij.org>
-
- * lib/webrick/utils.rb (create_listeners): Close socket objects.
-
-Sat Jun 28 16:35:51 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (rb_str_substr): need to reset code range for shared
- string too, not only copied string.
- [ruby-core:62842] [Bug #9882]
-
-Sat Jun 28 14:37:17 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (local_tbl_gen): remove local variables duplicated with
- arguments.
- [ruby-core:60501] [Bug #9486]
-
-Tue Jun 24 00:21:58 2014 Koichi Sasada <ko1@atdot.net>
-
- * eval.c (rb_using_refinement): add write-barriers for
- cref->nd_refinements.
-
-Tue Jun 24 00:14:20 2014 Tanaka Akira <akr@fsij.org>
-
- * lib/net/ftp.rb (transfercmd): Close TCP server socket even if an
- exception occur.
-
-Tue Jun 24 00:06:41 2014 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-
- * thread_win32.c (rb_w32_stack_overflow_handler): use Structured
- Exception Handling by AddVectoredExceptionHandler() for machine
- stack overflow on mingw.
- This would be equivalent to the handling using __try and __except
- on mswin introduced by r43748.
-
-Mon Jun 23 23:56:54 2014 Eric Wong <e@80x24.org>
-
- * signal.c (signal_exec): ignore immediate cmd for SIG_IGN
- * signal.c (trap_handler): set cmd to true for SIG_IGN
- * signal.c (trap): handle nil and true values for oldcmd
- [Bug #9835]
-
-Mon Jun 23 02:46:14 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * class.c (rb_mod_init_copy): always clear instance variable,
- constant and method tables first, regardless the source tables.
- [ruby-dev:48182] [Bug #9813]
-
-Mon Jun 23 02:36:04 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * thread.c (thread_start_func_2): stop if forked in a sub-thread,
- the thread has become the main thread.
- [ruby-core:62070] [Bug #9751]
-
-Mon Jun 23 01:53:18 2014 Josh Goebel <dreamer3@gmail.com>
-
- * net/protocol.rb (using_each_crlf_line): fix SMTP dot-stuffing
- for messages not ending with a new-line.
- [ruby-core:61441] [Bug #9627] [fix GH-616]
-
-Fri Jun 20 00:40:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * thread_pthread.c (ruby_init_stack, ruby_stack_overflowed_p):
- place get_stack above others to get stack boundary information.
- [ruby-core:60113] [Bug #9454]
-
-Fri Jun 20 00:40:06 2014 NARUSE, Yui <naruse@ruby-lang.org>
-
- * thread_pthread.c: rlimit is only available on Linux.
- At least r44712 breaks FreeBSD.
- [ruby-core:60113] [Bug #9454]
-
-Fri Jun 20 00:40:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * thread_pthread.c: get current main thread stack size, which may
- be expanded than allocated size at initialization, by rlimit().
- [ruby-core:60113] [Bug #9454]
-
-Fri Jun 20 00:20:02 2014 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-
- * configure.in: enable SSE2 on mingw. target='i386-pc-mingw32'.
- [ruby-core:62095] [Bug #8358]
-
-Tue Jun 17 00:45:44 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * compile.c (compile_array_): make copy a first hash not to modify
- the argument itself. keyword splat should be non-destructive.
- [ruby-core:62161] [Bug #9776]
-
-Tue Jun 17 00:37:15 2014 Bugra Barin <bugrabarin@hotmail.com>
-
- * dln.c (dln_load): use wchar version to load a library in
- non-ascii path on Windows. based on the patch by Bugra Barin
- <bugrabarin AT hotmail.com> in [ruby-core:61845]. [Bug #9699]
-
-Tue Jun 17 00:26:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * process.c (obj2uid, obj2gid): now getpwnam_r() and getgrnam_r()
- may need larger buffers than sysconf values, so retry with
- expanding the buffer when ERANGE is returned.
- [ruby-core:61325] [Bug #9600]
-
-Wed Jun 11 22:58:30 2014 Eric Wong <e@80x24.org>
-
- * gc.c (ruby_gc_set_params): simplify condition
-
-Wed Jun 11 22:58:30 2014 Eric Wong <e@80x24.org>
-
- * gc.c (ruby_gc_set_params): fix building without RGenGC
-
-Wed Jun 11 02:43:32 2014 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * test/objspace/test_objspace.rb (TestObjSpace#test_dump_uninitialized_file):
- remove dependency on json library.
-
-Wed Jun 11 02:43:32 2014 Scott Francis <scott.francis@shopify.com>
-
- * ext/objspace/objspace_dump.c: Check fptr before trying to dump RFILE
- object fd. [GH-562]
-
- * test/objspace/test_objspace.rb: add test
-
-Wed Jun 11 02:27:55 2014 Akinori MUSHA <knu@iDaemons.org>
-
- * configure.in: Fix a build problem with clang and --with-opt-dir.
- If ruby is configured with --with-opt-dir=dir when using clang
- as compiler, a warning `clang: warning: argument unused during
- compilation: '-I dir'` is emitted almost every time clang
- compiles a file. Unfortunately, RUBY_CHECK_PRINTF_PREFIX takes
- any output from the compiler as fatal error, and the check thus
- fails due to the warning. This is an attempt to fix the problem
- by adding a flag -Qunused-arguments to CFLAGS locally in the
- function to suppress the warning. [ruby-dev:48062] [Bug #9658]
- [Fixes GH-571] https://github.com/ruby/ruby/pull/571
-
-Wed Jun 11 02:18:34 2014 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-
- * numeric.c: Fix Numeric#step with 0 unit [Bug #9575]
-
-Wed Jun 11 00:36:05 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * test/ruby/test_string (test_LSHIFT_neary_long_max): extend timeout.
- this test fails on some CI environment by timeout.
-
-Sat Jun 7 01:17:16 2014 Tanaka Akira <akr@fsij.org>
-
- * signal.c (check_stack_overflow): Don't use ucontext_t if ucontext.h
- is not available.
- Fixes build on Android (x86).
-
-Tue Jun 3 00:38:33 2014 Eric Wong <e@80x24.org>
-
- * class.c (rb_class_subclass_add): use xmalloc
- * class.c (rb_module_add_to_subclasses_list): ditto
- * class.c (rb_class_remove_from_super_subclasses): use xfree
- * class.c (rb_class_remove_from_module_subclasses): ditto
- [Bug #9616]
-
-Mon Jun 2 02:19:30 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/win32.c (rb_w32_accept, open_ifs_socket, socketpair_internal):
- reset inherit flag of socket to avoid unintentional inheritance of
- socket. note that the return value of SetHandleInformation() is not
- verified intentionally because old Windows may return an error.
- [Bug #9688] [ruby-core:61754]
-
-Mon Jun 2 02:12:10 2014 Eric Wong <e@80x24.org>
-
- * time.c (time_mload): freeze and preserve marshal-loaded time zone
- * test/ruby/test_time.rb: add test for GC on loaded object
- [Bug #9652]
-
-Mon Jun 2 01:57:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_insnhelper.c (vm_callee_setup_arg): turn a macro into an
- inline function.
-
-Mon Jun 2 01:46:43 2014 Eric Wong <e@80x24.org>
-
- * variable.c (rb_const_set): delete existing entry on redefinition
- [Bug #9645]
- * test/ruby/test_const.rb (test_redefinition): test for leak
-
-Fri May 30 00:13:19 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * eval.c (setup_exception): preserve errinfo across calling #to_s
- method on the exception. [ruby-core:61091] [Bug #9568]
-
-Thu May 29 20:57:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * numeric.c (ruby_num_interval_step_size): check signs and get rid
- of implementation dependent behavior of negative division.
- [ruby-core:61106] [Bug #9570]
-
-Wed May 28 23:47:22 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (rb_cv_func___builtin_unreachable): try with an
- external variable not only by a warning, which might not be
- shown due to the optimization. [ruby-core:61647] [Bug #9665]
-
-Wed May 28 23:40:57 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/openssl/ossl_asn1.c (ossl_asn1_initialize): SYMID on a value
- other than Symbol is an undefined behavior. fix up r31699.
- [ruby-core:62142] [Bug #9771]
-
-Wed May 28 23:37:32 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/stringio/stringio.c (strio_putc): fix for non-ascii
- encoding, like as IO#putc. [ruby-dev:48114] [Bug #9765]
-
-Wed May 28 01:05:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/fileutils.rb (FileUtils#copy_entry): update rdoc about
- preserve option and permissions, following r31123.
- [ruby-core:62065] [Bug #9748]
-
-Wed May 28 00:57:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (umethod_bind): use the ancestor iclass instead of new
- iclass to get rid of infinite recursion, if the defined module
- is already included. [ruby-core:62014] [Bug #9721]
-
-Wed May 28 00:57:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (rb_method_call_with_block, umethod_bind): call with
- IClass including the module for a module instance method.
- [ruby-core:61936] [Bug #9721]
-
- * vm_insnhelper.c (vm_search_super_method): allow bound
- UnboundMethod case.
-
-Wed May 28 00:38:37 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * array.c (ary_reject): may be turned into a shared array during
- the given block. [ruby-dev:48101] [Bug #9727]
-
-Wed May 28 00:29:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (str_buf_cat): should round up the capacity by 4KiB,
- but not number of rooms. [ruby-core:61886] [Bug #9709]
-
-Wed May 28 00:23:11 2014 NARUSE, Yui <naruse@ruby-lang.org>
-
- * lib/xmlrpc/client.rb (do_rpc): don't check body length.
- If HTTP content-encoding is used, the length may be different.
- [Bug #8182] [ruby-core:53811]
-
-Wed May 28 00:18:29 2014 Tadayoshi Funaba <tadf@dotrb.org>
-
- * ext/date/date_core.c (d_lite_cmp): should compare with #<.
-
-Fri May 23 00:04:13 2014 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/socket.c (sock_s_getnameinfo): Save errno for EAI_SYSTEM.
- Reported by Saravana kumar. [ruby-core:61820] [Bug #9697]
- Fixed by Heesob Park. [ruby-core:61868]
-
-Fri May 23 00:04:13 2014 Tanaka Akira <akr@fsij.org>
-
- * ext/socket: Wrap struct addrinfo by struct rb_addrinfo.
-
-Fri May 23 00:04:13 2014 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/ipsocket.c (ip_s_getaddress): Don't access freed memory.
-
-Mon May 19 00:47:00 2014 Koichi Sasada <ko1@atdot.net>
-
- * test/ruby/test_array.rb: remove useless `assert'.
-
-Mon May 19 00:47:00 2014 Koichi Sasada <ko1@atdot.net>
-
- * array.c (rb_ary_modify): remember shared array owner if a shared
- array owner is promoted and a shared array is not promoted.
-
- Now, shared array is WB-unprotected so that shared arrays are not
- promoted. All objects referred from shared array should be marked
- correctly.
-
- [ruby-core:61919] [ruby-trunk - Bug #9718]
-
- * test/ruby/test_array.rb: add a test for above.
-
-Mon May 19 00:26:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_yylex): only a newline after label should be
- significant. [ruby-core:61658] [Bug #9669]
-
-Mon May 19 00:26:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (lex_state_e, parser_params, f_arglist, parser_yylex):
- separate EXPR_LABELARG from EXPR_BEG and let newline significant,
- so that required keyword argument can place at the end of
- argument list without parentheses. [ruby-core:61658] [Bug #9669]
-
-Fri May 16 00:27:02 2014 James Edward Gray II <james@graysoftinc.com>
-
- * lib/csv.rb: Fixed a broken regular expression that was causing
- CSV to miss escaping some special meaning characters when used
- in parsing.
- Reported by David Unric
- [ruby-core:54986] [Bug #8405]
-
-Fri May 16 00:14:25 2014 Kohei Suzuki <eagletmt@gmail.com>
-
- * vm_method.c (rb_method_entry_get_without_cache): me->klass is 0
- for a method aliased in a module. [ruby-core:61636] [Bug #9663]
-
-Fri May 16 00:14:25 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_method.c (rb_method_entry_get_without_cache): get rid of
- infinite recursion at aliases in a subclass and a superclass.
- return actually defined class for other than singleton class.
- [ruby-core:60431] [Bug #9475]
-
-Mon May 12 22:53:08 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (primary): flush cmdarg flags inside left-paren in a
- command argument, to allow parenthesed do-block as an argument
- without arguments parentheses. [ruby-core:61950] [Bug #9726]
-
-Mon May 12 22:22:43 2014 Koichi Sasada <ko1@atdot.net>
-
- * vm.c (invoke_block_from_c): add VM_FRAME_FLAG_BMETHOD to record
- it is bmethod frame.
-
- * vm.c (vm_exec): invoke RUBY_EVENT_RETURN event if rollbacked frame
- is VM_FRAME_FLAG_BMETHOD.
- [Bug #9759]
-
- * test/ruby/test_settracefunc.rb: add a test for TracePoint/set_trace_func.
-
- * vm_core.h: rename rb_thread_t::passed_me to
- rb_thread_t::passed_bmethod_me to clarify the usage.
-
- * vm_insnhelper.c (vm_call_bmethod_body): use renamed member.
-
-Mon May 12 22:11:47 2014 Shota Fukumori <her@sorah.jp>
-
- * vm_eval.c (eval_string_with_cref): Unify to use NIL_P.
-
-Mon May 12 22:11:47 2014 Shota Fukumori <her@sorah.jp>
-
- * vm_eval.c (eval_string_with_cref): Use file path even if scope is
- given. Related to [ruby-core:56099] [Bug #8662] and r42103.
-
-Thu May 8 01:13:10 2014 NARUSE, Yui <naruse@ruby-lang.org>
-
- * configure.in: correct pthread_setname_np's prototype on NetBSD.
- [Bug #9586]
-
-Tue May 6 00:54:56 2014 Narihiro Nakamura <authornari@gmail.com>
-
- * gc.c (gc_after_sweep): suppress unnecessary expanding heap.
- Tomb heap pages are freed pages here, so expanding heap is
- not required.
-
-Mon May 5 02:35:20 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/openssl/ossl_pkey.c (ossl_pkey_verify): as EVP_VerifyFinal()
- finalizes only a copy of the digest context, the context must be
- cleaned up after initialization by EVP_MD_CTX_cleanup() or a
- memory leak will occur. [ruby-core:62038] [Bug #9743]
-
-Mon May 5 02:21:48 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/dl/cptr.c (dlptr_free), ext/dl/handle.c (dlhandle_free),
- ext/fiddle/handle.c (fiddle_handle_free),
- ext/fiddle/pointer.c (fiddle_ptr_free): fix memory leak.
- based on the patch Heesob Park at [ruby-dev:48021] [Bug #9599].
-
-Mon May 5 01:20:27 2014 Eric Wong <e@80x24.org>
-
- * gc.c (rb_gc_writebarrier): drop special case for big hash/array
- [Bug #9518]
-
-Mon May 5 01:13:00 2014 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_before_sweep): cap `malloc_limit' to
- gc_params.malloc_limit_max. It can grow and grow with such case:
- `loop{"a" * (1024 ** 2)}'
- [Bug #9687]
-
- This issue is pointed by Tim Robertson.
- http://www.omniref.com/blog/blog/2014/03/27/ruby-garbage-collection-still-not-ready-for-production/
-
-Mon May 5 00:52:18 2014 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (BigDecimal_initialize): Insert GC guard.
-
- * ext/bigdecimal/bigdecimal.c (BigDecimal_global_new): ditto.
-
-Mon May 5 00:42:35 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * ext/psych/psych.gemspec: update gemspec for psych-2.0.5
-
-Mon May 5 00:42:35 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * ext/psych/lib/psych.rb: Merge psych-2.0.5. bump version to
- libyaml-0.1.6 for CVE-2014-2525.
- * ext/psych/yaml/config.h: ditto.
- * ext/psych/yaml/scanner.c: ditto.
- * ext/psych/yaml/yaml_private.h: ditto.
-
-Mon May 5 00:35:20 2014 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/visitors/yaml_tree.rb: support dumping Encoding
- objects.
-
- * ext/psych/lib/psych/visitors/to_ruby.rb: support loading Encoding
- objects.
-
- * test/psych/test_encoding.rb: add test
-
- * ext/psych/lib/psych.rb: add version
-
-Mon May 5 00:16:35 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * gc.c: Fix up default GC params by @csfrancis [fix GH-556]
-
-Fri May 2 00:19:36 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/openssl/ossl.c (ossl_make_error): check NULL for unknown
- error reasons with old OpenSSL, and insert a colon iff formatted
- message is not empty.
-
-Thu May 1 20:56:56 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/readline/extconf.rb (rl_hook_func_t): check pointer type.
- [ruby-dev:48089] [Bug #9702]
-
-Thu May 1 20:47:08 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/readline/extconf.rb: fix typo, `$defs` not `$DEFS`.
- [ruby-core:61756] [Bug #9578]
-
-Thu May 1 20:47:08 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/readline/extconf.rb (rl_hook_func_t): define as Function for
- very old readline versions. [ruby-core:61209] [Bug #9578]
-
-Thu May 1 20:47:08 2014 Tanaka Akira <akr@fsij.org>
-
- * ext/readline/readline.c (Init_readline): Use rl_hook_func_t instead
- of Function to support readline-6.3. (rl_hook_func_t is available
- since readline-4.2.)
- Reported by Dmitry Medvinsky. [ruby-core:61141] [Bug #9578]
-
-Sat Mar 1 21:00:27 2014 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-
- * proc.c: Having optional keyword arguments makes maximum arity +1,
- not unlimited [#8072]
-
-Sat Mar 1 17:25:12 2014 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-
- * proc.c: Having any mandatory keyword argument increases min arity
- [#9299]
-
-Mon Feb 24 14:56:41 2014 WATANABE Hirofumi <eban@ruby-lang.org>
-
- * tool/make-snapshot: needs CXXFLAGS. [ruby-core:59393][Bug #9320]
-
-Mon Feb 24 14:56:41 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * tool/make-snapshot: support new version scheme.
-
-Mon Feb 24 13:05:48 2014 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych.rb: New release of psych.
- * ext/psych/psych.gemspec: ditto
-
-Mon Feb 24 13:05:48 2014 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/yaml/emitter.c: merge libyaml 0.1.5
- * ext/psych/yaml/loader.c: ditto
- * ext/psych/yaml/parser.c: ditto
- * ext/psych/yaml/reader.c: ditto
- * ext/psych/yaml/scanner.c: ditto
- * ext/psych/yaml/writer.c: ditto
- * ext/psych/yaml/yaml_private.h: ditto
-
-Sat Feb 22 22:26:43 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * ext/io/console/console.c (console_dev): need read access for conout$
- because some functions need it. [Bug#9554]
-
-Sat Feb 22 21:56:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * compile.c (iseq_set_arguments): set arg_keyword_check from
- nd_cflag, which is set by parser. internal ID is used for
- unnamed keyword rest argument, which should be separated from no
- keyword check.
-
- * iseq.c (rb_iseq_parameters): if no keyword check, keyword rest is
- present.
-
- * parse.y (new_args_tail_gen): set keywords check to nd_cflag, which
- equals to that keyword rest is not present.
-
-Sat Feb 22 21:56:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * iseq.c (rb_iseq_parameters): push argument type symbol only for
- unnamed rest keywords argument.
-
-Sat Feb 22 21:56:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (rb_iseq_min_max_arity): maximum argument is unlimited if
- having rest keywords argument. [ruby-core:53298] [Bug #8072]
-
-Sat Feb 22 18:55:08 2014 Shugo Maeda <shugo@ruby-lang.org>
-
- * ext/socket/init.c (wait_connectable): break if the socket is
- writable to avoid infinite loops on FreeBSD and other platforms
- which conforms to SUSv3. This problem cannot be reproduced with
- loopback interfaces, so it's hard to write test code.
- rsock_connect() and wait_connectable() are overly complicated, so
- they should be refactored, but I commit this fix as a workaround
- for the release of Ruby 1.9.3 scheduled on Feb 24.
- [ruby-core:60940] [Bug #9547]
-
-Sat Feb 22 18:48:57 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * class.c (rb_mod_init_copy): do nothing if copying self.
- [ruby-dev:47989] [Bug #9535]
-
- * hash.c (rb_hash_initialize_copy): ditto.
-
-Sat Feb 22 18:20:58 2014 Masaki Matsushita <glass.saga@gmail.com>
-
- * hash.c (rb_hash_flatten): fix behavior of flatten(-1).
- [ruby-dev:47988] [Bug #9533]
-
- * test/ruby/test_array.rb: test for above.
-
-Sat Feb 22 17:46:32 2014 Tanaka Akira <akr@fsij.org>
-
- * lib/open-uri.rb: Make proxy disabling working again.
- Fixed by Christophe Philemotte. [ruby-core:59650] [Bug #9385]
-
-Sat Feb 22 17:33:39 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * eval.c (rb_mod_s_constants): return its own constants for other
- than Module itself. [ruby-core:59763] [Bug #9413]
-
-Sat Feb 22 16:51:36 2014 Eric Wong <e@80x24.org>
-
- * ext/json/generator/depend: add build dependencies for json extension
- [Bug #9374] [ruby-core:59609]
- * ext/json/parser/depend: ditto
-
-Sat Feb 22 16:34:12 2014 Yusuke Endoh <mame@tsg.ne.jp>
-
- * ext/fiddle/closure.c: use sizeof(*pcl) for correct sizeof value.
- [ruby-core:57599] [Bug #8978].
-
-Sat Feb 22 16:34:12 2014 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/fiddle/closure.c: use sizeof(*pcl) for correct sizeof value.
- [ruby-core:57599] [Bug #8978]. Thanks mame!
-
-Sat Feb 22 16:17:54 2014 Eric Wong <e@80x24.org>
-
- * ext/socket/ancdata.c (bsock_sendmsg_internal): only retry on error
- (bsock_recvmsg_internal): ditto
- * test/socket/test_unix.rb: test above for infinite loop
-
-Sat Feb 22 15:56:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * thread_pthread.c (rb_thread_create_timer_thread): fix for platforms
- where PTHREAD_STACK_MIN is a dynamic value and not a compile-time
- constant. [ruby-dev:47911] [Bug #9436]
-
-Sat Feb 22 15:56:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * thread_pthread.c (rb_thread_create_timer_thread): expand timer
- thread stack size to get rid of segfault on FreeBSD/powerpc64.
- based on the patch by Steve Wills at [ruby-core:59923].
- [ruby-core:56590] [Bug #8783]
-
-Sat Feb 22 15:13:38 2014 Benoit Daloze <eregontp@gmail.com>
-
- * range.c (Range#size): [DOC] improve description and add examples.
- Patch by @skade. [Fixes GH-501]
-
-Sat Feb 22 15:07:58 2014 Zachary Scott <e@zzak.io>
-
- * lib/racc/rdoc/grammar.en.rdoc: [DOC] Correct grammar and typos
- Patch by Giorgos Tsiftsis [Bug #9429] [ci skip]
-
-Sat Feb 22 15:06:32 2014 Zachary Scott <e@zzak.io>
-
- * lib/open-uri.rb: [DOC] use lower case version of core classes, same
- as commit r44878, based on patch by Jonathan Jackson [Bug #9483]
-
-Sat Feb 22 15:06:32 2014 Zachary Scott <e@zzak.io>
-
- * ext/ripper/lib/ripper/lexer.rb: [DOC] use lower case version of core
- classes when referring to return value, since we aren't directly
- talking about the class. Patch by Jonathan Jackson [Bug #9483]
-
-Sat Feb 22 15:03:05 2014 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
-
- * variable.c: adding extra example in docs.
- patched by Steve Klabnik. [Bug #9210]
-
-Sat Feb 22 15:01:21 2014 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb (Resolv::DNS::Resource::TXT#data): Return concatenated
- string.
- Patch by Ryan Brunner. [ruby-core:58220] [Bug #9093]
-
-Sat Feb 22 14:52:55 2014 Zachary Scott <e@zzak.io>
-
- * ext/openssl/ossl_pkey_dh.c: Fixed typo by Sandor Szuecs [Bug #9243]
-
-Sat Feb 22 14:45:36 2014 Zachary Scott <e@zzak.io>
-
- * lib/xmlrpc/client.rb: [DOC] Remove note about SSL package on RAA
- Since RAA has been deprecated, and the SSL package has been replaced
- with net/https this statement is entirely false and should be
- deleted. [Bug #9152]
-
-Sat Feb 22 14:31:23 2014 Zachary Scott <e@zzak.io>
-
- * lib/net/smtp.rb: [DOC] Remove dead link to RAA by Giorgos Tsiftsis
- Fixes the following bugs: [Bug #9152] [Bug #9268] [Bug #9394]
- * lib/open-uri.rb: ditto
-
-Sat Feb 22 14:18:35 2014 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb: Ignore name servers which cause EAFNOSUPPORT on
- socket creation.
- Reported by Bjoern Rennhak. [ruby-core:60442] [Bug #9477]
-
-Sat Feb 22 14:07:04 2014 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb (Resolv::DNS::Message::MessageDecoder): Raise
- DecodeError if no data before the limit.
- Reported by Will Bryant. [ruby-core:60557] [Bug #9498]
-
-Sat Feb 22 13:49:30 2014 Shugo Maeda <shugo@ruby-lang.org>
-
- * vm_insnhelper.c (vm_call_method): should check ci->me->flag of
- a refining method in case the method is private.
- [ruby-core:60111] [Bug #9452]
-
- * vm_method.c (make_method_entry_refined): set me->flag of a refined
- method entry to NOEX_PUBLIC in case the original method is private
- and it is refined as a public method. The original flag is stored
- in me->def->body.orig_me, so it's OK to make a refined method
- entry public. [ruby-core:60111] [Bug #9452]
-
- * test/ruby/test_refinement.rb: related tests.
-
-Sat Feb 22 13:26:57 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * iseq.c (iseq_load): keep type_map to get rid of memory leak.
- based on a patch by Eric Wong at [ruby-core:59699]. [Bug #9399]
-
-Sat Feb 22 13:17:32 2014 Masaki Matsushita <glass.saga@gmail.com>
-
- * ext/thread/thread.c (rb_szqueue_clear): notify SZQUEUE_WAITERS
- on SizedQueue#clear. [ruby-core:59462] [Bug #9342]
-
- * test/thread/test_queue.rb: add test. the patch is from
- Justin Collins.
-
-Sat Feb 22 01:35:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: check if pthread_setname_np is available.
-
- * thread_pthread.c: pthread_setname_np is not available on old
- Darwins. [ruby-core:60524] [Bug #9492]
-
-Sat Feb 22 00:21:50 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (local_push_gen, local_pop_gen): save cmdarg_stack to
- isolate command argument state from outer scope.
- [ruby-core:59342] [Bug #9308]
-
-Fri Feb 21 23:51:38 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * encoding.c (must_encindex, rb_enc_from_index, rb_obj_encoding): mask
- encoding index and ignore dummy flags. [ruby-core:59354] [Bug #9314]
-
-Fri Feb 21 23:10:12 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb (RbConfig): expand RUBY_SO_NAME for extensions
- backward compatibility. [ruby-core:59426] [Bug #9329]
-
-Fri Feb 21 23:07:56 2014 Akio Tajima <artonx@yahoo.co.jp>
-
- * win32/Makefile.sub: remove HAVE_FSEEKO because fseeko removed from win32/win32.c
- Fixed [Bug #9333].
-
-Fri Feb 21 23:00:34 2014 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/visitors/yaml_tree.rb: dumping strings with
- quotes should not have changed. [ruby-core:59316] [Bug #9300]
-
- * ext/psych/lib/psych.rb: fixed missing require.
-
- * test/psych/test_string.rb: test
-
-Sun Feb 2 05:48:42 2014 Eric Wong <e@80x24.org>
-
- * io.c (rb_io_syswrite): add RB_GC_GUARD
- [Bug #9472][ruby-core:60407]
-
-Fri Feb 21 17:42:42 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/resolv.rb (Resolv::Hosts#lazy_initialize): should not
- consider encodings in hosts file. [ruby-core:59239] [Bug #9273]
-
- * lib/resolv.rb (Resolv::Config.parse_resolv_conf): ditto.
-
-Fri Feb 21 16:47:20 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (get_encoding): respect BOM on pseudo encodings.
- [ruby-dev:47895] [Bug #9415]
-
-Fri Feb 21 16:47:20 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (get_actual_encoding): get actual encoding according to
- the BOM if exists.
-
- * string.c (rb_str_inspect): use according encoding, instead of
- pseudo encodings, UTF-{16,32}. [ruby-core:59757] [Bug #8940]
-
-Fri Feb 21 13:39:21 2014 Charlie Somerville <charliesome@ruby-lang.org>
-
- * compile.c (iseq_build_from_ary_body): Use :blockptr instead of :block
- as hash key when loading serialized instruction sequences from arrays.
- [Bug #9455] [ruby-core:60146]
-
-Thu Feb 20 12:58:45 2014 Tanaka Akira <akr@fsij.org>
-
- * process.c (READ_FROM_CHILD): Apply the last hunk of
- 0001-process.c-avoid-EINTR-from-Process.spawn.patch written by
- Eric Wong in [Bug #8770].
-
-Thu Feb 20 12:58:45 2014 Eric Wong <normalperson@yhbt.net>
-
- * process.c (send_child_error): retry write on EINTR to fix
- occasional Errno::EINTR from Process.spawn.
-
- * process.c (recv_child_error): retry read on EINTR to fix
- occasional Errno::EINTR from Process.spawn.
-
-Thu Feb 20 12:24:59 2014 Eric Hodel <drbrain@segment7.net>
-
- * lib/rinda/ring.rb (Rinda::RingFinger#make_socket): Use
- ipv4_multicast_ttl option for portability.
-
-Thu Feb 20 10:19:40 2014 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/option.c: IP_MULTICAST_LOOP and IP_MULTICAST_TTL socket
- option takes a byte on OpenBSD.
- Fixed by Jeremy Evans. [ruby-core:59496] [Bug #9350]
-
-Wed Feb 19 15:25:13 2014 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (ruby_gc_set_params): don't show obsolete warnings for
- RUBY_FREE_MIN/RUBY_HEAP_MIN_SLOTS if
- RUBY_GC_HEAP_FREE_SLOTS/RUBY_GC_HEAP_INIT_SLOTS are given.
- [Bug #9276]
-
-Wed Feb 19 14:25:55 2014 Koichi Sasada <ko1@atdot.net>
-
- * test/ruby/test_gc.rb: ignore warning messages for running with -w
- option such as chkbuild.
-
-Wed Feb 19 14:25:55 2014 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (get_envparam_double): fix a warning message.
-
-Wed Feb 19 14:25:55 2014 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: introduce new environment variable
- "RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR" to control major/minor GC
- frequency.
-
- Do full GC when the number of old objects is more than R * N
- where R is this factor and
- N is the number of old objects just after last full GC.
-
- * test/ruby/test_gc.rb: add a test.
-
-Wed Feb 19 07:51:02 2014 Eric Hodel <drbrain@segment7.net>
-
- * lib/rinda/ring.rb (Rinda::RingFinger#make_socket): Use
- ipv4_multicast_loop option for portability. Patch by Jeremy Evans.
- [ruby-trunk - Bug #9351]
-
-Mon Feb 17 05:43:20 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: reset LDFLAGS and DLDFLAGS for opt-dir again after
- LIBPATHFLAG and RPATHFLAG are set. [ruby-dev:47868] [Bug #9317]
-
-Sun Feb 16 07:13:36 2014 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Fix compilation error.
- https://bugs.ruby-lang.org/issues/8358#note-16
-
-Sun Feb 16 07:13:36 2014 Vit Ondruch <vondruch@redhat.com>
-
- * configure.in: add qouting brackets and append wildcard for the
- rest after target_cpu, to properly detect platform for SSE2
- instructions. [ruby-core:60576] [Bug #8358]
-
-Sun Feb 16 07:13:36 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: -mstackrealign is necessary for -msse2 working.
- [ruby-core:54716] [Bug #8349]
-
-Sun Feb 16 07:13:36 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: -mstackrealign is necessary for -msse2 working.
- [ruby-core:54716] [Bug #8349]
-
- * configure.in: use SSE2 instructions to drop unexpected precisions on
- other than mingw. [ruby-core:59472] [Bug #8358]
-
-Sun Feb 16 07:13:36 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: use SSE2 instructions for drop unexpected
- precisions. [ruby-core:54738] [Bug #8358]
-
-Fri Feb 7 04:19:19 2014 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (get_envparam_int): correct warning messsages.
-
- * gc.c (get_envparam_double): ditto.
-
-Fri Feb 7 04:19:19 2014 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (get_envparam_int): don't accept a value equals to lowerbound
- (changed by last commit) because "" or "foo" (not a number) strings
- are parsed as 0. They should be rejected.
-
- * gc.c (get_envparam_double): ditto.
-
-Thu Feb 6 08:23:28 2014 Eric Wong <e@80x24.org>
-
- * ext/thread/thread.c (rb_szqueue_max_set): use correct queue and
- limit wakeups. [Bug #9343][ruby-core:60517]
- * test/thread/test_queue.rb (test_sized_queue_assign_max):
- test for bug
-
-Thu Feb 6 11:27:39 2014 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: RubyGems 2.2.2 which contains the following bug fixes:
- http://rubygems.rubyforge.org/rubygems-update/History_txt.html#label-2.2.2+%2F+2014-02-05
- https://bugs.ruby-lang.org/issues/9489
-
-Thu Feb 6 11:23:59 2014 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (ruby_gc_set_params): if RUBY_GC_OLDMALLOC_LIMIT is provided,
- then set objspace->rgengc.oldmalloc_increase_limit.
- Without this fix, the env variable RUBY_GC_OLDMALLOC_LIMIT
- does not work.
-
- * gc.c (get_envparam_int): accept a value equals to lowerbound.
-
- * gc.c (get_envparam_double): ditto.
-
-Wed Feb 5 23:57:05 2014 Charlie Somerville <charliesome@ruby-lang.org>
-
- * ext/thread/thread.c (rb_szqueue_push): check GET_SZQUEUE_WAITERS
- instead of GET_QUEUE_WAITERS to prevent deadlock. Patch by Eric Wong.
- [Bug #9302] [ruby-core:59324]
-
- * test/thread/test_queue.rb: add test
-
-Wed Feb 5 23:43:30 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * hash.c (rb_objid_hash): should return `long'. brushup r44534.
-
- * object.c (rb_obj_hash): follow above change.
-
-Wed Feb 5 23:43:30 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * hash.c (rb_any_hash): should treat the return value of rb_objid_hash()
- as `long', because ruby assumes the hash value of the object id of
- an object is `long'.
- this fixes test failures on mswin64 introduced at r44525.
-
-Wed Feb 5 23:43:30 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (rb_objid_hash): return hash value from object ID with a
- salt, extract from rb_any_hash().
-
- * object.c (rb_obj_hash): return same value as rb_any_hash().
- fix r44125. [ruby-core:59638] [Bug #9381]
-
-Wed Feb 5 22:28:41 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_insnhelper.c (vm_search_super_method): allow bound method from a
- module, yet another method transplanting.
-
-Wed Feb 5 22:28:41 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_insnhelper.c (vm_search_super_method): when super called in a
- bound UnboundMethod generated from a module, no superclass is
- found since the current defined class is the module, then call
- method_missing in that case. [ruby-core:59619] [Bug #9377]
-
-Wed Feb 5 21:57:40 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/socket/socket.c (rsock_syserr_fail_host_port): add errno
- argument version anduse rb_syserr_fail_str() instead of
- rb_sys_fail_str() with restoring errno.
-
- * ext/socket/socket.c (rsock_syserr_fail_path): ditto, and
- rb_syserr_fail().
-
- * ext/socket/socket.c (rsock_sys_fail_sockaddr): ditto, use
- rsock_syserr_fail_raddrinfo().
-
- * ext/socket/socket.c (rsock_sys_fail_raddrinfo): ditto.
-
- * ext/socket/socket.c (setup_domain_and_type): ditto.
-
-Wed Feb 5 21:57:40 2014 Eric Wong <normalperson@yhbt.net>
-
- * ext/socket/socket.c (rsock_sys_fail_host_port): save and restore errno
- before calling rb_sys_fail_str to prevent [BUG] errno == 0.
- Patch by Eric Wong. [ruby-core:59498] [Bug #9352]
-
- * ext/socket/socket.c (rsock_sys_fail_path): ditto
- * ext/socket/socket.c (rsock_sys_fail_sockaddr): ditto
- * ext/socket/socket.c (rsock_sys_fail_raddrinfo): ditto
- * ext/socket/socket.c (rsock_sys_fail_raddrinfo_or_sockaddr): ditto
-
-Wed Feb 5 21:12:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/timeout.rb (Timeout::ExitException.catch): pass arguments
- for new instance.
-
- * lib/timeout.rb (Timeout::ExitException#exception): fallback to
- Timeout::Error if couldn't throw. [ruby-dev:47872] [Bug #9380]
-
- * lib/timeout.rb (Timeout#timeout): initialize ExitException with
- message for the fallback case.
-
-Wed Feb 5 21:12:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/timeout.rb (Timeout#timeout): should not rescue ordinarily
- raised ExitException, which should not be thrown.
-
- * lib/timeout.rb (Timeout::ExitException.catch): set @thread only if
- it ought to be caught.
-
- * lib/timeout.rb (Timeout#timeout): when a custom exception is given,
- no instance is needed to be caught, so defer creating new instance
- until it is raised. [ruby-core:59511] [Bug #9354]
-
-Wed Feb 5 17:55:28 2014 Aman Gupta <ruby@tmm1.net>
-
- * array.c (ary_add_hash): Fix consistency issue between Array#uniq and
- Array#uniq! [Bug #9340] [ruby-core:59457]
- * test/ruby/test_array.rb (class TestArray): regression test for above.
-
-Wed Feb 5 11:48:42 2014 Charlie Somerville <charliesome@ruby-lang.org>
-
- * struct.c (rb_struct_set): return assigned value from setter method
- rather than struct object. [Bug #9353] [ruby-core:59509]
-
- * test/ruby/test_struct.rb (test_setter_method_returns_value): add test
-
-Wed Feb 5 11:13:21 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (rb_str_modify_expand): enable capacity and disable
- assocation with packed objects when setting capa, so that
- pack("p") string fails to unpack properly after modified.
-
-Sun Feb 2 22:39:28 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/delegate.rb (Delegator): keep source information methods
- which start and end with '__'. [ruby-core:59718] [Bug #9403]
-
-Fri Jan 31 12:10:16 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (mnew_from_me): keep iclass as-is, to make inheritance
- chain consistent. [ruby-core:59358] [Bug #9315]
-
- * proc.c (method_owner): return the original defined_class from
- prepended iclass, instead.
-
-Fri Jan 31 12:05:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: let mingw do something black-magic, and check if
- _gmtime64_s() is available actually.
-
- * win32/win32.c (gmtime_s, localtime_s): use _gmtime64_s() and
- _localtime64_s() if available, not depending on very confusing
- mingw variants macros. based on the patch by phasis68 (Heesob
- Park) at [ruby-core:58764]. [ruby-core:58391] [Bug #9119]
-
-Thu Jan 30 15:02:35 2014 Shugo Maeda <shugo@ruby-lang.org>
-
- * configure.in: use $@ instead of $(.TARGET) because .TARGET is not
- supported by GNU make.
-
-Mon Jan 27 16:49:52 2014 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (BigDecimal_divide): Add an additional
- digit for the quotient to be compatible with bigdecimal 1.2.1 and
- the former. [ruby-core:59365] [#9316] [#9305]
-
- * test/bigdecimal/test_bigdecimal.rb: tests for the above change.
-
- * ext/bigdecimal/bigdecimal.gemspec: bigdecimal version 1.2.4.
-
-Mon Jan 27 16:45:34 2014 Yamashita Yuu <yamashita@geishatokyo.com>
-
- * ext/openssl/ossl_ssl.c (Init_ossl_ssl): Declare a constant
- `OP_MSIE_SSLV2_RSA_PADDING` only if the macro is defined. The
- `SSL_OP_MSIE_SSLV2_RSA_PADDING` has been removed from latest
- snapshot of OpenSSL 1.0.1. [Fixes GH-488]
-
-Thu Jan 23 10:37:24 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (HAS_EXTRA_STATES): warn extra states only when something
- differ. [ruby-core:59254] [Bug #9275]
-
-Thu Jan 9 14:05:24 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/{setup.mak,Makefile.sub}: update fake.rb like
- template/fake.rb.in.
-
-Thu Jan 9 14:05:24 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/Makefile.sub (fake.rb): should depend on version.h because
- if RUBY_VERSION is updated, fake.rb need to say the new version
- to avoid install error in rbconfig.rb.
-
-Thu Jan 9 08:21:00 2014 Aman Gupta <ruby@tmm1.net>
-
- * test/net/imap/cacert.pem: generate new CA cert, since the last one
- expired. [Bug #9341] [ruby-core:59459]
- * test/net/imap/server.crt: new server cert signed with updated CA.
- * test/net/imap/Makefile: add `make regen_certs` to automate this
- process.
-
-Thu Dec 26 03:28:11 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_insnhelper.c (argument_error): insert dummy frame to make
- a backtrace object intead of modify backtrace string array.
- [Bug #9295]
-
- * test/ruby/test_backtrace.rb: add a test for this patch.
- fix test to compare a result of Exception#backtrace with
- a result of Exception#backtrace_locations.
-
-Wed Dec 25 16:58:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (rb_mod_define_method): consider visibility only if self
- in the caller is same as the receiver, otherwise make public as
- well as old behavior. [ruby-core:57747] [Bug #9005]
- [ruby-core:58497] [Bug #9141]
-
- * vm.c (rb_vm_cref_in_context): return ruby level cref if self is
- same.
-
-Wed Dec 25 16:35:34 2013 Yusuke Endoh <mame@tsg.ne.jp>
-
- * sample/trick2013/: added the award-winning entries of TRICK 2013.
- See https://github.com/tric/trick2013 for the contest outline.
- (Matz has approved the attachment.)
-
-Tue Dec 24 23:47:50 2013 Koichi Sasada <ko1@atdot.net>
-
- * README.EXT: add a refer to URL.
-
-Tue Dec 24 23:47:50 2013 Koichi Sasada <ko1@atdot.net>
-
- * README.EXT: add a document about RGenGC.
- Reviewed by havenwood.
- [misc #8962]
-
- * README.EXT.ja: ditto.
-
-Mon Dec 23 19:00:00 2013 Eric Hodel <drbrain@segment7.net>
-
- * test/rubygems/test_gem_ext_builder.rb: Fix warning due to ambiguous
- expression.
-
-Mon Dec 23 16:13:10 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems/commands/install_command.rb: Restore gem install
- --ignore-dependencies for remote gems
- * test/rubygems/test_gem_commands_install_command.rb: Test for the
- above.
-
-Mon Dec 23 16:12:24 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-
- * array.c: Have to_h raise on elements that are not key-value pairs
- [#9239]
-
- * enum.c: ditto
-
-Sun Dec 22 19:22:52 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rdoc.rb: Set RDoc to release version.
-
-Sun Dec 22 19:22:31 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems.rb: Set RubyGems to release version.
-
-Sun Dec 22 19:22:01 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems.rb (module Gem): Fix comment for
- Gem::load_path_insert_index.
-
-Sun Dec 22 18:08:42 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/Makefile.sub (fake.rb): fixed wrong RUBY_PLATFORM, to correctly
- install win32.h.
- [ruby-core:58801][Bug #9199] reported by arton.
-
-Fri Dec 20 17:52:50 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_method.c: check definition of
- GLOBAL_METHOD_CACHE_SIZE and GLOBAL_METHOD_CACHE_MASK.
-
-Fri Dec 20 17:03:10 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: rename OBJ_WRITE and OBJ_WRITTEN into
- RB_OBJ_WRITE and RB_OBJ_WRITTEN.
-
- * array.c, class.c, compile.c, hash.c, internal.h, iseq.c,
- proc.c, process.c, re.c, string.c, variable.c, vm.c,
- vm_eval.c, vm_insnhelper.c, vm_insnhelper.h,
- vm_method.c: catch up this change.
-
-Fri Dec 20 16:01:35 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: add a comment for WB interfaces.
-
-Fri Dec 20 16:00:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: DLDFLAGS is defined in --with-opt-dir handler, so
- ${DLDFLAGS=} does not work now. use RUBY_APPEND_OPTIONS instead.
- [ruby-dev:47855] [Bug #9256]
-
-Fri Dec 20 14:19:12 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * configure.in (AC_ARG_WITH): use withval directly.
- fix failure on FreeBSD.
- http://fb32.rubyci.org/~chkbuild/ruby-trunk/log/20131217T070301Z.diff.html.gz
-
-Fri Dec 20 14:00:01 2013 Aman Gupta <ruby@tmm1.net>
-
- * include/ruby/ruby.h (struct RClass): add super, remove iv_index_tbl.
- since RCLASS_SUPER() is commonly used inside while loops, we move it
- back inside struct RClass to improve cache hits. this provides a
- small improvement (1%) in hotspots like rb_obj_is_kind_of()
- * internal.h (struct rb_classext_struct): remove super, add
- iv_index_table
- * internal.h (RCLASS_SUPER): update for new location
- * internal.h (RCLASS_SET_SUPER): ditto
- * internal.h (RCLASS_IV_INDEX_TBL): ditto
- * object.c (rb_class_get_superclass): ditto
- * include/ruby/backward/classext.h (RCLASS_SUPER): ditto
-
-Fri Dec 20 07:07:35 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 03d6ae7. Changes include:
-
- * Fixed typos.
-
- * Relaxed Gem.ruby test for ruby packagers that do not use `ruby`.
-
- * test/rubygems: ditto.
-
-Thu Dec 19 14:03:04 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (heap_get_freeobj): improve hot path performance.
-
- * gc.c (heap_get_freeobj_from_next_freepage): replace with
- heap_get_freepage(). It returns freeobj instead of freepage.
- This is not on hot path.
-
-Thu Dec 19 12:05:17 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master af60443. Changes include:
-
- * Improved speed of `gem install --ignore-dependencies`.
-
- * Open read-write for exclusive flock. [ruby-trunk - Bug #9257]
-
- * Remove specification before install to prevent infinite loop.
-
-Thu Dec 19 11:23:49 2013 Aman Gupta <ruby@tmm1.net>
-
- * vm_insnhelper.c (vm_call_iseq_setup_normal): simple for loop
- condition optimization. this area shows up as a hotspot in VM
- profiles.
-
-Thu Dec 19 10:50:13 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (newobj_of): don't need to RBASIC_SET_CLASS() which includes WB
- here because created obj is always YOUNG/INFANT.
-
-Thu Dec 19 10:48:37 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/gc/gcbench.rb: check GC::OPTS availability
- for not MRI 2.1.0.
-
-Thu Dec 19 03:10:30 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (heap_get_freeobj): remove redundant assignment. heap->freelist
- is set after the while() loop already.
-
-Thu Dec 19 01:54:30 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/runner.rb: fix commit miss on r44278.
-
-Thu Dec 19 00:26:11 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (garbage_collect_body): lazy_sweep setting should work
- without USE_RGENGC.
-
-Wed Dec 18 23:31:04 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_profile_dump_major_reason): fix this function because major_reason
- can be OR of multiple reasons.
-
- * gc.c (gc_profile_dump_on): ditto.
-
-Wed Dec 18 17:03:00 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_profile_record_get): should return an empty array
- when profiling is active.
-
-Wed Dec 18 16:49:40 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_profile_clear, gc_profile_enable): remove rest_sweep().
-
- * gc.c: check objspace->profile.current_record before inserting
- profiling record by new macro gc_prof_enabled().
-
-Wed Dec 18 14:32:06 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_exec.h (VM_DEBUG_STACKOVERFLOW): added.
- disable stack overflow check for every stack pushing as default.
-
- * vm_exec.c (vm_stack_overflow_for_insn): ditto.
-
-Wed Dec 18 10:00:22 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master d8f12e2. This increases the
- speed of `gem install --ignore-dependencies` which helps bundler
- tests.
- * test/rubygems: ditto.
-
-Wed Dec 18 09:00:17 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/ruby/test_gc.rb (test_expand_heap): allow +/-1 diff.
-
-Tue Dec 17 23:44:15 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * test/ruby/test_io.rb: fix duplicated test name.
-
-Tue Dec 17 20:15:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (rb_hash_reject): revert to deprecated behavior, with
- warnings, due to compatibility for HashWithDifferentAccess.
- [ruby-core:59154] [Bug #9223]
-
-Tue Dec 17 17:30:56 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * misc/ruby-electric.el: Import version 2.1.1 from
- https://github.com/knu/ruby-electric.el.
-
- * ruby-electric-delete-backward-char: Enable support for number
- prefix.
-
- * ruby-electric-curlies: Fix electric operation after an open
- curly.
-
-Tue Dec 17 16:19:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_trace.c (rb_postponed_job_flush): isolate exceptions in
- postponed jobs and restore outer ones. based on a patch by
- tarui. [ruby-core:58652] [Bug #9168]
-
-Tue Dec 17 10:48:04 2013 Aman Gupta <ruby@tmm1.net>
-
- * configure.in (RUBY_DTRACE_POSTPROCESS): Fix compatibility with
- systemtap on linux. stap requires `dtrace -G` post-processing, but
- the dtrace compatibility wrapper is very strict about probes.d
- syntax.
-
-Tue Dec 17 05:18:17 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 1c5f4b3. Allows rubygems
- repackagers to disable backward-compatible shared gem directory
- behavior.
- * test/rubygems: ditto.
-
-Tue Dec 17 05:14:35 2013 Eric Hodel <drbrain@segment7.net>
-
- * NEWS (RDoc): Update version number so I don't have to change it
- for the final release.
-
-Mon Dec 16 19:19:19 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_objspace_markable_object_p): should check special_const_p
- first (by is_markable_object()).
-
-Mon Dec 16 19:12:54 2013 Koichi Sasada <ko1@atdot.net>
-
- * ext/objspace/objspace.c (reachable_object_from_root_i): use
- compare_by_identity hash to avoid hash modify problem
- during iteration.
- [Bug #9252]
-
- * ext/objspace/objspace.c (reachable_objects_from_root): ditto.
-
-Mon Dec 16 18:16:28 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_verify_internal_consistency): should not use
- rb_objspace_each_objects() because it call rest_sweep().
-
-Mon Dec 16 18:07:30 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_objspace_markable_object_p): fix last commit (build error).
-
-Mon Dec 16 18:04:28 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_objspace_markable_object_p): it should be live objects.
-
-Mon Dec 16 18:00:51 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_objspace_each_objects): should not clear dont_lazy_sweep
- flag in nested case.
-
-Mon Dec 16 16:40:35 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_method.c (rb_method_entry_make): fix WB miss.
- Note that rb_method_entry_t::klass is not constified.
- We may constify this field.
-
- * test/ruby/test_alias.rb: add a test.
-
-Mon Dec 16 14:14:22 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: use gc_verify_internal_consistency() instead of
- gc_check_before_marks_i() for check consistency
- on RGENGC_CHECK_MODE >= 2.
-
-Mon Dec 16 14:01:48 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * process.c (make_clock_result): add :second as a unit for
- Process.clock_gettime.
-
-Mon Dec 16 13:10:54 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: introduce GC.verify_internal_consistency method to verify GC
- internal data structure.
-
- Now this method only checks generation (old/young) consistency.
-
-Mon Dec 16 11:49:26 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (gc_info_decode): Fix build errors when compiled with
- RGENGC_ESTIMATE_OLDMALLOC=0
- * gc.c (objspace_malloc_increase): ditto
-
-Sun Dec 15 13:38:29 2013 Koichi Sasada <ko1@atdot.net>
-
- * ext/objspace/objspace.c (reachable_object_from_root_i):
- reachable objects should not include categories and
- category_objects because it is noisy information.
-
- In fact, objects created after calling
- ObjectSpace.reachable_objects_from_root should not be included
- as a returning hash objects. Currently, mswin64 platform has a
- problem because of this behavior. Should we trace new objects?
-
-Sun Dec 15 07:09:28 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rdoc: Update to RDoc master 263a9e5. This improves the
- accessibility of the search box.
-
-Sat Dec 14 17:39:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_insnhelper.c (vm_callee_setup_arg_complex): count post
- arguments as mandatory arguments. [ruby-core:57706] [Bug #8993]
-
- * vm_insnhelper.c (vm_yield_setup_block_args): ditto.
-
-Sat Dec 14 16:26:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (rubylibprefix): replace exec_prefix as well as
- bindir and libdir. a patch by kimuraw (Wataru Kimura) at
- [ruby-dev:47852]. [Bug #9160]
-
-Sat Dec 14 14:42:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/logger.rb (lock_shift_log): no need to rotate the log file
- if it has been rotated by another process. based on the patch
- by no6v (Nobuhiro IMAI) in [ruby-core:58620]. [Bug #9133]
-
-Sat Dec 14 13:01:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (mnew_from_me): method by respond_to_missing? should be
- owned by the original class.
-
-Sat Dec 14 11:55:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/scanf.rb (IO#scanf): fix mistaken use of rescue modifier.
- a patch by Mon_Ouie at [ruby-core:52813]. [Bug #7940]
-
-Sat Dec 14 11:44:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * util.c (ruby_qsort): fix potential stack overflow on a large
- machine. based on the patch by Conrad Irwin <conrad.irwin AT
- gmail.com> at [ruby-core:51816]. [Bug #7772]
-
-Sat Dec 14 11:25:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * object.c (rb_mod_const_defined): support nested class path as
- well as const_get. [Feature #7414]
-
-Sat Dec 14 01:31:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * eval.c (rb_rescue2): reuse tags pushed for body proc to protect
- rescue proc too.
-
-Sat Dec 14 01:15:51 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (wmap_final_func): Bugfix. Should update *value to new pointer.
-
-Sat Dec 14 01:05:46 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/lib/socket.rb: Don't test $! in "ensure" clause because
- it may be set before the body.
- Reported by ko1 and mrkn. [ruby-core:59088] [Bug #9247]
-
- * lib/cgi/core.rb: Ditto.
-
- * lib/drb/ssl.rb: Ditto.
-
-Sat Dec 14 00:34:31 2013 Naohisa Goto <ngotogenome@gmail.com>
-
- * internal.h (ruby_sized_xrealloc2): fix typo introduced in r44117,
- which cause compile error on Solaris.
-
-Sat Dec 14 00:22:16 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * thread.c: (exec_recursive): use rb_catch_protect() instead of
- rb_catch_obj() and PUSH_TAG(), and reduce pushing tags and
- machine stack usage.
-
-Sat Dec 14 00:18:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (mnew_from_me): achieve the original defined_class from
- prepended iclass, to fix inherited owner.
-
- * proc.c (method_owner): return the defined class, but not the
- class which the method object is created from.
-
-Fri Dec 13 22:29:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (method_owner): return the class where alias is defined, not
- the class original method is defined.
-
- * vm_method.c (rb_method_entry_make, rb_alias): store the originally
- defined class in me. [Bug #7993] [Bug #7842] [Bug #9236]
-
- * vm_method.c (rb_method_entry_get_without_cache): cache included
- module but not iclass.
-
-Fri Dec 13 16:27:17 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (gc_info_decode): Use :major_by=>:nofree as fallback reason
- when other trigger conditions are present.
-
-Fri Dec 13 13:25:30 2013 Koichi Sasada <ko1@atdot.net>
-
- * error.c: add Exception#backtrace_locations.
- Now, there are no setter and independent from Exception#backtrace.
- [Feature #8960]
-
- * eval.c (setup_exception): set backtrace locations for `bt_location'
- special attribute.
-
- * vm_backtrace.c (rb_backtrace_to_location_ary): added.
-
- * internal.h: ditto.
-
- * test/ruby/test_backtrace.rb: add a test for
- Exception#backtrace_locations.
-
-Fri Dec 13 12:01:07 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (garbage_collect_body): use rb_bug() and explicit error message
- instead of using assert().
- [Bug #9222]
-
-Fri Dec 13 11:52:41 2013 Koichi Sasada <ko1@atdot.net>
-
- * array.c: fix comment to remove the word "shady".
-
- * variable.c: ditto.
-
-Fri Dec 13 11:33:55 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: rename *shady* func/macros.
- * RVALUE_RAW_SHADY() -> RVALUE_WB_PROTECTED_RAW()
- * RVALUE_SHADY() -> RVALUE_RAW_SHADY()
- * rgengc_check_shady() -> rgengc_check_relation().
- And fix some messages using "shady" to "non-WB-protected".
-
-Fri Dec 13 10:04:23 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems/request_set/lockfile.rb: Import RubyGems master a8d0669
- with a 1.8.7 compatibility fix.
- * test/rubygems/test_gem_request_set_lockfile.rb: ditto.
-
-Fri Dec 13 09:50:49 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master ddac51f. Changes:
-
- * Allow override for the shared gem installation directory for
- rubygems packagers.
-
- * Lock gem cache files for read and write to improve thread safety.
-
- * Use io/console when available.
-
- * Minor cleanup.
-
- * test/rubygems: ditto.
-
-Fri Dec 13 08:15:31 2013 Aman Gupta <ruby@tmm1.net>
-
- * class.c (include_modules_at): use RCLASS_M_TBL_WRAPPER for
- equality checks. this avoids an unnecessary deference inside a tight
- loop, fixing a performance regression from r43973.
- * object.c (rb_obj_is_kind_of): ditto.
- * object.c (rb_class_inherited_p): ditto.
-
-Wed Dec 13 02:00:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (VpSetPTR): fix for limitation of the resulting
- precision.
- [ruby-core:50269] [Bug #7458]
-
- * test/bigdecimal/test_bigdecimal.rb (test_limit): add tests for the above
- change.
-
-Wed Dec 13 01:56:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (VpAddAbs): put out a conditional branch from
- the inside of while-loop.
-
- * ext/bigdecimal/bigdecimal.c (VpSubAbs): ditto.
-
-Wed Dec 13 01:53:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (VPrint): be a static function, support another
- dump formats, and add more information of the given bigdecimal.
-
- * ext/bigdecimal/bigdecimal.h: ditto.
-
-Wed Dec 11 16:45:58 2013 Koichi Sasada <ko1@atdot.net>
-
- * eval.c (rb_raise_jump): call c_return hook immediately after
- popping `raise' frame.
- Patches by deivid (David Rodriguez). [Bug #8886]
-
- * test/ruby/test_settracefunc.rb: catch up this fix.
-
-Wed Dec 11 16:01:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (rb_hash_reject): return a plain hash, without copying
- the class, default value, instance variables, and taintedness.
- they had been copied just by accident.
- [ruby-core:59045] [Bug #9223]
-
-Wed Dec 11 15:36:15 2013 Aman Gupta <ruby@tmm1.net>
-
- * compile.c (iseq_specialized_instruction): emit opt_aset instruction
- to optimize Hash#[]= and Array#[]= when called with Fixnum argument.
- [Bug #9227] [ruby-core:58956]
-
-Wed Dec 11 04:54:03 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master ec8ed22. Notable changes
- include:
-
- * Renamed extension_install_dir to extension_dir (backwards
- compatible).
-
- * Fixed creation of gem.deps.rb.lock file from
- TestGemRequestSet#test_install_from_gemdeps_install_dir
-
- * Fixed a typo and some documentation.
-
- * test/rubygems: ditto.
-
-Wed Dec 11 03:18:08 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-
- * insns.def: Fix optimization bug of Float#/ [Bug #9238]
-
-Tue Dec 10 23:58:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/date/date_strptime.c (date__strptime_internal): unset
- case-insensitive flag for [:alpha:], which already implies both
- cases, to get rid of backtrack explosion. [ruby-core:58984]
- [Bug #9221]
-
-Tue Dec 10 23:44:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * array.c (rb_ary_hash): add salt to differentiate false and empty
- array. [ruby-core:58993] [Bug #9231]
-
- * hash.c (rb_any_hash, rb_hash_hash): ditto.
-
-Tue Dec 10 18:16:09 2013 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * man/ruby.1: [DOC] Use www.ruby-toolbox.com instead of RAA.
-
-Tue Dec 10 17:21:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (wmap_finalize, wmap_aset_update): use simple malloced array
- instead of T_ARRAY, to reduce GC pressure.
-
-Tue Dec 10 15:56:48 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (reflist_add): revert changes from r44109. it is unnecessary
- after r44113
- * gc.c (allrefs_i): fix whitespace
- * gc.c (allrefs_roots_i): fix whitespace
-
-Tue Dec 10 15:46:03 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (allrefs_add): push obj only if allrefs table doesn't have
- obj.
-
- * gc.c (allrefs_roots_i): ditto.
-
-Tue Dec 10 15:28:10 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (RGENGC_CHECK_MODE): separate checkers to different modes.
- * 2: enable generational bits check (for debugging)
- * 3: enable livness check
- * 4: show all references
-
-Tue Dec 10 15:15:37 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_marks_check): disable GC during checking and
- restore malloc_increase info.
-
-Tue Dec 10 14:41:53 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (reflist_add): return 0 if reference already exists
- * gc.c (allrefs_add): return 1 on newly added references
- * gc.c (allrefs_i): follow references to construct complete object
- graph. before this patch, RGENGC_CHECK could fail to verify some WB
- miss issues. [Bug #9226] [ruby-core:58959]
-
-Tue Dec 10 11:20:56 2013 Aman Gupta <ruby@tmm1.net>
-
- * ext/objspace/objspace_dump.c (dump_object): include fstring flag on
- strings. include gc flags (old, remembered, wb_protected) on all objects.
- * ext/objspace/objspace_dump.c (Init_objspace_dump): initialize lazy
- IDs before first use.
- * gc.c (rb_obj_gc_flags): new function to retrieve object flags
- * internal.h (RB_OBJ_GC_FLAGS_MAX): maximum flags allowed for one obj
- * test/objspace/test_objspace.rb (test_dump_flags): test for above
- * test/objspace/test_objspace.rb (test_trace_object_allocations):
- resolve name before dump (for rb_class_path_cached)
-
-Tue Dec 10 07:48:29 2013 Aman Gupta <ruby@tmm1.net>
-
- * vm_method.c (rb_clear_method_cache_by_class): fire
- ruby::method-cache-clear probe on global or klass-level method cache
- clear [Bug #9190]
- * probes.d (provider ruby): new dtrace probe
- * doc/dtrace_probes.rdoc: docs for new probe
- * test/dtrace/test_method_cache.rb: test for new probe
-
-Tue Dec 10 06:14:11 2013 Eric Hodel <drbrain@segment7.net>
-
- * ext/.document: Remove curses from documentable directories.
-
-Tue Dec 10 04:55:36 2013 Zachary Scott <e@zzak.io>
-
- * ext/openssl/lib/openssl/digest.rb: Deprecate OpenSSL::Digest::Digest
- [Fixes GH-446] https://github.com/ruby/ruby/pull/446
-
-Tue Dec 10 00:41:42 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * ext/thread/thread.c: [DOC] add call-seq alias for Queue#enq, #<<, etc.
-
- * ext/thread/thread.c (Init_thread): use rb_define_alias instead of
- rb_alias to document alias.
-
-Mon Dec 9 20:00:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * internal.h (RCLASS_SERIAL): Add RCLASS_SERIAL as a convenience
- accessor for RCLASS_EXT(klass)->class_serial.
-
- * class.c, vm_insnhelper.c, vm_method.c: Use RCLASS_SERIAL
-
-Mon Dec 9 19:50:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * compile.c, insns.def, test/ruby/test_rubyvm.rb, vm.c, vm_core.h,
- vm_insnhelper.c, vm_insnhelper.h, vm_method.c: Rename method_serial
- to global_method_state and constant_serial to global_constant_state
- after discussion with ko1.
-
-Mon Dec 9 18:50:43 2013 Aman Gupta <ruby@tmm1.net>
-
- * hash.c (rb_hash_replace): fix segv on `{}.replace({})` introduced
- in r44060 [Bug #9230] [ruby-core:58991]
- * test/ruby/test_hash.rb: regression test for above
-
-Mon Dec 9 18:10:10 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm.c (vm_stat): renamed from ruby_vm_stat.
- Should not use ruby_ prefix here.
-
-Mon Dec 9 16:13:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (wmap_size): add ObjectSpace::WeakMap#size and #length.
-
-Mon Dec 9 15:26:17 2013 Shugo Maeda <shugo@ruby-lang.org>
-
- * test/test_curses.rb: removed.
-
-Mon Dec 9 13:36:55 2013 Shugo Maeda <shugo@ruby-lang.org>
-
- * ext/curses, sample/curses: removed curses.
-
- * NEWS: added an entry for the above change.
-
-Mon Dec 9 12:26:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/objspace/object_tracing.c (newobj_i): use cached class path
- only to get rid object allocation during NEWOBJ hook.
- [ruby-core:58853] [Bug #9212]
-
- * variable.c (rb_class_path_cached): returns cached class path
- only, without searching and allocating new class path string.
-
-Mon Dec 9 11:14:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/date/date_parse.c (parse_time): unset case-insensitive flag
- for [:alpha:], which already implies both cases, to get rid of
- backtrack explosion. [ruby-core:58876] [Bug #9221]
-
-Mon Dec 9 08:40:40 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master bf37240. Fixes useless
- error message with `gem install -g` with no gem dependencies file.
* test/rubygems: ditto.
-Mon Dec 9 04:52:25 2013 Eric Hodel <drbrain@segment7.net>
-
- * NEWS: Update RubyGems entry with notable features.
-
-Mon Dec 9 04:43:54 2013 Eric Hodel <drbrain@segment7.net>
+Sun Sep 14 11:03:24 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * ext/.document: Add syslog/lib and thread/thread.c to documentable
- items. [ruby-trunk - Bug #9228]
-
-Mon Dec 9 04:28:50 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 096db36. Changes include
- support for PATH in Gemfile.lock and a typo fix from Akira Matsuda.
- * test/rubygems: ditto.
-
-Mon Dec 9 02:10:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * lib/net/http/responses.rb:
- Add `HTTPIMUsed`, as it is also supported by rack/rails.
- RFC - http://tools.ietf.org/html/rfc3229
- by Vipul A M <vipulnsward@gmail.com>
- https://github.com/ruby/ruby/pull/447 fix GH-447
-
-Sun Dec 8 20:47:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * class.c (rb_get_kwargs): when values is non-null, remove
- extracted keywords from the rest keyword argument.
-
-Sun Dec 8 20:26:54 2013 Yutaka Kanemoto <kanemoto@ruby-lang.org>
-
- * common.mk (ruby.imp): avoid circular dependency on AIX
-
-Sun Dec 8 20:21:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * bigdecimal.c (BigDecimal_coerce): convert a Float to a BigDecimal instead
- of converting the receiver to a Float. The reason is there are BigDecimal
- instances with precisions that is smaller than the Float's precision.
- [ruby-core:58756] [Bug #9192]
-
- * test/bigdecimal/test_bigdecimal.rb: add tests for the above change.
-
-Sun Dec 8 18:28:20 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * NEWS: [DOC] update NEWS about GC.
-
-Sun Dec 8 17:52:24 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * object.c: [DOC] document Module#singleton_class?.
-
-Sun Dec 8 16:19:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * class.c (rb_get_kwargs): if optional is negative, unknown
- keywords are allowed.
-
- * vm_insnhelper.c (vm_callee_setup_keyword_arg): check unknown
- keywords.
-
-Sun Dec 8 14:55:12 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * array.c (rb_ary_shuffle_bang, rb_ary_sample): rename local variables.
-
-Sun Dec 8 13:59:38 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * array.c (rb_ary_shuffle_bang, rb_ary_sample): check
- unknown keywords.
-
- * test/ruby/test_array.rb (test_shuffle, test_sample): tests for
- the above.
-
-Sun Dec 8 13:01:11 2013 Aman Gupta <ruby@tmm1.net>
-
- * vm.c (ruby_vm_stat): add RubyVM.stat() for access to internal cache
- counters. this methods behaves like GC.stat, accepting an optional
- hash or symbol argument. [Bug #9190] [ruby-core:58750]
- * test/ruby/test_rubyvm.rb: test for new method
-
-Sun Dec 8 11:59:40 2013 Aman Gupta <ruby@tmm1.net>
-
- * hash.c (rb_hash_replace): add a write barrier to fix GC mark miss on
- hashes using Hash#replace [Bug #9226] [ruby-core:58948]
-
-Sun Dec 8 11:21:00 2013 Aman Gupta <ruby@tmm1.net>
-
- * include/ruby/ruby.h: add RGENGC_WB_PROTECTED_NODE_CREF setting
- In a large app, this reduces the size of
- remembered_shady_object_count by 80%. [Bug #9225] [ruby-core:58947]
- * gc.c (rb_node_newnode): add FL_WB_PROTECTED flag to NODE_CREF
- * class.c (rewrite_cref_stack): insert OBJ_WRITE for NODE_CREF
- * iseq.c (set_relation): ditto
- * iseq.c (rb_iseq_clone): ditto
- * vm_eval.c (rb_yield_refine_block): ditto
- * vm_insnhelper.c (vm_cref_push): ditto
- * vm_insnhelper.h (COPY_CREF): ditto
-
-Sun Dec 8 10:45:05 2013 Aman Gupta <ruby@tmm1.net>
-
- * hash.c (hash_aset_str): revert r43870 due to performance issue
- [Bug #9188] [ruby-core:58730]
- * parse.y (assoc): convert literal string hash keys to fstrings
- * test/ruby/test_hash.rb (class TestHash): expand test
-
-Sun Dec 8 10:22:38 2013 Aman Gupta <ruby@tmm1.net>
-
- * parse.y (register_symid_str): use fstrings in symbol table
- [Bug #9171] [ruby-core:58656]
- * parse.y (rb_id2str): ditto
- * string.c (rb_fstring): create frozen_strings on first usage. this
- allows rb_fstring() calls from the parser (before cString is created)
- * string.c (fstring_set_class_i): set klass on fstrings generated
- before cString was defined
- * string.c (Init_String): convert frozen_strings table to String
- objects after boot
- * ext/-test-/symbol/type.c (bug_sym_id2str): expose rb_id2str()
- * test/-ext-/symbol/test_type.rb (module Test_Symbol): verify symbol
- table entries are fstrings
-
-Sun Dec 8 10:24:20 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems.rb: Update version for upcoming ruby 2.1.0 RC.
-
-Sun Dec 8 10:21:36 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 14749ce. This fixes bugs
- handling of gem dependencies lockfiles (Gemfile.lock).
-
- * test/rubygems: ditto.
-
-Sun Dec 8 09:40:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * array.c (rb_ary_or): use RHASH_TBL_RAW instead of RHASH_TBL
-
- * process.c (rb_execarg_fixup): use RHASH_TBL_RAW and insert write
- barriers where appropriate
-
- * vm.c (kwmerge_i): use RHASH_TBL_RAW
-
- * vm.c (HASH_ASET): use rb_hash_aset instead of calling directly into
- st_insert
-
-Sat Dec 7 11:15:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (rb_hash_reject): copy unrejected elements only to new hash,
- so that the change on the original receiver can affect.
- [ruby-core:58914] [Bug #9223]
-
-Sat Dec 7 08:25:00 2013 Richo Healey <richo@psych0tik.net>
-
- * test/ruby/test_struct.rb: Add regression test for question marks and
- bangs in struct members. [Closes GH-468]
-
-Fri Dec 6 19:33:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * class.c (rb_extract_keywords, rb_get_kwargs): move from
- vm_insnhelper.c.
-
-Fri Dec 6 19:18:02 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: change oldmalloc meaning.
- Increase oldmalloc_increase with malloc_increase
- instead of using obj_memsize_of().
-
- This change will avoid the danger of memory full without major GC.
-
-Fri Dec 6 19:08:48 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (atomic_sub_nounderflow): not 0 but val itself.
-
-Fri Dec 6 18:37:11 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_objspace_alloc, Init_heap): initialize
- oldmalloc_increase_limit at Init_heap.
-
- rb_objspace_alloc() is not called on some platforms.
-
-Fri Dec 6 18:33:39 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (garbage_collect_body): bug fix.
- initialize after recording.
-
-Fri Dec 6 17:49:46 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (atomic_sub_nounderflow): added to simplify atomic sub with
- care about underflow.
-
- * gc.c (objspace_malloc_increase): use it.
-
-Fri Dec 6 17:10:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_insnhelper.c (rb_get_kwargs): get keyword argument values from an
- option hash, not only checking keys.
-
- * dir.c (dir_initialize): use rb_get_kwargs.
-
- * gc.c (gc_start_internal): ditto.
-
-Fri Dec 6 16:47:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * misc/ruby-mode.el (ruby-brace-to-do-end): split single line block.
-
- * misc/ruby-mode.el (ruby-do-end-to-brace): shrink single line block
- to one line.
-
-Fri Dec 6 16:16:30 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_start_internal): do not use rb_gc_start() and rb_gc().
-
-Fri Dec 6 15:24:30 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_start_internal, rb_gc): do not need
- heap_pages_free_unused_pages() here.
- It was done in after_sweep().
-
- * gc.c (rb_gc): The reason is now GPR_FLAG_CAPI.
-
-Fri Dec 6 14:05:19 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (gc_start_internal): GC.start() now accepts two optional
- keyword arguments. These can be used to disable full_mark (minor
- mark only) or disable immediate_sweep (use lazy sweep). These new
- options are useful for benchmarking GC behavior, or performing minor
- GC out-of-band.
- * test/ruby/test_gc.rb (class TestGc): tests for new options.
-
-Fri Dec 6 11:51:28 2013 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * lib/erb.rb: [DOC] fix broken link, Use rubygems.org and www.ruby-toolbox.com instead of RAA.
- [Bug #9197]
-
-Fri Dec 6 10:50:54 2013 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * lib/webrick/httprequest.rb: [DOC] Fix broken link of CGI specification by @udzura [fix GH-466]
-
-Thu Dec 6 01:27:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (GetVpValueWithPrec):
- treat 0.0 and -0.0 of floating-point numbers specially for an optimization
- and to correctly propagate its signbit to the result.
- [Bug #9214] [ruby-core:58858]
-
- * test/bigdecimal/test_bigdecimal.rb: add tests case for the above change.
-
- * test/bigdecimal/test_bigdecimal_util.rb: ditto.
-
-Thu Dec 5 22:18:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb (configuration): strip destdir part from prefix to get
- rid of duplication. a patch by arton at [ruby-core:58859].
- [ruby-core:58856] [Bug #9213]
-
-Thu Dec 5 21:53:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * array.c (rb_ary_or): lhs elements are preferred, so should not
- replace with rhs elements.
-
- * test/ruby/test_array.rb (test_OR_in_order): import the test failed
- by r43969 from rubyspec/core/array/union_spec.rb.
-
-Thu Dec 5 21:05:42 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_info_decode): fix to avoid syntax error on VS2012.
-
-Thu Dec 5 19:35:35 2013 Martin Duerst <duerst@it.aoyama.ac.jp>
-
- * st.c: tweaked comment
-
-Thu Dec 5 19:21:10 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (struct rb_objspace): rename internal last_collection_flags to
- latest_gc_info
- * gc.c (gc_latest_collection_info): add GC.latest_gc_info() with similar
- behavior to GC.stat()
- * gc.c (rb_gc_latest_gc_info): new c-api for above
- * gc.c (gc_stat_internal): remove :last_collection_flags from GC.stat
- * gc.c (gc_profile_decode_flags): remove GC::Profiler.decode_flags
- * include/ruby/intern.h (rb_gc_latest_gc_info): export new c-api
- * test/ruby/test_gc.rb (class TestGc): test for new behavior
- * NEWS: note about new api
-
- * gc.c (gc_stat_internal): raise TypeError on wrong type
- * gc.c (gc_stat): fix error message
-
-Thu Dec 5 18:18:08 2013 Aman Gupta <ruby@tmm1.net>
-
- * ext/objspace/gc_hook.c: remove this file
- * ext/-test-/tracepoint/gc_hook.c: new filename for above
- * ext/objspace/objspace.c: remove ObjectSpace.after_gc_start_hook=
- * test/objspace/test_objspace.rb: remove test
- * test/-ext-/tracepoint/test_tracepoint.rb: add above test for
- tracepoint re-entry
-
-Thu Dec 5 17:44:53 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: change function names vm_ prefix to objspace_ prefix.
- They are objspace_ functionality.
-
-Thu Dec 5 16:11:04 2013 Aman Gupta <ruby@tmm1.net>
-
- * include/ruby/intern.h: add rb_gc_stat() for access to GC.stat
- variables from c-api
- * gc.c (rb_gc_stat): new c-api method. accepts either VALUE hash like
- GC.stat, or VALUE symbol key and returns size_t directly. the second
- form is useful to avoid allocations, i.e. for usage inside
- INTERNAL_EVENT_GC tracepoints.
- * gc.c (gc_stat): add GC.stat(:key) to return single value instead of hash
- * gc.c (gc_stat_internal): helper method to retrieve single or all stat values
- * test/ruby/test_gc.rb (class TestGc): test for new behavior
- * NEWS: note about this new api
-
-Thu Dec 5 14:40:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (rb_hash): revert r43981 and bail out to the outermost frame
- when recursion is detected.
-
-Thu Dec 5 13:47:15 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (vm_malloc_size): added.
- return malloc_usable_size() if possible.
-
- * gc.c (MALLOC_ALLOCATED_SIZE): add new setting macro to enable
- GC.allocated_size.
- If platform supports `malloc_usable_size()' (or similar one),
- GC.allocated_size can be implemented with this function.
- Default is 0.
-
- * gc.c (vm_xmalloc, vm_xrealloc, vm_xfree): use vm_malloc_size()
- to detect collect allocated size.
-
- * gc.c (vm_malloc_increase): refactoring.
-
-Thu Dec 5 13:19:03 2013 Aman Gupta <ruby@tmm1.net>
-
- * include/ruby/ruby.h: remove INTERNAL_EVENT_GC_END and replace with
- two new events: GC_END_MARK and GC_END_SWEEP
- * gc.c (gc_after_sweep): emit GC_END_SWEEP after lazy sweep is done
- * gc.c (gc_marks_body): emit GC_END_MARK at end of minor/major mark
- * ext/-test-/tracepoint/tracepoint.c (struct tracepoint_track): tests
- for new events.
- * test/-ext-/tracepoint/test_tracepoint.rb (class TestTracepointObj):
- ditto.
- * NEWS: remove ObjectSpace.after_gc_*_hook. These are only a sample,
- and will be removed before ruby 2.1.
- * ext/objspace/gc_hook.c: remove ObjectSpace.after_gc_end_hook=
-
-Thu Dec 5 10:47:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ruby_atomic.h (ATOMIC_PTR_EXCHANGE): atomic exchange function for
- a generic pointer.
-
-Thu Dec 5 10:47:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (finalize_deferred): flush all deferred finalizers while other
- finalizers can get ready to run newly by lazy sweep.
- [ruby-core:58833] [Bug #9205]
-
-Thu Dec 5 09:07:59 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (ruby_gc_set_params): Accept safe_level argument so GC tuning
- settings can be applied before rb_safe_level() is available.
- * internal.h (rb_gc_set_params): ditto.
- * ruby.c (process_options): Apply GC tuning early during boot process
- so boot-time allocations can benefit. This also benefits any code
- loaded in via `ruby -r`.
-
-Wed Dec 4 13:02:13 2013 Aman Gupta <ruby@tmm1.net>
-
- * vm_trace.c (rb_suppress_tracing): Fix initialization of stack
- allocated rb_trace_arg_t structure. Without this patch, sometimes
- INTERNAL_EVENT_GC would be skipped accidentally inside
- rb_threadptr_exec_event_hooks_orig().
-
-Wed Dec 4 12:57:24 2013 Aman Gupta <ruby@tmm1.net>
-
- * string.c (fstr_update_callback): Improve implementation in r43968
- based on feedback from @nagachika. In the existing case, we can
- return ST_STOP to prevent any hash modification. In the !existing
- case, set both key and value to the fstr.
-
-Wed Dec 4 12:47:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/delegate.rb (Delegator#method_missing): ignore the target if not
- set, and delegate to global methods. [ruby-core:58572] [Bug #9155]
-
- * lib/delegate.rb (Delegator#respond_to_missing): ditto.
-
- * lib/delegate.rb (SimpleDelegator#__getobj__): yield and return if
- not delegated but a block is given, like as Hash#fetch.
-
- * lib/delegate.rb (DelegateClass#__getobj__): ditto.
-
-Tue Dec 3 23:48:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: check malloc_size() availability.
-
- * gc.c: use malloc_size() with malloc/malloc.h if available.
-
-Tue Dec 3 23:06:20 2013 Narihiro Nakamura <authornari@gmail.com>
-
- * object.c (rb_obj_clone): don't copy FL_WB_PROTECTED of a
- original object.
-
-Tue Dec 3 22:32:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (rb_hash_recursive): make similar (recursive) constructs
- return same hash value. execute recursively, and rewind to the
- topmost frame with an object which .eql? to the recursive
- object, if recursion is detected.
-
- * hash.c (rb_hash): detect recursion for all `hash' methods. each
- `hash' methods no longer need to use rb_exec_recursive().
-
-Tue Dec 3 21:53:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_eval.c (rb_catch_protect): new function similar to
- rb_catch_obj(), but protect from all global jumps like as
- rb_load_protect(), rb_protect(), etc.
-
-Tue Dec 3 20:18:46 2013 Narihiro Nakamura <authornari@gmail.com>
-
- * object.c (rb_obj_clone): Protect FL_PROMOTED and FL_WB_PROTECTED
- flags of a destination object.
-
-Tue Dec 3 20:16:38 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * array.c (rb_hash_rehash): use hash_alloc() instead of rb_hash_new(),
- to hide temporary object from ObjectSpace. [Bug #9187]
-
-Tue Dec 3 17:11:47 2013 Aman Gupta <ruby@tmm1.net>
-
- * load.c (features_index_add_single): Move loaded_features_index array values off
- the ruby heap. [Bug #9201] [ruby-core:58805]
- * load.c (loaded_features_index_clear_i): Clean up off-heap array structure.
- * vm.c (rb_vm_mark): Remove unnecessary mark_tbl for loaded_features_index.
- This improves minor GC time by 15% in a large application.
-
-Tue Dec 3 17:01:45 2013 Aman Gupta <ruby@tmm1.net>
-
- * include/ruby/ruby.h (struct RClass): Add wrapper struct around
- RClass->m_tbl with serial. This prevents double marking method
- tables, since many classes/modules can share the same method table.
- This improves minor mark time in a large application by 30%.
- * internal.h (struct method_table_wrapper): Define new
- wrapper struct with additional serial.
- * internal.h (RCLASS_M_TBL_INIT): New macro for initializing method
- table wrapper and st_table.
- * method.h (void rb_sweep_method_entry): Rename rb_free_m_table to
- rb_free_m_tbl for consistency
- * .gdbinit (define rb_method_entry): Update rb_method_entry gdb helper
- for new method table structure.
- * class.c: Use RCLASS_M_TBL_WRAPPER and
- RCLASS_M_TBL_INIT macros.
- * class.c (rb_include_class_new): Share WRAPPER between module and
- iclass, so serial can prevent double marking.
- * eval.c (rb_prepend_module): ditto.
- * eval.c (rb_using_refinement): ditto.
- * gc.c: Mark and free new wrapper struct.
- * gc.c (obj_memsize_of): Count size of additional wrapper struct.
-
-Tue Dec 3 14:05:49 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * array.c (rb_ary_uniq_bang): remove duplicate code.
-
-Tue Dec 3 13:40:42 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * array.c (ary_add_hash): set and return values because string keys
- will be frozen. [ruby-core:58809] [Bug #9202]
-
- * array.c (rb_ary_uniq_bang): ditto.
-
- * array.c (rb_ary_or): ditto.
-
- * array.c (rb_ary_uniq): ditto.
-
- * test/ruby/test_array.rb: tests for above.
-
- The patch is from normalperson (Eric Wong).
-
-Tue Dec 3 12:20:21 2013 Aman Gupta <ruby@tmm1.net>
-
- * string.c (rb_fstring): Use st_update instead of st_lookup +
- st_insert.
- * string.c (fstr_update_callback): New callback for st_update.
-
-Tue Dec 3 12:17:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/rdoc/constant.rb (RDoc::Constant#documented?): workaround for
- NoMethodError when the original of alias is not found.
-
-Tue Dec 3 10:43:58 2013 Eric Hodel <drbrain@segment7.net>
-
- * ext/openssl/lib/openssl/buffering.rb: Return ASCII-8BIT strings from
- SSLSocket methods. [ruby-trunk - Bug #9028]
- * test/openssl/test_ssl.rb: Test for the above.
-
-Tue Dec 3 09:42:27 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rdoc: Update to RDoc master 900de99. Changes include:
-
- Fixed documentation display of constants
-
- Fixed handling of unknown parsers
-
- * test/rdoc: ditto.
-
-Mon Dec 2 22:30:10 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * hash.c (getenv): fixed test failures introduced by r43950.
- [ruby-core:58774] [Bug #9195] reported by phasis68 (Heesob Park).
-
-Mon Dec 2 21:49:19 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * hash.c (rb_hash_rehash): make temporary st_table under the control
- of GC. [Bug #9187]
-
- * test/ruby/test_hash.rb: add a test for above.
-
-Mon Dec 2 17:23:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * variable.c (rb_mod_constants): when calling Module#constants with
- inherit=false, there is no need to use a hashtable to deduplicate
- constant names. [Feature #9196] [ruby-core:58786]
-
-Mon Dec 2 14:16:52 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/net/smtp.rb (Net::SMTP#critical): Always return a
- Net::SMTP::Response. Patch by Pawel Veselov.
- [ruby-trunk - Bug #9125]
- * test/net/smtp/test_smtp.rb: Test for the above.
-
-Mon Dec 2 05:52:33 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master baa965b. Notable changes:
-
- Copy directories to lib/ when installing extensions. This completes
- the fix for [ruby-trunk - Bug #9106]
-
- * test/rubygems: ditto.
-
-Mon Dec 2 02:03:47 2013 Shota Fukumori <her@sorah.jp>
-
- * test/ruby/test_case.rb (test_nomethoderror):
- Add test related to r43913, r43914
-
-Mon Dec 2 00:53:01 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * hash.c (getenv): use ANSI codepage version of getenv() for miniruby
- on Windows.
- [ruby-core:58732] [Bug #9189] reported by phasis68 (Heesob Park).
-
-Sun Dec 1 22:14:27 2013 Zachary Scott <e@zzak.io>
-
- * doc/contributors.rdoc: [DOC] Import contributors from redmine wiki
- Many wiki pages have become outdated and spam-ridden, we will import
- these to trunk and begin maintaining them in ruby-trunk. This will
- also allow new contributors to easily contribute patches to update
- these pages, where previously a redmine account with wiki access was
- required. Another bonus is having a contributors file to show thanks
- to all of the people who have submitted a patch to Ruby.
-
-Sun Dec 1 18:03:26 2013 Zachary Scott <e@zzak.io>
-
- * doc/maintainers.rdoc: [DOC] Current maintainers of Ruby
-
-Sun Dec 1 17:17:36 2013 Zachary Scott <e@zzak.io>
-
- * doc/contributing.rdoc: [DOC] Current branch maintainers
-
-Sun Dec 1 17:16:36 2013 Zachary Scott <e@zzak.io>
-
- * doc/contributing.rdoc: [DOC] Reporting other (ruby-lang.org) issues
-
-Sun Dec 1 17:15:51 2013 Zachary Scott <e@zzak.io>
-
- * doc/contributing.rdoc: [DOC] Current platform maintainers
-
-Sun Dec 1 17:14:55 2013 Zachary Scott <e@zzak.io>
-
- * doc/contributing.rdoc: [DOC] Reporting downstream distro issues
-
-Sun Dec 1 14:37:20 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * hash.c (rb_hash_to_a): specify array capa.
-
-Sun Dec 1 14:15:36 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * hash.c (rb_hash_rehash): fix to free new st_table when exception
- is raised in do_hash(). [Bug #9187]
-
-Sun Dec 1 11:57:59 2013 Zachary Scott <e@zzak.io>
-
- * ext/openssl/lib/openssl/buffering.rb: Fix warning in copyright
-
-Sun Dec 1 08:27:28 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 66e5c39. Notable changes:
-
- Implement gem.deps.rb (Gemfile) .lock support
-
- Fixed `gem uninstall` for a relative directory in GEM_HOME.
-
- * test/rubygems: ditto.
-
-Sun Dec 1 06:00:49 2013 Aman Gupta <ruby@tmm1.net>
-
- * test/ruby/test_gc.rb (test_gc_reason): Force minor GC by consuming
- free slots to fix test.
-
-Sat Nov 30 21:22:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * dir.c (dir_initialize): check unknown keywords. [ruby-dev:47152]
- [Bug #8060]
-
-Sat Nov 30 18:05:38 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/win32ole/win32ole.c (hash2named_arg): correct declaration to fix
- build failure. a patch by phasis68 (Heesob Park) at
- [ruby-core:58710]. [Bug #9184]
-
-Sat Nov 30 17:46:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * eval.c (ruby_cleanup): determine exit status and signal to terminate
- before finalization, to get rid of access destroyed T_DATA exception
- object. [ruby-core:58643] [Bug #9167]
-
-Sat Nov 30 16:25:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * enumerator.c (enumerator_with_index): should not store local variable
- address to memoize the arguments. it is invalidated after the return.
- [ruby-core:58692] [Bug #9178]
-
-Sat Nov 30 13:28:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * siphash.c (sip_hash24): fix for aligned word access little endian
- platforms. [ruby-core:58658] [Bug #9172]
-
-Sat Nov 30 13:21:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_eval.c (rb_yield_block): implement non-nil block argument.
-
-Fri Nov 29 20:59:39 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * vm_dump.c (rb_vmdebug_debug_print_pre): Bugfix. Get PC directly.
- PC is cached into local stack and cfp->pc is incorrect at next of
- branch or jump.
- * vm_exec.h (DEBUG_ENTER_INSN): catch up this change.
- * vm_core.h: update signature of rb_vmdebug_debug_print_pre.
-
-Fri Nov 29 20:43:57 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * compile.c: Bugsfix for dump_disasm_list.
- rb_inspect denies a hidden object. So, insert wrapper that creates
- the unhidden one.
- adjust->label is null sometimes.
- insn_data_line_no makes no sense at all.
-
-Fri Nov 29 18:06:45 2013 Shota Fukumori <her@sorah.jp>
-
- * test/ruby/test_case.rb (test_method_missing): Test for r43913.
-
-Fri Nov 29 17:53:22 2013 Shota Fukumori <her@sorah.jp>
-
- * vm_insnhelper.c (check_match): Fix SEGV with VM_CHECKMATCH_TYPE_CASE
- and class of `pattern` has `method_missing`
- [Bug #8872] [ruby-core:58606]
-
-Fri Nov 29 17:06:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_eval.c (rb_yield_block): yield block with rb_block_call_func
- arguments.
-
- * range.c (range_each): use rb_yield_block.
-
- * include/ruby/ruby.h (RB_BLOCK_CALL_FUNC_ARGLIST): constify argv.
-
- * enum.c (rb_enum_values_pack): ditto.
-
- * vm_eval.c (rb_block_call, rb_check_block_call): ditto.
-
- * include/ruby/ruby.h (RB_BLOCK_CALL_FUNC_ARGLIST): for declaration
- argument list of rb_block_call_func.
-
-Fri Nov 29 11:26:43 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/ruby.h (rb_block_call_func): add blockarg. block
- function can take block argument, e.g., proc {|&blockarg| ...}.
-
-Thu Nov 28 21:43:48 2013 Zachary Scott <e@zzak.io>
-
- * doc/dtrace_probes.rdoc: [DOC] Import dtrace probes doc from wiki
-
-Thu Nov 28 21:17:32 2013 Zachary Scott <e@zzak.io>
-
- * doc/contributing.rdoc: [DOC] Add heading above ChangeLog tips to
- setup entry for commits, its not required. Actually easier if
- contributors don't include a ChangeLog entry.
-
-Thu Nov 28 21:16:18 2013 Zachary Scott <e@zzak.io>
-
- * doc/contributing.rdoc: [DOC] Add coding style heading for patch
- rules
-
-Thu Nov 28 21:15:45 2013 Zachary Scott <e@zzak.io>
-
- * doc/contributing.rdoc: [DOC] Add notes about deciding what to patch
-
-Thu Nov 28 19:43:45 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * benchmark/bm_hash_flatten.rb: added. r43896 is about 4 times faster
- than 2.0.0p353.
-
- * benchmark/bm_hash_keys.rb: added. r43896 is about 5 times faster
- than 2.0.0p353.
-
- * benchmark/bm_hash_values.rb: added. r43896 is about 5 times faster
- than 2.0.0p353.
-
-Thu Nov 28 19:29:04 2013 Zachary Scott <e@zzak.io>
-
- * doc/contributing.rdoc: [DOC] Add notes about slideshow proposals
- from wiki page: HowToRequestFeatures
-
-Thu Nov 28 17:34:42 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * st.c: add st_values() and st_values_check().
-
- * include/ruby/st.h: add prototypes for above.
-
- * hash.c (rb_hash_values): use st_values_check() for performance
- improvement if VALUE and st_data_t are compatible.
-
-Thu Nov 28 17:14:14 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * st.c (st_keys): fix not to use Qundef in st.c.
-
- * include/ruby/st.h: define modified prototype.
-
- * hash.c (rb_hash_keys): use modified st_keys().
-
-Thu Nov 28 16:34:43 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c: Expose details about last garbage collection via GC.stat.
- * gc.c (gc_stat): Add :last_collection_flags for reason/trigger/type of
- last GC run.
- * gc.c (gc_prof_sweep_timer_stop): Record HAVE_FINALIZE GPR even
- without GC_PROFILE_MORE_DETAIL.
- * gc.c (gc_profile_flags): Add GC::Profiler.decode_flags to make sense
- of GC.stat[:last_collection_flags]
- * test/ruby/test_gc.rb (class TestGc): Test for above.
-
-Thu Nov 28 16:15:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/win32.c (rb_w32_dup2): extract from rb_cloexec_dup2() and
- redirect_dup2().
-
-Tue Nov 28 14:40:00 2013 Akira Matsuda <ronnie@dio.jp>
-
- * lib/drb/ssl.rb: [Doc] Fix typo
-
-Thu Nov 28 13:56:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * common.mk (Doxyfile): tool/file2lastrev.rb needs running with
- BASERUBY since r43617. [ruby-dev:47823] [Bug #9169]
-
-Thu Nov 28 09:18:39 2013 Koichi Sasada <ko1@atdot.net>
-
- * string.c (rb_fstring): fstrings should be ELTS_SHARED.
- If we resurrect dying objects (non-marked, but not swept yet),
- pointing shared string can be collected.
- To avoid such issue, fstrings (recorded to fstring_table)
- should not be ELTS_SHARED (should not have a shared string).
-
-Thu Nov 28 01:35:08 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * st.c (st_keys): fix to use st_index_t for size of hash.
-
-Thu Nov 28 00:36:52 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * st.c (st_keys): define st_keys(). it writes each key to buffer.
-
- * hash.c (rb_hash_keys): use st_keys() for performance improvement
- if st_data_t and VALUE are compatible.
-
- * include/ruby/st.h: define macro ST_DATA_COMPATIBLE_P() to predicate
- whether st_data_t and passed type are compatible.
-
- * configure.in: check existence of builtin function to use in
- ST_DATA_COMPATIBLE_P().
-
-Thu Nov 28 00:07:28 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * ruby_atomic.h: remove duplicate definitions between ATOMIC_XXX
- and ATOMIC_SIZE_XXX.
-
-Wed Nov 27 23:55:50 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * ruby_atomic.h: define ATOMIC_SIZE_CAS() with
- __atomic_compare_exchange_n() and refactoring.
-
-Tue Nov 27 21:43:00 2013 Akira Matsuda <ronnie@dio.jp>
-
- * lib/irb/notifier.rb: [Doc] Fix typo
- * ext/json/lib/json/common.rb: Ditto.
-
-Tue Nov 27 18:04:57 2013 Akira Matsuda <ronnie@dio.jp>
-
- * lib/irb/notifier.rb: Fix typo
-
-Wed Nov 27 17:54:57 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_mark_stacked_objects): check only when check_mode > 0.
-
-Wed Nov 27 16:07:19 2013 Aman Gupta <ruby@tmm1.net>
-
- * test/ruby/test_gc.rb (class TestGc): Fix warning in
- test_expand_heap.
-
-Wed Nov 27 15:55:52 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (Init_GC): Add new GC::INTERNAL_CONSTANTS for information about
- GC heap/page/slot sizing.
- * test/ruby/test_gc.rb (class TestGc): test for above.
-
-Wed Nov 27 15:21:17 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (gc_page_sweep): Fix compile warning from last commit.
- * hash.c (hash_aset_str): Re-use existing variable to avoid
- unnecessary pointer dereferencing.
-
-Wed Nov 27 15:12:55 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_page_sweep): disable debug print.
-
-Wed Nov 27 15:05:59 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_stat): add new information heap_eden_page_length and
- heap_tomb_page_length.
-
- * test/ruby/test_gc.rb: fix to use GC.stat[:heap_eden_page_length]
- instead of GC.stat[:heap_length].
- This test expects `heap_eden_page_length' (used pages size).
-
-Wed Nov 27 15:02:53 2013 Aman Gupta <ruby@tmm1.net>
-
- * test/ruby/test_eval.rb (class TestEval): Use assert_same instead of
- assert_equal.
- * test/ruby/test_hash.rb (class TestHash): ditto.
- * test/ruby/test_iseq.rb (class TestISeq): ditto.
-
-Wed Nov 27 14:50:02 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rinda/ring.rb: Announce RingServer for the same process.
- [ruby-trunk - Bug #9163]
- * test/rinda/test_rinda.rb: Tests for the above.
-
-Wed Nov 27 14:37:33 2013 Aman Gupta <ruby@tmm1.net>
-
- * test/ruby/test_eval.rb (class TestEval): Add test for shared eval
- filenames via rb_fstring().
- * test/ruby/test_iseq.rb (class TestISeq): Add test for shared
- iseq labels via rb_fstring(). [Bug #9159]
-
-Wed Nov 27 14:24:55 2013 Aman Gupta <ruby@tmm1.net>
-
- * hash.c (hash_aset_str): Use rb_fstring() to de-duplicate hash string
- keys. Patch by Eric Wong. [Bug #8998] [ruby-core:57727]
- * test/ruby/test_hash.rb (class TestHash): test for above.
-
-Wed Nov 27 10:39:39 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c: Rename rb_heap_t members:
- used -> page_length
- limit -> total_slots
-
-Wed Nov 27 08:24:49 2013 Aman Gupta <ruby@tmm1.net>
-
- * compile.c: Use rb_fstring() to de-duplicate string literals in code.
- [ruby-core:58599] [Bug #9159] [ruby-core:54405]
- * iseq.c (prepare_iseq_build): De-duplicate iseq labels and source
- locations.
- * re.c (rb_reg_initialize): Use rb_fstring() for regex string.
- * string.c (rb_fstring): Handle non-string and already-fstr arguments.
- * vm_eval.c (eval_string_with_cref): De-duplicate eval source
- filename.
-
-Wed Nov 27 07:13:54 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych.rb: psych version 2.0.2
+ * ext/psych/lib/psych.rb: update version
* ext/psych/psych.gemspec: ditto
-Wed Nov 27 06:40:18 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/scalar_scanner.rb: fix support for negative
- years.
- * ext/psych/lib/psych/visitors/yaml_tree.rb: ditto
- * test/psych/test_date_time.rb: test for change.
- Fixes: https://github.com/tenderlove/psych/issues/168
-
-Wed Nov 27 04:46:55 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/scalar_scanner.rb: fix regexp for matching TIME
- strings.
- * test/psych/test_date_time.rb: test for change.
- Fixes: https://github.com/tenderlove/psych/issues/171
-
-Wed Nov 27 02:26:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (str_new4): copy the original capacity so that memsize of
- frozen shared string returns correct size.
-
-Wed Nov 27 02:20:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * array.c (rb_ary_hash): should not ignore the rest of recursive
- constructs.
-
- * hash.c (rb_hash_hash): ditto.
-
- * range.c (range_hash): ditto.
-
- * struct.c (rb_struct_hash): ditto.
-
- * test/-ext-/test_recursion.rb (TestRecursion): separate from
- test/ruby/test_thread.rb.
-
-Tue Nov 26 22:43:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (rb_hash): cut off if recursion detected to get rid of stack
- overflow. [ruby-core:58567] [Bug #9151]
-
-Tue Nov 26 20:02:39 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/ruby/test_settracefunc.rb: add tests for a_call/a_return
- by Brandur <brandur@mutelight.org> [Feature #9120]
-
-Tue Nov 26 19:29:52 2013 Koichi Sasada <ko1@atdot.net>
-
- * common.mk: add useful config "set breakpoint pending on"
- for run.gdb.
-
-Tue Nov 26 19:17:47 2013 Koichi Sasada <ko1@atdot.net>
-
- * ext/objspace/object_tracing.c (newobj_i): skip class_path if class
- is frozen.
-
- rb_class_path() can modify frozen classes (and causes errors).
- This patch is temporary. We need no-modification/no-allocation
- class path function.
-
-Tue Nov 26 18:12:13 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_trace.c: skip "exception check" and "reentrant check (only normal
- events) for internal events.
-
- Reentrant check for internal events are remaining.
-
-Tue Nov 26 17:38:16 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_trace.c: prohibit to specify normal events and internal events
- simultaneously.
- I will introduce special care for internal events later.
-
- * ext/-test-/tracepoint/tracepoint.c: test this behavior.
-
- * test/-ext-/tracepoint/test_tracepoint.rb: ditto.
-
-Tue Nov 26 16:30:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * file.c (rb_readlink): fix buffer overflow on a long symlink. since
- rb_str_modify_expand() expands from its length but not its capacity,
- need to set the length properly for each expansion.
- [ruby-core:58592] [Bug #9157]
-
-Tue Nov 26 14:23:17 2013 Aman Gupta <ruby@tmm1.net>
-
- * ext/objspace/objspace_dump.c (dump_append_string_value): Escape
- control characters for strict json parsers.
- * ext/objspace/objspace_dump.c (objspace_dump): Document File/IO
- output option.
-
-Tue Nov 26 11:43:19 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * ruby_atomic.h: use __atomic builtin functions supported by GCC.
- __sync family are legacy functions now and it is recommended
- that new code use the __atomic functions.
- http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
-
- * configure.in: check existence of __atomic functions.
-
-Tue Nov 26 10:57:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/bigdecimal/bigdecimal.gemspec: revert Gem::Specification#date
- for snapshot/release tarballs.
-
-Tue Nov 26 06:42:50 2013 Aman Gupta <ruby@tmm1.net>
-
- * NEWS: Add ObjectSpace.after_gc_{start,end}_hook=
- * ext/objspace/objspace_dump.c: [DOC] catch up dump/dump_all to r43679
-
-Tue Nov 26 04:12:10 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 612f85a. Notable changes:
-
- Fixed installation and activation of git: and path: gems via
- Gem.use_gemdeps
-
- Improved documentation coverage
-
- * test/rubygems: ditto.
-
-Mon Nov 25 22:23:03 2013 Zachary Scott <e@zzak.io>
-
- * lib/xmlrpc.rb: [DOC] Fix link to xmlrpc4r site [Bug #9148]
- Patch by Giorgos Tsiftsis
-
-Mon Nov 25 19:48:10 2013 Zachary Scott <e@zzak.io>
-
- * lib/uri/common.rb: [DOC] typo fixes by @vipulnsward [Fixes GH-456]
- https://github.com/ruby/ruby/pull/456
- * lib/uri/generic.rb: [DOC] ditto.
-
-Mon Nov 25 14:34:42 2013 Zachary Scott <e@zzak.io>
-
- * ext/bigdecimal/bigdecimal.gemspec: bump BigDecimal to 1.2.3 for
- proper release date in RubyGems
-
-Mon Nov 25 14:25:08 2013 Zachary Scott <e@zzak.io>
-
- * ext/bigdecimal/bigdecimal.gemspec: Remove Gem::Specification#date
- We should rely on rubygems to create the date the gem was released
- for each version.
-
-Mon Nov 25 06:53:30 2013 Koichi Sasada <ko1@atdot.net>
-
- * internal.h: do not use ruby_sized_xrealloc() and ruby_sized_xfree()
- if HAVE_MALLOC_USABLE_SIZE (or _WIN32) is defined.
-
- We don't need these function if malloc_usable_size() is available.
-
- * gc.c: catch up this change.
-
- * gc.c: define HAVE_MALLOC_USABLE_SIZE on _WIN32.
-
- * array.c (ary_resize_capa): do not use ruby_sized_xfree() with
- local variable to avoid "unused local variable" warning.
- This change only has few impact.
-
- * string.c (rb_str_resize): ditto.
-
-Mon Nov 25 05:05:04 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/-ext-/tracepoint/test_tracepoint.rb: catch up GC.stat changes
- at r43835.
-
-Mon Nov 25 04:45:59 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: continue to change OLDSPACE -> OLDMALLOC.
- RGENGC_ESTIMATE_OLDSPACE -> RGENGC_ESTIMATE_OLDMALLOC.
-
- * gc.c: add a new major GC reason GPR_FLAG_MAJOR_BY_OLDMALLOC.
-
-Mon Nov 25 04:16:09 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: change terminology "..._num" to "..._slots" about slot operation.
- * final_num -> final_slots
- * objspace_live_num() -> objspace_live_slots()
- * objspace_limit_num() -> objspace_limit_slots()
- * objspace_free_num() -> objspace_free_slots()
-
-Mon Nov 25 04:03:12 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_stat): add internal information.
- * heap_swept_slot
- * malloc_increase
- * malloc_limit
- * remembered_shady_object
- * remembered_shady_object_limit
- * old_object
- * old_object_limit
- * oldmalloc_increase
- * oldmalloc_limit
-
- * gc.c (gc_stat): rename names.
- * heap_live_num -> heap_live_slot
- * heap_free_num -> heap_free_slot
- * heap_final_slot -> heap_final_slot
-
- Quote from RDoc of GC.stat():
- "The contents of the hash are implementation specific and may
- be changed in the future."
-
- * test/ruby/test_gc.rb: catch up this change.
-
-Mon Nov 25 03:59:45 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/ruby/test_gc.rb: catch up last commit.
- Now RUBY_GC_OLDSPACE_LIMIT(...) is RUBY_GC_OLDMALLOC_LIMIT(...).
-
-Mon Nov 25 03:10:46 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: change terminology OLDSPACE -> OLDMALLOC.
- (oldspace -> oldmalloc for variable names)
-
- OLDSPACE is confusing because it is not includes slots.
- To more clearly, rename such as (oldspace_limit -> oldmalloc_limit).
- It is clear that it measures (estimates) malloc()'ed size.
-
-Mon Nov 25 00:50:03 2013 Masaki Matsushita <glass.saga@gmail.com>
+Sun Sep 14 08:43:37 2014 Eric Wong <e@80x24.org>
- * internal.h: use __builtin_bswap16() if possible.
+ * ccan/container_of/container_of.h (container_of_or_null): added
+ [ccan 7ec5b8e06b2fd5fa98b1fcde1158c286d2d429d8] (David Gibson)
- * configure.in: check existence of __builtin_bswap16().
+Sun Sep 14 08:41:44 2014 Eric Wong <e@80x24.org>
-Sun Nov 24 22:24:19 2013 Tanaka Akira <akr@fsij.org>
+ * ccan/list/list.h (list_del_init, list_node_init): new functions
+ for multiple list_del() calls
+ [ccan ec8654d94d3c5c47aa5f82698f7e8048c79765b1] (Rusty Russell)
- * bignum.c (bigxor_int): Apply BIGLO for long in a BDIGIT expression.
- (bigor_int): Ditto.
- (bigand_int): Ditto.
+Sat Sep 13 22:19:26 2014 Bernard Potocki <bernard.potocki@imanel.org>
-Sun Nov 24 18:13:23 2013 Tanaka Akira <akr@fsij.org>
+ * hash.c (rb_hash_aset): fix misleading example which may suggest
+ that Hash.store will return self instead of value - Hash#store
+ is returning value and update itself, as well as Hash#[]=.
+ [Fix GH-715]
- * include/ruby/defines.h (SIZEOF_ACTUAL_BDIGIT): Defined.
+Sat Sep 13 15:16:31 2014 Eric Wong <e@80x24.org>
- * include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): Use
- SIZEOF_ACTUAL_BDIGIT instead of SIZEOF_BDIGITS.
- SIZEOF_BDIGITS can be different to sizeof(BDIGIT).
+ * class.c: use ALLOC(rb_subclass_entry_t)
-Sun Nov 24 13:49:08 2013 Tanaka Akira <akr@fsij.org>
+Sat Sep 13 14:14:00 2014 Eric Wong <e@80x24.org>
- * include/ruby/defines.h: Don't use int128_t for Bignum.
- It's not always faster.
+ * process.c (free_exec_arg): remove
+ (memsize_exec_arg): ptr is never NULL
+ (exec_arg_data_type): use RUBY_TYPED_DEFAULT_FREE
- * bignum.c: Ditto.
+ * variable.c (autoload_i_free): remove
+ (autoload_data_i_type): use RUBY_TYPED_DEFAULT_FREE
+ (autoload_memsize): ptr is never NULL
-Sun Nov 24 10:18:15 2013 Aman Gupta <ruby@tmm1.net>
+ * vm_backtrace.c (location_free): remove
+ (location_mark): ptr is never NULL
+ (location_data_type): use RUBY_TYPED_DEFAULT_FREE
+ (backtrace_mark): ditto
+ (backtrace_free): ditto
- * NEWS: Add details about new debugging features and APIs.
+Sat Sep 13 13:43:07 2014 Eric Wong <e@80x24.org>
-Sun Nov 24 09:37:20 2013 Andrew Vit <andrew@avit.ca>
+ * doc/NEWS-2.0.0: fix typo for default RUBY_FIBER_MACHINE_STACK_SIZE
+ [ci skip]
- * lib/csv.rb: Optimize header hashes by freezing string keys.
- [ruby-core:58510]
+Sat Sep 13 11:16:58 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Sun Nov 24 09:18:06 2013 Aman Gupta <ruby@tmm1.net>
+ * ext/win32ole/win32ole_event.c(ev_advise, ole_event_free,
+ fev_s_allocate, fev_unadvise): avoid segmentation fault when COM
+ server freed before calling Unadvise from WIN32OLE_EVENT object.
+ * ext/win32ole/win32ole.c: ditto.
- * ext/objspace/objspace_dump.c (dump_object): Use PRIuSIZE to print
- size_t for better win32 compatibility.
- * test/objspace/test_objspace.rb (test_dump_all): Hold reference to
- test string to avoid failure due to GC. Reduce size of failure message
- using grep(/TEST STRING/).
+Sat Sep 13 09:47:44 2014 Eric Wong <e@80x24.org>
-Sun Nov 24 08:38:00 2013 Kyle Stevens <kstevens715@gmail.com>
+ * man/ruby.1: use https for *.ruby-lang.org links
- * lib/csv.rb: If skip_lines is set to a String, convert it to a Regexp
- to prevent the alternative, which is that each line in the CSV gets
- converted to a Regexp when calling skip_lines#match.
+Sat Sep 13 06:31:23 2014 Eric Wong <e@80x24.org>
-Sun Nov 24 01:03:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * vm.c (thread_alloc): remove needless volatile
- * ext/bigdecimal/bigdecimal.c (BigDecimal_power): Use FIX2LONG instead
- of FIX2INT to avoid conversion error.
+Sat Sep 13 06:13:55 2014 Eric Wong <e@80x24.org>
-Sun Nov 24 00:44:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * proc.c (proc_free): remove, use RUBY_TYPED_DEFAULT_FREE
+ (proc_mark, proc_memsize): remove needless branching
- * include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): define by macros
- defined in defines.h, instead of complex and repeated expression.
+ * vm.c (env_free): remove, use RUBY_TYPED_DEFAULT_FREE
+ (env_mark, env_memsize): remove needless branching
-Sat Nov 23 22:22:26 2013 Tanaka Akira <akr@fsij.org>
+Sat Sep 13 05:52:15 2014 Eric Wong <e@80x24.org>
- * include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): Limit the value to
- less than 8.
+ * proc.c (rb_proc_alloc): inline and move to vm.c
+ (rb_proc_wrap): new wrapper function used by rb_proc_alloc
+ (proc_dup): simplify alloc + copy + wrap operation
+ [ruby-core:64994]
-Sat Nov 23 19:52:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * vm.c (rb_proc_alloc): new inline function
+ (rb_vm_make_proc): call rb_proc_alloc
- * ext/bigdecimal/lib/bigdecimal/math.rb (BigMath.E): Use BigMath.exp.
- [Feature #6857] [ruby-core:47130]
+ * vm_core.h: remove rb_proc_alloc, add rb_proc_wrap
-Sat Nov 23 19:46:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * benchmark/bm_vm2_newlambda.rb: short test to show difference
- * ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Optimize the
- calculation algorithm to reduce the number of divisions.
- This optimization was proposed by Rafal Michalski.
- [Feature #6857] [ruby-core:47130]
+Sat Sep 13 04:40:04 2014 Eric Wong <e@80x24.org>
-Sat Nov 23 19:20:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * process.c (Init_process): subclass Thread as Process::Waiter
+ (rb_detach_process): use Process::Waiter instead of singleton class
+ Thanks to headius and nobu. [Bug #10231]
- * ext/bigdecimal/bigdecimal.c (BigDecimal_div2): The signature was
- changed to allow us to pass arguments directly.
+ * test/ruby/test_process.rb (test_process_detach): new test
- * ext/bigdecimal/bigdecimal.c (BigDecimal_div3): Added for the role of
- the old BigDecimal_div2.
+ * inits.c (rb_call_inits): call Init_Thread before Init_process to
+ ensure Process::Waiter may be a subclass of Thread
-Sat Nov 23 12:31:00 2013 Koichi Sasada <ko1@atdot.net>
+Fri Sep 12 18:14:28 2014 Eric Wong <e@80x24.org>
- * gc.c: fix global variable name.
- Now we have following environments (and related variable names).
+ * vm.c (env_alloc): inline to avoid extra zeroing
+ tiny speedup [ruby-core:64980]
- * RUBY_GC_HEAP_INIT_SLOTS
- * RUBY_GC_HEAP_FREE_SLOTS
- * RUBY_GC_HEAP_GROWTH_FACTOR (new from 2.1)
- * RUBY_GC_HEAP_GROWTH_MAX_SLOTS (new from 2.1)
+Fri Sep 12 17:13:29 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * obsolete
- * RUBY_FREE_MIN -> RUBY_GC_HEAP_FREE_SLOTS (from 2.1)
- * RUBY_HEAP_MIN_SLOTS -> RUBY_GC_HEAP_INIT_SLOTS (from 2.1)
+ * vm_method.c (rb_method_entry_make, remove_method): ditto.
- * RUBY_GC_MALLOC_LIMIT
- * RUBY_GC_MALLOC_LIMIT_MAX (new from 2.1)
- * RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR (new from 2.1)
+Fri Sep 12 14:39:55 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * RUBY_GC_OLDSPACE_LIMIT (new from 2.1)
- * RUBY_GC_OLDSPACE_LIMIT_MAX (new from 2.1)
- * RUBY_GC_OLDSPACE_LIMIT_GROWTH_FACTOR (new from 2.1)
+ * gems/bundled_gems: Upgraded to test-unit-3.0.1 and minitest-5.4.1
- * test/ruby/test_gc.rb: catch up this change.
-
-Sat Nov 23 09:45:49 2013 Aman Gupta <ruby@tmm1.net>
-
- * marshal.c (w_object): Use HASH_PROC_DEFAULT directly from internal.h
-
-Sat Nov 23 08:43:23 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c: Rename heap_pages_swept_num to heap_pages_swept_slots to
- clarify meaning (number of slots, not pages).
-
-Sat Nov 23 08:23:23 2013 Aman Gupta <ruby@tmm1.net>
-
- * lib/set.rb (class SortedSet): Fix source_location for methods
- defined via eval.
-
-Sat Nov 23 03:44:03 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master dcce4ff. Important changes
- in this commit:
-
- Remove automatic detection of gem dependencies files. This prevents a
- security hole as described in [ruby-core:58490]
-
- Fixed bugs for installing git gems.
-
- * test/rubygems: ditto.
-
-Fri Nov 22 22:30:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (BigDecimal_power):
- Round the result value only if the precision is given.
-
-Fri Nov 22 17:20:50 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * transcode.c (str_transcode0): don't scrub invalid chars if
- str.encode doesn't have explicit invalid: :replace.
- workaround fix for see #8995
-
-Fri Nov 22 17:11:26 2013 Narihiro Nakamura <authornari@gmail.com>
-
- * include/ruby/intern.h, internal.h: Expose rb_gc_count().
-
-Fri Nov 22 17:07:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.gemspec: version 1.2.2.
-
-Fri Nov 22 17:04:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (BigDecimal_data_type):
- Use RUBY_TYPED_FREE_IMMEDIATELY only if it is available.
-
-Fri Nov 22 16:49:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (BigDecimal_power): Round the result value.
- [Bug #8818] [ruby-core:56802]
+Fri Sep 12 06:55:40 2014 Eric Wong <e@80x24.org>
- * test/bigdecimal/test_bigdecimal.rb: Add a test for the above fix.
+ * string.c (Init_frozen_strings): use st_init_table_with_size
-Fri Nov 22 16:25:43 2013 Koichi Sasada <ko1@atdot.net>
+Fri Sep 12 06:15:37 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * gc.c (heap_set_increment): accept minimum additional page number.
+ * string.c (sym_find): remove Symbol.find because we have Symbol GC now.
+ https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20140904Japan
+ If you still want this, request again on Redmine. [Feature #7854]
+ https://bugs.ruby-lang.org/issues/7854
- * gc.c (gc_after_sweep): allocate pages to allocate at least
- RUBY_HEAP_MIN_SLOTS.
- [Bug #9137]
+ * ext/-test-/symbol/init.c (sym_find): moved from string.c for tests.
-Fri Nov 22 16:19:52 2013 Narihiro Nakamura <authornari@gmail.com>
+Fri Sep 12 04:24:03 2014 Eric Wong <e@80x24.org>
- * include/ruby/intern.h (rb_gc_set_params): Deprecate
- rb_gc_set_params because it's only used in ruby internal.
+ * insns.def (once): define and use fake RUNNING_THREAD_ONCE_DONE
+ pointer to indicate is->once.running_thread is done.
- * internal.h (ruby_gc_set_params): Declare rb_gc_set_params's
- alias function.
+ * vm_core.h (iseq_inline_storage_entry): remove done field,
+ allowing the union to be reduced from 24=>16 bytes on 64-bit
+ [Feature #10187]
- * gc.c: ditto.
+Thu Sep 11 20:10:00 2014 Koichi Sasada <ko1@atdot.net>
- * ruby.c: use ruby_gc_set_params.
+ * vm.c (rb_thread_mark): use rb_gc_mark_values() to mark VM stack.
-Fri Nov 22 14:55:00 2013 Kenta Murata <mrkn@mrkn.jp>
+Thu Sep 11 19:50:57 2014 Koichi Sasada <ko1@atdot.net>
- * ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Insert rb_thread_check_ints.
+ * vm.c (rb_vm_register_special_exception): make new function to
+ make and register special exceptions.
-Fri Nov 22 14:35:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * vm.c (rb_vm_mark): do not need to mark special exceptions
+ because they are registered by rb_gc_register_mark_object().
- * ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Fix the inserting points
- of RB_GC_GUARDs.
+ * eval.c (Init_eval): use rb_vm_register_special_exception().
-Fri Nov 22 14:31:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * gc.c (Init_GC): ditto.
- * ext/bigdecimal/bigdecimal.c: Fix indentation.
+ * proc.c (Init_Proc): ditto.
-Fri Nov 22 14:03:00 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * thread.c (Init_Thread): ditto.
- * ext/nkf: merge nkf 2.1.3 2a2f2c5.
+Thu Sep 11 19:32:30 2014 Koichi Sasada <ko1@atdot.net>
-Fri Nov 22 12:43:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * util.c (ruby_strtod): ignore too long fraction part, which does not
- affect the result.
-
-Fri Nov 22 12:17:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/openssl/lib/openssl/buffering.rb (OpenSSL::Buffering#initialize):
- initialize of a module should pass arguments to super.
-
-Fri Nov 22 12:02:58 2013 Tanaka Akira <akr@fsij.org>
-
- * test/ruby/test_settracefunc.rb: Ignore events from other threads.
-
-Fri Nov 22 10:35:57 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm.c (ruby_vm_destruct): do not use ruby_xfree() after freeing
- objspace.
-
- * gc.c (ruby_mimfree): added. It is similar to ruby_mimmalloc().
+ * gc.c (rb_gc_mark_values): added.
+ This function is similar to rb_gc_mark_locations(), but not
+ conservative.
* internal.h: ditto.
-Fri Nov 22 09:42:35 2013 Zachary Scott <e@zzak.io>
-
- * test/digest/test_digest.rb: Reverse order of assert_equal
- Reported by @splattael
-
-Fri Nov 22 09:03:16 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * gc.c: fix build failure on FreeBSD introduced by r43763.
- malloc_usable_size() is defined by malloc_np.h on FreeBSD.
-
- * configure.in: check malloc.h and malloc_np.h.
-
-Fri Nov 22 08:27:13 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 50a8210. Important changes
- in this commit:
-
- RubyGems now automatically checks for gem.deps.rb or Gemfile when
- running ruby executables. This behavior is similar to `bundle exec
- rake`. This change may be reverted before Ruby 2.1.0 if too many bugs
- are found.
-
- * test/rubygems: ditto.
-
-Thu Nov 21 22:33:59 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: RGENGC_CHECK_MODE should be 0.
-
-Thu Nov 21 21:40:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (VpAlloc): Fix the expr to adjust the size
- of the digit array.
-
-Thu Nov 21 21:36:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (BigDecimal_sqrt): Fix the precision of
- the result BigDecimal of sqrt.
- [Bug #5266] [ruby-dev:44450]
-
- * test/bigdecimal/test_bigdecimal.rb: add tests for the above changes.
-
-Thu Nov 21 18:49:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (vm_xrealloc, vm_xfree): use malloc_usable_size() to obtain old
- size if available.
-
-Thu Nov 21 18:47:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/delegate.rb (SimpleDelegator#__getobj__): target object must be set.
-
- * lib/delegate.rb (DelegateClass#__getobj__): ditto.
-
-Thu Nov 21 18:28:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/tempfile.rb (Tempfile#initialize): use class method to get rid
- of warnings when $VERBOSE.
-
-Thu Nov 21 17:43:29 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: rename initial_xxx variables to gc_params.xxx.
- They are not only used initial values.
-
- Chikanaga-san: Congratulations on RubyPrize!
-
-Thu Nov 21 17:16:00 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: enable "RGENGC_ESTIMATE_OLDSPACE" option as default.
- Without this option, some application consumes huge memory.
- (and there are only a few performance down)
-
- Introduced new environment variables:
- * RUBY_GC_HEAP_OLDSPACE (default 16MB)
- * RUBY_GC_HEAP_OLDSPACE_MAX (default 128 MB)
- * RUBY_GC_HEAP_OLDSPACE_GROWTH_FACTOR (default 1.2)
-
- * gc.c (initial_malloc_limit): rename to initial_malloc_limit_min.
-
-Thu Nov 21 16:51:34 2013 Zachary Scott <e@zzak.io>
-
- * ext/digest/bubblebabble/bubblebabble.c: Teach RDoc digest/bubblebabble
-
-Thu Nov 21 16:50:16 2013 Zachary Scott <e@zzak.io>
-
- * test/digest/test_digest.rb: Add more tests for digest/bubblebabble
-
-Thu Nov 21 16:32:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/delegate.rb (Delegator#method_missing): try private methods defined in
- Kernel after the target. [Fixes GH-449]
-
-Thu Nov 21 16:25:08 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * test/uri/test_generic.rb (URI#test_merge): Test uri + URI(path)
- in addition to uri + path.
-
-Thu Nov 21 15:36:08 2013 Zachary Scott <e@zzak.io>
-
- * ext/openssl/lib/openssl/buffering.rb: [DOC] Fix HEREDOC comment for
- OpenSSL::Buffering which breaks overview because of RDoc bug
-
-Thu Nov 21 14:46:57 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * eval_intern.h (SAVE_ROOT_JMPBUF): workaround for the failure of
- test/ruby/test_exception.rb on Windows.
- wrap by __try and __exception statements on mswin to raise SIGSEGV
- when EXCEPTION_STACK_OVERFLOW is occurred, because MSVCRT doesn't
- handle the exception.
- however, (1) mingw-gcc doesn't support __try and __exception
- statements, and (2) we cannot retry SystemStackError after this
- change yet (maybe crashed) because SEH and longjmp() are too
- uncongenial.
-
- * signal.c (check_stack_overflow, CHECK_STACK_OVERFLOW): now defined on
- Windows, too.
-
- * thread_win32.c (ruby_stack_overflowed_p): ditto.
-
-Thu Nov 21 14:18:24 2013 Zachary Scott <e@zzak.io>
-
- * object.c: [DOC] Clarify Object#dup vs #clone [Bug #9128]
- Moving existing doc for this comparison to separate section of #dup
- Adding examples to document behavior of #dup with Module#extend.
- Based on a patch by stevegoobermanhill
-
-Thu Nov 21 14:06:02 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_marks_check): do not dump all refs.
-
- * gc.c (allrefs_dump_i): fix output format.
-
-Thu Nov 21 13:43:07 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: change RGENGC_CHECK_MODE (>= 2) logic.
- Basically, make an object graph of all of living objects before and
- after marking and check status.
-
- [Before marking: check WB sanity]
- If there is a non-old object `obj' pointed from old object
- (`parent') then `parent' or `obj' should be remembered.
-
- [After marking: check marking miss]
- Traversible objects with the object graph should be marked.
- (However, this alert about objects pointed by machine context
- can be false positive. We only display alert.)
-
- [Implementation memo]
- objspace_allrefs() creates an object graph.
- The object graph is represented by st_table, key is object (VALUE)
- and value is referring objects. Referring objects are stored by
- "struct reflist".
-
- * gc.c (init_mark_stack): do not use push_mark_stack_chunk() at init.
- This pre-allocation causes failure on is_mark_stack_empty()
- without any pushing.
-
-Thu Nov 21 13:40:20 2013 Zachary Scott <e@zzak.io>
-
- * lib/observer.rb: [DOC] Clarify default observer method.
- By @edward [Fixes GH-450] https://github.com/ruby/ruby/pull/450
-
-Thu Nov 21 13:32:53 2013 Zachary Scott <e@zzak.io>
-
- * ext/openssl/ossl_engine.c: [DOC] Documentation for OpenSSL::Engine
- This patch is based off work by @vbatts in GH-436 completing the
- documentation for this class and its methods.
- https://github.com/ruby/ruby/pull/436
-
-Thu Nov 21 10:45:22 2013 Zachary Scott <e@zzak.io>
-
- * ext/openssl/lib/openssl/buffering.rb: Remove unused arguments from
- OpenSSL::Buffering.new [Fixes GH-445]
-
-Thu Nov 21 10:30:47 2013 Zachary Scott <e@zzak.io>
-
- * test/digest/test_digest.rb: Add test for Digest::SHA256.bubblebabble
-
-Wed Nov 20 20:54:01 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * tool/instruction.rb : fix typo.
-
-Wed Nov 20 19:45:22 2013 Tanaka Akira <akr@fsij.org>
-
- * random.c (rand_init): Make it possible to specify arbitrary array
- for init_genrand().
-
-Wed Nov 20 17:34:13 2013 Koichi Sasada <ko1@atdot.net>
-
- * parse.y (rb_gc_mark_symbols): set global_symbols.minor_marked only
- when full_mark is 0.
- rb_gc_mark_symbols() (with full_mark == 1) can be called by other
- than GC (such as rb_objspace_reachable_objects_from_root()).
-
-Wed Nov 20 11:46:38 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/json: merge JSON 1.8.1.
- https://github.com/nurse/json/compare/002ac2771ce32776b32ccd2d06e5604de6c36dcd...e09ffc0d7da25d0393873936c118c188c78dbac3
- * Remove Rubinius exception since transcoding should be working now.
- * Fix https://github.com/flori/json/issues/162 reported by Marc-Andre
- Lafortune <github_rocks@marc-andre.ca>. Thanks!
- * Applied patches by Yui NARUSE <naruse@airemix.jp> to suppress
- warning with -Wchar-subscripts and better validate UTF-8 strings.
- * Applied patch by ginriki@github to remove unnecessary if.
- * Add load/dump interface to JSON::GenericObject to make
- serialize :some_attribute, JSON::GenericObject
- work in Rails active models for convenient
- SomeModel#some_attribute.foo.bar access to serialised JSON data.
-
-Wed Nov 20 01:39:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/rdoc/constant.rb (RDoc::Constant#documented?): workaround for
- NoMethodError when the original of alias is not found.
-
-Tue Nov 19 23:38:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (--with-os-version-style): option to transform target
- OS version string.
-
-Tue Nov 19 21:27:33 2013 Tanaka Akira <akr@fsij.org>
-
- * test/net/http/utils.rb (spawn_server): Specify zero for port to
- avoid reusing an allocated port.
-
- * test/net/http/test_http.rb: Don't specify port here.
-
- * test/net/http/test_https.rb: Ditto.
-
-Tue Nov 19 18:52:10 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (heap_is_swept_object): use heap_page::before_sweep flag.
-
-Tue Nov 19 18:49:32 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_objspace_reachable_objects_from_root): do major marking.
-
-Tue Nov 19 18:45:40 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_gc_resurrect): added.
- rb_fstring() used rb_gc_mark() to avoid freeing used string.
- However, rb_gc_mark() set mark bit *and* pushes mark_stack.
- rb_gc_resurrect() does only set mark bit if it is before sweeping.
-
- * string.c (rb_fstring): use rb_gc_resurrect.
-
- * internal.h: add decl.
-
-Tue Nov 19 09:47:02 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rdoc: Update to RDoc master a1195ce. Changes include:
-
- Improved accessibility of the main sidebar navigation.
-
- Fixed handling of regexp options in HTML source highlighting.
-
- * test/rdoc: ditto.
-
-Tue Nov 19 09:33:52 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 6a3d9f9. Changes include:
-
- Compatibly renamed Gem::DependencyResolver to Gem::Resolver.
-
- Added support for git gems in gem.deps.rb and Gemfile.
-
- Fixed resolver bugs.
-
- * test/rubygems: ditto.
-
- * lib/rubygems/LICENSE.txt: Updated to license from RubyGems trunk.
- [ruby-trunk - Bug #9086]
-
- * lib/rubygems/commands/which_command.rb: RubyGems now indicates
- failure when any file is missing. [ruby-trunk - Bug #9004]
-
- * lib/rubygems/ext/builder: Extensions are now installed into the
- extension install directory and the first directory in the require
- path from the gem. This allows backwards compatibility with msgpack
- and other gems that calculate full require paths.
- [ruby-trunk - Bug #9106]
-
-
-Tue Nov 19 07:21:56 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in (LOCALTIME_OVERFLOW_PROBLEM): Define it for cross
- compiling.
- [ruby-core:58391] [Bug #9119] Reported by Luis Lavena.
- Analyzed by Heesob Park.
-
-Tue Nov 19 05:55:05 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rdoc/rubygems_hook.rb: Remove debugging puts committed by
- accident.
-
-Mon Nov 18 22:47:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * eval_intern.h (TH_PUSH_TAG, TH_EXEC_TAG): refine stack overflow
- detection. chain local tag after setjmp() successed on it, because
- calling setjmp() also can overflow the stack.
- [ruby-dev:47804] [Bug #9109]
-
- * vm_eval.c (rb_catch_obj): now th->tag points previous tag until
- TH_EXEC_TAG().
-
- * thread_pthread.c (ruby_init_stack): set stack_start properly by
- get_main_stack() if possible.
-
-Mon Nov 18 22:45:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * eval_jump.c (rb_exec_end_proc): unlink and free procs data before
- calling for each procs. [Bug #9110]
-
-Sun Nov 17 06:33:32 2013 Shota Fukumori <her@sorah.jp>
-
- * configure.in: Use $LIBS for base of $SOLIBS, also in darwin.
- By this fix, environment that libgmp is located in $LIBS can build
- ruby.
-
-Sun Nov 17 01:56:32 2013 Tanaka Akira <akr@fsij.org>
-
- * thread_pthread.c (rb_thread_create_timer_thread): Show error
- message instead of error number.
- (thread_create_core): Ditto.
-
- * cont.c (fiber_machine_stack_alloc): Ditto.
-
-Sat Nov 16 18:28:08 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/ultralightparser.rb
- (REXML::Parsers::UltraLightParser#parse): Fix wrong :start_doctype
- position.
- [Bug #9061] [ruby-dev:47778]
- Patch by Ippei Obayashi. Thanks!!!
-
- * test/rexml/parser/test_ultra_light.rb: Add a test for this case.
-
-Sat Nov 16 02:13:56 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * cont.c : Introduce ensure rollback mechanism. Please see below.
-
- * internal.h (ruby_register_rollback_func_for_ensure): catch up above change.
- Add rollback mechanism API.
-
- * vm_core.h (typedef struct rb_vm_struct): catch up above change.
- Introduce ensure-rollback relation table.
-
- * vm_core.h (typedef struct rb_thread_struct): catch up above change.
- Introduce ensure stack.
-
- * eval.c (rb_ensure): catch up above change.
- Introduce ensure stack.
-
- * hash.c : New function for rollback ensure, and register it to
- ensure-rollback relation table. [ruby-dev:47803] [Bug #9105]
-
- Ensure Rollback Mechanism:
- A rollback's function is a function to rollback a state before ensure's
- function execution.
- When the jump of callcc is across the scope of rb_ensure,
- ensure's functions and rollback's functions are executed appropriately
- for keeping consistency.
-
- Current API is unstable, and only internal use.
-
- ruby_register_rollback_func_for_ensure(ensure_func,rollback_func)
- This API create relation ensure's function to rollback's function.
- By registered rollback's function, it is executed When jumping into
- corresponding rb_ensure scope.
-
-Sat Nov 16 00:18:36 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * eval_jump.c (rb_exec_end_proc): fix double free or corruption error
- when reentering by callcc. [ruby-core:58329] [Bug #9110]
-
- * test/ruby/test_beginendblock.rb: test for above.
-
-Fri Nov 15 01:06:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/objspace/objspace_dump.c (dump_output): allow IO object as
- output, and use Tempfile.create and return open file instead of
- mkstemp() and path name for :file output.
- [ruby-core:58266] [Bug #9102]
-
- * test/objspace/test_objspace.rb (TestObjSpace#dump_my_heap_please):
- remove temporary output file.
-
-Thu Nov 14 23:39:00 2013 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] remove example of
- Rational#to_d without argument. [Bug #8958]
-
-Thu Nov 14 20:24:15 2013 Naohisa Goto <ngotogenome@gmail.com>
-
- * ruby_atomic.h (ATOMIC_SIZE_CAS): fix compile error on Solaris
- since r43460.
-
-Thu Nov 14 19:53:00 2013 Tanaka Akira <akr@fsij.org>
-
- * test/openssl/test_cipher.rb (test_aes_gcm_wrong_tag): Don't use
- String#succ because it can make modified (wrong) auth_tag longer
- than 16 bytes. The longer auth_tag makes that
- EVP_CIPHER_CTX_ctrl (and internally aes_gcm_ctrl) fail.
- [ruby-core:55143] [Bug #8439] reported by Vit Ondruch.
-
-Thu Nov 14 11:33:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (foreach_safe_i, hash_foreach_iter): deal with error detected
- by ST_CHECK.
-
- * st.c (st_foreach_check): call with non-error argument in normal case.
-
-Thu Nov 14 02:37:14 2013 Zachary Scott <e@zzak.io>
-
- * ext/thread/thread.c: [DOC] This patch accomplishes the following:
-
- - Teach RDoc about ConditionVariable
- - Teach RDoc about Queue
- - Teach RDoc about SizedQueue
- - Use fully-qualified namespace for Document-method
- This is necessary to separate definitions between classes
- - Fix rdoc bug in call_seq vs. call-seq
- - Correct doc for SizedQueue#pop patch by @jackdanger [Bug #8988]
-
-Thu Nov 14 01:11:54 2013 Zachary Scott <e@zzak.io>
-
- * ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] +precision+ is required
-
-Wed Nov 13 19:21:36 2013 Zachary Scott <e@zzak.io>
-
- * ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] Document the required
- +precision+ argument for Rational#to_d [Bug #8958]
-
-Wed Nov 13 19:02:05 2013 Zachary Scott <e@zzak.io>
-
- * ext/digest/*: [DOC] Fix several typos and broken http links.
- Improved examples for Digest overview and fixed a broken example in
- Digest::HMAC overview. This patch also adds a description of
- Digest::SHA256.bubblebabble to the Digest overview.
-
- Patched by @stomar [Bug #9027]
-
-Wed Nov 13 18:32:12 2013 Zachary Scott <e@zzak.io>
-
- * ext/openssl/ossl_config.c: [DOC] Document the following:
-
- - OpenSSL::ConfigError
- - OpenSSL::Config::DEFAULT_CONFIG_FILE
-
- Patched by @vbatts via GH-436
- https://github.com/ruby/ruby/pull/436
-
-Wed Nov 13 18:03:00 2013 Zachary Scott <e@zzak.io>
-
- * ext/openssl/ossl_asn1.c: [DOC] Document parts of
- OpenSSL::ASN1::ObjectId included a fix for the class overview, which
- previously showed the documentation for Constructive due to missing
- ObjectId overview. This patch also includes a note for Primitive.
-
- Based on a patch by @vbatts via GH-436
- https://github.com/ruby/ruby/pull/436
-
-Wed Nov 13 17:19:36 2013 Zachary Scott <e@zzak.io>
+ * vm.c (env_mark): use rb_gc_mark_values() because env values should
+ be Ruby VALUEs.
+
+Thu Sep 11 19:16:39 2014 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_ptr): rename to gc_mark_set.
+
+ * gc.c (gc_mark): add gc_mark_ptr() to skip is_markable_object()
+ check. gc_mark_maybe() can use gc_mark_ptr() directly because
+ passed pointer is checked by is_pointer_to_heap().
- * ext/openssl/lib/openssl/config.rb: In #parse use +string+ for +str+
+Thu Sep 11 18:40:16 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Wed Nov 13 17:09:45 2013 Zachary Scott <e@zzak.io>
+ * .gitignore: ignored temporary files and coverage results.
- * ext/openssl/lib/openssl/*.rb: [DOC] Document the following:
+Thu Sep 11 18:15:30 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- - Integer#to_bn
- - OpenSSL::Buffering module
- - Deprecated OpenSSL::Digest::Digest compatibility class
- - OpenSSL::Config
+ * .gitignore: ignored only simplecov.
+ * coverage/README: Added coverage docs.
- These changes were based on a patch by @vbatts via GH-436
- https://github.com/ruby/ruby/pull/436
+Thu Sep 11 17:25:31 2014 Koichi Sasada <ko1@atdot.net>
-Wed Nov 13 10:55:43 2013 Zachary Scott <e@zzak.io>
+ * include/ruby/ruby.h, gc.c: add new internal events
+ RUBY_INTERNAL_EVENT_GC_ENTER and
+ RUBY_INTERNAL_EVENT_GC_EXIT.
- * doc/regexp.rdoc: [DOC] Fix typo in Special global variables section.
- Reported by Alex Johnson on ruby-doc.org
+ When invoking GC process, GC_ENTER event is called.
+ When exiting from GC process, GC_EXIT event is called.
-Wed Nov 13 10:43:19 2013 Zachary Scott <e@zzak.io>
+ Incremental GC (incremental marking and lazy sweep) can call
+ these events many times.
- * hash.c: [DOC] Adds an example for Hash#store
+ For example (minor marking):
+ (1) GC_ENTER
+ - (2) GC_START (minor GC)
+ (minor marking)
+ - (3) GC_END_MARK
+ (start lazy sweep)
+ (4) GC_EXIT
+ (ruby process)
+ (5) GC_ENTER
+ (lazy sweep)
+ (6) GC_EXIT
+ (ruby process)
+ (... repeat (5), (6))
+ (7) GC_ENTER
+ (finish lazy sweep)
+ - (8) GC_END_SWEEP
+ (9) GC_EXIT
-Wed Nov 13 09:03:40 2013 Zachary Scott <e@zzak.io>
+ 2nd example (incremental major marking):
+ (1) GC_ENTER
+ - (2) GC_START (minor GC)
+ (start incremental marking)
+ (3) GC_EXIT
+ (ruby process)
+ (4) GC_ENTER
+ (incremental marking)
+ (5) GC_EXIT
+ (ruby process)
+ (... repeat (4), (5))
+ (6) GC_ENTER
+ (finish incremental marking)
+ - (7) GC_END_MARK
+ (start lazy sweep)
+ (8) GC_EXIT
+ (ruby process)
+ (9) GC_ENTER
+ (lazy sweep)
+ (10) GC_EXIT
+ (ruby process)
+ (... repeat (9), (10))
+ (11) GC_ENTER
+ (finish lazy marking)
+ - (12) GC_STOP_SWEEP
+ (13) GC_EXIT
- * doc/regexp.rdoc: [DOC] add note about Bug #4044 as suggested by
- duerst-san in [ruby-core:43612] [Fixes GH-443] Patched by @rosenfeld
- https://github.com/ruby/ruby/pull/443
+ These internal events enable to measure GC pause time completely.
-Tue Nov 12 10:15:14 2013 Eric Hodel <drbrain@segment7.net>
+Thu Sep 11 17:04:54 2014 Eric Wong <e@80x24.org>
- * test/rubygems/insure_session.rb: Remove unused test file.
+ * lib/benchmark.rb: remove CLOCK_MONOTONIC_RAW support
+ Thanks to Vit Ondruch for reporting the issue on ARM.
+ [Bug #10202]
-Tue Nov 12 09:16:24 2013 Eric Hodel <drbrain@segment7.net>
+Thu Sep 11 14:31:57 2014 Koichi Sasada <ko1@atdot.net>
- * lib/rubygems: Update to RubyGems master b9213d7. Changes include:
+ * include/ruby/ruby.h: freeze nil/true/false.
+ [Feature #8923]
- Fixed tests on Windows (I hope) by forcing platform for
- platform-dependent tests.
+ * gc.c (should_be_finalizable): check frozen after checkin FL_ABLE.
- Fixed File.exists? warnings.
+ * object.c (rb_obj_taint): check
+ OBJ_TAINTABLE(obj).
- Improved testing infrastructure.
+ * object.c (rb_obj_freeze): remove immediate_frozen_tbl
+ because all of immediate values are frozen. YAY!
- * test/rubygems: ditto.
-
- * test/rdoc/test_rdoc_rubygems_hook.rb: Switch to util_spec like
- RubyGems.
-
-Mon Nov 11 18:31:12 2013 Aman Gupta <ruby@tmm1.net>
-
- * internal.h: move common string/hash flags to include file.
- * ext/objspace/objspace_dump.c: remove flags shared above.
- * hash.c: ditto.
- * string.c: ditto.
-
-Mon Nov 11 04:36:14 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems/specification.rb: Include 2.2.0.preview.2 when checking
- if extensions should be built. Fixes a ruby-ci failure.
- * test/rubygems/test_gem_specification.rb: Test for the above.
-
-Mon Nov 11 03:15:56 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_trace.c (symbol2event_flag): add secret feature.
- add a_call/a_return events.
- a_call is call | b_call | c_call, and same as a_return.
-
-Mon Nov 11 02:51:17 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 4bdc4f2. Important changes
- in this commit:
-
- RubyGems now chooses the test server port reliably. Patch by akr.
-
- Partial implementation of bundler's Gemfile format.
-
- Refactorings to improve the new resolver.
-
- Fixes bugs in the resolver.
-
- * test/rubygems: Tests for the above.
-
-Mon Nov 11 01:02:06 2013 Zachary Scott <e@zzak.io>
-
- * lib/timeout.rb: [DOC] Add note about change from #8730 [Fixes GH-440]
- * NEWS: [DOC] Improve grammar on change to Timeout
- Patched by @srawlins in https://github.com/ruby/ruby/pull/440
-
-Sun Nov 10 23:47:05 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * gc.c (rb_gcdebug_print_obj_condition): catch up recent changes
- to compile on GC_DEBUG.
-
-Sun Nov 10 22:16:19 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * error.c (exc_cause): captured previous exception.
-
- * eval.c (make_exception): capture previous exception automagically.
- [Feature #8257]
-
-Sun Nov 10 08:37:20 2013 Zachary Scott <e@zzak.io>
-
- * thread.c: [DOC] Remove duplicate reference
-
-Sun Nov 10 08:09:29 2013 Zachary Scott <e@zzak.io>
-
- * lib/drb/drb.rb: [DOC] promote better windows-safe filename regular
- expression in DRb Logger example. Reported by Chris Pheonix
- [Bug #9074]
-
-Sun Nov 10 08:03:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (rb_define_finalizer, rb_undefine_finalizer): rename and export
- finalizer functions.
-
-Sun Nov 10 07:41:22 2013 Zachary Scott <e@zzak.io>
-
- * lib/weakref.rb: [DOC] fix typos by @xaviershay [Fixes GH-439]
- https://github.com/ruby/ruby/pull/439
-
-Sun Nov 10 06:14:39 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * compile.c (iseq_compile_each): emit opt_str_freeze if the #freeze
- method is called on a static string literal with no arguments.
-
- * defs/id.def (firstline): add freeze so idFreeze is available
-
- * insns.def (opt_str_freeze): add opt_str_freeze instruction which
- pushes a frozen string literal without allocating a new object if
- String#freeze is not overridden
-
- * string.c (Init_String): define String#freeze
-
- * vm.c (vm_init_redefined_flag): define BOP_FREEZE on String class as
- a basic operation
-
- * vm_insnhelper.h: ditto
-
- [Feature #8992] [ruby-core:57705]
-
-Sun Nov 10 01:34:14 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (vm_malloc_increase): sweep immediately on GC due to malloc().
- To reduce memory usage, sweep as soon as possible.
- This behavior is same as Ruby 2.0.0 and before.
-
-Sun Nov 10 00:39:26 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/gc/gcbench.rb: output version description and GC::OPTS.
-
-Sun Nov 10 00:36:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (should_be_callable): allow private call since rb_eval_cmd
- calls even private methods.
-
-Sun Nov 10 00:33:17 2013 Zachary Scott <e@zzak.io>
-
- * lib/racc/rdoc/grammar.en.rdoc: [DOC] fix typo by Tsuyoshi Sawada
- [Bug #9077]
-
-Sat Nov 9 22:35:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * tool/rbinstall.rb (Gem::Specification.load): obtain spec date from
- VCS for the case using git, RUBY_RELEASE_DATE is the last resort.
- probably fixes [Bug #9085].
-
-Sat Nov 9 20:56:12 2013 Narihiro Nakamura <authornari@gmail.com>
-
- * ext/objspace/object_tracing.c: use declarations in internal.h.
-
- * ext/objspace/objspace.c: ditto
-
-Sat Nov 9 20:32:59 2013 Tanaka Akira <akr@fsij.org>
-
- * test/objspace/test_objspace.rb (test_dump_all): Make the test string
- shorter to be an embedded string on 32bit environment as well as
- 64bit environment.
-
-Sat Nov 9 15:00:16 2013 Zachary Scott <e@zzak.io>
-
- * io.c: [DOC] ARGF.gets may return nil [Bug #9029] patch by znz
-
-Sat Nov 9 14:54:52 2013 Zachary Scott <e@zzak.io>
-
- * lib/rss/*: [DOC] document various constants @steveklabnik [Bug #8812]
-
-Sat Nov 9 14:50:09 2013 Zachary Scott <e@zzak.io>
-
- * lib/rss/rss.rb: [DOC] document Time#w3cdtf by @steveklabnik
- [Bug #8821]
-
-Sat Nov 9 14:29:04 2013 Zachary Scott <e@zzak.io>
-
- * ext/dl/cfunc.c: [DOC] fix typo in example [Bug #8944]
- Patched by Heesob Park
-
-Sat Nov 9 13:59:58 2013 Zachary Scott <e@zzak.io>
-
- * lib/test/unit/assertions.rb: [DOC] better example for assert_send()
- Patch by Andrew Grimm [Bug #8975]
-
-Sat Nov 9 12:45:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * insns.def: unify ic_constant_serial and ic_class_serial into one field
- ic_serial. This is possible because these fields are only ever used
- exclusively with each other.
-
- * insns.def: ditto
- * vm_core.h: ditto
- * vm_insnhelper.c: ditto
-
-Sat Nov 9 12:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * class.c: unify names of vm state version counters to 'serial'.
- This includes renaming 'vm_state_version_t' to 'rb_serial_t',
- 'method_state' to 'method_serial', 'seq' to 'class_serial',
- 'vmstat' to 'constant_serial', etc.
-
- * insns.def: ditto
- * internal.h: ditto
- * vm.c: ditto
- * vm_core.h: ditto
- * vm_insnhelper.c: ditto
- * vm_insnhelper.h: ditto
- * vm_method.c: ditto
-
-Sat Nov 9 09:22:29 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (gc_page_sweep, rgengc_rememberset_mark): Refactoring.
- Get bitmaps directly.
-
-Sat Nov 9 09:16:36 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (RVALUE_PROMOTE_INFANT): Refactoring. Remove duplicated nonsense
- code.
-
-Sat Nov 9 09:04:48 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (gc_marks_test): Bugfix. Fix a struct member name for build
- with RGENGC_CHECK_MODE.
-
-Sat Nov 9 08:58:23 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c : Add GC_PROFILE_DETAIL_MEMORY option.
- If GC_PROFILE_MORE_DETAIL && GC_PROFILE_DETAIL_MEMORY,
- maxrss, minflt and majflt are added to each profile record.
-
-Sat Nov 9 07:41:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * internal.h (rb_vm_backtrace_object, rb_gc_count): make prototype
- declarations, not old-K&R style.
-
-Sat Nov 9 06:11:14 2013 vo.x (Vit Ondruch) <vondruch@redhat.com>
-
- * tool/rbinstall.rb (Gem::Specification#collect): make stable
- Gem::Specification.files in default .gemspecs the different order of
- "files" in .gemspec files makes them different therefore possibly
- conflicting in multilib scenario. patch by vo.x (Vit Ondruch) at
- [ruby-core:57544] [Bug #8623].
-
-Sat Nov 9 01:59:18 2013 Aman Gupta <ruby@tmm1.net>
-
- * ext/objspace/objspace_dump.c: Add experimental methods to
- dump objectspace as json: ObjectSpace.dump_all and
- ObjectSpace.dump(obj). These methods are useful for debugging
- reference leaks and memory growth in large ruby applications.
- [Bug #9026] [ruby-core:57893] [Fixes GH-423]
- * test/objspace/test_objspace.rb: tests for above.
-
-Sat Nov 9 00:26:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * file.c (GetLastError): already defined in windows.h on nowadays
- cygwin, and caused the confliction with the system provided
- definition on cygwin64. by @kou1okada [Fixes GH-433].
-
-Fri Nov 8 18:35:31 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * lib/open3.rb: receive arguments as keyword arguments.
-
-Fri Nov 8 13:19:26 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * io.c (rb_io_open_with_args): use RARRAY_CONST_PTR().
-
- * io.c (rb_scan_open_args): use const qualifier for above.
-
- * io.c (rb_open_file): ditto.
-
- * io.c (rb_io_open_with_args): ditto.
-
-Fri Nov 8 11:35:06 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * dir.c, pack.c, ruby.c, struct.c, vm_eval.c: use RARRAY_CONST_PTR().
-
-Fri Nov 8 10:58:02 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * object.c (rb_obj_frozen_p): ditto.
- * compile.c (iseq_build_from_ary_exception): use RARRAY_CONST_PTR().
+ * test/ruby/test_eval.rb: skip instance_variable_set for
+ frozen objects.
- * compile.c (iseq_build_from_ary_body): ditto.
+ * test/ruby/test_weakmap.rb: check ArgumentError instead of
+ RuntimeError.
-Fri Nov 8 10:49:34 2013 Masaki Matsushita <glass.saga@gmail.com>
+Thu Sep 11 10:03:16 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * enumerator.c (append_method): use RARRAY_CONST_PTR().
+ * lib/rdoc.rb, lib/rdoc, test/rdoc: Update to RDoc 4.2.0.alpha(21b241a)
- * enumerator.c (lazy_init_iterator): ditto.
+Wed Sep 10 17:52:25 2014 Koichi Sasada <ko1@atdot.net>
-Fri Nov 8 02:44:29 2013 Koichi Sasada <ko1@atdot.net>
+ * compile.c (rb_vm_addr2insn): rename to rb_vm_insn_addr2insn
+ to clear what address.
- * gc.c (vm_malloc_increase): check GVL before gc_rest_sweep().
- vm_malloc_increase() can be called without GVL.
- However, gc_rest_sweep() assumes acquiring GVL.
- To avoid this problem, check GVL before gc_rest_sweep().
- [Bug #9090]
+Wed Sep 10 16:22:26 2014 Koichi Sasada <ko1@atdot.net>
- This workaround introduces possibility to set malloc_limit as
- wrong value (*1). However, this may be rare case. So I commit it.
+ * test/ruby/test_gc.rb: fix condition.
- *1: Without rest_sweep() here, gc_rest_sweep() can decrease
- malloc_increase due to ruby_sized_xfree().
+Wed Sep 10 15:29:46 2014 Eric Wong <e@80x24.org>
-Fri Nov 8 02:50:25 2013 Zachary Scott <e@zzak.io>
+ * vm_core.h (rb_call_info_t): ci->flag becomes 32-bit unsigned int
+ ci->index becomes a 32-bit signed int (from signed long).
+ Reorder for better packing on 64-bit, giving an 8 byte reduction
+ from 104 to 96 bytes for each ci.
+ [Feature #10187]
- * lib/securerandom.rb: [DOC] specify arguments passed to ::random_bytes
- By @chastell [Fixes GH-412] https://github.com/ruby/ruby/pull/412
+ * compile.c (new_callinfo, setup_args, iseq_compile_each,
+ iseq_build_from_ary_body): adjust for type changes
-Fri Nov 8 02:43:01 2013 Zachary Scott <e@zzak.io>
+ * vm_insnhelper.c (vm_getivar): ditto
- * ext/objspace/object_tracing.c: [DOC] trace_object_allocations_stop
- By @srawlins [Fixes GH-421] https://github.com/ruby/ruby/pull/421
+Wed Sep 10 15:07:35 2014 Eric Wong <e@80x24.org>
-Fri Nov 8 02:34:20 2013 Zachary Scott <e@zzak.io>
+ * compile.c (rb_iseq_translate_threaded_code):
+ modify in-place w/o copy
+ (rb_vm_addr2insn): new function for debug
+ (rb_iseq_original_iseq): ditto
+ (iseq_set_sequence): assign iseq_encoded directly
+ [Feature #10185]
- * lib/net/ftp.rb: [DOC] Document Net::FTP.mdtm and .set_socket and fix
- spelling typo, based on patch by @artfuldodger [Fixes GH-426]
- https://github.com/ruby/ruby/pull/426
+ * vm_core (rb_iseq_t): move original ->iseq to bottom
-Fri Nov 8 02:14:37 2013 Zachary Scott <e@zzak.io>
+ * iseq.c (iseq_free, iseq_free): adjust for new layout
+ (rb_iseq_disasm): use original iseq for dump
+ (iseq_data_to_ary): ditto
+ (rb_iseq_line_trace_each): ditto
+ (rb_iseq_build_for_ruby2cext): use iseq_encoded directly
- * array.c: [DOC] Add note about negative indices in Array overview
- By @ckaenzig [Fixes GH-427] https://github.com/ruby/ruby/pull/427
+ * vm_dump.c (rb_vmdebug_debug_print_pre): use original iseq
-Fri Nov 8 02:09:12 2013 Zachary Scott <e@zzak.io>
+Wed Sep 10 15:00:11 2014 Eric Wong <e@80x24.org>
- * lib/csv.rb: [DOC] Fix typo in CSV.parse_line by @funky-bibimbap
- [Fixes GH-430] https://github.com/ruby/ruby/pull/430
+ * time.c (time_mark): remove NULL check
+ (time_memsize): ditto
+ (time_free): remove, use RUBY_TYPED_DEFAULT_FREE instead
+ [Feature #10219]
-Fri Nov 8 01:01:54 2013 Zachary Scott <e@zzak.io>
+Wed Sep 10 14:14:57 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * golf_prelude.rb: syntax formatting for whitespace [Fixes GH-425]
- Patch by @edward https://github.com/ruby/ruby/pull/425
+ * common.mk (encs enc trans libencs libenc libtrans): force to run
+ enk.mk because common.mk does not know the dependency, but enk.mk
+ knows. [ruby-dev:48530] [Bug #10220]
-Thu Nov 7 19:36:09 2013 Koichi Sasada <ko1@atdot.net>
+Wed Sep 10 11:59:10 2014 Koichi Sasada <ko1@atdot.net>
- * gc.c: modify malloc_limit strategy.
+ * gc.c (gc_stat): update rdoc.
- * fix default values:
- GC_MALLOC_LIMIT_GROWTH_FACTOR
- GC_MALLOC_LIMIT: 8MB -> 16MB
- GC_MALLOC_LIMIT_MAX: 384MB -> 32MB
+Wed Sep 10 11:52:08 2014 Koichi Sasada <ko1@atdot.net>
- * algorithm of malloc_limit increment.
- if (malloc_increase < malloc_limit) {
- next_malloc_limit = malloc_limit * factor
- if (malloc_limit > malloc_limit_max) {
- malloc_limit = malloc_increase
- }
- }
- This algorithm change malloc_limit from
- 16MB -> 32MB slowly.
- If malloc_limit exceeds malloc_limit_max, then
- increase with malloc_increase.
+ * gc.c (gc_stat_internal): rename:
+ * malloc_increase -> malloc_increase_bytes
+ * malloc_limit -> malloc_increase_bytes_limit
+ * oldmalloc_increase -> oldmalloc_increase_bytes
+ * oldmalloc_limit -> oldmalloc_increase_bytes_limit
+ ref: [Feature #9924]
-Thu Nov 7 11:06:05 2013 Masaki Matsushita <glass.saga@gmail.com>
+Wed Sep 10 11:45:40 2014 Koichi Sasada <ko1@atdot.net>
- * array.c (rb_ary_shuffle_bang): use RARRAY_PTR_USE() without WB
- because there are not new relations.
+ * gc.c (gc_stat_internal): rename `heap_used' to `heap_allocated_pages'.
+ ref: [Feature #9924]
-Thu Nov 7 10:34:12 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * test/ruby/test_gc.rb: add constraints test for gc stat information.
- * array.c (rb_ary_sample): use rb_ary_dup().
+Wed Sep 10 11:31:16 2014 Koichi Sasada <ko1@atdot.net>
-Thu Nov 7 09:39:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * gc.c (gc_stat_internal): rename:
+ * remembered_shady_object -> remembered_wb_unprotected_objects
+ * remembered_shady_object_limit -> remembered_wb_unprotected_objects_limit
+ * old_object -> old_objects
+ * old_object_limit -> old_objects_limit
+ ref: [Feature #9924]
- * vm_trace.c (rb_threadptr_exec_event_hooks_orig): errinfo should not
- be propagated to trace blocks so that no argument raise does not
- throw internal objects. [ruby-dev:47793] [Bug #9088]
+Wed Sep 10 11:12:25 2014 Koichi Sasada <ko1@atdot.net>
-Wed Nov 6 21:30:55 2013 Masaya Tarui <tarui@ruby-lang.org>
+ * gc.c (gc_stat_internal): support:
+ * total_allocated_pages
+ * total_freed_pages
+ ref: [Feature #9924]
- * gc.c (gc_before_sweep): Change algorithm of malloc_limit to
- conservative for closing to memory consumption of ruby 2.0.
+Wed Sep 10 10:48:04 2014 Koichi Sasada <ko1@atdot.net>
- * gc.c (GC_MALLOC_LIMIT, GC_MALLOC_LIMIT_GROWTH_FACTOR):
- Adjust parameters for new algorithm.
+ * test/ruby/test_gc.rb: catch up last fix.
-Wed Nov 6 21:16:51 2013 Masaki Matsushita <glass.saga@gmail.com>
+Wed Sep 10 10:36:08 2014 Koichi Sasada <ko1@atdot.net>
- * array.c (rb_ary_shift_m): use RARRAY_PTR_USE() without WB because
- there are not new relations.
+ * gc.c (objspace_total_slot): rename objspace_available_slots.
-Wed Nov 6 21:05:20 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * gc.c (objspace_live_slot, objspace_free_slot): rename
+ ..._slot() to ..._slots().
- * array.c (rb_ary_reverse): use RARRAY_PTR_USE().
+ * gc.c (objspace_free_slot): should subtract heap_pages_final_slots.
-Wed Nov 6 19:30:44 2013 Masaya Tarui <tarui@ruby-lang.org>
+ * gc.c (gc_stat_internal):
+ * add `heap_available_slots' field
+ * rename heap_live_slot to heap_live_slots
+ * rename heap_free_slot to heap_free_slots
+ ref: [Feature #9924]
- * common.mk (help): add texts about gcbench.
+Wed Sep 10 07:22:53 2014 Koichi Sasada <ko1@atdot.net>
-Wed Nov 6 16:32:32 2013 Martin Duerst <duerst@it.aoyama.ac.jp>
+ * gc.c: refactoring for RGENGC_PROFILE > 0.
- * lib/open3.rb: tweaked grammar in comments
+ * rename rb_objspace_t::profile::..._count
+ to rb_objspace_t::profile::total_..._count
+ * rename promote_infant_types to promote_types
-Wed Nov 6 11:46:36 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * gc.c (gc_remember_unprotected): count remembered shady objects here.
- * array.c (rb_ary_sample): use RARRAY_AREF() and RARRAY_PTR_USE()
- instead of RARRAY_PTR().
-
-Wed Nov 6 10:37:07 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * array.c (rb_ary_and): defer hash creation and some refactoring.
-
-Wed Nov 6 09:14:31 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/bm_vm1_gc_short_lived.rb: added.
- These GC benchmarks do not reflect practical applications.
- They are only for tuning.
-
- * benchmark/bm_vm1_gc_short_with_complex_long.rb: added.
-
- * benchmark/bm_vm1_gc_short_with_long.rb: added.
+Wed Sep 10 03:12:12 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
- * benchmark/bm_vm1_gc_short_with_symbol.rb: added.
-
- * benchmark/bm_vm1_gc_wb_ary.rb: added.
-
- * benchmark/bm_vm1_gc_wb_obj.rb: added.
-
- * benchmark/bm_vm_thread_queue.rb: added.
- This benchmark is added to know how fast C version of thread.so.
+ * gc.c (init_mark_stack): MEMZERO() receive type as 2nd argument instead
+ of size.
+ Coverity Scan found this bug.
-Wed Nov 6 09:13:32 2013 Koichi Sasada <ko1@atdot.net>
+Tue Sep 9 21:55:39 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * gc.c: define RGENGC_ESTIMATE_OLDSPACE == 0 if USE_RGENGC is 0.
+ * ext/win32ole/sample/excel2.rb: remove some commented-out code.
+ rotate graph more slowly to see graph clearly.
-Wed Nov 6 07:13:18 2013 Koichi Sasada <ko1@atdot.net>
+Tue Sep 9 19:52:33 2014 Koichi Sasada <ko1@atdot.net>
- * gc.c (Init_GC): add GC::OPTS to show options.
+ * gc.c: rename rb_objspace_t::marked_objects to marked_slots.
-Wed Nov 6 07:12:17 2013 Koichi Sasada <ko1@atdot.net>
+ * gc.c (gc_marks_start): should be clear first.
- * benchmark/gc/gcbench.rb: add some options to make quiet.
+ * gc.c (gc_marks_start): remembered shady objects are also marked.
-Wed Nov 6 04:14:25 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+ * gc.c (gc_stat_internal): add heap_marked_slots.
- * ext/psych/lib/psych/visitors/to_ruby.rb: process merge keys before
- reviving objects. Fixes GH psych #168
- * test/psych/test_merge_keys.rb: test for change
- https://github.com/tenderlove/psych/issues/168
+Tue Sep 9 18:58:48 2014 Koichi Sasada <ko1@atdot.net>
-Tue Nov 5 21:21:47 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c: rename
+ * total_allocated_object_num -> total_allocated_objects
+ * total_allocated_object_num_at_gc_start -> total_allocated_objects_at_gc_start
+ * total_freed_object_num -> total_freed_objects
- * test/ruby/test_thread.rb (test_thread_join_in_trap):
- Run the test in a different process.
+ * gc.c (gc_stat_internal):
+ * rename total_allocated_object -> total_allocated_objects
+ * rename total_freed_object -> total_freed_objects
-Tue Nov 5 20:14:32 2013 Masaya Tarui <tarui@ruby-lang.org>
+Tue Sep 9 18:51:36 2014 Koichi Sasada <ko1@atdot.net>
- * gc.c (is_live_object): A hidden object may be a live object.
- [ruby-dev:47788] [Bug #9072]
+ * gc.c (gc_stat_internal): fix symbol names
+ * heap_final_slot -> heap_final_slots
+ * heap_swept_slot -> heap_swept_slots
-Tue Nov 5 13:37:19 2013 Koichi Sasada <ko1@atdot.net>
+Tue Sep 9 18:18:07 2014 Koichi Sasada <ko1@atdot.net>
- * gc.c: add support to estimate increase of oldspace memory usage.
- This is another approach to solve an issue discussed at r43530.
- This feature is disabled as default.
+ * gc.c (rb_objspace_t::heap_pages): rename field names:
+ * used -> allocated_pages
+ * increment -> allocatable_pages
+ * length -> sorted_length
+ And remove unused `limit' field.
- This feature measures an increment of memory consumption by oldgen
- objects. It measures memory consumption for each objects when
- the object is promoted. However, measurement of memory consumption
- is not accurate now. So that this measurement is `estimation'.
+ * gc.c: rename macros:
+ * heap_pages_used -> heap_allocated_pages
+ * heap_pages_length -> heap_pages_sorted_length
+ * heap_pages_increment -> heap_allocatable_pages
- To implement this feature, move memsize_of() function from
- ext/objspace/objspace.c and expose rb_obj_memsize_of().
+ * gc.c (gc_stat_internal): fix symbol names
+ * heap_used -> heap_allocated_pages
+ * heap_eden_page_length -> heap_eden_pages
+ * heap_tomb_page_length -> heap_tomb_pages
+ * heap_increment -> heap_allocatable_pages
+ * heap_length -> heap_sorted_length
- Some memsize() functions for T_DATA (T_TYPEDDATA) have problem to
- measure memory size, so that we ignores T_DATA objects now.
- For example, some functions skip NULL check for pointer.
+ ref: [Feature #9924]
+ https://docs.google.com/spreadsheets/d/11Ua4uBr6o0k-nORrZLEIIUkHJ9JRzRR0NyZfrhEEnc8/edit?usp=sharing
+ Yellow color fields in this table are changed.
- The macro RGENGC_ESTIMATE_OLDSPACE enables/disables this feature,
- and turned off as default.
+ * test/ruby/test_gc.rb: catch up this change.
- We need to compare 3gen GC and this feature carefully.
- (it is possible to enable both feature)
- We need a help to compare them.
+Tue Sep 9 14:56:03 2014 Koichi Sasada <ko1@atdot.net>
- * internal.h: expose rb_obj_memsize_of().
+ * gc.c: continue layout changing.
- * ext/objspace/objspace.c: use rb_obj_memsize_of() function.
+ newobj_of() also touch:
+ (4) increment total_allocated_object_num
+ (5) check hook_events
- * cont.c (fiber_memsize): fix to check NULL.
+ And gather fields related to marking phase.
- * variable.c (autoload_memsize): ditto.
+Tue Sep 9 14:21:50 2014 Koichi Sasada <ko1@atdot.net>
- * vm.c (vm_memsize): ditto.
+ * gc.c: fix layout of rb_objspace_t to improve cache locality.
-Tue Nov 5 04:03:07 2013 Koichi Sasada <ko1@atdot.net>
+ newobj_of() accesses:
+ (1) rb_objspace_t::flags
+ (2) rb_objspace_t::eden_heap::freelist
+ (3) and rb_objspace_t::eden_heap::free_pages if freelist is NULL.
- * gc.c (GC_MALLOC_LIMIT_MAX): fix default value 512MB -> 384MB.
- 512MB is huge.
+Tue Sep 9 14:09:36 2014 Koichi Sasada <ko1@atdot.net>
-Tue Nov 5 03:31:23 2013 Koichi Sasada <ko1@atdot.net>
+ * gc.c: move rb_objspace_t::flags::gc_stressful after during_gc
+ to make accessing both parameters easy.
- * gc.c: add 3gen GC patch, but disabled as default.
+ * gc.c (heap_get_freeobj): add LIKELY() hint.
- RGenGC is designed as 2 generational GC, young and old generation.
- Young objects will be promoted to old objects after one GC.
- Old objects are not collect until major (full) GC.
+ * gc.c (heap_get_freeobj_from_next_freepage): ditto.
- The issue of this approach is some objects can promoted as old
- objects accidentally and not freed until major GC.
- Major GC is not frequently so short-lived but accidentally becoming
- old objects are not freed.
+ * gc.c (newobj_of): check both parameters at once for exceptional
+ case.
- For example, the program "loop{Array.new(1_000_000)}" consumes huge
- memories because short lived objects (an array which has 1M
- elements) are promoted while GC and they are not freed before major
- GC.
+Tue Sep 9 13:51:32 2014 Koichi Sasada <ko1@atdot.net>
- To solve this problem, generational GC with more generations
- technique is known. This patch implements three generations gen GC.
+ * gc.c: add rb_objspace_t::flags::gc_stressful and
+ ruby_gc_stressful macro.
+ Rename objspace->gc_stress to objspace->gc_stress_mode.
- At first, newly created objects are "Infant" objects.
- After surviving one GC, "Infant" objects are promoted to "Young"
- objects.
- "Young" objects are promoted to "Old" objects after surviving
- next GC.
- "Infant" and "Young" objects are collected if it is not marked
- while minor GC. So that this technique solves this problem.
+ If objspace->gc_stress_mode is true (!nil and !false) then
+ ruby_gc_stressful becomes TRUE.
- Representation of generations:
- * Infant: !FL_PROMOTED and !oldgen_bitmap [00]
- * Young : FL_PROMOTED and !oldgen_bitmap [10]
- * Old : FL_PROMOTED and oldgen_bitmap [11]
+ ruby_gc_stressful will speedup newobj_of() slightly.
- The macro "RGENGC_THREEGEN" enables/disables this feature, and
- turned off as default because there are several problems.
- (1) Failed sometimes (Heisenbugs).
- (2) Performance down.
- Especially on write barriers. We need to detect Young or Old
- object by oldgen_bitmap. It is slower than checking flags.
+ * gc.c: initialize ruby_gc_stress(full|_mode) by gc_params.gc_stress
+ even if ENABLE_VM_OBJSPACE is false.
- To evaluate this feature on more applications, I commit this patch.
- Reports are very welcome.
+Tue Sep 9 13:05:50 2014 Koichi Sasada <ko1@atdot.net>
- This patch includes some refactoring (renaming names, etc).
+ * gc.c: remove ruby_disable_gc_stress and add ruby_disable_gc
+ to speed-up newobj_of().
- * include/ruby/ruby.h: catch up 3gen GC.
+ * gc.c (ready_to_gc): check ruby_disable_gc.
- * .gdbinit: fix to show a prompt "[PROMOTED]" for promoted objects.
+ * signal.c: use ruby_disable_gc.
-Tue Nov 5 00:05:51 2013 Koichi Sasada <ko1@atdot.net>
+Tue Sep 9 12:11:41 2014 Koichi Sasada <ko1@atdot.net>
- * node.h: catch up comments for last commit.
+ * gc.c: rename gc_stat entries and check stat transition.
-Tue Nov 5 00:02:00 2013 Koichi Sasada <ko1@atdot.net>
+Tue Sep 9 12:06:03 2014 Koichi Sasada <ko1@atdot.net>
- * include/ruby/ruby.h: rename FL_OLDGEN to FL_PROMOTED.
- This flag represents that "this object is promoted at least once."
+ * gc.c (gc_sweep_rest): remove wrong modification of during_gc flag.
- * gc.c, debug.c, object.c: catch up this change.
+Tue Sep 9 11:39:41 2014 Koichi Sasada <ko1@atdot.net>
-Mon Nov 4 22:20:16 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c: pack boolean values into rb_objspace_t::flags with bit fields
+ to improve cache locality.
- * test/xmlrpc: Don't use fixed ports: 8070 and 8071.
+Tue Sep 9 11:11:05 2014 Koichi Sasada <ko1@atdot.net>
-Mon Nov 4 15:25:52 2013 Tanaka Akira <akr@fsij.org>
-
- * test/xmlrpc/webrick_testing.rb (start_server): Initialize the server
- at main thread to fail early.
+ * test/ruby/test_object.rb: extend timeout.
-Mon Nov 4 10:08:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Sep 9 09:02:07 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * eval_intern.h (TH_EXEC_TAG, TH_JUMP_TAG): get rid of undefined
- behavior of setjmp() in rhs of assignment expression.
- [ISO/IEC 9899:1999] 7.13.1.1
+ * lib/mkmf.rb (MakeMakefile#pkg_config): append --cflags to also
+ $CXXFLAGS, as they are often used by C++ compiler.
+ [ruby-core:54532] [Bug #8315]
-Sun Nov 3 23:06:51 2013 Tanaka Akira <akr@fsij.org>
+Tue Sep 9 07:03:22 2014 Eric Wong <e@80x24.org>
- * sample/test.rb: Make temporary file names unique.
+ * compile.c: remove needless SYM2ID <-> ID2SYM conversions
+ [misc #10207]
-Sun Nov 3 20:41:17 2013 Tanaka Akira <akr@fsij.org>
+Tue Sep 9 05:48:42 2014 Eric Wong <e@80x24.org>
- * test/xmlrpc: Wrap definitions by TestXMLRPC module.
+ * symbol.c (rb_intern_cstr_without_pindown): check dsymbol on return
+ This is not a complete fix for bug 10206, but seems to reduce
+ that crash and also looks correct.
-Sun Nov 3 20:23:38 2013 Tanaka Akira <akr@fsij.org>
+Tue Sep 9 04:36:24 2014 Eric Wong <e@80x24.org>
- * test/xmlrpc/webrick_testing.rb (stop_server): Don't try to shutdown
- the server if the server is not started.
+ * vm_core.h (rb_env_t): use flexible array
+ This reduces allocations and speeds up the lambda calculus
+ fizzbuzz (bm_app_lc_fizzbuzz.rb) benchmark [ruby-core:64858]
+ * proc.c (get_local_variable_ptr): deconst to adjust for flex array
+ * vm.c (env_mark, env_free, env_memsize): remove check for env->env
+ * vm.c (env_alloc): single allocation for flex array
+ * vm.c (vm_make_env_each): adjust env_alloc call
-Sun Nov 3 09:35:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Sep 8 16:08:22 2014 Koichi Sasada <ko1@atdot.net>
- * load.c (rb_feature_p): deal with default loadable suffixes.
+ * benchmark/bm_app_lc_fizzbuzz.rb: should skip output on benchmark.
- * load.c (load_lock): initialize statically linked extensions.
+Mon Sep 8 16:04:02 2014 Koichi Sasada <ko1@atdot.net>
- * load.c (search_required, rb_require_safe): deal with statically
- linked extensions.
+ * benchmark/bm_app_lc_fizzbuzz.rb: `answer.to_a' does not return
+ a string, but an array.
- * load.c (ruby_init_ext): defer initialization of statically linked
- extensions until required actually. [Bug #8883]
+Mon Sep 8 13:18:37 2014 Koichi Sasada <ko1@atdot.net>
-Sat Nov 2 15:14:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * benchmark/bm_app_lc_fizzbuzz.rb: added.
- * lib/logger.rb (Logger::LogDevice::LogDeviceMutex#lock_shift_log):
- open file can't be removed or renamed on Windows. [ruby-dev:47790]
- [Bug #9046]
+ This program is described closely in "Understanding Computation"
+ chapter 6 by Tom Stuart. <http://computationbook.com/>
- * test/logger/test_logger.rb (TestLogDevice#run_children): don't use
- fork.
+ Japanese translation will be published soon.
+ <http://www.oreilly.co.jp/books/9784873116976/>
-Sat Nov 2 07:08:43 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Mon Sep 8 12:01:39 2014 Koichi Sasada <ko1@atdot.net>
- * lib/logger.rb: Inter-process locking for log rotation
- Current implementation fails log rotation on multi process env.
- by sonots <sonots@gmail.com>
- https://github.com/ruby/ruby/pull/428 fix GH-428 [Bug #9046]
+ * gc.c: add incremental GC algorithm. [Feature #10137]
-Fri Nov 1 23:24:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ Please refer this ticket for details.
- * gc.c (wmap_mark_map): mark live objects only, but delete zombies.
- [ruby-dev:47787] [Bug #9069]
+ This change also introduces the following changes.
-Fri Nov 1 22:45:54 2013 Masaya Tarui <tarui@ruby-lang.org>
+ * Remove RGENGC_AGE2_PROMOTION and introduce object age (0 to 3).
+ Age can be count with FL_PROMOTE0 and FL_PROMOTE1 flags in
+ RBasic::flags (2 bit). Age == 3 objects become old objects.
+ * WB_PROTECTED flag in RBasic to WB_UNPROTECTED bitmap.
+ * LONG_LIVED bitmap to represent living objects while minor GCs
+ It specifies (1) Old objects and (2) remembered shady objects.
+ * Introduce rb_objspace_t::marked_objects which counts marked
+ objects in current marking phase. marking count is needed to
+ introduce incremental marking.
+ * rename mark related function and sweep related function to
+ gc_(marks|sweep)_(start|finish|step|rest|continue).
+ * rename rgengc_report() to gc_report().
+ * Add obj_info() function to get cstr of object details.
+ * Add MEASURE_LINE() macro to measure execution time of specific line.
+ * and many small fixes.
- * gc.c (struct heap_page, gc_page_sweep, gc_sweep): Refactoring for
- performance. Add before_sweep condition to heap_page structure.
+ * include/ruby/ruby.h: add flag USE_RINCGC.
+ Now USE_RINCGC can be set only with USE_RGENGC.
- * gc.c (rb_gc_force_recycle): Use before_sweep member.
+ * include/ruby/ruby.h: introduce FL_PROMOTED0 and add FL_PROMOTED1
+ to count object age.
- * gc.c (heap_is_before_sweep, is_before_sweep): Remove. They have not
- already been used.
+ * include/ruby/ruby.h: rewrite write barriers for incremental marking.
-Fri Nov 1 22:20:28 2013 Masaya Tarui <tarui@ruby-lang.org>
+ * debug.c: catch up flag name changes.
- * gc.c (make_deferred): Refactoring. Collect codes which should be
- atomic.
+ * internal.h: add rb_gc_writebarrier_remember() instead of
+ rb_gc_writebarrier_remember_promoted().
- * gc.c (make_io_deferred, obj_free, rb_objspace_call_finalizer,
- gc_page_sweep): Correspond to the above.
+ * array.c (ary_memcpy0): use rb_gc_writebarrier_remember().
-Fri Nov 1 21:40:35 2013 Masaya Tarui <tarui@ruby-lang.org>
+ * array.c (rb_ary_modify): ditto.
- * gc.c (typedef struct rb_objspace): Refactoring. Move some members
- into profile member.
+ * hash.c (rb_hash_keys): ditto.
- * gc.c (newobj_of): Correspond to the above.
+ * hash.c (rb_hash_values): ditto.
- * gc.c (finalize_list): Ditto.
+ * object.c (init_copy): use rb_copy_wb_protected_attribute() because
+ FL_WB_PROTECTED is moved from RBasic::flags.
- * gc.c (objspace_live_num): Ditto.
+ * test/objspace/test_objspace.rb: catch up ObjectSpace.dump() changes.
- * gc.c (gc_page_sweep): Ditto.
+Sun Sep 7 12:47:06 2014 Tanaka Akira <akr@fsij.org>
- * gc.c (rb_gc_force_recycle): Ditto.
+ * process.c: PTHREAD_CANCEL_DISABLE is not defined on Android.
- * gc.c (garbage_collect_body): Ditto.
+Sat Sep 6 20:59:06 2014 Tanaka Akira <akr@fsij.org>
- * gc.c (rb_gc_count): Ditto.
+ * process.c (has_privilege): The gid zero is not a privilege.
- * gc.c (gc_stat): Ditto.
+Sat Sep 6 20:19:16 2014 Tanaka Akira <akr@fsij.org>
- * gc.c (gc_prof_set_heap_info): Ditto.
+ * process.c (struct child_handler_disabler_state): cancelstate field
+ added.
+ (disable_child_handler_before_fork): Record cancelstate.
+ (disable_child_handler_fork_parent): Restore cancelstate.
- * gc.c (gc_profile_dump_on): Ditto.
+Sat Sep 6 19:27:10 2014 Tanaka Akira <akr@fsij.org>
-Fri Nov 1 20:53:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * process.c (struct child_handler_disabler_state): Defined.
- * string.c (rb_str_scrub): fix typo, should yield invalid byte
- sequence to be scrubbed. reported by znz at IRC.
+Sat Sep 6 18:31:32 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Fri Nov 1 17:25:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/rake.rb, lib/rake/*, test/rake/*: Update latest rake master(e47d023)
- * gc.c (is_live_object): finalizer may not run because of lazy-sweep.
- [ruby-dev:47786] [Bug #9069]
+Sat Sep 6 16:38:08 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Fri Nov 1 16:55:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/win32ole/win32ole_variant.c (ole_val2variant_err,
+ ole_val2variantdata, Init_win32ole_variant): support VT_ERROR
+ variant with error code. add WIN32OLE_VARIANT::NoParam.
+ * test/win32ole/test_win32ole_variant.rb(test_c_noparam,
+ test_vt_error_noparam): ditto.
+ * ext/win32ole/win32ole.c: ditto.
- * string.c (rb_str_scrub): export with fixed length arguments, and
- allow nil as replacement string instead of omitting.
+Sat Sep 6 11:08:52 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Nov 1 06:20:44 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * parse.y (arg_ambiguous_gen): fix warning message, "even" does
+ not mean the number of spaces here. state the place to put a
+ space and the operator. [ruby-core:64790] [Bug #10204]
- * thread.c (rb_mutex_struct): reduce rb_mutex_t size by 8 bytes
- on 64bit platform. Patch by Eric Wong. [Feature #9068][ruby-core:58114]
+Sat Sep 6 08:44:40 2014 Zachary Scott <e@zzak.io>
-Fri Nov 1 01:08:33 2013 Koichi Sasada <ko1@atdot.net>
+ * lib/rdoc/generator/template/darkfish/js/jquery.js: Backport
+ rdoc/rdoc@74f60fcb04fee1778fe2694d1a0ea6513f8e67b7
- * benchmark/gc/gcbench.rb: print HWM (high water mark) if possible.
+Sat Sep 6 08:10:44 2014 Eric Wong <e@80x24.org>
-Thu Oct 31 21:48:31 2013 Kouhei Sutou <kou@cozmixng.org>
+ * test/ruby/test_io.rb (test_readpartial_locktmp): use IO#nonblock=
+ Old fcntl invocation may drop necessary flags on some platforms.
- * lib/rexml/parsers/streamparser.rb: Add dependency file require.
- [Bug #9062] [ruby-dev:47779]
- Reported by Ippei Obayashi. Thanks!!!
+Sat Sep 6 07:46:51 2014 Eric Wong <e@80x24.org>
-Thu Oct 31 14:09:32 2013 Koichi Sasada <ko1@atdot.net>
+ * test/ruby/test_io.rb (test_readpartial_locktmp): avoid EBADF
+ [ruby-core:64773] [ruby-core:64775]
- * vm_method.c (rb_method_entry_make): fix to pass an ISeq value.
- OBJ_WRITTEN() accepts only VALUE.
+Sat Sep 6 01:34:31 2014 Tanaka Akira <akr@fsij.org>
-Wed Oct 30 19:07:57 2013 Akinori MUSHA <knu@iDaemons.org>
+ * process.c (rb_f_exec): Call before_exec_async_signal_safe and
+ after_exec_async_signal_safe around rb_exec_async_signal_safe.
+ (rb_exec_async_signal_safe): Don't call
+ before_exec_async_signal_safe and after_exec_async_signal_safe.
+ (rb_exec_without_timer_thread): Call before_exec and
+ after_exec.
+ (disable_child_handler_fork_child): Make SIGPIPE handler SIG_DFL.
- * misc/ruby-additional.el (ruby-brace-to-do-end)
- (ruby-do-end-to-brace, ruby-toggle-block): Remove functions that
- are already in the latest released version of Emacs (24.3).
- [Bug #7565]
+Sat Sep 6 00:49:41 2014 Tanaka Akira <akr@fsij.org>
-Wed Oct 30 12:44:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * signal.c (ruby_signal): Don't set SA_SIGINFO for SIG_IGN and
+ SIG_DFL.
- * win32/Makefile.sub (config.status): add missing variables,
- PLATFORM_DIR and THREAD_MODEL.
+Fri Sep 5 21:45:33 2014 Tanaka Akira <akr@fsij.org>
-Wed Oct 30 12:20:32 2013 Tanaka Akira <akr@fsij.org>
+ * process.c (disable_child_handler_before_fork): New function.
+ (disable_child_handler_fork_parent): Ditto.
+ (disable_child_handler_fork_child): Ditto.
+ (retry_fork_async_signal_safe): Call above functions to disable
+ signal handlers in child process.
- * time.c (v2w): Normalize a rational value to an integer if possible.
- [ruby-core:58070] [Bug #9059] reported by Isaac Schwabacher.
+Fri Sep 5 21:02:54 2014 Tanaka Akira <akr@fsij.org>
-Wed Oct 30 12:08:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * process.c (handle_fork_error): Make try_gc_p argument volatile to
+ suppress "clobbered" warning.
- * array.c (rb_ary_uniq_bang): use rb_ary_modify_check() instead of
- rb_ary_modify() because the array will be unshared soon.
+Fri Sep 5 20:48:06 2014 Tanaka Akira <akr@fsij.org>
-Wed Oct 30 03:25:10 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+ * process.c (handle_fork_error): Don't need state_p argument.
- * ext/psych/lib/psych/visitors/yaml_tree.rb: make less garbage when
- testing if a string is binary.
+Fri Sep 5 20:35:52 2014 Tanaka Akira <akr@fsij.org>
-Wed Oct 30 03:08:24 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+ * process.c (has_privilege): Fix a return value.
- * ext/psych/lib/psych/visitors/yaml_tree.rb: string subclasses should
- not be considered to be binary. Fixes Psych / GH 166
- https://github.com/tenderlove/psych/issues/166
+Fri Sep 5 19:00:40 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * test/psych/test_string.rb: test for fix
+ * lib/shellwords.rb: proofreading documentation.
+ [Bug #10155][ruby-core:64471]
-Tue Oct 29 23:01:18 2013 Masaki Matsushita <glass.saga@gmail.com>
+Fri Sep 5 18:34:33 2014 Laurent Arnoud <laurent@spkdev.net>
- * array.c (rb_ary_zip): some refactoring.
+ * test/csv/test_row.rb: Added some missing tests in CSV.
+ [fix GH-710]
+ * test/csv/test_table.rb: ditto.
-Tue Oct 29 22:11:37 2013 Masaki Matsushita <glass.saga@gmail.com>
+Fri Sep 5 12:57:52 2014 Tanaka Akira <akr@fsij.org>
- * array.c (rb_ary_uniq_bang): use st_foreach() instead of for loop.
+ * process.c (has_privilege): Refine uid/gid check.
-Tue Oct 29 20:01:58 2013 Koichi Sasada <ko1@atdot.net>
+Fri Sep 5 12:40:55 2014 Tanaka Akira <akr@fsij.org>
- * add RUBY_TYPED_FREE_IMMEDIATELY to data types which only use
- safe functions during garbage collection such as xfree().
+ * configure.in: Check sys/id.h, getuidx and getgidx for AIX.
- On default, T_DATA objects are freed at same points as finalizers.
- This approach protects issues such as reported by [ruby-dev:35578].
- However, freeing T_DATA objects immediately helps heap usage.
+ * process.c (getresuid): Defined for AIX.
+ (getresgid): Ditto
+ AIX don't have getresuid/getresgid but getuidx/getgidx.
- Most of T_DATA (in other words, most of dfree functions) are safe.
- However, we turned off RUBY_TYPED_FREE_IMMEDIATELY by default
- for safety.
+Fri Sep 5 12:28:21 2014 Tanaka Akira <akr@fsij.org>
- * cont.c: ditto.
+ * process.c (has_privilege): Fix assignments.
- * dir.c: ditto.
+Fri Sep 5 11:10:13 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * encoding.c: ditto.
+ * lib/rdoc/generator/pot/po.rb: fixed broken tests for trailing whitespace.
+ * test/rdoc/test_rdoc_generator_pot.rb: ditto.
+ * test/rdoc/test_rdoc_generator_pot_po.rb: ditto.
- * enumerator.c: ditto.
+Fri Sep 5 10:41:07 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * error.c: ditto.
+ * test/rdoc/test_rdoc_rdoc.rb (TestRDocRDoc#test_parse_file_encoding):
+ typofix.
- * file.c: ditto.
+Fri Sep 5 10:39:14 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * gc.c: ditto.
+ * lib/rdoc.rb, lib/rdoc, test/rdoc: Update to RDoc 4.2.0.alpha(313287)
- * io.c: ditto.
+Fri Sep 5 06:04:22 2014 Eric Wong <e@80x24.org>
- * iseq.c: ditto.
+ * vm.c: remove unused USE_THREAD_RECYCLE [misc #10198]
- * marshal.c: ditto.
+Fri Sep 5 00:29:08 2014 Tanaka Akira <akr@fsij.org>
- * parse.y: ditto.
+ * configure.in (dirfd): Check function.
- * proc.c: ditto.
+ * dir.c (dir_fileno): New method.
+ [ruby-dev:48265] [Feature #9880]
- * process.c: ditto.
+Thu Sep 4 23:39:52 2014 Tanaka Akira <akr@fsij.org>
- * random.c: ditto.
+ * process.c (has_privilege): New function.
+ (retry_fork_async_signal_safe): Don't use vfork() for privileged
+ process.
- * thread.c: ditto.
+ * configure.in (getresuid): Check function.
+ (getresgid): Ditto.
- * time.c: ditto.
+Thu Sep 4 20:22:14 2014 Laurent Arnoud <laurent@spkdev.net>
- * transcode.c: ditto.
+ * test/pathname/test_pathname.rb: added testcase for Pathname#mountpoint?.
+ [fix GH-709]
- * variable.c: ditto.
+Thu Sep 4 20:09:21 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+ * symbian/*: removed Symbian support.
+ [Feature #10199][ruby-core:64725]
+ * dln.c: ditto.
+ * include/ruby/defines.h: ditto.
+ * thread_pthread.c: ditto.
* vm.c: ditto.
- * vm_backtrace.c: ditto.
-
- * vm_trace.c: ditto.
-
- * ext/bigdecimal/bigdecimal.c: ditto.
-
- * ext/objspace/objspace.c: ditto.
-
- * ext/stringio/stringio.c: ditto.
-
- * ext/strscan/strscan.c: ditto.
-
-Tue Oct 29 19:48:33 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: fix typo (FL_WB_PROTECT -> FL_WB_PROTECTED).
-
-Tue Oct 29 18:45:08 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_trace.c (tp_free): removed because empty free function.
- Use RUBY_TYPED_NEVER_FREE instead.
-
-Tue Oct 29 18:37:33 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: introduce new flags for T_TYPEDDATA.
- * RUBY_TYPED_FREE_IMMEDIATELY: free the data given by DATA_PTR()
- with dfree function immediately. Otherwise (default), the data
- freed at finalization point.
- * RUBY_TYPED_WB_PROTECTED: make this object with FL_WB_PROTECT
- (not shady).
-
- * gc.c (obj_free): support RUBY_TYPED_FREE_IMMEDIATELY.
-
-Tue Oct 29 16:49:03 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (vm_malloc_increase): decrease it more carefully.
-
-Tue Oct 29 16:24:52 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (heap_page_resurrect): return a page in tomb heap even if
- freelist is NULL.
-
-Tue Oct 29 15:46:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ruby_atomic.h (ATOMIC_SIZE_CAS): new macro, compare and swap size_t.
-
-Tue Oct 29 12:08:05 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/readline/readline.c (readline_getc): Consider
- NULL as input.
-
-Tue Oct 29 11:10:08 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c (gc_profile_total_time): fix off-by-one error in
- GC::Profiler.total_time.
- * test/ruby/test_gc.rb (class TestGc): test for above.
-
-Tue Oct 29 09:53:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * insns.def, vm.c, vm_insnhelper.c, vm_insnhelper.h, vm_method.c: split
- ruby_vm_global_state_version into two separate counters - one for the
- global method state and one for the global constant state. This means
- changes to constants do not affect method caches, and changes to
- methods do not affect constant caches. In particular, this means
- inclusions of modules containing constants no longer globally
- invalidate the method cache.
-
- * class.c, eval.c, include/ruby/intern.h, insns.def, vm.c, vm_method.c:
- rename rb_clear_cache_by_class to rb_clear_method_cache_by_class
-
- * class.c, include/ruby/intern.h, variable.c, vm_method.c: add
- rb_clear_constant_cache
-
- * compile.c, vm_core.h, vm_insnhelper.c: rename vmstat field in
- rb_call_info_struct to method_state
-
- * vm_method.c: rename vmstat field in struct cache_entry to method_state
-
-Mon Oct 28 23:26:04 2013 Tanaka Akira <akr@fsij.org>
-
- * test/readline/test_readline.rb (teardown): Clear Readline.input and
- Readline.output.
-
-Mon Oct 28 21:35:31 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/-test-/file/depend, ext/-test-/postponed_job/depend,
- ext/-test-/tracepoint/depend: New files for dependencies.
-
-Mon Oct 28 15:32:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/openssl/depend (ossl.o): work around of dependency of
- thread_native.h, which depends on headers by THREAD_MODEL.
- [ruby-dev:47777]
-
- * ext/openssl/extconf.rb: need THREAD_MODEL.
-
-Mon Oct 28 14:57:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * load.c (ruby_init_ext): share feature names between frame name and
- provided features.
-
-Mon Oct 28 14:41:27 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * misc/ruby-electric.el: Import ruby-electric.el 2.1 from
- https://github.com/knu/ruby-electric.el.
-
- * Hitting the newline-and-indent key within a comment fires
- comment-indent-new-line.
-
- * Introduce a new feature
- `ruby-electric-autoindent-on-closing-char`.
-
- * Fix fallback behavior of ruby-electric-space/return that
- caused error with auto-complete.
-
-Mon Oct 28 13:17:17 2013 Or Cohen <orc@fewbytes.com>
-
- * error.c (name_err_to_s): remove no longer needed overriding, since
- r30455 which made exc_to_s almost same. Fixes [GH-413].
-
-Mon Oct 28 12:42:11 2013 Tanaka Akira <akr@fsij.org>
-
- * common.mk, ext/objspace/depend, ext/coverage/depend,
- ext/-test-/debug/depend, ext/date/depend: Update dependencies.
-
-Mon Oct 28 09:29:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * vm.c: vm_clear_all_cache is not necessary now we use a 64 bit counter
- for global state version.
-
- * vm_insnhelper.h: ruby_vm_global_state_version overflow is unnecessary
-
-Mon Oct 28 07:47:32 2013 Aman Gupta <ruby@tmm1.net>
-
- * vm_backtrace.c (rb_profile_frame_classpath): do not use rb_inspect
- directly, since it might have a custom implementation or show ivars.
-
-Mon Oct 28 04:10:41 2013 Aman Gupta <ruby@tmm1.net>
-
- * vm_backtrace.c (rb_profile_frame_classpath): handle singleton
- methods defined directly on an object.
- * test/-ext-/debug/test_profile_frames.rb: test for above.
-
-Mon Oct 28 00:52:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * struct.c (new_struct): fix warning message, class name and encoding.
-
-Sun Oct 27 20:53:08 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/readline/readline.c: Include ruby/thread.h for
- rb_thread_call_without_gvl2.
- (readline_rl_instream, readline_rl_outstream): Record FILE
- structures allocated by this extension.
- (getc_body): New function extracted from readline_getc.
- (getc_func): New function.
- (readline_getc): Use rb_thread_call_without_gvl2 to invoke getc_func.
- [ruby-dev:47033] [Bug #8749]
- (clear_rl_instream, clear_rl_outstream): Close FILE structure
- allocated by this extension reliably. [ruby-core:57951] [Bug #9040]
- (readline_readline): Use clear_rl_instream and clear_rl_outstream.
- (readline_s_set_input): Set readline_rl_instream.
- (readline_s_set_output): Set readline_rl_outstream.
- (Init_readline): Don't call readline_s_set_input because
- readline_getc doesn't block other threads for any FILE structure now.
-
- [ruby-dev:47033] [Bug #8749] reported by Nobuhiro IMAI.
- [ruby-core:57951] [Bug #9040] reported by Eamonn Webster.
-
-Sat Oct 26 19:31:28 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * gc.c: catch up recent changes to compile on GC_DEBUG,
- RGENGC_CHECK_MODE.
-
-Sat Oct 26 19:08:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * range.c (range_initialize_copy): disallow to modify after
- initialized.
-
-Sat Oct 26 17:48:54 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/open-uri.rb (meta_add_field): : Re-implemented.
- [ruby-core:58017] [Bug #9051] patch by Eamonn Webster.
-
-Sat Oct 26 14:35:09 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_profile_dump_on): use "Page" terminology.
-
-Sat Oct 26 13:25:45 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_sweep, gc_heap_lazy_sweep): fix measurement code.
- We only need one sweep time measurement without lazy sweep.
-
-Sat Oct 26 11:59:13 2013 Tanaka Akira <akr@fsij.org>
-
- * addr2line.c: Include ELF header after system headers (especially
- sys/types.h) to avoid compilation failure,
- "usr/include/sh3/elf_machdep.h:4:2: error: #error Define _BYTE_ORDER!",
- on NetBSD/sh3 (dreamcast, hpcsh, landisk, mmeye).
-
-Sat Oct 26 11:35:22 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: tuning parameters.
+Thu Sep 4 17:44:40 2014 Koichi Sasada <ko1@atdot.net>
- * gc.c (GC_MALLOC_LIMIT): change default value to 16MB.
+ * dir.c (glob_helper): use #ifdef instead of #if.
+ gcc's -Wundef option shows warning for undefined macro.
- * gc.c (GC_MALLOC_LIMIT_GROWTH_FACTOR): change default value to 2.0.
+ * numeric.c (flo_is_finite_p): ditto.
- * gc.c (gc_before_sweep): change decrease ratio of `malloc_limit'
- from 1/4 to 1/10.
+ * vm_dump.c (rb_vmdebug_thread_dump_state): ditto.
-Sat Oct 26 11:30:07 2013 Koichi Sasada <ko1@atdot.net>
+ * vm_core.h: define VM_DEBUG_VERIFY_METHOD_CACHE to 0.
- * gc.c (vm_malloc_increase): do gc_rest_sweep() before GC.
- gc_rest_sweep() can reduce malloc_increase, so try it before GC.
- Otherwise, malloc_increase can be less than malloc_limit at
- gc_before_sweep(). This means that re-calculation of malloc_limit
- may be wrong value.
+Thu Sep 4 03:57:46 2014 Eric Wong <e@80x24.org>
-Sat Oct 26 06:35:41 2013 Masaya Tarui <tarui@ruby-lang.org>
+ * man/ruby.1: spelling fix ("bellow" => "below") [ci-skip]
- * gc.c (gc_before_heap_sweep): Restructure code to mean clearly.
- heap->freelist is connected to end of list.
+Thu Sep 4 03:52:16 2014 Eric Wong <e@80x24.org>
-Sat Oct 26 04:01:35 2013 Koichi Sasada <ko1@atdot.net>
+ * man/ruby.1: add trailing slash to URLs [ci-skip]
- * gc.c (gc_before_heap_sweep): fix freelist management.
- After rb_gc_force_recycle() for a object belonging to heap->freelist,
- `heap->using_page->freelist' is not null.
+Wed Sep 3 19:10:28 2014 Tanaka Akira <akr@fsij.org>
-Thu Oct 24 21:57:24 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+ * process.c (before_fork_ruby): Renamed from before_fork.
+ (after_fork_ruby): Renamed from after_fork.
- * parse.y: Remove +(binary) and -(binary) special cases
- [Feature #9048]
+Wed Sep 3 18:56:05 2014 Tanaka Akira <akr@fsij.org>
-Thu Oct 24 12:45:53 2013 Zachary Scott <e@zzak.io>
+ * process.c (forked_child): Removed.
- * object.c: [DOC] Document first argument also takes string for:
+Wed Sep 3 16:56:07 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- rb_mod_const_get, rb_mod_const_set, rb_mod_const_defined
-
- Also added note about NameError exception for invalid constant name
-
-Thu Oct 24 12:23:58 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * thread.c (rb_thread_terminate_all): add a comment why we need
- state check and call terminate_i again.
-
-Thu Oct 24 12:15:02 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * thread.c (rb_thread_terminate_all): add a comment why infinite
- sleep is safe.
-
-Thu Oct 24 07:41:42 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c: add new initial_growth_max tuning parameter.
- [ruby-core:57928] [Bug #9035]
- * gc.c (heap_set_increment): when initial_growth_max is set,
- do not grow number of slots by more than growth_max at a time.
- * gc.c (rb_gc_set_params): load optional new tuning value from
- RUBY_HEAP_SLOTS_GROWTH_MAX environment variable.
- * test/ruby/test_gc.rb (class TestGc): test for above.
-
-Thu Oct 24 01:34:12 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/win32.h (rb_infinity_float): suppress overflow in
- constant arithmetic warnings. [ruby-core:57981] [Bug #9044]
-
-Thu Oct 24 00:11:24 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-
- * lib/ostruct.rb: raise NoMethodError with a #name and #args.
- Raise RuntimeError when modifying frozen instances
- instead of TypeError.
- (OpenStruct#each_pair): Return an enumerator with size
- (OpenStruct#delete): Use the converted argument.
- Patches by Kenichi Kamiya. [Fixes GH-383]
-
- * test/ostruct/test_ostruct.rb: Added tests for above.
-
-Thu Oct 24 00:10:22 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-
- * array.c: Add Array#to_h [Feature #7292]
-
- * enum.c: Add Enumerable#to_h
-
-Wed Oct 23 23:48:28 2013 Aman Gupta <ruby@tmm1.net>
-
- * gc.c: Rename free_min to min_free_slots and free_min_page to
- max_free_slots. The algorithm for heap growth is:
- if (swept_slots < min_free_slots) pages++
- if (swept_slots > max_free_slots) pages--
-
-Wed Oct 23 22:51:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/Makefile.sub (config.h): VC 2013 supports C99 mathematics
- functions. [ruby-core:57981] [Bug #9044]
-
-Wed Oct 23 19:13:18 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: move increment from heap to heap_pages.
- Share `increment' information with heaps.
-
- * gc.c: change ratio of heap_pages_free_min_page
- to 0.80.
- This change means slow down page freeing speed.
-
-Wed Oct 23 17:52:03 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (heap_pages_free_unused_pages): cast to (int) for size_t
- variable `i'.
-
-Wed Oct 23 17:39:35 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: introduce tomb heap.
- Tomb heap is where zombie objects and ghost (freed slot) lived in.
- Separate from other heaps (now there is only eden heap) at sweeping
- helps freeing pages more efficiently.
- Before this patch, even if there is an empty page at former phase
- of sweeping, we can't free it.
-
- Algorithm:
- (1) Sweeping all pages in a heap and move empty pages from the
- heap to tomb_heap.
- (2) Check all existing pages and free a page
- if all slots of this page are empty and
- there is enough empty slots (checking by swept_num)
-
- To introduce this patch, there are several tuning of GC parameters.
-
-Wed Oct 23 14:20:56 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_prof_sweep_timer_stop): catch up recent changes
- to compile on GC_PROFILE_MORE_DETAIL=1.
-
-Wed Oct 23 11:43:27 2013 Zachary Scott <e@zzak.io>
-
- * file.c: [DOC] fix rdoc format of File#expand_path from r43386
-
-Tue Oct 22 21:58:28 2013 URABE Shyouhei <shyouhei@ruby-lang.org>
-
- * vm_core.h (enum): avoid syntax error.
-
- * method.h: ditto.
-
- * internal.h: ditto.
-
-Tue Oct 22 19:53:16 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (Init_heap): move logics from heap_pages_init() and remove
- heap_pages_init().
-
-Tue Oct 22 19:19:05 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: allow multiple heaps.
- Now, objects are managed by page. And a set of pages is called heap.
- This commit supports multiple heaps in the object space.
-
- * Functions heap_* and rb_heap_t manages heap data structure.
- * Functions heap_page_* and struct heap_page manage page data
- structure.
- * Functions heap_pages_* and struct rb_objspace_t::heap_pages
- maintains all pages.
- For example, pages are allocated from the heap_pages.
-
- See https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/GC_design
- and https://bugs.ruby-lang.org/attachments/4015/data-heap_structure_with_multiple_heaps.png
- for more details.
-
- Now, there is only one heap called `eden', which is a space for all
- new generated objects.
-
-Tue Oct 22 18:26:12 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/pp.rb (object_address_group): Use Kernel#to_s to obtain the class
- name and object address.
- This fix a problem caused by %p in C generates variable length
- address.
- Reported by ko1 via IRC.
-
-Tue Oct 22 16:57:48 2013 Benoit Daloze <eregontp@gmail.com>
-
- * file.c (File#expand_path): [DOC] improve documentation of File#expand_path.
- Based on patch by Prathamesh Sonpatki. [ruby-core:57734] [Bug #9002]
-
-Tue Oct 22 15:59:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * dir.c (glob_helper): don't skip current directories if FNM_DOTMATCH
- is given. [ruby-core:53108] [Bug #8006]
-
-Tue Oct 22 14:53:11 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_trace.c: exterminate Zombies.
- There is a bug that T_ZOMBIE objects are not collected.
- Because there is a pass to miss finalizer postponed job
- with multi-threading. This patch solve this issue.
-
- * vm_trace.c (rb_postponed_job_register_one): set
- RUBY_VM_SET_POSTPONED_JOB_INTERRUPT(th) if another same job
- is registered.
- There is a possibility to remain a postponed job without
- interrupt flag.
-
- * vm_trace.c (rb_postponed_job_register_one): check interrupt
- carefully.
-
- * vm_trace.c (rb_postponed_job_register_one): use additional space
- to avoid buffer full.
-
- * gc.c (gc_finalize_deferred_register): check failure.
-
- * thread.c (rb_threadptr_execute_interrupts): check
- `postponed_job_interrupt' immediately. There is a possibility
- to miss this flag.
-
-Tue Oct 22 12:11:16 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: check if the given CFLAGS and LDFLAGS are working, and
- bail out early if not.
-
-Tue Oct 22 00:06:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * file.c (rb_file_exists_p): warn deprecated name. [Bug #9041]
-
-Mon Oct 21 23:57:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * encoding.c (load_encoding): should preserve outer errinfo, so that
- expected exception may not be lost. [ruby-core:57949] [Bug #9038]
-
-Sun Oct 20 15:41:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * io.c (rb_io_reopen): create a new, temporary FD via rb_sysopen and
- call rb_cloexec_dup2 on it to atomically replace the file fptr->fd
- points to. This leaves no possible window where fptr->fd is invalid
- to userspace (even for any threads running w/o GVL). based on the
- patch by Eric Wong <normalperson@yhbt.net> at [ruby-core:57943].
- [Bug #9036]
-
-Sun Oct 20 15:29:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * error.c (rb_syserr_fail_path_in): new function split from
- rb_sys_fail_path_in to raise SystemCallError without errno.
-
- * internal.h (rb_syserr_fail_path): like rb_sys_fail_path but without
- errno.
-
-Sun Oct 20 13:58:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/ruby.h (rb_obj_wb_unprotect, rb_obj_written),
- (rb_obj_write): suppress unused-parameter warnings.
-
-Sun Oct 20 10:32:48 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update RubyGems to master 0886307. This commit
- improves documentation and should bring ruby above 75% documented on
- rubyci.
-
-Sun Oct 20 09:30:56 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 3de7e0f. Changes:
-
- Only attempt to build extensions for newly-installed gems. This
- prevents compilation attempts at gem activation time for gems that
- already have extensions built.
-
- Fix crash in the dependency resolver for dependencies that cannot be
- resolved.
-
- * test/rubygems: ditto.
-
-Sun Oct 20 05:24:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * variable.c (rb_class2name): should return real class name, not
- singleton class or iclass.
-
-Sun Oct 20 04:18:48 2013 Aman Gupta <ruby@tmm1.net>
-
- * variable.c (rb_class2name): call rb_tmp_class_path() directly to
- avoid extra rb_str_dup() from rb_class_name().
-
-Sat Oct 19 19:59:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/file.c (code_page): use simple array instead of st_table.
-
- * encoding.c (rb_locale_encindex): defer initialization of win32 code
- page table until encoding db loaded.
-
-Sat Oct 19 08:25:05 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: fix rb_objspace_t.
- * make "struct heap" and move most of variables
- in rb_objspace_t::heap.
- * rename rb_objspace_t::heap::sorted to
- rb_objspace_t::heap_sorted_pages
- and make a macro heap_sorted_pages.
- * rename rb_objspace_t::heap::range to
- rb_objspace_t::heap_range and rename macros
- lomem/himem to heap_lomem/heap_himem.
-
-Sat Oct 19 07:14:40 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 42543b6. Changes:
-
- Fix `gem update` for gems with multiple platforms.
-
- * test/rubygems: ditto.
-
-Sat Oct 19 06:55:52 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master 0a3814b. Changes:
-
- Fixed extension directory in Gem::Specification#require_paths.
-
- Allow installation of gems when $HOME is nonexistent or unwritable.
-
- Use proper API in InstallCommand.
-
- Improve support for path option in gem dependency files.
-
- Remove warnings.
-
- * test/rubygems: ditto.
-
-Fri Oct 18 15:23:34 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: change terminology of heap.
- Change "slot" to "page". "Slot" is a space of RVALUE.
- 1. "Heap" consists of a set of "heap_page"s (pages).
- 2. Each "heap_page" has "heap_page_body".
- 3. "heap_page_body" has RVALUE (a.k.a. "slot") spaces.
- 4. "sorted" is a sorted array of "heap_page"s, sorted
- by address of heap_page_body (for "is_pointer_to_heap").
-
- See https://bugs.ruby-lang.org/attachments/4008/data-heap_structure.png.
-
-Fri Oct 18 09:40:43 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master cee6788. Changes:
-
- Fix test failure on vc10-x64 Server on rubyci.org due to attempting
- to File.chmod where it is not supported.
-
- Continuing work on improved gem dependencies file (Gemfile) support.
-
- * test: ditto.
-
-Fri Oct 18 06:02:49 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems master f738c67. Changes:
-
- Fixed test bug for ruby with ENABLE_SHARED = no
+ * object.c (rb_obj_copy_ivar): allocate no memory for empty
+ instance variables. [ruby-core:64700] [Bug #10191]
- * test/rubygems: ditto.
+Wed Sep 3 12:05:17 2014 Tanaka Akira <akr@fsij.org>
-Fri Oct 18 00:57:07 2013 Tanaka Akira <akr@fsij.org>
+ * process.c (retry_fork_async_signal_safe): Use vfork() if available.
+ vfork() is still faster than fork() especially when the parent
+ process uses big memory.
- * lib/tsort.rb (TSort.tsort): Extracted from TSort#tsort.
- (TSort.tsort_each): Extracted from TSort#tsort_each.
- (TSort.strongly_connected_components): Extracted from
- TSort#strongly_connected_components.
- (TSort.each_strongly_connected_component): Extracted from
- TSort#each_strongly_connected_component.
+ ruby -rbenchmark -e 'a = "a" * 1_000_000_000; puts Benchmark.measure { system("true") }'
+ fork: 0.000000 0.010000 0.010000 ( 0.014968)
+ vfork: 0.000000 0.000000 0.000000 ( 0.000912)
+ on Debian sid.
-Thu Oct 17 18:50:08 2013 Koichi Sasada <ko1@atdot.net>
+Wed Sep 3 11:33:08 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * gc.c (CALC_EXACT_MALLOC_SIZE_CHECK_OLD_SIZE): introduced.
- This macro enable checker compare with allocated memory and
- declared old_size of sized_xfree and sized_xrealloc.
+ * test/openssl/test_pkey_rsa.rb (OpenSSL#test_sign_verify_memory_leak):
+ added timeout into testcase for low performance environment.
+ [Bug #9984][ruby-core:63367]
-Thu Oct 17 18:45:41 2013 Koichi Sasada <ko1@atdot.net>
+Wed Sep 3 07:50:15 2014 Tanaka Akira <akr@fsij.org>
- * string.c (STR_HEAP_SIZE): includes TERM_LEN(str).
+ * configure.in: Use AC_FUNC_FORK.
- * string.c (rb_str_memsize): use STR_HEAP_SIZE().
+ * io.c: Use HAVE_WORKING_FORK instead of HAVE_FORK.
-Thu Oct 17 17:43:00 2013 Shugo Maeda <shugo@ruby-lang.org>
+ * process.c: Ditto.
- * vm_insnhelper.c (vm_call_method): set ci->me to 0 when the
- original method of a refined method is undef to avoid SEGV.
+Wed Sep 3 00:12:44 2014 Tanaka Akira <akr@fsij.org>
- * vm_method.c (rb_method_entry_without_refinements): return 0 when
- the original method of a refined method is undef to avoid SEGV.
+ * process.c (retry_fork_async_signal_safe): Don't return on in child
+ process.
- * test/ruby/test_refinement.rb: related test.
+Tue Sep 2 23:47:35 2014 Tanaka Akira <akr@fsij.org>
-Thu Oct 17 17:38:36 2013 Koichi Sasada <ko1@atdot.net>
+ * process.c (retry_fork_async_signal_safe): Specialized version of
+ retry_fork respect to rb_fork_async_signal_safe.
+ (retry_fork_ruby): Specialized version of retry_fork respect to
+ rb_fork_ruby.
+ (rb_fork_ruby): Removed.
- * gc.c, internal.h: rename ruby_xsizefree/realloc to
- rb_sized_free/realloc.
+Tue Sep 2 23:26:26 2014 Tanaka Akira <akr@fsij.org>
- * array.c: catch up these changes.
+ * process.c (send_child_error): Simplified.
+ (recv_child_error): Ditto.
- * string.c: ditto.
+Tue Sep 2 22:56:25 2014 Tanaka Akira <akr@fsij.org>
-Thu Oct 17 17:32:51 2013 Koichi Sasada <ko1@atdot.net>
+ * process.c (rb_fork_async_signal_safe): Inline rb_fork_internal.
+ (rb_fork_ruby): Ditto.
+ (rb_fork_internal): Removed.
+ (chfunc_protect): Removed.
- * array.c, string.c: use ruby_xsizedfree() and ruby_xsizedrealloc().
+Tue Sep 2 22:43:52 2014 Tanaka Akira <akr@fsij.org>
- * internal.h (SIZED_REALLOC_N): define a macro as REALLOC_N().
+ * test/ruby/test_io.rb (test_new_with_block): Set autoclose to avoid
+ EBADF.
-Thu Oct 17 17:11:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Sep 2 22:01:51 2014 Kouhei Sutou <kou@cozmixng.org>
- * win32/win32.c (console_emulator_p): check by comparison between
- module handle of WriteConsoleW and kernel32.dll.
+ * Makefile.in (update-coverage): Remove a never executed line.
- * configure.in, win32/Makefile.sub, win32/setup.mak: no longer need
- psapi.lib.
+Tue Sep 2 19:48:26 2014 Tanaka Akira <akr@fsij.org>
-Thu Oct 17 16:53:30 2013 Koichi Sasada <ko1@atdot.net>
+ * process.c (handle_fork_error): Extracted from retry_fork.
- * gc.c, internal.h: add new internal memory management functions.
- * void *ruby_xsizedrealloc(void *ptr, size_t new_size, size_t old_size)
- * void ruby_xsizedfree(void *x, size_t size)
- These functions accept additional size parameter to calculate more
- accurate malloc_increase parameter which control GC timing.
- [Feature #8985]
+Tue Sep 2 17:02:53 2014 Vit Ondruch <v.ondruch@tiscali.cz>
-Thu Oct 17 14:21:34 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * tool/rbinstall.rb: fixed error of local installation.
+ [Bug #10192][ruby-core:64702]
- * win32/file.c (rb_file_expand_path_internal): fix memory leaks at
- a non-absolute home exception.
+Tue Sep 2 16:58:03 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Thu Oct 17 14:06:39 2013 Koichi Sasada <ko1@atdot.net>
+ * test/runner.rb: reporting test coverage for test-all with COVERAGE env.
+ [Feature #10189][ruby-core:64681][fix GH-708]
+ * Makefile.in: added task for coverage report.
+ * common.mk: added definition of forked simplecov url.
+ * .gitignore: ignored coverage directory.
- * ext/objspace/object_tracing.c (newobj_i): fix memory leak.
- There is possibility to remain info due to missing FREEOBJ event.
- FREEOBJ events are skipped while suppress_tracing state, for example,
- during trace events are invoking.
+Mon Sep 1 20:11:02 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Thu Oct 17 12:30:16 2013 Tanaka Akira <akr@fsij.org>
+ * ext/win32ole/win32ole.c (rbtime2vtdate): try to convert millisecond
+ of Time object to millisecond of VT_DATE VARIANT.
+ * test/win32ole/test_win32ole_variant.rb
+ (test_conversion_time2date_with_msec): ditto.
- * lib/tsort.rb (TSort.each_strongly_connected_component_from):
- Extracted from TSort#each_strongly_connected_component_from.
+Sun Aug 31 16:58:49 2014 Tanaka Akira <akr@fsij.org>
-Thu Oct 17 11:07:06 2013 Eric Hodel <drbrain@segment7.net>
+ * lib/benchmark.rb: Fix a syntax error.
- * lib/rubygems: Update to RubyGems master 941c21a. Changes:
+Sun Aug 31 08:46:44 2014 Eric Wong <e@80x24.org>
- Restored method bundler wants to remove for compatibility.
+ * ext/zlib/zlib.c (gzfile_reset): preserve ZSTREAM_FLAG_GZFILE
+ [Bug #10101]
- Improvements to Gemfile compatibility.
+ * test/zlib/test_zlib.rb (test_rewind): test each_byte
- * test/rubygems: ditto.
+Sat Aug 30 19:22:47 2014 Eric Wong <e@80x24.org>
-Thu Oct 17 08:08:11 2013 Koichi Sasada <ko1@atdot.net>
+ * symbol.c (rb_sym2id): do not return garbage object
- * ext/objspace/object_tracing.c (newobj_i): add workaround.
- some bugs hits this check.
+Sat Aug 30 06:39:48 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * ext/objspace/object_tracing.c (object_allocations_reporter_i): cast as pointer.
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: fix NameError dumping and
+ loading. Fixes GH #85. Thanks @brentdax for the patch!
+ * test/psych/test_exception.rb: test for fix
-Thu Oct 17 07:36:53 2013 Eric Hodel <drbrain@segment7.net>
+Sat Aug 30 06:23:40 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * lib/rubygems: Update to RubyGems master 2abce58. Changes:
+ * ext/psych/lib/psych/scalar_scanner.rb: fix loading strings that
+ look like integers but have a newline. Fixes GH #189
+ * test/psych/test_string.rb: test for fix
- Fixed documentation generation when sdoc and json are installed as
- gems.
+Sat Aug 30 06:10:39 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- Added some missing documentation.
+ * ext/psych/lib/psych/visitors/to_ruby.rb: merge keys with a hash
+ should merge the hash in to the parent.
+ * test/psych/test_merge_keys.rb: test for change. Fixes GH #202
-Thu Oct 17 07:10:26 2013 Zachary Scott <e@zzak.io>
+Sat Aug 30 06:00:26 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * ext/curses/curses.c: [DOC] Cleaned up formatting consistency of rdoc
- comments for Curses, including period spacing and column width.
+ * ext/psych/lib/psych/visitors/to_ruby.rb: quoted "<<" strings
+ should not be treated as merge keys.
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: hashes with keys
+ containing "<<" should roundtrip.
+ * test/psych/test_merge_keys.rb: test for change. Fixes GH #203
- This patch also fixed some typos. Thanks to @postmodern for the patch!
- [Fixes GH-420] https://github.com/ruby/ruby/pull/420
+Fri Aug 29 17:56:44 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Thu Oct 17 06:58:42 2013 Zachary Scott <e@zzak.io>
+ * test/net/imap/test_imap_response_parser.rb: removed needless code.
- * ext/date/date_core.c: [DOC] plural grammar fixed by @scott113341
- Contributed via documenting-ruby.org: documenting-ruby/ruby#16
- https://github.com/documenting-ruby/ruby/pull/16
+Fri Aug 29 17:36:58 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Thu Oct 17 05:52:31 2013 Zachary Scott <e@zzak.io>
+ * test/rinda/test_rinda.rb: removed useless assignment variables.
+ * test/rss/rss-assertions.rb: ditto.
+ * test/rss/test_maker_itunes.rb: ditto.
- * ext/io/nonblock/nonblock.c: [DOC] Document io/nonblock by reprah
- [Fixes GH-418] https://github.com/ruby/ruby/pull/418 based on the
- original discussion from documenting-ruby/ruby#18
+Fri Aug 29 16:18:26 2014 Eric Wong <e@80x24.org>
-Thu Oct 17 05:40:33 2013 Koichi Sasada <ko1@atdot.net>
+ * string.c: revert part of r47311, add rb_vm_fstring_table(),
+ remove vm_core.h dependency. [ruby-core:64627]
- * gc.c (objspace_each_objects): do not skip empty RVALUEs.
+Fri Aug 29 15:17:13 2014 Eric Wong <e@80x24.org>
-Thu Oct 17 05:31:31 2013 Koichi Sasada <ko1@atdot.net>
+ * string.c: remove static frozen_strings
+ * string.c (Init_frozen_strings): new function
+ * string.c (rb_fstring): remove check for frozen strings,
+ use per-VM table
+ * string.c (rb_str_free): use per-VM table
+ * string.c (Init_String): use per-VM table
+ * vm_core.h (rb_vm_t): add frozen_strings table
+ * internal.h (Init_frozen_strings): new function prototype
+ * eval.c (ruby_setup): call Init_frozen_strings
+ [Feature #10182]
- * error.c (rb_bug_reporter_add): return simply 0 if failed.
- Please check return value.
+Wed Aug 27 23:10:24 2014 Masaki Matsushita <glass.saga@gmail.com>
-Thu Oct 17 05:17:33 2013 Koichi Sasada <ko1@atdot.net>
+ * lib/tempfile.rb: remove "require 'thread'". its features are no
+ longer used.
- * ext/objspace/object_tracing.c: add new method
- ObjectSpace.trace_object_allocations_debug_start for GC debugging.
- If you encounter the BUG "... is T_NONE" (and so on) on your
- application, please try this method at the beginning of your app.
+Wed Aug 27 21:19:40 2014 gogo tanaka <mail@tanakakazuki.com>
-Wed Oct 16 22:35:27 2013 Zachary Scott <e@zzak.io>
+ * lib/drb/acl.rb: Removed meaningless #to_s methods in interpolation.
+ [Feature #10174][ruby-core:64584]
+ * lib/erb.rb: ditto.
+ * lib/observer.rb: ditto.
+ * lib/rake/invocation_chain.rb: ditto.
+ * lib/rubygems/command_manager.rb: ditto.
+ * lib/rubygems/config_file.rb: ditto.
+ * lib/uri/common.rb: ditto.
- * ext/io/nonblock/nonblock.c: use rb_cIO instead of VALUE
+Wed Aug 27 21:08:20 2014 gogo tanaka <mail@tanakakazuki.com>
-Wed Oct 16 17:45:13 2013 Koichi Sasada <ko1@atdot.net>
+ * lib/drb/drb.rb: use attr_reader instead of Module#attr.
+ [Feature #10172][ruby-core:64582]
+ * lib/irb/ruby-token.rb: ditto.
+ * lib/net/telnet.rb: ditto.
+ * lib/rdoc/ruby_token.rb: ditto.
+ * lib/thwait.rb: ditto.
- * bootstraptest/runner.rb: check nil before calling `signal?'
- for a process status.
+Wed Aug 27 19:52:33 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Wed Oct 16 17:37:17 2013 Koichi Sasada <ko1@atdot.net>
+ * ext/win32ole/win32ole.c (vtdate2rbtime): try to convert millisecond
+ of VT_DATE VARIANT to nsec of Time object.
+ * test/win32ole/test_win32ole_variant.rb
+ (test_conversion_dbl2date_with_msec): ditto.
- * error.c, internal.h (rb_bug_reporter_add): add a new C-API.
- rb_bug_reporter_add() allows to register a function which
- is called at rb_bug() called.
+Wed Aug 27 09:57:29 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ext/-test-/bug_reporter/bug_reporter.c: add a test for this C-API.
+ * test/ruby/test_complex.rb: removed unreachable code.
+ * test/ruby/test_rational.rb: ditto.
- * ext/-test-/bug_reporter/extconf.rb: ditto.
+Wed Aug 27 07:59:17 2014 Eric Wong <e@80x24.org>
- * test/-ext-/bug_reporter/test_bug_reporter.rb: ditto.
+ * compile.c (iseq_set_sequence): check for multiplication overflow
-Wed Oct 16 15:14:21 2013 Koichi Sasada <ko1@atdot.net>
+Tue Aug 26 22:07:42 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * NEWS: add a line into NEWS for last commit.
+ * test/ruby/test_complex.rb: cherry-picked working assertions from r47251.
+ * test/ruby/test_rational.rb: cherry-picked working assertions from r47263.
-Wed Oct 16 15:09:14 2013 Koichi Sasada <ko1@atdot.net>
+Tue Aug 26 21:07:56 2014 gogo tanaka <mail@tanakakazuki.com>
- * ext/objspace/objspace.c: add a new method `reachable_objects_from_root'.
- ObjectSpace.reachable_objects_from_root returns all objects referred
- from root (called "root objects").
- This feature is for deep object analysis.
+ * lib/mathn.rb (Fixnum#**, Bignum#**, Float#**, Rational#**):
+ remove as these are now built-in. [ruby-core:63973] [Bug #10086]
- * test/objspace/test_objspace.rb: add a test.
+Tue Aug 26 20:46:55 2014 Tanaka Akira <akr@fsij.org>
-Wed Oct 16 15:00:21 2013 Eric Hodel <drbrain@segment7.net>
+ * time.c (rb_time_unmagnify_to_float): Avoid double rounding.
+ Reported by Tsuyoshi Sawada.
+ https://bugs.ruby-lang.org/issues/10135#note-1
- * lib/rubygems: Update to RubyGems master b955554. Changes:
+Tue Aug 26 17:12:47 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- Fixed NameError for Gem::Ext due to re-entering file lookup in
- RubyGems' overridden require. Bug by Koichi Sasada.
+ * io.c (io_close): ignore only "closed stream" IOError and
+ NoMethodError, do not swallow other exceptions at the end of
+ block. [ruby-core:64463] [Bug #10153]
- Fixed possible circular require warning in tests.
+Tue Aug 26 13:46:33 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
- Used existing constant for `gem install -g` dependency file list.
+ * template/fake.rb.in: fix failed to make install when @srcdir@ is
+ absolute path.
- * test/rubygems: ditto.
+Tue Aug 26 13:43:50 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Wed Oct 16 09:42:42 2013 Eric Hodel <drbrain@segment7.net>
+ * test/ruby/test_range.rb: added workaround for VERBOSE message.
- * lib/rubygems: Update to RubyGems master 278d00d. Changes:
+Tue Aug 26 12:38:02 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- Fixes building extensions without a "clean" make rule
+ * test/test_mathn.rb: added workaround for VERBOSE messages.
- Adds gem dependency file autodetection to "gem install -g"
+Tue Aug 26 11:44:04 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * test/rubygems: Tests for the above.
+ * lib/shell/process-controller.rb: removed commented-out code.
-Wed Oct 16 09:12:23 2013 Eric Hodel <drbrain@segment7.net>
+Tue Aug 26 11:39:01 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * lib/rubygems: Update to RubyGems master commit 2a74263. This fixes
- several bugs in RubyGems 2.2.0.preview.1.
+ * lib/thwait.rb (ThreadsWait): removed needless constant.
- * test/rubygems: ditto.
+Tue Aug 26 09:27:10 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Wed Oct 16 07:25:02 2013 Aman Gupta <ruby@tmm1.net>
+ * lib/mathn.rb: mathn library is deprecated on ruby 2.2.
+ [Feature #10169][ruby-core:64553]
- * gc.c (gc_mark_roots): rename roots to be categories
- instead of function names.
+Tue Aug 26 09:25:03 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Tue Oct 15 19:18:13 2013 Koichi Sasada <ko1@atdot.net>
+ * lib/mathn.rb: removed commented-out code.
- * gc.h (rb_objspace_reachable_objects_from_root): added.
- This API provides information which objects are root objects.
- `category' shows what kind of root objects.
+Mon Aug 25 20:15:50 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * gc.c (gc_mark_roots): separate from gc_marks_body().
+ * ext/win32ole/win32ole.c(fole_s_connect, fole_initialize): raise a
+ security error with the tainted string object.
+ * ext/win32ole/win32ole_event.c(ev_advise): ditto.
+ * test/win32ole/test_win32ole.rb(test_s_new_exc_svr_tainted,
+ test_s_new_exc_host_tainted): ditto.
+ * test/win32ole/test_win32ole_event.rb(test_s_new_exc_tainted): ditto.
-Tue Oct 15 17:47:59 2013 Tanaka Akira <akr@fsij.org>
+Mon Aug 25 12:56:54 2014 Ivan Korunkov <ivankorunkov@ya.ru>
- * process.c: Fix a typo. MacOS X doesn't have ENOTSUPP.
+ * lib/logger.rb (format_datetime): use "%6N" to show microsecond.
+ [Fix GH-704]
-Mon Oct 14 12:32:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Aug 25 11:02:07 2014 Eric Wong <e@80x24.org>
- * ruby.c (process_options): load statically linked extensions before
- rubygems, because of ext/thread.
+ * vm_core.h (rb_iseq_location_t): change first_lineno type to VALUE
+ * iseq.c (rb_iseq_build_for_ruby2cext): update based on argument
- * ruby.c (process_options): use gem_prelude instead of requiring
- rubygems directly when --enable=gems is given.
+Sun Aug 24 16:14:46 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * Makefile.in (DEFAULT_PRELUDES): always use gem_prelude regardless of
- --disable-rubygems.
+ * lib/e2mmap.rb: remove needless instance variables.
+ * lib/irb.rb: ditto.
+ * lib/irb/**/*.rb: ditto.
+ * lib/shell.rb: ditto.
-Mon Oct 14 11:07:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Aug 24 12:44:26 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * lib/mkmf.rb (have_framework): should append framework options to
- $LIBS, not $LDFLAGS. The former is propagated to exts.mk when
- enable-static-linked-ext.
+ * test/ruby/test_complex.rb: removed needless conditions.
+ * test/ruby/test_rational.rb: ditto.
- * lib/mkmf.rb (create_makefile): ranlib on static library, not DLLIB.
+Sun Aug 24 11:47:39 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Sun Oct 13 23:53:40 2013 Andrew Grimm <andrew.j.grimm@gmail.com>
+ * test/ruby/test_rational.rb: fixed indent.
- * vsnprintf.c: Fix spelling from compliment to complement.
- Patch by @agrimm.
+Sun Aug 24 11:44:11 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * include/ruby/ruby.h: ditto
+ * test/ruby/test_rational.rb: remove commented-out code.
-Sun Oct 13 20:59:27 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Aug 24 11:09:29 2014 Eric Wong <e@80x24.org>
- * vm.c (Init_BareVM): initialize defined_module_hash here,
- Init_top_self() is too late to register core classes/modules.
+ * lib/benchmark.rb (measure): reduce allocations as in r47260
- * compile.c (compile_array_): no hash to merge if it is empty.
+Sun Aug 24 10:35:54 2014 Pete Higgins <pete@peterhiggins.org>
- * vm.c (m_core_hash_merge_kwd): just check keys if only one argument
- is given, without merging.
+ * lib/benchmark.rb (module Benchmark): define BENCHMARK_CLOCK
+ (realtime): use Process.clock_gettime(BENCHMARK_CLOCK)
+ Reduces allocations to improve performance [Feature #10165]
-Sat Oct 12 06:35:01 2013-10-11 Eric Hodel <drbrain@segment7.net>
+ * test/benchmark/test_benchmark.rb (test_realtime_output): new test
- * lib/rake: Update to rake 10.1.0
- * bin/rake: ditto.
- * test/rake: ditto.
+Fri Aug 22 20:23:54 2014 Koichi Sasada <ko1@atdot.net>
- * NEWS: Update NEWS to include rake 10.1.0 and links to release notes.
+ * string.c (rb_fstring): fix condition (easy to cause infinite loop!).
-Sat Oct 12 03:26:04 2013 Koichi Sasada <ko1@atdot.net>
+Fri Aug 22 20:07:43 2014 Koichi Sasada <ko1@atdot.net>
- * class.c, variable.c, gc.c (rb_class_tbl): removed.
+ * string.c (rb_fstring, fstr_update_callback): simply delete garbage
+ key first.
- * vm.c, vm_core.h (rb_vm_add_root_module): added to register as a
- defined root module or class.
- This guard helps mark miss from defined classes/modules they are
- only referred from C's global variables in C-exts.
- Basically, it is extension's bug.
- Register to hash object VM has.
- Marking a hash objects allows generational GC supports.
+ Garbage keys can be swept by lazy sweeping invoked by creating new
+ fstring. So that simply do:
+ (1) delete garbage key and return `fstr_update_callback' immediately
+ (2) try again `fstr_update_callback()' to create a new fstr.
- * gc.c (RGENGC_PRINT_TICK): disable (revert).
+ This bug can be cause memory corruption, reported by
+ http://u64.rubyci.org/~chkbuild/ruby-trunk/log/20140821T220302Z.fail.html.gz
-Sat Oct 12 03:24:49 2013 Koichi Sasada <ko1@atdot.net>
+Fri Aug 22 19:30:39 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * vm_method.c (rb_gc_mark_unlinked_live_method_entries):
- revert last commit to introduce debug prints.
+ * test/ruby/test_complex.rb: removed commented-out code.
-Fri Oct 11 21:05:19 2013 Koichi Sasada <ko1@atdot.net>
+Fri Aug 22 19:25:28 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * internal.h, parse.y: use `full_mark' instead of `full_marking'.
+ * test/ruby/test_complex.rb: fixed broken tests. Math is not
+ compatible CMath now.
-Fri Oct 11 20:58:16 2013 Koichi Sasada <ko1@atdot.net>
+Fri Aug 22 15:36:09 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * gc.c: use terminology `full_mark' instead of `minor_gc'
- in mark functions.
+ * common.mk (Doxyfile): revert r43888, not to require preinstalled
+ ruby. [ruby-core:64488] [Bug #10161]
-Fri Oct 11 20:46:09 2013 Koichi Sasada <ko1@atdot.net>
+Fri Aug 22 12:32:15 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * gc.c: use __GNUC__ instead of __GCC__.
+ * lib/shell.rb: removed commented-out code.
+ * lib/shell/builtin-command.rb: ditto.
+ * lib/shell/command-processor.rb: ditto.
-Fri Oct 11 20:35:59 2013 Koichi Sasada <ko1@atdot.net>
+Fri Aug 22 12:21:46 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * gc.c, parse.y: support generational Symbol related marking.
- Each symbols has String objects respectively to represent
- Symbols.
- These objects are marked only when:
- * full marking
- * new symbols are added
- This hack reduce symbols (related strings) marking time.
- For example, on my Linux environment, the following code
- "20_000_000.times{''}"
- with 40k symbols (similar symbol number on Rails 3.2.14 app,
- @jugyo tells me) boosts, from 7.3sec to 4.2sec.
+ * lib/complex.rb: removed deprecated library.
+ * lib/rational.rb: ditto.
- * internal.h: change prototype of rb_gc_mark_symbols().
+Fri Aug 22 11:38:49 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Fri Oct 11 19:27:22 2013 Akinori MUSHA <knu@iDaemons.org>
+ * lib/prettyprint.rb: removed PrettyPrint#first?
+ because it is obsoleted method since Ruby 1.8.2
- * misc/ruby-electric.el: Import ruby-electric.el 2.0.1 which fixes
- a bug and a flaw with auto-end introduced in the revamp.
+Thu Aug 21 17:10:31 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ruby-forward-sexp is inappropriate here because it moves the
- cursor past the keyword.
+ * win32/win32.c (constat_attr): manage reverse video internally
+ since Windows console window does not manage it. based on the
+ patch by white leaf in [ruby-dev:48483]. [Bug #10158]
- * Fix a reversed looking-back check in
- ruby-electric--block-beg-keyword-at-point-p.
+Thu Aug 21 14:45:41 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * Do not add end again if space or return is hit repeatedly
- after a block beginning keyword.
+ * lib/e2mmap.rb: removed commented-out code.
-Fri Oct 11 18:12:47 2013 Koichi Sasada <ko1@atdot.net>
+Thu Aug 21 13:23:34 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ext/objspace/gc_hook.c: prohibit reentrant.
+ * lib/rinda/ring.rb: split executable code into sample directory.
+ * sample/rinda-ring.rb: ditto.
-Fri Oct 11 18:11:34 2013 Koichi Sasada <ko1@atdot.net>
+Thu Aug 21 13:21:45 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * vm_trace.c (rb_postponed_job_flush): fix bit operation.
+ * lib/drb/acl.rb: split executable code into sample directory.
+ * sample/drb/acl.rb: ditto.
-Fri Oct 11 17:33:24 2013 Akinori MUSHA <knu@iDaemons.org>
+Thu Aug 21 12:55:35 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * misc/ruby-electric.el: Import ruby-electric.el 2.0 from
- https://github.com/knu/ruby-electric.el which integrates changes
- from another fork by @qoobaa.
+ * .gitignore: ignored temporary file for Changelog.
+ http://mkosaki.blog46.fc2.com/blog-entry-1284.html
- * Allow ruby-electric-mode to be disabled by introducing a
- dedicated key map. Electric key bindings are now defined in
- ruby-electric-mode-map instead of overwriting ruby-mode-map.
+Thu Aug 21 12:40:22 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * Add ruby-electric-mode-hook.
+ * lib/net/imap.rb: split executable code into sample directory.
+ * sample/net-imap.rb: ditto.
- * Use a remap in binding ruby-electric-delete-backward-char.
+Thu Aug 21 12:23:56 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * Totally revamp electric keywords and then introduce electric
- return. Modifier keywords are now properly detected making
- use of ruby-mode's indentation level calculator, and
+ * lib/net/imap.rb: removed commented-out code.
- * block-mid keywords (then, else, elsif, when, rescue and
- ensure) also become electric with automatic reindentation.
+Wed Aug 20 17:27:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * Add standardized comments for ELPA integration.
+ * configure.in (RUBY_TRY_CFLAGS, RUBY_TRY_LDFLAGS),
+ (RUBY_CHECK_BUILTIN_SETJMP, RUBY_SETJMP_TYPE),
+ (RUBY_STACK_GROW_DIRECTION): quote defun names, for some
+ versions of autoconf possibly. [ruby-core:64473] [Bug #10156]
- * Fix interaction with smartparens-mode by disabling its end
- keyword completion, since ruby-electric has become more clever
- at it.
+Tue Aug 19 22:28:32 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * The custom variable `ruby-electric-keywords` is changed to
- `ruby-electric-keywords-alist`, allowing user to fine-grained
- configuration.
+ * sprintf.c (rb_str_format): fix condition to round.
+ [ruby-core:64454] [Bug #10151]
-Fri Oct 11 16:53:28 2013 Koichi Sasada <ko1@atdot.net>
+Tue Aug 19 22:22:45 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * vm_trace.c (rb_postponed_job_flush): simplify.
+ * enc/trans/euckr-tbl.rb (EUCKR_TO_UCS_TBL): add missing euro and
+ registered signs. [ruby-core:64452] [Bug #10149]
-Fri Oct 11 03:36:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Aug 19 13:59:43 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * thread.c (rb_threadptr_execute_interrupts): flush postponed job only
- once at last.
+ * compar.c (rb_cmperr): preserve encodings of arguments in the
+ message.
- * vm_trace.c (rb_postponed_job_flush): defer calling postponed jobs
- registered while flushing to get rid of infinite reentrance of
- ObjectSpace.after_gc_start_hook. [ruby-dev:47400] [Bug #8492]
+Tue Aug 19 10:13:23 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Oct 10 23:04:00 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * ext/thread/thread.c (get_array): check instance variables are
+ initialized properly. [ruby-core:63826][Bug #10062]
- * array.c (rb_ary_or): remove unused variables.
+Mon Aug 18 17:06:27 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Oct 10 23:01:16 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * sprintf.c (rb_str_format): support rational 'f' format.
+ [ruby-core:64382] [Bug #10136]
- * array.c (rb_ary_or): use rb_hash_keys().
+Mon Aug 18 08:03:46 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Thu Oct 10 21:36:16 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * spec/default.mspec: use 2.2 definition.
- * array.c (rb_ary_compact_bang): use ary_resize_smaller().
+Sun Aug 17 19:41:40 2014 Kazuki Tsujimoto <kazuki@callcc.net>
-Thu Oct 10 17:25:28 2013 Koichi Sasada <ko1@atdot.net>
+ * gc.c (obj_memsize_of): don't calculate memsize of T_NODE
+ when called from check_gen_consistency. It fixes segmentation
+ fault on RGENGC_CHECK_MODE >= 1 introduced by r47188.
- * vm.c (vm_exec): support :b_return event for "lambda{return}.call".
- [Bug #8622]
+Sun Aug 17 17:08:12 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * test/ruby/test_settracefunc.rb: add a test.
+ * ext/win32ole/win32ole.c (ole_invoke): use RHASH_SIZE instead of
+ calling Hash#length method.
-Thu Oct 10 13:52:37 2013 Koichi Sasada <ko1@atdot.net>
+Sat Aug 16 19:32:06 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * vm_trace.c (postponed_job): use preallocated buffer.
- Pre-allocate MAX_POSTPONED_JOB (1024) sized buffer
- and use it.
- If rb_postponed_job_register() cause overflow, simply it
- fails and returns 0.
- And maybe rb_postponed_job_register() is signal safe.
+ * ext/win32ole/win32ole_event.c (evs_length): use RARRAY_LEN instead
+ of calling Array#length method.
- * vm_core.h: change data structure.
+Sat Aug 16 10:20:17 2014 Eric Wong <e@80x24.org>
-Thu Oct 10 11:11:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * time.c (time_timespec): fix tv_nsec overflow
+ [Bug #10144]
- * vm.c (Init_VM): hide also the singleton class of frozen-core, not
- only frozen-core itself.
+Fri Aug 15 20:34:17 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Thu Oct 10 06:02:08 2013 Koichi Sasada <ko1@atdot.net>
+ * ext/win32ole/win32ole.c: separate WIN32OLE_EVENT src from
+ win32ole.c.
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_event.c: ditto.
+ * ext/win32ole/win32ole_event.h: ditto.
+ * ext/win32ole/depend: ditto.
- * test/ruby/test_rand.rb: fix r43224. local variable `e' is
- no longer available.
+Fri Aug 15 19:38:00 2014 Koichi Sasada <ko1@atdot.net>
-Thu Oct 10 00:02:35 2013 Yusuke Endoh <mame@tsg.ne.jp>
+ * iseq.c (rb_iseq_clone): Should not insert write barrier from
+ non-RVALUE data (to non-RVALUE data, of course).
- * numeric.c (fix_aref): avoid a possible undefined behavior.
- 1L << 63 on 64-bit platform is undefined, at least, according to
- ISO/IEC 9899 (C99) 6.5.7.
+ Ruby 2.1 also has a same problem.
-Wed Oct 9 23:57:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Aug 15 19:34:33 2014 Koichi Sasada <ko1@atdot.net>
- * object.c (id_for_attr): avoid inadvertent symbol creation.
+ * string.c (setup_fake_str): fake strings should not set class by
+ RBASIC_SET_CLASS() because it insert write barriers to fake
+ (non-RVALUE) structure.
-Wed Oct 9 18:03:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ It can cause unexpected behaviour.
- * vm_method.c (rb_attr): preserve encoding of the attribute ID in
- error message.
+ Ruby 2.1 also have a same problem (setup_fake_str() in parse.y).
-Wed Oct 9 17:40:16 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * symbol.c (setup_fake_str): ditto.
- * string.c (rb_fstring): because of lazy sweep, str may be unmarked
- already and swept at next time, so mark it for the time being.
- [ruby-core:57756]
+Fri Aug 15 19:27:25 2014 Koichi Sasada <ko1@atdot.net>
-Wed Oct 9 13:53:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * array.c (rb_ary_tmp_new_fill): added.
+ This function creates internal use only array (which is completely
+ hided by ObjectSpace.each_object) with filling nil.
- * compar.c (cmp_eq): fail if recursion. [ruby-core:57736] [Bug #9003]
+ Otherwise, it can be includes strange VALUEs.
- * thread.c (rb_exec_recursive_paired_outer): new function which is
- combination of paired and outer variants.
+ * internal.h: added.
-Wed Oct 9 09:18:14 2013 Koichi Sasada <ko1@atdot.net>
+ * node.h: use rb_ary_tmp_new_fill() for MEMO.
- * include/ruby/debug.h,
- vm_backtrace.c (rb_profile_frame_full_label): add new C API
- rb_profile_frame_full_label() which returns label with
- qualified method name.
- Note that in future version of Ruby label() may return
- same return value of full_label().
+Fri Aug 15 10:13:37 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ext/-test-/debug/profile_frames.c,
- test/-ext-/debug/test_profile_frames.rb: fix a test for this change.
+ * lib/gserver.rb: removed unmaintained code.
+ [ruby-core:40313][Feature #5480]
+ * lib/xmlrpc/httpserver.rb: ditto.
+Fri Aug 15 09:22:12 2014 Eric Wong <e@80x24.org>
-Wed Oct 9 00:55:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * vm_core.h (rb_thread_struct): reorder to pack
+ * cont.c (rb_context_struct, rb_fiber_struct): ditto
+ On x86-64, these changes reduces:
+ rb_thread_struct to 1000 bytes (from 1016)
+ rb_context_struct to 1288 bytes (from 1312)
+ rb_fiber_struct to 2272 bytes (from 2304)
- * load.c (load_lock): display backtrace to $stderr at circular
- require.
+Fri Aug 15 09:06:31 2014 Eric Wong <e@80x24.org>
- * vm_backtrace.c (rb_backtrace_print_to): new function to print
- backtrace to the given output.
+ * thread_pthread.h: define RB_NATIVETHREAD_LOCK_INIT and
+ RB_NATIVETHREAD_COND_INIT macros
-Tue Oct 8 21:03:35 2013 Koichi Sasada <ko1@atdot.net>
+ * thread_pthread.c (native_mutex_lock, native_mutex_unlock,
+ native_mutex_trylock, native_mutex_initialize,
+ native_mutex_destroy, native_cond_wait):
+ use rb_nativethread_lock_t instead of pthread_mutex_t
+ [Feature #10134]
- * vm_backtrace.c, include/ruby/debug.h: add new APIs
- * VALUE rb_profile_frame_method_name(VALUE frame)
- * VALUE rb_profile_frame_qualified_method_name(VALUE frame)
+ * thread_pthread.c (native_mutex_debug): make argument type-agnostic
+ to avoid later cast.
- * iseq.c (rb_iseq_klass), internal.h: add new internal function
- rb_iseq_method_name().
+ * thread_pthread.c (register_cached_thread_and_wait):
+ replace PTHREAD_COND_INITIALIZER with RB_NATIVETHREAD_COND_INIT,
+ use native_mutex_{lock,unlock}
- * ext/-test-/debug/profile_frames.c (profile_frames),
- test/-ext-/debug/test_profile_frames.rb: add a test.
+ * thread_pthread.c (use_cached_thread):
+ use native_mutex_{lock,unlock}
-Tue Oct 8 16:11:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * thread_pthread.c (native_sleep):
+ use rb_nativethread_lock_t to match th->interrupt_lock,
+ use native_mutex_{lock,unlock}
- * array.c (rb_ary_uniq): use rb_hash_values(), as well as the case no
- block is given.
+ * thread_pthread.c (timer_thread_lock): use rb_nativethread_lock_t type
- * internal.h: define rb_hash_values() as internal API.
+Fri Aug 15 08:10:29 2014 Eric Wong <e@80x24.org>
-Tue Oct 8 13:53:21 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * cont.c (cont_mark): fix typo in unused path [ci skip]
- * array.c (rb_ary_uniq): use rb_hash_keys().
+Fri Aug 15 06:00:56 2014 Eric Wong <e@80x24.org>
- * internal.h: define rb_hash_keys() as internal API.
+ * vm.c (rb_thread_mark): update comment about marking `me'
+ [ruby-core:64340] [ruby-core:64341]
- * hash.c (rb_hash_keys): ditto.
+Fri Aug 15 05:53:59 2014 Eric Wong <e@80x24.org>
-Tue Oct 8 10:56:39 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * README.EXT: preliminary documentation for RB_GC_GUARD
+ [Bug #10100] [ruby-core:60741]
- * cont.c: disable FIBER_USE_NATIVE on GNU/Hurd because it doesn't
- support a combination getcontext() and threads. Patch by
- Gabriele Giacone (1o5g4r8o@gmail.com). [Bug #8990][ruby-core:57685]
+Thu Aug 14 00:26:19 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Tue Oct 8 05:58:12 2013 Tanaka Akira <akr@fsij.org>
+ * ext/win32ole/win32ole.c: separate WIN32OLE_RECORD src from
+ win32ole.c
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_record.c: ditto.
+ * ext/win32ole/win32ole_record.h: ditto.
+ * ext/win32ole/depend: ditto.
- * lib/time.rb (Time.strptime): Time.strptime('0', '%s') returns local
- time Time object as Ruby 2.0 and before.
+Wed Aug 13 21:41:04 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Tue Oct 8 05:40:37 2013 Eric Hodel <drbrain@segment7.net>
+ * ext/win32ole/win32ole.c: separate WIN32OLE_VARIANT src from
+ win32ole.c.
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_variant.c: ditto.
+ * ext/win32ole/win32ole_variant.c: ditto.
+ * ext/win32ole/depend: ditto.
- * .travis.yml: Rebuild Travis CI's "ruby-head" version on successful
- build. Patch by Konstantin Haase. [Fixes GH-417]
- https://github.com/ruby/ruby/pull/417
+Wed Aug 13 20:09:37 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Tue Oct 8 04:28:25 2013 Akinori MUSHA <knu@iDaemons.org>
+ * ext/win32ole/win32ole.c: remove unused variable.
- * misc/ruby-mode.el: Use preceding-char/following-char
- (returning 0 at BOF/EOF) instead of char-before/char-after
- (returning nil at BOF/EOF) to avoid error from char-syntax when
- at BOF/EOF.
+Wed Aug 13 19:31:27 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Tue Oct 8 04:12:45 2013 Akinori MUSHA <knu@iDaemons.org>
+ * ext/win32ole/win32ole.c (ole_search_handler_method, rescue_callback,
+ folerecord_inspect): use PRIsVALUE in rb_sprintf.
- * misc/ruby-additional.el (ruby-mode-set-encoding): Add a missing
- else clause to unbreak with `cp932`, etc.
+ * ext/win32ole/win32ole_param.c (foleparam_inspect): ditto.
- * misc/ruby-mode.el (ruby-mode-set-encoding): Ditto.
+ * ext/win32ole/win32ole_variable.c (folevariable_inspect): use
+ PRIsVALUE in rb_sprintf, use rb_inspect.
-Tue Oct 8 03:57:34 2013 Akinori MUSHA <knu@iDaemons.org>
+Wed Aug 13 11:54:41 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * misc/ruby-additional.el (ruby-mode-set-encoding): Use
- `default-buffer-file-coding-system` if the :prefer-utf-8
- property is not available.
+ * lib/irb/completion.rb: reverted r47163.
+ because another case can't be show completion target.
- * misc/ruby-mode.el (ruby-mode-set-encoding): Ditto.
+Wed Aug 13 11:17:00 2014 Shimpei Makimoto <github@makimoto.org>
- * misc/ruby-additional.el (ruby-encoding-map): Override the
- default value.
+ * lib/irb.rb: Prevent irb from crashing when exception with
+ nil backtrace is raised.
+ [fix GH-434][ruby-core:58078][Bug #9063]
+ * test/irb/test_raise_no_backtrace_exception.rb: ditto.
-Tue Oct 8 03:19:19 2013 Akinori MUSHA <knu@iDaemons.org>
+Wed Aug 13 11:08:55 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * misc/ruby-additional.el (ruby-mode-set-encoding): Add support
- for `prefer-utf-8` which was introduced in Emacs trunk.
+ * lib/irb/completion.rb: fixed broken completion list with
+ String including spaces. Contributed from @dunric. [fix GH-465]
- * misc/ruby-additional.el (ruby-encoding-map): Add a mapping from
- `japanese-cp932` to `cp932` to fix the problem where saving a
- source file written in Shift_JIS twice would end up having
- `coding: japanese-cp932` which Ruby could not recognize.
+Wed Aug 13 00:07:01 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * misc/ruby-additional.el (ruby-mode-set-encoding): Add support
- for encodings mapped to nil in `ruby-encoding-map`.
+ * ext/win32ole/win32ole.c: separate WIN32OLE_PARAM src from win32ole.c
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_param.c: ditto.
+ * ext/win32ole/win32ole_param.h: ditto.
+ * ext/win32ole/depend: ditto.
- * misc/ruby-additional.el (ruby-encoding-map): Map `us-ascii` and
- `utf-8` to nil by default, meaning they need not be explicitly
- declared in magic comment.
+Tue Aug 12 23:17:47 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * misc/ruby-additional.el (ruby-encoding-map): Add type
- declaration for better customize UI.
+ * ext/win32ole/win32ole.c: refactoring. move some methods
+ into win32ole_type.c / win32ole_method.c
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_method.c: ditto.
+ * ext/win32ole/win32ole_method.h: ditto.
+ * ext/win32ole/win32ole_type.h: ditto.
+ * ext/win32ole/win32ole_type.h: ditto.
- * misc/ruby-mode.el: Ditto for the above.
+Tue Aug 12 22:59:48 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Tue Oct 8 00:14:53 2013 Akinori MUSHA <knu@iDaemons.org>
+ * ext/win32ole/win32ole.c: refactoring. move
+ ole_typelib_from_itypeinfo into win32ole_typelib.c.
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_typelib.h: ditto.
+ * ext/win32ole/win32ole_typelib.h: ditto.
- * misc/ruby-additional.el: Add a standard header and footer,
- including (provide 'ruby-additional).
+Tue Aug 12 21:49:40 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Mon Oct 7 22:52:45 2013 Akinori MUSHA <knu@iDaemons.org>
+ * ext/win32ole/win32ole.c (ole_create_dcom): use the converted
+ result if the argument can be converted to a string, to get rid
+ of invalid access. Thanks to nobu. [ruby-dev:48467] [Bug #10127]
- * misc/ruby-electric.el (ruby-electric-space-can-be-expanded-p):
- Return nil to avoid "end" insertion when in smartparens-mode
- that is configured to insert "end" for the same keyword.
+Tue Aug 12 14:22:58 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * misc/ruby-electric.el (ruby-electric-keywords): New custom
- variable to replace `ruby-electric-simple-keywords-re` with.
+ * configure.in: ignored working directory same as prefix value.
+ [ruby-core:54999] [Bug #8409]
-Mon Oct 7 22:52:16 2013 Akinori MUSHA <knu@iDaemons.org>
+Tue Aug 12 13:34:25 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * misc/ruby-additional.el: Use preceding-char/following-char
- (returning 0 at BOF/EOF) instead of char-before/char-after
- (returning nil at BOF/EOF) to avoid error from char-syntax when
- at BOF/EOF.
+ * lib/fileutils.rb: enable to remove with non-owner directory.
+ [ruby-dev:45976] [Bug #6756]
+ * test/fileutils/test_fileutils.rb: add testcase for #6756.
-Mon Oct 7 22:45:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Aug 12 12:57:28 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * cont.c (FIBER_USE_NATIVE): split long conditions.
+ * vm_exec.c: improve performance in ppc64 arch.
+ [ruby-core:63437] [Feature #9997]
-Mon Oct 7 20:29:31 2013 Zachary Scott <e@zzak.io>
+Tue Aug 12 12:14:52 2014 Akira Matsuda <ronnie@dio.jp>
- * lib/time.rb: [DOC] typo in Time.rb overview by @srt32 [Fixes GH-416]
- https://github.com/ruby/ruby/pull/416
+ * lib/fileutils.rb: fix typo.
+ [ruby-dev:47831] [Bug #9180]
-Mon Oct 7 20:07:20 2013 Tanaka Akira <akr@fsij.org>
+Tue Aug 12 10:10:42 2014 Eric Wong <e@80x24.org>
- * lib/time.rb (Time.strptime): Use :offset.
- Patch by Felipe Contreras. [ruby-core:57694]
+ * vm_method.c (release_method_definition): use rb_free_method_entry
-Mon Oct 7 16:47:27 2013 Koichi Sasada <ko1@atdot.net>
+Tue Aug 12 06:16:09 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * test/-ext-/debug/test_profile_frames.rb: rename class C to
- something long name because one test depends on absence of
- class ::C.
+ * ext/win32ole/win32ole.c: separate WIN32OLE_METHOD src from
+ win32ole.c.
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_method.c: ditto.
+ * ext/win32ole/win32ole_method.h: ditto.
+ * ext/win32ole/depend: ditto.
-Mon Oct 7 16:33:10 2013 Koichi Sasada <ko1@atdot.net>
+Mon Aug 11 22:19:15 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * ext/-test-/debug/profile_frames.c:
- test/-ext-/debug/test_profile_frames.rb: add a test for new C-APIs.
+ * ext/win32ole/win32ole_variable.c (folevariable_inspect): refactoring.
-Mon Oct 7 16:12:36 2013 Koichi Sasada <ko1@atdot.net>
+Mon Aug 11 20:47:27 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * include/ruby/debug.h: add backtrace collecting APIs for profiler.
- * int rb_profile_frames(int start, int limit, VALUE *buff, int *lines);
- Collect information of frame information.
+ * ext/win32ole/win32ole.c: separate WIN32OLE_VARIABLE src from
+ win32ole.c
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_variable.c: ditto.
+ * ext/win32ole/win32ole_variable.h: ditto.
+ * ext/win32ole/depend: ditto.
- * VALUE rb_profile_frame_path(VALUE frame);
- * VALUE rb_profile_frame_absolute_path(VALUE frame);
- * VALUE rb_profile_frame_label(VALUE frame);
- * VALUE rb_profile_frame_base_label(VALUE frame);
- * VALUE rb_profile_frame_first_lineno(VALUE frame);
- * VALUE rb_profile_frame_classpath(VALUE frame);
- * VALUE rb_profile_frame_singleton_method_p(VALUE frame);
- Get information about each frame.
+Mon Aug 11 16:17:21 2014 Tony Miller <mcfiredrill@gmail.com>
- These APIs are designed for profilers, for example, no object allocation,
- and enough information for profilers.
- In this version, this API collects only Ruby level frames.
- This issue will be fixed after Ruby 2.1.
+ * dir.c (rb_dir_exists_p): [DOC] Document that Dir.exists? is
+ deprecated. [ruby-core:64135] [Bug #10102]
- * vm_backtrace.c: implement above APIs.
+Mon Aug 11 11:26:33 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * iseq.c (rb_iseq_klass): return local_iseq's class.
+ * lib/tempfile.rb: start rdoc parsing inside singleton class
+ definition to include the document there.
+ [ruby-core:64157] [Bug #10105]
-Mon Oct 7 14:26:01 2013 Koichi Sasada <ko1@atdot.net>
+Sun Aug 10 12:22:43 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * proc.c: catch up last commit.
- Type of return value of rb_iseq_first_lineno() is now VALUE.
+ * ext/win32ole/win32ole_type.c: refactoring.
- * vm_insnhelper.c (argument_error): ditto.
+Sun Aug 10 10:34:00 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * vm_method.c (rb_method_entry_make): ditto.
+ * lib/cgi/session/pstore.rb: separated sample code.
+ * lib/open3.rb: ditto.
-Mon Oct 7 14:07:45 2013 Koichi Sasada <ko1@atdot.net>
+Sun Aug 10 10:03:24 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * iseq.c, internal.h: change to public (but internal) functions
- * VALUE rb_iseq_path(VALUE iseqval);
- * VALUE rb_iseq_absolute_path(VALUE iseqval);
- * VALUE rb_iseq_label(VALUE iseqval);
- * VALUE rb_iseq_base_label(VALUE iseqval);
- * VALUE rb_iseq_first_lineno(VALUE iseqval);
- And new (temporary) function:
- * VALUE rb_iseq_klass(VALUE iseqval);
+ * lib/irb/ext/multi-irb.rb: removed commented-out code.
- * iseq.c. vm_core.h (int rb_iseq_first_lineno): remove
- function `int rb_iseq_first_lineno(const rb_iseq_t *iseq)'.
- Use `VALUE rb_iseq_first_lineno(VALUE iseqval)' instead.
+Sat Aug 9 11:02:07 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * proc.c. vm_insnhelper.c, vm_method.c: catch up this change.
+ * lib/irb.rb: removed commented-out code.
+ * lib/irb/**/*.rb: ditto.
-Sun Oct 6 08:37:39 2013 Zachary Scott <e@zzak.io>
+Sat Aug 9 10:35:30 2014 Laurent Arnoud <laurent@spkdev.net>
- * lib/webrick.rb: [DOC] fix grammar in WEBrick overview [Fixes GH-413]
- Based on patch by @chastell https://github.com/ruby/ruby/pull/413
+ * lib/cmath.rb: fixed indent. [fix GH-696]
+ * lib/drb/ssl.rb: ditto.
+ * lib/irb/**/*.rb: ditto.
-Sat Oct 5 11:21:01 2013 Aaron Pfeifer <aaron.pfeifer@gmail.com>
+Sat Aug 9 10:28:03 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * thread.c (terminate_atfork_i): fix locking mutexes not unlocked in
- forks when not tracked in thread. [ruby-core:55102] [Bug #8433]
+ * test/minitest/test_minitest_unit.rb: removed obsoleted condition
+ for Ruby 1.8.
+ * test/ruby/test_time_tz.rb: ditto.
-Fri Oct 4 19:54:09 2013 Zachary Scott <e@zzak.io>
+Sat Aug 9 10:18:00 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ext/dbm/dbm.c: [DOC] Fix wrong constant name in DBM by @edward
- [Fixes GH-409] https://github.com/ruby/ruby/pull/409
+ * test/cgi/test_cgi_core.rb: removed obsoleted condition for Ruby 1.8.
+ * test/cgi/test_cgi_header.rb: ditto.
+ * test/cgi/test_cgi_multipart.rb: ditto.
+ * test/cgi/test_cgi_tag_helper.rb: ditto.
-Fri Oct 4 19:49:42 2013 Aman Gupta <ruby@tmm1.net>
+Sat Aug 9 00:34:37 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * gc.c: rename heap.free_num as heap.swept_num to clarify meaning and
- avoid confusion with objspace_free_num().
+ * ext/win32ole/win32ole.c: separate WIN32OLE_TYPE src from win32ole.c.
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_type.c: ditto.
+ * ext/win32ole/win32ole_type.h: ditto.
+ * ext/win32ole/depend: ditto.
-Fri Oct 4 19:02:01 2013 Aman Gupta <ruby@tmm1.net>
+Fri Aug 8 01:53:37 2014 Masaki Matsushita <glass.saga@gmail.com>
- * gc.c (objspace_free_num): new method for available/free slots on
- heap. [ruby-core:57633] [Bug #8983]
- * gc.c (gc_stat): change heap_free_num definition to use new method.
- * test/ruby/test_gc.rb: test for above.
+ * lib/securerandom.rb: use OpenSSL::BN for performance improvement.
-Fri Oct 4 18:53:42 2013 Aman Gupta <ruby@tmm1.net>
+ * benchmark/bm_securerandom.rb: benchmark script.
- * gc.c: add rb_objspace.limit to keep accurate count of total heap
- slots [ruby-core:57633] [Bug #8983]
+Fri Aug 8 17:19:57 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Fri Oct 4 09:32:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/open-uri.rb: remove needless condition for old ruby version.
+ * test/open-uri/test_open-uri.rb: ditto.
- * lib/csv.rb (CSV.foreach): support enumerator. based on a patch by
- Hanmac (Hans Mackowiak) at [ruby-core:57643]. [ruby-core:57283]
- [Feature #8929]
+Fri Aug 8 16:40:59 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Thu Oct 3 18:20:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/irb/init.rb: removed unreachable code.
- * win32/win32.c (console_emulator_p, constat_handle): disable built-in
- console colorizing when console-emulator-like DLL is injected.
- [Feature #8201]
+Fri Aug 8 16:34:22 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Thu Oct 3 18:01:44 2013 Koichi Sasada <ko1@atdot.net>
+ * lib/drb/drb.rb: removed unreachable code.
- * gc.c: define gc_profile_record::allocated_size if
- CALC_EXACT_MALLOC_SIZE is true.
+Fri Aug 8 14:33:49 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Thu Oct 3 13:42:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/webrick/httpproxy.rb: remove needless condition
+ for old ruby version.
- * common.mk (yes-test-sample): use RUNRUBY instead of MINIRUBY to set
- runtime library path and run the built ruby. [Bug #8971]
+Fri Aug 8 01:07:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Oct 3 00:17:15 2013 Akinori MUSHA <knu@iDaemons.org>
+ * parse.y (parser_yylex): fix invalid char in eval, should raise
+ an syntax error too, as well as directly coded.
+ [ruby-core:64243] [Bug #10117]
- * misc/ruby-additional.el: Properly quote the body. An unquoted
- body given to eval-after-load is evaluated immediately!
+Thu Aug 7 23:25:29 2014 Masaki Matsushita <glass.saga@gmail.com>
-Wed Oct 2 21:38:30 2013 Yusuke Endoh <mame@tsg.ne.jp>
+ * lib/open3.rb: avoid unnecessary write if stdin_data is empty.
- * ext/socket/ifaddr.c (rsock_getifaddrs): fix possible memory leak.
- When a system had no interface, this function used xmalloc for root
- but did not return any reference to it. This patch fixes it by
- immediately returning an empty array if no interface is found.
- Coverity Scan found this bug.
+Thu Aug 7 21:42:49 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Wed Oct 2 21:37:04 2013 Yusuke Endoh <mame@tsg.ne.jp>
+ * ext/win32ole/win32ole_typelib.c (foletypelib_version): return
+ version string.
- * random.c (make_seed_value): a local array declaration was accessed
- out of scope. Coverity Scan found this bug.
+ * test/win32ole/test_win32ole_typelib.rb (test_version): ditto.
-Wed Oct 2 18:52:40 2013 Koichi Sasada <ko1@atdot.net>
+Thu Aug 7 15:13:13 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * gc.c: relax GC condition due to malloc_limit.
+ * lib/cgi.rb: remove needless condition for old ruby version.
- * gc.c (GC_MALLOC_LIMIT_MAX): change default value
- (256MB -> 512MB) and permit zero to ignore max value.
+Thu Aug 7 06:04:49 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * gc.c (vm_malloc_increase, vm_xrealloc): do not cause GC on realloc.
+ * parse.y (parser_yyerror): preserve source code encoding in
+ syntax error messages. [ruby-core:64228] [Bug #10114]
- * gc.c (gc_before_sweep): change debug messages.
+Wed Aug 6 20:56:02 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Wed Oct 2 16:26:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/win32ole/win32ole.c: separate src of WIN32OLE_TYPELIB from
+ win32ole.c
- * io.c (rb_io_close_read): duplex IO should wait its child process
- even after close_read.
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_typelib.c: ditto.
+ * ext/win32ole/win32ole_typelib.h: ditto.
+ * ext/win32ole/depend: ditto.
-Wed Oct 2 15:39:13 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Wed Aug 6 20:44:07 2014 Akinori MUSHA <knu@iDaemons.org>
- * vm_core.h: use __has_attribute() instead of __clang__major__ because
- clang says "Note that marketing version numbers should not be used
- to check for language features, as different vendors use different
- numbering schemes. Instead, use the Feature Checking Macros."
- http://clang.llvm.org/docs/LanguageExtensions.html
+ * enum.c (enum_one): [DOC] Move enum.one? documentation before the
+ relevant method. Submitted by @vipulnsward. [Fixes GH-687]
+ https://github.com/ruby/ruby/pull/687
-Wed Oct 2 14:19:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Aug 6 20:25:47 2014 Akinori MUSHA <knu@iDaemons.org>
- * io.c (rb_io_close_write): detach tied IO for writing before closing
- to get rid of race condition. [ruby-list:49598]
+ * lib/set.rb (Set#replace): Check if an object given is enumerable
+ before clearing self. Reported by yui-knk. [GH-675]
+ https://github.com/ruby/ruby/pull/675
- * io.c (rb_io_close_read): keep fptr in write_io to be discarded, to
- fix freed pointer access when it is in use by other threads, and get
- rid of potential memory/fd leak.
+Wed Aug 6 20:07:26 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Tue Oct 1 23:44:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+ * ext/win32ole/win32ole.c (olerecord_ivar_set): remove rb_str_subseq.
- * vm_core.h: use __attribute__((unused)) in UNINITIALIZED_VAR on clang
- 4.0+ instead of just on 4.2. Clang has supported the unused attribute
- since before version 4, so this should be safe.
+Wed Aug 6 19:09:27 2014 Akinori MUSHA <knu@iDaemons.org>
-Tue Oct 1 22:03:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/set.rb (Set): Implement Set#clone by splitting
+ initialize_copy into initialize_dup and initialize_clone.
+ Submitted by yui-knk. [Fixes GH-661]
+ https://github.com/ruby/ruby/pull/661
- * lib/tempfile.rb (Tempfile#unlink): finalizer is no longer needed
- after unlinking. patched by by normalperson (Eric Wong) at
- [ruby-core:56521] [Bug #8768]
+Wed Aug 6 18:42:58 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Tue Oct 1 20:54:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/win32ole/win32ole.c: separate src of WIN32OLERuntimeError
+ from win32ole.c.
- * file.c (stat_new_0): constify.
+ * ext/win32ole/win32ole.h: ditto
+ * ext/win32ole/depend: ditto.
+ * ext/win32ole/win32ole_error.c: ditto.
+ * ext/win32ole/win32ole_error.h: ditto.
- * file.c (rb_stat_new): constify and export. based on a patch by
- Hanmac (Hans Mackowiak) at [ruby-core:53225]. [Feature #8050]
+Wed Aug 6 04:33:58 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Tue Oct 1 16:03:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/net/http.rb (Net::HTTP.proxy_uri): use initializer instead
+ of parser to handle IPv6 address. [Bug #9129]
- * include/ruby/ruby.h (ruby_safe_level_4_warning): needed by extension
- libraries which check safe level 4. [ruby-dev:47517] [Bug #8652]
+Wed Aug 6 04:16:05 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Mon Sep 30 23:14:36 2013 Zachary Scott <e@zzak.io>
+ * lib/net/http/requests.rb (Net::HTTP::Options::RESPONSE_HAS_BODY):
+ OPTIONS requests may have response bodies. [Feature #8429]
+ http://tools.ietf.org/html/rfc7231#section-4.3.7
- * ext/objspace/objspace.c: [DOC] Cleaned up many rdoc formatting
- issues and several duplicate grammar bugs.
+Wed Aug 6 03:18:04 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Mon Sep 30 23:01:01 2013 Zachary Scott <e@zzak.io>
+ * lib/net/http/generic_request.rb (Net::HTTP::GenericRequest#exec):
+ handle req['host'] in update_uri.
- * ext/objspace/object_tracing.c: [DOC] Adjust rdoc formatting and fix
- small grammar typo
+ * lib/net/http/generic_request.rb
+ (Net::HTTP::GenericRequest#update_uri):
+ use req['host'] if it is explicitly set. Even if URI is given,
+ it is already used for the initial value of req['host'].
+ Therefore overwritten value should be respected. [Bug #10054]
-Mon Sep 30 17:28:39 2013 Koichi Sasada <ko1@atdot.net>
+Wed Aug 6 03:17:34 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * ext/objspace/object_tracing.c: [DOC] add some notes for
- ObjectSpace::trace_object_allocations.
+ * lib/net/http/generic_request.rb
+ (Net::HTTP::GenericRequest#update_uri):
+ handle scheme, host, and port to reflect connection to @uri.
-Mon Sep 30 16:46:58 2013 Koichi Sasada <ko1@atdot.net>
+ * lib/net/http.rb (Net::HTTP#begin_transport): move trivial handling
+ to Net::HTTP::GenericRequest#update_uri.
- * ext/objspace/object_tracing.c: add new 3 methods to control tracing.
- * ObjectSpace::trace_object_allocations_start
- * ObjectSpace::trace_object_allocations_stop
- * ObjectSpace::trace_object_allocations_clear
- And some refactoring.
- * test/objspace/test_objspace.rb: add a test for new methods.
+Wed Aug 6 02:16:43 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * NEWS: add a description for new methods.
+ * lib/net/http/generic_request.rb
+ (Net::HTTP::GenericRequest#initialize):
+ optimize object allocation.
-Mon Sep 30 11:18:04 2013 Koichi Sasada <ko1@atdot.net>
+Wed Aug 6 01:16:47 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * gc.c (rb_gc_disable): do rest_sweep() before disable GC.
- This fix may solve a failure of
- TestTracepointObj#test_tracks_objspace_events
- [test/-ext-/tracepoint/test_tracepoint.rb:43].
+ * lib/uri/generic.rb (URI::Generic#path_query): remove a private method.
-Mon Sep 30 10:40:20 2013 Shugo Maeda <shugo@ruby-lang.org>
+Wed Aug 6 01:15:47 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * vm_method.c (rb_undef): raise a NameError if the original method
- of a refined method is not defined.
+ * lib/uri/generic.rb (URI::Generic#normalize!): use String#empty?
- * vm_insnhelper.c (rb_method_entry_eq): added NULL check to avoid SEGV.
+ * lib/uri/generic.rb (URI::Generic#path_query): optimized.
- * test/ruby/test_refinement.rb: related test.
+ * lib/uri/generic.rb (URI::Generic#to_s): optimized.
-Sun Sep 29 23:45:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Aug 6 00:15:10 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * parse.y (rb_id_attrset, intern_str): allow junk attrset ID for
- Struct.
+ * lib/uri/http.rb (URI::HTTP#request_uri): optimized.
+ decrease object allocation, and ensure always create at least one new
+ object for return value.
- * parse.y (rb_id_attrset): fix inconsistency with literals, allow
- ID_ATTRSET and return it itself, but ID_JUNK cannot make ID_ATTRSET.
- and raise a NameError instead of rb_bug() for invalid argument.
+Wed Aug 6 03:41:21 2014 Aaron Patterson <aaron@tenderlovemaking.com>
-Sun Sep 29 18:45:05 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+ * ext/psych/lib/psych/visitors/to_ruby.rb: backwards compatibility for
+ hashes emitted by Syck. Github #198
+ * test/psych/test_hash.rb: test for change.
- * vm_insnhelper.c (vm_callee_setup_arg_complex, vm_yield_setup_block_args):
- clear keyword arguments to prevent GC bug which occurs
- while marking VM stack.
- [ruby-dev:47729] [Bug #8964]
+Tue Aug 5 19:27:59 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * test/ruby/test_keyword.rb: tests for the above.
+ * ext/win32ole/win32ole.c (ole_invoke): skip VariantClear when
+ argument is VT_RECORD variant.
-Sat Sep 28 23:25:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Aug 5 15:52:51 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * math.c (math_log, math_log2, math_log10): fix for Bignum argument.
- numbits should be add only when right shifted.
+ * gems/bundled_gems: Upgrade to test-unit-3.0.0 and minitest-5.4.0.
-Sat Sep 28 14:30:29 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Mon Aug 4 21:50:09 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * test/dl/test_base.rb: {libc, libm} detection now handle GNU/Hurd
- correctly. Patch by Gabriele Giacone (1o5g4r8o@gmail.com).
- [Bug #8937][ruby-core:57311]
- * test/fiddle/helper.rb: ditto.
+ * test/win32ole/test_win32ole_record.rb: add for WIN32OLE_RECORD
+ test(need .NET Framework 3.5 to run test).
-Sat Sep 28 00:19:41 2013 Shugo Maeda <shugo@ruby-lang.org>
+Mon Aug 4 19:49:34 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * ext/curses/extconf.rb: check the size of chtype.
+ * ext/win32ole/win32ole.c (ole_invoke): call rb_hash_foreach instead
+ of rb_block_call.
- * ext/curses/curses.c (NUM2CH, CH2NUM): use proper macros for
- the size of chtype.
+ * ext/win32ole/win32ole.c: add comment for rdoc of WIN32OLE_VARIANT
+ class.
- [ruby-core:56090] [Bug #8659]
+Mon Aug 4 09:12:47 2014 Eric Wong <e@80x24.org>
-Fri Sep 27 18:33:23 2013 Koichi Sasada <ko1@atdot.net>
+ * variable.c: cleanup to use rb_const_lookup
+ [Feature #10107]
- * gc.c: add two GC tuning environment variables.
- RUBY_GC_MALLOC_LIMIT_MAX and RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR.
- See r43067 for details.
+ * vm_insnhelper.c: ditto
- * gc.c (rb_gc_set_params): refactoring. And change verbose notation.
- Mostly duplicated functions get_envparam_int/double is not cool.
- Please rewrite it.
+Sun Aug 3 10:55:07 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/ruby/test_gc.rb: fix a test for this change.
+ * include/ruby/encoding.h (rb_check_symbol_cstr): ditto.
-Fri Sep 27 17:44:41 2013 Koichi Sasada <ko1@atdot.net>
+Sun Aug 3 10:43:08 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * gc.c (GC_MALLOC_LIMIT): 8,000,000 -> 8 * 1,024 * 1,024.
+ * vm_insnhelper.c (vm_call_method): unusable super class should cause
+ method missing when BasicObject is refined but not been using.
+ [ruby-core:64166] [Bug #10106]
-Fri Sep 27 17:19:39 2013 Koichi Sasada <ko1@atdot.net>
+Sat Aug 2 23:47:45 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * gc.c (gc_before_sweep): cast to size_t to suppress warnings.
+ * ext/win32ole/win32ole.c: separate WIN32OLE::VARIANT src file
+ from win32ole.c
+ * ext/win32ole/win32ole.h: ditto.
+ * ext/win32ole/win32ole_variant_m.c: ditto.
+ * ext/win32ole/win32ole_variant_m.h: ditto.
+ * ext/win32ole/depend: ditto.
+ * ext/.document: ditto.
-Fri Sep 27 17:07:55 2013 Koichi Sasada <ko1@atdot.net>
+Sat Aug 2 14:34:58 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * gc.c: add some fine-grained profiling codes to tuning marking phase.
- If you enable RGENGC_PRINT_TICK to 1, then profiling results by RDTSC
- (on x86/amd64 environment) are printed at last.
- Thanks Yoshii-san.
+ * ext/win32ole/win32ole.c: add comments for rdoc.
-Fri Sep 27 16:32:27 2013 Koichi Sasada <ko1@atdot.net>
+Sat Aug 2 10:26:57 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * gc.c: simplify threshold of GC caused by malloc_increase.
- Now, malloc_limit is increased/decreased by mysterious logic.
- This fix simplify malloc_limit increase/decrease logic such as:
- if (malloc_increase > malloc_limit) /* so many malloc */
- malloc_limit += malloc_limit * (GC_MALLOC_LIMIT_FACTOR-1);
- else
- malloc_limit -= malloc_limit * (GC_MALLOC_LIMIT_FACTOR-1)/4;
- Default value of GC_MALLOC_LIMIT_FACTOR is 1.8.
- malloc_limit is bounded by GC_MALLOC_LIMIT_MAX (256MB by default).
- This logic runs at gc_before_sweep(). So there are no effect from
- caused by lazy sweep. And we can remove malloc_increase2.
+ * object.c (rb_obj_itself): new method Object#itself. based on the
+ patch by Rafael Franca in [ruby-core:64156].
+ [EXPERIMENTAL] this method may be renamed due to compatibilities.
+ [ruby-core:44704] [Feature #6373]
- * gc.c (HEAP_MIN_SLOTS, FREE_MIN, HEAP_GROWTH_FACTOR): rename to
- GC_HEAP_MIN_SLOTS, GC_FREE_MIN, GC_HEAP_GROWTH_FACTOR respectively.
- Check them by `#ifndef' so you can specify these values outside gc.c.
+Fri Aug 1 22:30:40 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * gc.c (ruby_gc_params_t): add initial_malloc_limit_factor and
- initial_malloc_limit_max.
+ * ext/win32ole/win32ole.c (folerecord_initialize): accept
+ only 2 arguments. The 2nd argument should be WIN32OLE object or
+ WIN32OLE_RECORD object.
- * gc.c (vm_malloc_prepare, vm_xrealloc): use vm_malloc_increase to
- add and check malloc_increase.
+Fri Aug 1 20:17:33 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Fri Sep 27 01:05:00 2013 Zachary Scott <e@zzak.io>
+ * ext/win32ole/win32ole.c (ole_variant2val): call
+ folerecord_s_allocate instead of WIN32OLE_RECORD.new.
- * re.c: [DOC] arguments of Regexp::union receive #to_regexp [Bug #8205]
+Fri Aug 1 18:39:57 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Fri Sep 27 00:39:27 2013 Zachary Scott <e@zzak.io>
+ * test/date/test_date.rb: remove commented-out code.
+ * test/date/test_date_arith.rb: ditto.
+ * test/date/test_date_attr.rb: ditto.
+ * test/date/test_date_parse.rb: ditto.
- * struct.c: [DOC] grammar of ArgumentError in Struct.new [Bug #8936]
- Patch by Prathamesh Sonpatki
+Fri Aug 1 16:35:32 2014 Evan Miller <evan@squareup.com>
-Thu Sep 26 22:11:56 2013 Zachary Scott <e@zzak.io>
+ * numeric.c (flodivmod): all results are NaN if divisor is NaN.
+ [fix GH-692]
- * ext/bigdecimal/bigdecimal.c: [DOC] several fixes by @chastell
- This includes fixing the capitalization of Infinity, return value of
- example "BigDecimal.new('NaN') == 0.0", and code style in example.
- [Fixes GH-398] https://github.com/ruby/ruby/pull/398
+Thu Aug 01 07:28:12 2014 Kenta Murata <mrkn@mrkn.jp>
-Thu Sep 26 22:08:11 2013 Zachary Scott <e@zzak.io>
+ * ext/bigdecimal/bigdecimal.c: [DOC] Add description of
+ `BigDecimal.new` exceptions. Patched by @joker1007 and
+ @prathamesh-sonpatki [Fixes GH-690]
+ https://github.com/ruby/ruby/pull/690
- * lib/observer.rb: [DOC] syntax improvement in example by @chastell
- [Fixes GH-400] https://github.com/ruby/ruby/pull/400
+Thu Jul 31 22:20:12 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Thu Sep 26 22:03:15 2013 Zachary Scott <e@zzak.io>
+ * ext/win32ole/win32ole.c: add WIN32OLE_RECORD#inspect.
- * ext/digest/digest.c: [DOC] typo in overview by @chastell
- [Fixes GH-399] https://github.com/ruby/ruby/pull/399
+Thu Jul 31 20:35:32 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Thu Sep 26 22:00:42 2013 Zachary Scott <e@zzak.io>
+ * ext/win32ole/win32ole.c: add
+ WIN32OLE_RECORD#ole_instance_variable_set and
+ WIN32OLE_RECORD#ole_instance_variable_get
- * ext/openssl/ossl.c: [DOC] typo in example by @zoranzaric
- [Fixes GH-401] https://github.com/ruby/ruby/pull/401
+Wed Jul 30 23:28:10 2014 Kazuki Tsujimoto <kazuki@callcc.net>
-Thu Sep 26 21:07:49 2013 Akinori MUSHA <knu@iDaemons.org>
+ * sprintf.c (rb_str_format): like r47006, get rid of
+ function calls in RSTRING_PTR().
- * misc/ruby-electric.el (ruby-electric-delete-backward-char): Add
- support for smartparens-mode.
+Wed Jul 30 22:10:29 2014 Kazuki Tsujimoto <kazuki@callcc.net>
- * misc/ruby-electric.el (ruby-electric-cua-replace-region-maybe)
- (ruby-electric-cua-delete-region-maybe): New functions that
- combine `ruby-electric-cua-*-region` with
- `ruby-electric-cua-*-region-p`, using a slightly better way to
- detect if it is in cua-mode.
+ * process.c (rlimit_resource_type, rlimit_resource_value):
+ get rid of inadvertent dynamic symbol pin-down.
-Thu Sep 26 16:51:00 2013 Shota Fukumori <her@sorah.jp>
+ * re.c (match_backref_number): ditto.
- * insns.def (opt_regexpmatch2): Check String#=~ hasn't overridden
- before calling rb_reg_match().
+ * signal.c (esignal_init, rb_f_kill, trap_signm): ditto.
- * test/ruby/test_string.rb: Test for above.
+ * transcode.c (econv_opts): ditto.
- * vm.c (vm_init_redefined_flag): Add BOP flag for String#=~
+ * vm_trace.c (symbol2event_flag): ditto.
- [ruby-core:57385] [Bug #8953]
+Wed Jul 30 21:29:39 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Thu Sep 26 16:43:42 2013 Akinori MUSHA <knu@iDaemons.org>
+ * ext/win32ole/win32ole.c (ole_invoke): pass WIN32OLE_RECORD variant
+ by reference when invoke OLE methods at first.
- * misc/ruby-electric.el: Avoid use of the interactive function
- `self-insert-command` which fires `post-self-insert-hook` and
- `post-command-hook`, to make the ruby-electric commands work
- nicely with those minor modes that make use of them to do
- similar input assistance, such as electric-pair-mode,
- autopair-mode and smartparens-mode.
+ * ext/win32ole/win32ole.c (olerecord_set_ivar): release
+ IRecordInfo interface before setting another IRecordInfo interface.
-Thu Sep 26 16:24:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+Wed Jul 30 13:17:35 2014 Koichi Sasada <ko1@atdot.net>
- * insns.def (opt_regexpmatch1): check Regexp#=~ is not defined before
- calling rb_reg_match()
+ * gc.c: remove unused macros.
- * test/ruby/test_regexp.rb: add test
+Tue Jul 29 22:21:37 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * vm.c (ruby_vm_redefined_flag): change type to short[]
+ * ext/win32ole/win32ole.c (hash2olerec): ignore WIN32OLE_RECORD
+ instance variable if the variable is nil.
- * vm.c (vm_redefinition_check_flag): return REGEXP_REDEFINED_OP_FLAG if
- klass == rb_cRegexp
+Tue Jul 29 19:43:27 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * vm.c (vm_init_redefined_flag): setup BOP flag for Regexp#=~
+ * ext/win32ole/win32ole.c (folerecord_method_missing): refactoring.
+ divide functionality of folerecord_method_missing into
+ olerecord_ivar_set and olerecord_ivar_get.
- * vm_insnhelper.h: add REGEXP_REDEFINED_OP_FLAG
+Mon Jul 28 20:20:08 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- [ruby-core:57385] [Bug #8953]
+ * ext/win32ole/win23ole.c (folerecord_method_missing): support
+ setter of member of WIN32OLE_RECORD object.
-Thu Sep 26 14:46:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Jul 28 06:37:19 2014 Zachary Scott <e@zzak.io>
- * gc.c (mark_locations_array): disable AddressSanitizer. based on a
- patch by halfie (Ruby Guy) at [ruby-core:57372].
- [ruby-core:56155] [Bug #8680]
+ * vm_eval.c: [DOC] Fix rdoc formatting of patch from [Bug #9551]
-Wed Sep 25 17:41:29 2013 Koichi Sasada <ko1@atdot.net>
+Mon Jul 28 06:34:43 2014 Zachary Scott <e@zzak.io>
- * README.EXT, README.EXT.ja: remove description of RARRAY_PTR()
- and add a caution of accessing internal data structure directly.
- Also add a description of rb_ary_store().
- [Bug #8399]
+ * vm_eval.c: [DOC] [Bug #9551] Improve clarity of Kernel::catch
+ documentation, patch by Jesse Sielaff.
-Wed Sep 25 17:12:08 2013 Koichi Sasada <ko1@atdot.net>
+Mon Jul 28 06:24:54 2014 Zachary Scott <e@zzak.io>
- * include/ruby/ruby.h: rename RARRAY_RAWPTR() to RARRAY_CONST_PTR().
- RARRAY_RAWPTR(ary) returns (const VALUE *) type pointer and
- usecase of this macro is not acquire raw pointer, but acquire
- read-only pointer. So we rename to better name.
- RSTRUCT_RAWPTR() is also renamed to RSTRUCT_CONST_PTR()
- (I expect that nobody use it).
+ * lib/uri/common.rb: [DOC] [Bug #9563] Recommend using URI.escape
+ before parsing a uri to avoid invalid characters. Reported by
+ Evgeniy Serykh.
- * array.c, compile.c, cont.c, enumerator.c, gc.c, proc.c, random.c,
- string.c, struct.c, thread.c, vm_eval.c, vm_insnhelper.c:
- catch up this change.
+Mon Jul 28 05:55:56 2014 Zachary Scott <e@zzak.io>
-Wed Sep 25 16:58:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * time.c: [DOC] Clarify %Y in strftime, which can accept any digits
+ and will output at least 4 digits as the year. Reported by Yury
+ Trofimenko [Bug #10049]
- * internal.h (rb_float_value, rb_float_new): move inline functions
- from ruby/ruby.h.
+ * lib/time.rb: ditto
- * numeric.c (rb_float_value, rb_float_new): define external functions
- for extension libraries.
+Mon Jul 28 05:32:06 2014 Zachary Scott <e@zzak.io>
-Wed Sep 25 15:37:02 2013 Koichi Sasada <ko1@atdot.net>
+ * lib/uri/common.rb: [DOC] [Bug #10075] Clarify how URI.join arguments
+ are handled by RFC3986, originally reported by John Feminella.
- * test/rdoc/test_rdoc_generator_darkfish.rb: add a guard for windows.
+Mon Jul 28 05:21:41 2014 Zachary Scott <e@zzak.io>
-Wed Sep 25 09:53:11 2013 Eric Hodel <drbrain@segment7.net>
+ * file.c: [DOC] Clarify how File.file? handles symbolic links. Also
+ cleaned up the rdoc style for this method, more to follow.
+ Originally reported by Michael Renner [Bug #10067]
- * lib/rubygems: Fix CVE-2013-4363. Miscellaneous minor improvements.
+Mon Jul 28 05:12:22 2014 Zachary Scott <e@zzak.io>
- * test/rubygems: Tests for the above.
+ * time.c: [DOC] Remove dead link and old bug report, which hasn't been
+ reproduced in a few years. Reported by Federico Builes [Bug #10071]
-Tue Sep 24 17:38:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Jul 28 04:39:58 2014 Zachary Scott <e@zzak.io>
- * string.c (rb_str_inspect): get rid of out-of-bound access.
+ * ext/zlib/zlib.c: [DOC] Remove default value of Zlib constants, as
+ they may change in the implementation without notice. Patched by
+ @robin850 [Fixes GH-682] https://github.com/ruby/ruby/pull/682
- * string.c (rb_str_inspect): when a UTF-16/32 string doesn't have a
- BOM, inspect as a dummy encoding string.
+Mon Jul 28 04:35:35 2014 Zachary Scott <e@zzak.io>
-Tue Sep 24 17:15:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/openssl/ossl_hmac.c: Fix NO_HMAC warning [Fixes GH-665]
+ Patched by @vipulnsward https://github.com/ruby/ruby/pull/665
- * enc/encdb.c (ENC_DUMMY_UNICODE): make BOM-encodings dummy.
+Sun Jul 27 19:49:36 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * encoding.c (enc_autoload): keep dummy encodings dummy.
+ * lib/cgi/core.rb: remove unused variables.
+ * lib/erb.rb: ditto.
+ * lib/mkmf.rb: ditto.
+ * lib/net/http/response.rb: ditto.
+ * lib/optparse/version.rb: ditto.
+ * lib/prime.rb: ditto.
+ * lib/racc/parser.rb: ditto.
+ * lib/rexml/document.rb: ditto.
+ * lib/rexml/dtd/dtd.rb: ditto.
+ * lib/rexml/element.rb: ditto.
+ * lib/rexml/functions.rb: ditto.
+ * lib/rexml/parsers/xpathparser.rb: ditto.
-Tue Sep 24 16:41:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Jul 27 05:11:21 2014 Zachary Scott <e@zzak.io>
- * ext/win32/lib/win32/registry.rb (Win32::Registry#write): data size
- is in bytes, not chars. terminators should be placed automatically.
+ * lib/irb.rb: [DOC] PROMPT_I cannot be nil, patch by @hgillane
+ Fixes documenting-ruby/ruby#37
+ https://github.com/documenting-ruby/ruby/pull/37
-Tue Sep 24 16:39:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Jul 27 02:41:50 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ext/win32/lib/win32/registry.rb (Win32::Registry#each_value): encode
- name.
+ * lib/shell/command-processor.rb: remove unused variable.
+ * lib/shell/system-command.rb: ditto.
+ * lib/tmpdir.rb: ditto.
+ * lib/uri/generic.rb: ditto.
- * ext/win32/lib/win32/registry.rb (Win32::Registry#each_key): ditto.
+Sun Jul 27 02:08:31 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ext/win32/lib/win32/registry.rb (Win32::Registry#export_string):
- encode to locale encoding if default internal is not set.
+ * lib/weakref.rb: split executable code into sample directory.
+ * sample/weakref.rb: ditto.
-Tue Sep 24 16:35:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Jul 27 02:06:55 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ext/win32/lib/win32/registry.rb (Win32::Registry::API#EnumKey):
- size of the name is in WCHARs, not in bytes.
+ * lib/delegate.rb: split executable code into sample directory.
+ * sample/delegate.rb: ditto.
-Tue Sep 24 14:07:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+Sun Jul 27 01:46:34 2014 Zachary Scott <e@zzak.io>
- * gc.c (free_method_cache_entry_i): unused function
+ * proc.c (method_super_method): [DOC] Method#super_method
- * gc.c (rb_free_mc_table): ditto
+Sun Jul 27 01:22:39 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * internal.h (method_cache_entry_t): unused struct
+ * proc.c (method_super_method): new method Method#super_method,
+ which returns a method object of the method to be called by
+ `super` in the receiver method object.
+ [ruby-core:62202] [Feature #9781]
- * vm_method.c (verify_method_cache): remove unused variable
+Sat Jul 26 17:22:14 2014 URABE Shyouhei <shyouhei@ruby-lang.org>
- * vm_method.c (rb_method_entry): ditto
+ * ext/objspace/objspace_dump.c (dump_append): avoid fflush.
-Tue Sep 24 14:01:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+ because dump_append_string_value() iterates over each chars,
+ fflush()-ing here effectively issues system calls on every single
+ bytes exist in a ruby process.
- * class.c (class_alloc): remove mc_tbl
+Sat Jul 26 16:55:18 2014 Eric Wong <e@80x24.org>
- * gc.c (obj_free): ditto
+ * iseq.h (struct iseq_compile_data_storage): reduce overhead
+ to 16 bytes (from 32) on 64-bit
- * internal.h (struct rb_classext_struct): ditto
+Sat Jul 26 16:28:06 2014 Eric Wong <e@80x24.org>
- * method.h (rb_method_entry): remove ent param
+ * vm_core.h (struct rb_iseq_struct): reduce to 280 bytes
+ (from 288 bytes) on 64-bit
- * vm_method.c: restore the global method cache. Per class cache tables
- turned out to be far too slow.
+Sat Jul 26 06:44:43 2014 Eric Wong <e@80x24.org>
- [ruby-core:57289] [Bug #8930]
+ * parse.y (struct parse_params): shrink to 320 to 304 bytes on 64-bit
-Tue Sep 24 12:51:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Jul 26 05:58:35 2014 Eric Wong <e@80x24.org>
- * ext/win32/lib/win32/registry.rb (Win32::Registry::API): need
- Constants.
+ * include/ruby/ruby.h (ZALLOC, ZALLOC_N): implement
+ (Data_Make_Struct, TypedData_Make_Struct):
+ ZALLOC replaces ALLOC+memset
+ [ruby-core:63951][Feature #10082]
+ * compile.c (iseq_seq_sequence): ZALLOC_N replaces ALLOC_N+MEMZERO
+ * cont.c (fiber_t_alloc): ZALLOC replaces ALLOC+MEMZERO
+ * io.c (rb_io_reopen): ditto
+ * iseq.c (prepare_iseq_build): ditto
+ * parse.y (new_args_tail_gen, parser_new, ripper_s_allocate): ditto
+ * re.c (match_alloc): ditto
+ * variable.c (rb_const_set): ditto
+ * ext/socket/raddrinfo.c (get_addrinfo): ditto
+ * ext/strscan/strscan.c (strscan_s_allocate): ditto
+ * gc.c (rb_objspace_alloc): calloc replaces malloc+MEMZERO
- * ext/win32/lib/win32/registry.rb (Win32::Registry::API#EnumValue):
- size of the name is in WCHARs, not in bytes.
+Sat Jul 26 05:54:54 2014 Eric Wong <e@80x24.org>
-Mon Sep 23 22:16:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * symbol.c (dsymbol_check): remove unneeded semi-colon
- * enc/encdb.c, enc/utf_16_32.h (ENC_DUMMY_UNICODE): Unicode with BOM
- must be based on big endian variants, so that actual encodings would
- work. [ruby-core:57318] [Bug #8940]
+Fri Jul 25 14:07:27 2014 Koichi Sasada <ko1@atdot.net>
-Mon Sep 23 12:11:26 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * gc.c: change objspace::rgengc::parent_object_is_old (boolean)
+ to objspace::rgengc::parent_object (VALUE).
+ Use Qfalse or RVALUE pointer instead of FALSE and TRUE.
- * hash.c (env_each_pair): do not call rb_assoc_new() if
- it isn't needed.
+ * gc.c (gc_marks_body): should clear parent_object just before
+ gc_mark_roots() because there are no parents objects
+ for root objects.
-Mon Sep 23 10:42:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Jul 25 13:45:39 2014 Koichi Sasada <ko1@atdot.net>
- * test/ruby/test_module.rb (TestModule#test_include_toplevel): test
- for top level main.include. based on a part of the patch by
- kyrylo at [GH-395].
+ * gc.c (rb_gc_writebarrier_remember_promoted): should remember only
+ OLD objects on RGENGC_AGE2_PROMOTION.
-Mon Sep 23 05:07:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Jul 25 13:42:02 2014 Koichi Sasada <ko1@atdot.net>
- * include/ruby/intern.h (rb_ary_cat): move from internal.h, since it
- is described in README.EXT.
+ * gc.c (gc_mark_stacked_objects): fix error message.
-Sun Sep 22 20:55:20 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+Fri Jul 25 13:18:00 2014 Will Farrington <wfarrington@digitalocean.com>
- * vm_insnhelper.c (vm_make_proc_with_iseq): fix bug message.
- This is follow up to changes in r42637.
+ * ext/socket/socket.c (sock_gethostname): Use NI_MAXHOST to support
+ hostnames longer than 64 characters if the system supports it.
+ [fixes GH-683]
-Sun Sep 22 20:35:38 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+Fri Jul 25 12:21:11 2014 Santiago Pastorino <santiago@wyeworks.com>
- * ext/-test-/tracepoint/tracepoint.c (Init_tracepoint): prevent from GC.
+ * compile.c (defined_expr): make the condition if the receiver
+ is explicit or implicit cleaner. [fix GH-681]
-Sun Sep 22 19:00:28 2013 Benoit Daloze <eregontp@gmail.com>
+Fri Jul 25 03:53:52 2014 Eric Hodel <drbrain@segment7.net>
- * benchmark/bm_app_answer.rb: revert r42990, benchmark scripts should
- be self-contained and avoid dependencies, especially such small one.
- See https://github.com/ruby/ruby/pull/393#issuecomment-24861301.
+ * doc/keywords.rdoc: [DOC] Describe each keyword.
-Sat Sep 21 20:11:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu Jul 24 22:40:24 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * process.c (rb_fork_internal): remove cloexec setting on pipes
- created by rb_cloexec_pipe. patch by normalperson (Eric Wong) at
- [ruby-core:56523]. [Bug #8769]
+ * ext/win32ole/win32ole.c (Init_win32ole): add WIN32OLE_RECORD#initialize
+ method.
-Sat Sep 21 01:04:25 2013 Zachary Scott <e@zzak.io>
+ * ext/win32ole/win32ole.c (ole_val2variant): convert WIN32OLE_RECORD
+ object to VT_RECORD variant.
- * lib/benchmark.rb: [DOC] grammar of Benchmark#bm [Bug #8888]
- Patch by Prathamesh Sonpatki
+Thu Jul 24 20:10:59 2014 Koichi Sasada <ko1@atdot.net>
-Sat Sep 21 00:50:02 2013 Zachary Scott <e@zzak.io>
+ * gc.c: fix major GC flags.
+ * add GPR_FLAG_MAJOR_BY_FORCE, which indicates
+ major GC by METHOD, CAPI and so on (see GC_BY).
+ * remove GPR_FLAG_MAJOR_BY_RESCAN because not used.
+ * remove GPR_FLAG_MAJOR_BY_STRESS, use FORCE instead.
- * enumerator.c: [DOC] Enumerator#each arguments documentation [GH-388]
- Patch by @kachick https://github.com/ruby/ruby/pull/388
+ * test/ruby/test_gc.rb: catch up.
-Sat Sep 21 00:49:16 2013 Zachary Scott <e@zzak.io>
+Thu Jul 24 15:55:02 2014 Naohisa Goto <ngotogenome@gmail.com>
- * enum.c: [DOC] Enumerable#to_a accepts arguments [GH-388]
- Patch by @kachick https://github.com/ruby/ruby/pull/388
+ * include/ruby/io.h (struct rb_io_buffer_t): PACKED_STRUCT should not
+ be used for platform-specific optimization. PACKED_STRUCT_UNALIGNED
+ should be used. [ruby-core:63988] [Bug #10088]
-Sat Sep 21 00:47:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu Jul 24 04:42:13 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * string.c (rb_str_conv_enc_opts): make sure to scan coderange to get
- rid of unnecessary conversion.
+ * lib/benchmark.rb: split executable code into sample directory.
+ * sample/benchmark.rb: ditto.
-Sat Sep 21 00:21:08 2013 Zachary Scott <e@zzak.io>
+Thu Jul 24 04:36:49 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ext/openssl/lib/openssl/ssl.rb: [DOC] Document OpenSSL::SSLServer
- Based on a patch by Rafal Lisowski [Bug #8758]
+ * lib/tempfile.rb: split executable code into sample directory.
+ * sample/tempfile.rb: ditto.
-Fri Sep 20 23:54:03 2013 Zachary Scott <e@zzak.io>
+Thu Jul 24 04:29:36 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * lib/gserver.rb: [DOC] correct gserver.rb license [Bug #8913]
+ * lib/pstore.rb: split executable code into sample directory.
+ * sample/pstore.rb: ditto.
-Fri Sep 20 23:48:34 2013 Zachary Scott <e@zzak.io>
+Wed Jul 23 23:50:11 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/psych/yaml/yaml.h: [DOC] merge upstream typo fix by @GreenGeorge
- https://github.com/tenderlove/psych/pull/161
+ * include/ruby/defines.h, siphash.c, st.c (UNALIGNED_WORD_ACCESS):
+ add PowerPC64 too, which is capable to access unaligned words.
+ patched by Gustavo Frederico Temple Pedrosa in [ruby-core:63937].
+ [Feature #10081]
-Fri Sep 20 23:37:40 2013 Zachary Scott <e@zzak.io>
+ * regint.h (PLATFORM_UNALIGNED_WORD_ACCESS): ditto.
- * lib/securerandom.rb: [DOC] SecureRandom.hex length argument
- [Fixes GH-394] Patch by @avdi https://github.com/ruby/ruby/pull/394
+Wed Jul 23 04:04:38 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Fri Sep 20 23:34:48 2013 Zachary Scott <e@zzak.io>
+ * lib/drb/extserv.rb: remove duplicate code with sample directory.
+ contributed from @vipulnsward. [fix GH-679]
- * benchmark/bm_app_answer.rb: removed duplicate code [Fixes GH-393]
- Patch by @gouravtiwari https://github.com/ruby/ruby/pull/393
+Tue Jul 22 12:56:24 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Sep 20 23:24:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * string.c (rb_str_count): fix wrong single-byte optimization.
+ 7bit ascii can be a trailing byte in Shift_JIS.
+ [ruby-dev:48442] [Bug #10078]
- * common.mk (btest, btest-ruby, test-knownbug): add $(RUN_OPTS) to
- ruby to be run, so that tests are runnable before making exts.
+Tue Jul 22 01:48:38 2014 Eric Wong <e@80x24.org>
- * common.mk (test-sample): ditto, and use $(MINIRUBY) as rubytest.rb
- does not need extension libraries.
+ * include/ruby/io.h (rb_io_buffer_t): fix packing on gcc
+ r46892 caused packing to be a no-op on gcc (4.7.2-5, Debian)
+ [Bug #10079][ruby-core:63912]
- * tool/rubytest.rb: pass $(RUN_OPTS) to testing ruby using --run-opt.
+Mon Jul 21 15:55:42 2014 fuji70 <fujifuji70@gmail.com>
-Fri Sep 20 15:01:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/optparse.rb (getopts): print default values and descriptions
+ in the help message. [fix GH-676]
- * parse.y (intern_str): sigil only names are junk, at least one
- identifier character is needed. [ruby-dev:47723] [Bug #8928]
+Sun Jul 20 14:26:27 2014 Eric Wong <e@80x24.org>
- * parse.y (rb_enc_symname_type): fix out of bound access.
+ * vm_core.h (rb_proc_t): reduce to 64 bytes from 72 on 64-bit
-Fri Sep 20 14:14:32 2013 Tanaka Akira <akr@fsij.org>
+Sun Jul 20 13:50:34 2014 Eric Wong <e@80x24.org>
- * ext/-test-/printf/printf.c (printf_test_call): Fix an end of buffer
- argument.
+ * transcode.c (rb_econv_t): reduce to 184 bytes from 200 on 64-bit
-Thu Sep 19 16:59:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Jul 20 12:44:23 2014 Eric Wong <e@80x24.org>
- * parse.y (lambda): adjust position to the beginning of the block.
+ * include/ruby/io.h (rb_io_buffer_t): pack structure
+ Reduces rb_io_t from 200 to 192 bytes, allowing rb_io_t to
+ occupy one less cache line.
+ [Feature #10050]
-Thu Sep 19 16:25:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Jul 20 12:41:53 2014 Eric Wong <e@80x24.org>
- * vsnprintf.c (BSD_vfprintf): initialize cp so that size is 0 in the
- commented case. fix an accidental bug at r16716.
+ * include/ruby/io.h (rb_io_t): shrink to 200 bytes from 216 on 64-bit
+ This puts us within 8 bytes of being three cache lines instead of
+ four lines on x86-64. This breaks the ABI.
+ [Feature #10050]
-Thu Sep 19 14:33:14 2013 Koichi Sasada <ko1@atdot.net>
+Sun Jul 20 12:36:46 2014 Eric Wong <e@80x24.org>
- * NEWS: add a news for r42974.
+ * include/ruby/oniguruma.h (struct re_pattern_buffer): shrink to 448
+ bytes from 464 bytes on 64-bit. This breaks the ABI.
+ [Feature #10034]
-Thu Sep 19 14:12:02 2013 Koichi Sasada <ko1@atdot.net>
+Sun Jul 20 01:06:06 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * include/ruby/ruby.h: make Symbol objects frozen.
- [Feature #8906]
- I want to freeze this good day, too.
+ * ext/openssl/ossl.c: use encryptor instead of encrypter in doc.
+ contributed from @vipulnsward. [fix GH-663]
- * test/ruby/test_eval.rb: catch up this change.
+Sun Jul 20 00:32:44 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/ruby/test_symbol.rb: add a test to check frozen symbols.
+ * io.c (rb_io_initialize): [DOC] fix rdoc of append mode. it does
+ not move the pointer at open. [ruby-core:63747] [Bug #10039]
-Thu Sep 19 09:11:33 2013 Eric Hodel <drbrain@segment7.net>
+Sat Jul 19 12:40:50 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * NEWS: Update for RDoc 4.1.0.preview.1 and RubyGems 2.2.0.preview.1
+ * compile.c (iseq_compile_each): allow to access private attribute
+ reader in op_assign. [ruby-core:63817] [Bug #10060]
-Thu Sep 19 08:59:41 2013 Eric Hodel <drbrain@segment7.net>
+Sat Jul 19 11:56:36 2014 Grey Baker <greysteil@gmail.com>
- * lib/rdoc/markdown/literals_1_9.rb: Fix trailing whitespace.
+ * lib/time.rb (Time#apply_offset): Guards against a `nil` return
+ value from `Time.month_days` when offsetting date. Out of range
+ values are then caught when `Time.utc` is called (as usual).
- Previously kpeg (which generates this file) added trailing
- whitespace, but this bug is now fixed.
+ Previously a `nil` return value from `Time.month_days` would
+ have the `<` operator called on it, and raise `NoMethodError`.
+ [fix GH-667]
- * lib/rdoc/markdown.rb: ditto.
+ * lib/rdoc/parser/changelog.rb (RDoc#parse_entries): fix dirty hack.
-Thu Sep 19 08:33:14 2013 Eric Hodel <drbrain@segment7.net>
+Sat Jul 19 06:19:01 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * lib/rdoc: Update to RDoc 4.1.0.preview.1
+ * ext/win32ole/win32ole.c: refactoring.
- RDoc 4.1.0 contains a number of enhancements including a new default
- style and accessibility support. You can see the changelog here:
+Fri Jul 18 22:34:41 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- https://github.com/rdoc/rdoc/blob/v4.1.0.preview.1/History.rdoc
+ * ext/win32ole/win32ole.c (folevariant_initialize): WIN32OLE_VARIANT
+ does not support VT_RECORD. VT_RECORD should be supported in
+ WIN32OLE_RECORD.
- * test/rdoc: ditto.
+ * test/win32ole/test_win32ole_variant.rb (test_s_new_vt_record_exc):
+ ditto.
-Thu Sep 19 07:16:26 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+Fri Jul 18 19:54:03 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * ext/psych/lib/psych.rb: updating Psych version
+ * ext/win32ole/win32ole.c (folevariant_initialize): remove unnecessary
+ code.
- * ext/psych/psych.gemspec: ditto
+Fri Jul 18 19:11:03 2014 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-Thu Sep 19 06:39:40 2013 Eric Hodel <drbrain@segment7.net>
+ * lib/matrix/eigenvalue_decomposition: Style fix
+ Patch by Gogo Tanaka [#10058]
- * lib/rubygems/dependency_resolver.rb: Switch the iterative resolver
- algorithm from recursive to iterative to avoid possible
- SystemStackError.
+Fri Jul 18 19:03:53 2014 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-Thu Sep 19 06:29:30 2013 Eric Hodel <drbrain@segment7.net>
+ * lib/matrix.rb: Avoid using `and`.
+ Patch by gogo tanaka [#10058]
- * lib/rubygems: Update to RubyGems 2.2.0.preview.1
+Fri Jul 18 17:41:54 2014 GoGo tanaka <qlli.illb@gmail.com>
- This brings several new features to RubyGems summarized here:
+ * test/matrix/test_matrix.rb: Add tests for Matrix class.
+ [Feature #10057][ruby-core:63809]
- https://github.com/rubygems/rubygems/blob/v2.2.0.preview.1/History.txt
+Fri Jul 18 10:14:42 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * test/rubygems: ditto.
+ * lib/fileutils.rb: added missing options of FileUtils.touch by @Domon.
+ [fix GH-669]
-Wed Sep 18 23:14:58 2013 Masaki Matsushita <glass.saga@gmail.com>
+Thu Jul 17 19:57:27 2014 Herwin <herwin@quarantainenet.nl>
- * string.c (rb_str_enumerate_lines): make String#each_line and
- #lines not raise invalid byte sequence error when it is called
- with an argument. The patch also causes performance improvement.
- [ruby-dev:47549] [Bug #8698]
+ * ext/thread/thread.c (rb_szqueue_push): add optional parameter,
+ non_block defaulted to false. [ruby-core:63794] [Feature #10052]
- * test/ruby/test_m17n_comb.rb (test_str_each_line): remove
- assertions which check that String#each_line and #lines will
- raise an error if the receiver includes invalid byte sequence.
+Wed Jul 16 23:01:43 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Wed Sep 18 16:32:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/win32ole/win32ole.c (ole_variant2val): support array of
+ VT_RECORD variant.
- * proc.c (mnew_from_me): allocate structs after allocated wrapper
- object successfully, to get rid of potential memory leak.
+Wed Jul 16 20:21:49 2014 Naohisa Goto <ngotogenome@gmail.com>
-Tue Sep 17 15:54:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * vm_core.h (struct rb_iseq_struct): stack_max is changed to int
+ because all calculations related to stack_max in compile.c
+ (iseq_set_sequence) and vm_insnhelper.c (vm_push_frame) are
+ conducted by using int. This partly reverts r23945.
+ * vm_insnhelper.c (vm_push_frame): ditto. This reverts r42401.
- * lib/shell/command-processor.rb (Shell::CommandProcessor#find_system_command):
- return executable file only, should ignore directories and
- unexecutable files. [ruby-core:57235] [Bug #8918]
+Wed Jul 16 19:55:32 2014 Naohisa Goto <ngotogenome@gmail.com>
- * lib/test/unit/assertions.rb (Test::Unit::Assertions#assert_throw):
- assertion for throw. MiniTest::Assertions#assert_throws discards
- the caught value.
+ * vm_core.h (struct rb_iseq_struct): temporal workaround of [Bug 10037].
+ Add padding on big-endian 64-bit architecture (e.g. sparc64).
- * lib/test/unit/assertions.rb (Test::Unit::Assertions#assert_nothing_thrown):
- returns the result of the given block.
+Wed Jul 16 19:32:23 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Tue Sep 17 12:55:58 2013 Eric Hodel <drbrain@segment7.net>
+ * ext/win32ole/win32ole.c (fole_record_method_missing): call
+ rb_hash_fetch instead of rb_hash_aref.
- * doc/regexp.rdoc: [DOC] Replace paragraphs in verbatim sections with
- plain paragraphs to improve readability as ri and HTML.
+Wed Jul 16 18:08:47 2014 Koichi Sasada <ko1@atdot.net>
-Mon Sep 16 07:32:35 2013 Tadayoshi Funaba <tadf@dotrb.org>
+ * iseq.c (rb_iseq_defined_string): use rb_gc_mark_object() instead of
+ marking from vm_mark().
- * complex.c: removed meaningless lines.
- * rational.c: ditto.
+ * vm.c (rb_vm_mark): ditto.
-Mon Sep 16 00:44:23 2013 Masaki Matsushita <glass.saga@gmail.com>
+Wed Jul 16 18:03:50 2014 Koichi Sasada <ko1@atdot.net>
- * ext/socket/mkconstants.rb: define MSG_FASTOPEN.
- [ruby-core:57138] [Feature #8897]
+ * gc.c (gc_mark_roots): call rb_vm_mark directly.
-Sun Sep 15 13:31:23 2013 Tadayoshi Funaba <tadf@dotrb.org>
+ * vm.c: remove mark function for RubyVM object because
+ RubyVM object marked manually.
- * rational.c (nurat_div): reverted r28844, r28886 and r28887.
- REASON: Nobuyoshi Nakada <nobu@ruby-lang.org>'s commits are buggy.
- So Rational#/ may produce exact number with inexact number.
- Moreover, without reducing.
- REALLY NONSENSE COMMITS.
- A bug report by me [ruby-dev:44710] is also caused by this behavior.
- Kenta Murata <mrkn@mrkn.jp> patched it up.
- But he did not fix the origin.
- Today, the bug is still alive in ruby 1.9.3 and 2.0.0.
+Wed Jul 16 12:25:39 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sat Sep 14 06:08:10 2013 Eric Hodel <drbrain@segment7.net>
+ * regcomp.c: Merge Onigmo 5.14.1 25a8a69fc05ae3b56a09.
+ this includes Support for Unicode 7.0 [Bug #9092].
- * dir.c (dir_s_glob): [DOC] Improve wording and layout.
+Tue Jul 15 23:59:27 2014 Jared Jennings <jared.jennings.ctr@us.af.mil>
- * dir.c (file_s_fnmatch): ditto.
+ * ext/digest: make built-in digest function implementations
+ indicate success or failure of init and final functions.
+ [ruby-core:61614] [Bug #9659]
- * dir.c (Init_Dir): [DOC] Document File::Constants::FNM_XXX
- constants. (These won't show up in RDoc until a new RDoc is
- imported.)
+ * ext/digest/digest.c: expect digest init and finish functions to
+ indicate success or failure; raise exception on failure.
+ [ruby-core:61614] [Bug #9659]
-Thu Sep 12 14:58:58 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Tue Jul 15 20:31:40 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * lib/uri/generic.rb (URI::Generic.find_proxy): return nil if
- http_proxy environment variable is empty string.
- [ruby-core:57140] [Bug #8898]
+ * ext/win32ole/win32ole.c: modify document for WIN32OLE_RECORD.
-Fri Sep 13 10:40:28 2013 Eric Hodel <drbrain@segment7.net>
+Tue Jul 15 12:42:23 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * lib/rubygems: Update to RubyGems 2.1.3
+ * defs/default_gems: change version definition file of rake.
- Fixed installing platform gems
+Tue Jul 15 12:00:03 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- Restored concurrent requires
+ * lib/rake.rb, lib/rake/*.rb: Upgrade to rake-10.3.2
+ [fix GH-668]
+ * test/rake/*.rb: ditto.
- Fixed installing gems with extensions with --install-dir
+Mon Jul 14 19:14:51 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- Fixed `gem fetch -v` to install the latest version
+ * ext/win32ole/win32ole.c: modify WIN32OLE class document and
+ add comment for constants of WIN32OLE.
- Fixed installing gems with "./" in their files entries
+Mon Jul 14 16:38:45 2014 Eric Wong <e@80x24.org>
- * test/rubygems/test_gem_package.rb: Tests for the above.
+ * vm_core.h (struct rb_iseq_struct): reduce to 288 bytes
+ on x86-64 (from 296 bytes)
- * NEWS: Updated for RubyGems 2.1.3
+Mon Jul 14 16:07:25 2014 Eric Wong <e@80x24.org>
-Thu Sep 12 22:40:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * iseq.h (struct iseq_catch_table_entry): shrink to 32 bytes
+ on x86-64 (from 48 bytes)
- * configure.in (RUBY_CHECK_SIGNEDNESS): macro to check signedness of a
- type.
+Mon Jul 14 16:04:41 2014 Eric Wong <e@80x24.org>
- * configure.in (size_t): must be unsigned.
- [ruby-core:57149] [Feature #8890]
+ * iseq.h (struct iseq_catch_table): new flexible array struct
+ (iseq_catch_table_bytes): allocated size function
+ * vm_core.h (struct rb_iseq_struct): update catch_table member
+ This reduces the struct from 304 to 296 bytes on x86-64.
+ * compile.c (iseq_set_exception_table): update for struct changes
+ * iseq.c (iseq_free): ditto
+ * iseq.c (iseq_memsize): ditto
+ * iseq.c (rb_iseq_disasm): ditto
+ * iseq.c (iseq_data_to_ary): ditto
+ * iseq.c (rb_iseq_build_for_ruby2cext): ditto (untested)
+ * vm.c (vm_exec): ditto
+ * vm_core.h (struct rb_iseq_struct): ditto
+ * vm_insnhelper.c (vm_throw): ditto
-Thu Sep 12 22:37:08 2013 Anton Ovchinnikov <revolver112@gmail.com>
+Sun Jul 13 17:49:52 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ext/bigdecimal/bigdecimal.c, ext/digest/md5/md5.c,
- ext/json/fbuffer/fbuffer.h, ext/json/generator/generator.c:
- Eliminate less-than-zero checks for unsigned variables.
- According to section 4.1.5 of C89 standard, size_t is an unsigned
- type. These checks were found with 'cppcheck' static analysis tool.
- [ruby-core:57117] [Feature #8890]
+ * ext/openssl/ossl_cipher.c: Fix call to ciphers class method and
+ spell out `encryption` by @vipulnsward [fix GH-664]
-Thu Sep 12 21:35:46 2013 Naohisa Goto <ngotogenome@gmail.com>
+Sun Jul 13 17:31:51 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * Makefile.in (libruby-static.a): change LDFLAGS order. LDFLAGS may
- include library path that should be specified before LIBS.
- [ruby-dev:47707] [Bug #8901]
+ * ext/gdbm/gdbm.c: fix wrong arguments in GetDBM2 macro.
+ * ext/sdbm/init.c: ditto.
-Thu Sep 12 20:07:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Jul 13 17:25:50 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * vsnprintf.c (MAXEXP, MAXFRACT): calculate depending on constants in
- float.h.
+ * ext/dbm/dbm.c: fix wrong arguments in GetDBM2 macro by @v2e4lisp.
+ [fix GH-655]
- * vsnprintf.c (BSD_vfprintf): limit length for cvt() to get rid of
- buffer overflow. [ruby-core:57023] [Bug #8864]
+Sun Jul 13 16:44:56 2014 Eric Wong <e@80x24.org>
- * vsnprintf.c (exponent): make expbuf size more precise.
+ * vm_core.h (struct rb_call_info_struct): improve packing
+ This reduces the struct from 112 to 104 bytes on x86-64.
-Wed Sep 11 17:30:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Jul 13 15:53:25 2014 Eric Wong <e@80x24.org>
- * configure.in (RUNRUBY): append -- only after runruby.rb, not
- cross-compiling baseruby, so that $(RUN_OPT) can be command line
- options. [ruby-dev:47703] [Bug #8893]
+ * vm_core.h (struct rb_iseq_struct): stack_max is uint32_t
+ This reduces the struct from 312 to 304 bytes on x86-64.
-Wed Sep 11 07:55:17 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sun Jul 13 10:56:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * thread.c (rb_mutex_unlock): Mutex#unlock no longer raise
- an exception even if uses on trap. [Bug #8891]
+ * configure.in (rb_cv_broken_backtrace): exit with failure
+ normally, no needs to abort. [ruby-core:63678] [Bug #10008]
-Tue Sep 10 14:37:01 2013 Shota Fukumori <sorah@tubusu.net>
+Sat Jul 12 15:10:22 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * vm_backtrace.c (vm_backtrace_to_ary): Ignore the second argument if
- it is nil. [Bug #8884] [ruby-core:57094]
+ * ext/win32ole/win32ole.c (fole_record_method_missing): correct
+ fields Hash key.
- * test/ruby/test_backtrace.rb (test_caller_with_nil_length):
- Test for above.
+Sat Jul 12 04:17:40 2014 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-Tue Sep 10 12:39:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/net/smtp.rb (Net::SMTP#data): enable buffering while
+ 'data' send for optimizing Net::SMTP#send_message.
+ [ruby-dev:48329] [misc #9981]
+ patch by Masahiro Tomita.
- * class.c (method_entry_i): should exclude refined methods from
- instance method list. [ruby-core:57080] [Bug #8881]
+Sat Jul 12 01:13:45 2014 Naohisa Goto <ngotogenome@gmail.com>
-Tue Sep 10 12:05:04 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+ * test/ruby/envutil.rb (assert_no_memory_leak): On Solaris 9 or later,
+ if possible, execute child ruby with environment variables
+ LD_PRELOAD=libumem.so UMEM_OPTIONS="backend=mmap". With these
+ variables, freed memory is immediately returned to the OS.
+ [Bug #10020] [ruby-dev:48391]
- * io.c (rb_f_printf): [DOC] add missing parenthesis in rdoc.
+Fri Jul 11 20:49:10 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
-Tue Sep 10 10:08:00 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+ * ext/win32ole/win32ole.c: add WIN32OLE_RECORD class to support
+ VT_RECORD OLE variables.
- * NEWS: Update RubyGems note.
+Fri Jul 11 17:15:08 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Tue Sep 10 09:51:22 2013 Eric Hodel <drbrain@segment7.net>
+ * lib/abbrev.rb: remove executable.
- * lib/rubygems: Update to RubyGems 2.1.0. Fixes CVE-2013-4287.
+Fri Jul 11 16:45:39 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- See http://rubygems.rubyforge.org/rubygems-update/CVE-2013-4287_txt.html
- for CVE information.
+ * lib/fileutils.rb: handle ENOENT error with symlink targeted to
+ non-exists file. [ruby-dev:45933] [Bug #6716]
- See http://rubygems.rubyforge.org/rubygems-update/History_txt.html#label-2.1.0+%2F+2013-09-09
- for release notes.
+Fri Jul 11 15:59:42 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * test/rubygems: Tests for the above.
+ * array.c: Clarify documentation for Array#insert.
+ [ruby-core:62934] [Bug #9901]
-Mon Sep 9 21:31:45 2013 Tanaka Akira <akr@fsij.org>
+Fri Jul 11 15:39:36 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * process.c: Remove spaces between SI prefix and unit to follow
- SI brochure.
- http://www.bipm.org/en/si/si_brochure/
- https://www.nmij.jp/library/units/si/
+ * io.c: Improve Documentation by @dapplebeforedawn.
+ [fix GH-658] [ruby-core:63579] [Bug #10012]
- * time.c: Ditto.
+Fri Jul 11 14:19:14 2014 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
- * ext/socket/ancdata.c: Ditto.
+ * lib/matrix.rb: Fix sign for cross_product [#9499]
-Mon Sep 9 16:55:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Jul 11 11:11:50 2014 Koichi Sasada <ko1@atdot.net>
- * vm_method.c (rb_add_refined_method_entry): clear cache in the
- refined class since refining a method entry is modifying the class.
- [ruby-core:57079] [Bug #8880]
+ * benchmark/prepare_so_k_nucleotide.rb: use require_relative.
-Mon Sep 9 09:14:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * benchmark/prepare_so_reverse_complement.rb: ditto.
- * tool/rbinstall.rb (Gem::Specification#initialize): default date to
- RUBY_RELEASE_DATE. [ruby-core:57072] [Bug #8878]
+Fri Jul 11 10:09:03 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * tool/rbinstall.rb (Gem::Specification#to_ruby): add date.
+ * pack.c (encodes): fix buffer overrun by tail_lf. Thanks to
+ Mamoru Tasaka and Tomas Hoger. [ruby-core:63604] [Bug #10019]
-Sun Sep 8 16:01:54 2013 Tanaka Akira <akr@fsij.org>
+Thu Jul 10 23:51:36 2014 Naohisa Goto <ngotogenome@gmail.com>
- * rational.c (f_gcd): Relax the condition to use GMP.
+ * hash.c (ruby_setenv): Fix TestEnv#test_aset failure on Solaris 9.
+ When name contains '=', ruby_setenv raises Errno::EINVAL.
+ That is the same behavior as Solaris 10.
+ NULL check for malloc return value is also added.
-Sun Sep 8 13:56:38 2013 Masaki Suketa <masaki.suketa@nifty.ne.jp>
+Thu Jul 10 15:02:55 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/win32ole/win32ole.c (folevariant_initialize): check type of
- element of array.
+ * vm_insnhelper.c (vm_callee_setup_keyword_arg): adjust VM stack
+ pointer to get rid of overwriting splat arguments by arguments
+ for `to_hash` conversion. [ruby-core:63593] [Bug #10016]
- * test/win32ole/test_win32ole_variant.rb (test_s_new_ary): ditto.
+Thu Jul 10 01:09:57 2014 Koichi Sasada <ko1@atdot.net>
-Sat Sep 7 21:33:10 2013 Tanaka Akira <akr@fsij.org>
+ * symbol.c: remove rb_gc_mark_symbols().
- * math.c (math_log): Test the sign for bignums.
- (math_log2): Ditto.
- (math_log10): Ditto.
+ fstrings referred by static symbols and pinned dynamic symbols
+ are registered by rb_gc_register_mark_object().
-Sat Sep 7 20:25:47 2013 Tanaka Akira <akr@fsij.org>
+ fstrings referred by dynamic symbols (not pinned symbols)
+ are referred from global_symbols.dsymbol_fstr_hash (Hash object).
- * math.c (math_log): Support bignums bigger than 2**1024.
- (math_log2): Ditto.
- (math_log10): Ditto.
+ Note that fstrings referred from dynamic symbols must live logger
+ than symbol objects themselves because rb_gc_free_dsymbol() uses
+ fstrings to remove from symbol tables.
+ This is why we can not mark fstrings from dynamic symbols.
-Sat Sep 7 15:36:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+ This technique reduces root objects for GC marking.
- * vm_eval.c (vm_call0): fix prototype, the id parameter should be of
- type ID, not VALUE
+ * gc.c (gc_mark_roots): ditto.
- * vm_insnhelper.c (check_match): the rb_funcall family of functions
- does not care about refinements. We need to use
- rb_method_entry_with_refinements instead to call === with
- refinements. Thanks to Jon Conley for reporting this bug.
- [ruby-core:57051] [Bug #8872]
+ * internal.h: ditto.
- * test/ruby/test_refinement.rb: add test
+Thu Jul 10 00:24:18 2014 Naohisa Goto <ngotogenome@gmail.com>
-Sat Sep 7 13:49:40 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+ * common.mk (DTRACE_DEPENDENT_OBJS): fix build failure on Solaris
+ introduced in r46768. Object files containing dtrace probes should
+ be listed in DTRACE_DEPENDENT_OBJS.
- * variable.c (classname): the name of class that has
- non class id should not be nil. This bug was introduced
- in r36577.
+Wed Jul 9 17:07:28 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/thread/test_cv.rb: test for change.
+ * symbol.c, symbol.h: Symbol class implementation and internals,
+ split from parse.y.
-Sat Sep 7 13:29:22 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+Wed Jul 9 14:45:39 2014 Koichi Sasada <ko1@atdot.net>
- * lib/find.rb (Find.find): respect the encodings of arguments.
- [ruby-dev:47530] [Feature #8657]
+ * parse.y: change Symbol <-> ID relationship to avoid
+ exposing IDs from collectable symbols.
+ [Bug #10014]
- * test/test_find.rb: add tests.
+ Now, rb_check_id() returns 0 if corresponding symbol is
+ pinned dynamic symbol.
-Sat Sep 7 10:40:32 2013 Tanaka Akira <akr@fsij.org>
+ There is remaining intern_cstr_without_pindown(), it can return
+ IDs from collectable symbols. We must be careful to use it
+ (only used in parse.y). I think it should be removed if
+ it does not have impact for performance.
- * ext/socket/mkconstants.rb (TCP_FASTOPEN): Defined for TCP fast open.
- [ruby-core:57048] [Feature #8871] patch by Masaki Matsushita.
+ * parse.y:
+ add:
+ * STATIC_SYM2ID()
+ * STATIC_ID2SYM()
+ rename:
+ * rb_pin_dynamic_symbol() -> dsymbol_pindown()
-Fri Sep 6 23:53:31 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * internal.h:
+ remove:
+ * rb_check_id_without_pindown()
+ * rb_sym2id_without_pindown()
+ add:
+ * rb_check_symbol()
+ * rb_check_symbol_cstr()
- * common.mk: use RUNRUBY instead of MINIRUBY because MINIRUBY can't
- require extension libraries. The patch is from nobu
- (Nobuyoshi Nakada).
+ * load.c: use rb_check_id() or rb_check_id_cstr().
- * ext/thread/extconf.rb: for build ext/thread/thread.c.
+ * object.c: ditto.
- * include/ruby/intern.h: ditto.
+ * struct.c: ditto.
* thread.c: ditto.
- * lib/thread.rb: removed and replaced by ext/thread/thread.c.
-
- * ext/thread/thread.c: Queue, SizedQueue and ConditionVariable
- implementations in C. This patch is based on patches from panaggio
- (Ricardo Panaggio) and funny_falcon (Yura Sokolov) and ko1
- (Koichi Sasada). [ruby-core:31513] [Feature #3620]
-
- * test/thread/test_queue.rb (test_queue_thread_raise): add a test for
- ensuring that killed thread should be removed from waiting threads.
- It is based on a code by ko1 (Koichi Sasada). [ruby-core:45950]
-
-Fri Sep 6 22:47:12 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Define ac_cv_func_clock_getres to yes for mingw*.
-
-Fri Sep 6 21:04:10 2013 Tanaka Akira <akr@fsij.org>
-
- * rational.c: Include gmp.h if GMP is used.
- (GMP_GCD_DIGITS): New macro.
- (rb_gcd_gmp): New function.
- (f_gcd_normal): Renamed from f_gcd.
- (rb_gcd_normal): New function.
- (f_gcd): Invoke rb_gcd_gmp or f_gcd_normal.
-
- * internal.h (rb_gcd_normal): Declared.
- (rb_gcd_gmp): Ditto.
-
- * ext/-test-/rational: New directory.
-
- * test/-ext-/rational: New directory.
-
-Fri Sep 6 14:23:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/win32.c (clock_getres): required as well as clock_gettime().
- [ruby-dev:47699] [Bug #8869]
-
-Fri Sep 6 11:45:27 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * transcode.c (rb_econv_append): new function to append a string data
- with converting its encoding. split from rb_econv_substr_append.
-
-Fri Sep 6 02:37:22 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/visitors/yaml_tree.rb: use double quotes when
- strings start with special characters.
- https://github.com/tenderlove/psych/issues/157
-
- * test/psych/test_string.rb: test for change.
-
-Fri Sep 6 00:05:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * class.c (rewrite_cref_stack): remove recursion.
-
-Thu Sep 5 18:05:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * string.c (fstring_cmp): take string encoding into account when
- comparing fstrings [ruby-core:57037] [Bug #8866]
-
- * test/ruby/test_string.rb: add test
-
-Thu Sep 5 17:25:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (rb_fstring, rb_str_free): use st_data_t instead of VALUE.
-
- * string.c (rb_fstring): get rid of duplicating already frozen object.
-
-Thu Sep 5 14:01:22 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/optparse.rb: The Integer acceptable now allows binary and
- hexadecimal numbers per the documentation. [ruby-trunk - Bug #8865]
-
- DecimalInteger, OctalInteger, DecimalNumeric now validate their input
- before converting to a number. [ruby-trunk - Bug #8865]
-
- * test/optparse/test_acceptable.rb: Tests for the above, tests for all
- numeric acceptables for existing behavior.
-
-Thu Sep 5 13:49:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * include/ruby/ruby.h: add RSTRING_FSTR flag
-
- * internal.h: add rb_fstring() prototype
-
- * string.c (rb_fstring): deduplicate frozen string literals
-
- * string.c (rb_str_free): delete fstrings from frozen_strings table when
- they are GC'd
-
- * string.c (Init_String): initialize frozen_strings table
-
-Thu Sep 5 12:48:00 2013 Kenta Murata <mrkn@cookpad.com>
-
- * configure.in (with_gmp): set with_gmp no if it is empty.
-
-Thu Sep 5 10:41:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * vm_insnhelper.c (vm_getivar): use class sequence to check class
- identity, instead of pointer + vm state
-
- * vm_insnhelper.c (vm_setivar): ditto
-
-Thu Sep 5 08:20:58 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (GMP_DIV_DIGITS): New macro.
- (bary_divmod_gmp): New function.
- (rb_big_divrem_gmp): Ditto.
- (bary_divmod_branch): Ditto.
- (bary_divmod): Use bary_divmod_branch.
- (bigdivrem): Ditto.
-
- * internal.h (rb_big_divrem_gmp): Declared.
-
-Thu Sep 5 06:22:42 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_divmod_normal): Reduce temporary array allocations.
-
-Thu Sep 5 02:17:06 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big_divrem_normal): Add GC guards.
-
-Thu Sep 5 00:38:32 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big_divrem_normal): New function.
-
- * internal.h (rb_big_divrem_normal): Declared.
-
- * ext/-test-/bignum/div.c: New file.
-
- * test/-ext-/bignum/test_div.rb: New file.
-
-Thu Sep 5 00:08:44 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigdivrem_normal): Removed.
- (bary_divmod_normal): New function.
- (bary_divmod): Use bary_divmod_normal.
- (bigdivrem): Use bary_divmod_normal.
-
-Wed Sep 4 23:02:12 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigdivrem): Useless declaration removed.
-
-Wed Sep 4 22:56:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * numeric.c (NUM_STEP_GET_INF): split from NUM_STEP_SCAN_ARGS(), since
- inf is not used in num_step_size().
-
-Wed Sep 4 20:22:43 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigdivrem_normal): Add assertions.
-
-Wed Sep 4 19:18:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * internal.h (vm_state_version_t): prefer LONG_LONG to uint64_t.
-
-Wed Sep 4 16:28:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * internal.h (vm_state_version_t): use uint64_t when it is larger than
- LONG_LONG, and fallback to unsigned long.
-
-Wed Sep 4 15:37:05 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * enc/trans/utf8_mac-tbl.rb: fix r42789.
- Fix conversion table and logic. [ruby-dev:47680]
-
-Wed Sep 4 14:08:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * class.c, compile.c, eval.c, gc.h, insns.def, internal.h, method.h,
- variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
- vm_method.c: Implement class hierarchy method cache invalidation.
-
- [ruby-core:55053] [Feature #8426] [GH-387]
-
-Wed Sep 4 11:13:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (str_gsub): use BEG(0) for whole matched position not
- return value from rb_reg_search(), for \K matching.
- [ruby-dev:47694] [Bug #8856]
-
-Wed Sep 4 11:11:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (SOLIBS): LIBRUBY_SO also needs linking with gmp, to
- run worker processes in test-all on non-ELF platforms.
-
-Tue Sep 3 23:01:41 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/parser/test_tree.rb
- (TestTreeParser::TestInvalid#test_unmatched_close_tag):
- Compute expected value from test value.
-
-Tue Sep 3 22:59:58 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/treeparser.rb (REXML::Parsers::TreeParser#parse):
- Add source information to parse exception on no close tag error.
- [Bug #8844] [ruby-dev:47672]
- Patch by Ippei Obayashi. Thanks!!!
- * test/rexml/parser/test_tree.rb: Add a test for the above case.
-
-Tue Sep 3 22:57:57 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/parser/test_tree.rb: Fix test name to describe test
- content.
-
-Tue Sep 3 22:54:46 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/treeparser.rb (REXML::Parsers::TreeParser#parse):
- Remove needless nested parse exception information.
- [Bug #8844] [ruby-dev:47672]
- Reported by Ippei Obayashi. Thanks!!!
- * test/rexml/parser/test_tree.rb: Add a test for the above case.
-
-Tue Sep 3 22:03:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (rb_enc_str_new_cstr): new function to create a string from
- the C-string pointer with the specified encoding.
-
-Tue Sep 3 21:41:37 2013 Akira Matsuda <ronnie@dio.jp>
-
- * eval.c (Init_eval): Make Module#include and Module#prepend public
- [Feature #8846]
-
- * test/ruby/test_module.rb (class TestModule): Test for above
-
-Tue Sep 3 21:35:19 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * thread_pthread.c (sys/dyntune.h): for gettune().
-
- * thread_pthread.c (hpux_attr_getstackaddr): fix missing *.
- [ruby-core:56983] [Feature #8793]
-
-Tue Sep 3 20:12:46 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (GMP_STR2BIG_DIGITS): New macro.
- (str2big_gmp): New function.
- (rb_cstr_to_inum): Use str2big_gmp for big bignums.
- (rb_str2big_gmp): New function.
-
- * internal.h (rb_str2big_gmp): Declared.
-
-Tue Sep 3 19:44:40 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * ext/win32/lib/win32/registry.rb (Win32::Registry#values): added.
- [Feature #7763] [ruby-core:51783]
-
-Tue Sep 3 18:26:00 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * misc/inf-ruby.el (inf-ruby-keys, run-ruby): Add magic autoload
- comments.
-
- * misc/rdoc-mode.el (rdoc-mode): Ditto.
-
- * misc/ruby-electric.el (ruby-electric-mode): Ditto.
-
- * misc/ruby-style.el (ruby-style-c-mode): Ditto.
-
-Tue Sep 3 17:06:15 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * test/ruby/test_rubyoptions.rb
- (TestRubyOptions::SEGVTest::ExpectedStderr): the URL was changed at
- r42800.
-
-Tue Sep 3 14:48:25 2013 Zachary Scott <e@zzak.io>
-
- * lib/thread.rb: [DOC] CV#wait typo by @avdi [Fixes GH-386]
- https://github.com/ruby/ruby/pull/386
-
-Tue Sep 3 14:37:53 2013 Zachary Scott <e@zzak.io>
-
- * error.c: [DOC] Update bug tracker url by @ScotterC [Fixes GH-390]
- https://github.com/ruby/ruby/pull/390
-
-Tue Sep 3 12:45:23 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_str2big_poweroftwo): New function.
- (rb_str2big_normal): Ditto.
- (rb_str2big_karatsuba): Ditto.
-
- * internal.h (rb_str2big_poweroftwo): Declared.
- (rb_str2big_normal): Ditto.
- (rb_str2big_karatsuba): Ditto.
-
- * ext/-test-/bignum/str2big.c: New file.
-
- * test/-ext-/bignum/test_str2big.rb: New file.
-
- * ext/-test-/bignum/depend: Add the dependency for str2big.c.
-
-Tue Sep 3 12:09:08 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_gettime): Support times() based monotonic clock.
- (rb_clock_getres): Ditto.
-
-Tue Sep 3 12:03:02 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (str2big_scan_digits): Extracted from rb_cstr_to_inum.
-
-Tue Sep 3 11:23:57 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/win32.c (rb_w32_select_with_thread): rounding up the fraction of
- tv_usec instead of rounding down.
- this change is an experiment to get rid of failures on vc10-x64 CI.
-
-Tue Sep 3 11:00:28 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/win32.c (do_select): constify timeout.
-
- * win32/win32.c (rb_w32_select_with_thread): constify 10ms wait and
- 0ms wait structs.
-
-Tue Sep 3 10:03:42 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * test/openssl/test_pair.rb
- (OpenSSL::TestPair#test_write_nonblock_no_exceptions): on some CIs
- such as Debian 6.0, Ubuntu 10.04, CentOS and vc10-x64 (maybe depend
- on OpenSSL version), writing to SSLSocket after SSL_ERROR_WANT_WRITE
- causes SSL_ERROR_SSL "bad write retry".
-
-Tue Sep 3 08:20:46 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * enc/trans/utf8_mac-tbl.rb: update conversion table to recent OS X.
- Previous table is used on Mac OS X 10.1 or prior.
- This table is used on 10.2 or later. [ruby-dev:47680]
-
-Tue Sep 3 07:49:25 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * numeric.c (NUM_STEP_SCAN_ARGS): On second thought, keep
- Numeric#step backward compatible in that it raises TypeError
- when nil is given as second argument.
-
- * test/ruby/test_float.rb (TestFloat#test_num2dbl): Revert.
-
- * test/ruby/test_numeric.rb (TestNumeric#test_step): Fix test
- cases for the above change.
-
-Tue Sep 3 07:39:58 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bytes_2comp): Define it only for little endian
- environment.
-
-Tue Sep 3 07:31:29 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * numeric.c (NUM_STEP_SCAN_ARGS): Numeric#step should raise
- TypeError if a non-numeric parameter is given.
-
- * test/ruby/test_float.rb (TestFloat#test_num2dbl): Allow nil as
- step, as with the keyword argument.
-
- * test/ruby/test_numeric.rb (TestNumeric#test_step): Add tests for
- nil as step or limit.
-
-Tue Sep 3 07:28:49 2013 Tanaka Akira <akr@fsij.org>
-
- * internal.h (bit_length): Add casts to fix compilation error with
- clang 3.0 -Werror,-Wshorten-64-to-32.
- [ruby-dev:47687] reported by SASADA Koichi.
-
-Tue Sep 3 03:17:26 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_insnhelper.c (vm_search_super_method): use ci->argc instead of
- ci->orig_argc. ci->argc can be changed by splat arguments.
- [ruby-list:49575]
- This fix should be applied to Ruby 2.0.0 series.
-
- * test/ruby/test_super.rb: add a test for above.
-
-Mon Sep 2 23:46:29 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * numeric.c (num_step): Default the limit argument to infinity and
- allow it to be omitted. Keyword arguments (by: and to:) are
- introduced for ease of use. [Feature #8838] [ruby-dev:47662]
- [ruby-dev:42194]
-
- * numeric.c (num_step): Optimize for infinite loop.
-
-Mon Sep 2 22:55:59 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (ISDIGIT): Unused macro removed.
-
-Mon Sep 2 22:49:15 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (str2big_poweroftwo): Extracted from rb_cstr_to_inum.
- (str2big_normal): Ditto.
- (str2big_karatsuba): Ditto.
-
-Mon Sep 2 14:39:29 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * ruby.c (Process#setproctitle): [DOC] Fix and improve rdoc.
-
- * ruby.c (Process#argv0): [DOC] Improve rdoc.
-
-Mon Sep 2 14:15:00 2013 Kenta Murata <mrkn@cookpad.com>
-
- * NEWS: fix description of number literal suffixes.
-
-Mon Sep 2 14:01:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * test/rake/test_rake_rules.rb: add space after string literal to
- prevent conflict with string options syntax "foo"opts
-
- * test/rss/rss-assertions.rb: ditto
-
-Mon Sep 2 12:28:38 2013 Tanaka Akira <akr@fsij.org>
-
- * test/ruby/test_bignum.rb (test_interrupt_during_to_s): Disable it
- when GMP is used.
-
-Mon Sep 2 07:02:10 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (Init_Bignum): Define Bignum::GMP_VERSION when GMP is used.
-
-Mon Sep 2 01:46:14 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_generic): Reduce arguments.
- (big2str_gmp): Ditto.
- (rb_big2str1): Follow the above change.
-
-Mon Sep 2 00:08:08 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (get_mach_timebase_info): Extracted from rb_clock_gettime.
- (rb_clock_gettime): Use get_mach_timebase_info.
- (rb_clock_getres): Support MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC.
-
-Sun Sep 1 23:30:47 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (GMP_BIG2STR_DIGITS): New constant.
- (big2str_gmp): New function.
- (rb_big2str1): Use big2str_gmp for big bignums.
-
- * internal.h (rb_big2str_gmp): Declared.
-
- * ext/-test-/bignum/big2str.c (big2str_gmp): New method.
-
-Sun Sep 1 22:37:51 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_mul_gmp): Use mpz_init and mpz_clear instead of
- mpz_inits and mpz_clears.
- Older GMP don't have them.
-
-Sun Sep 1 21:17:54 2013 Tanaka Akira <akr@fsij.org>
-
- * test/net/http/test_http.rb (test_bind_to_local_port): Choose an open
- port more reliably.
-
-Sun Sep 1 20:32:40 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_base_poweroftwo): Renamed from
- big2str_base_powerof2.
- (rb_big2str_poweroftwo): New function for test.
- (big2str_generic): Extracted from rb_big2str1.
- (rb_big2str_generic): New function for test.
-
- * internal.h (rb_big2str_poweroftwo): Declared.
- (rb_big2str_generic): Ditto.
-
- * ext/-test-/bignum/big2str.c: New file.
-
- * test/-ext-/bignum/test_big2str.rb: New file.
-
-Sun Sep 1 15:21:21 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_2bdigits): Renamed from big2str_orig.
-
-Sun Sep 1 13:02:24 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c: Remove BITSPERDIG >= INT_MAX test. The static assertion,
- SIZEOF_BDIGITS <= sizeof(BDIGIT) is enough.
-
-Sun Sep 1 11:38:26 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (maxpow_in_bdigit): Removed.
-
-Sun Sep 1 10:30:42 2013 Tanaka Akira <akr@fsij.org>
-
- * numeric.c (rb_fix_bit_length): Moved from bignum.c.
-
-Sun Sep 1 09:55:45 2013 Tanaka Akira <akr@fsij.org>
-
- * internal.h (bit_length): Moved from bignum.c.
- (nlz_int): Ditto.
- (nlz_long): Ditto.
- (nlz_long_long): Ditto.
- (nlz_int128): Ditto.
-
-Sun Sep 1 03:32:22 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bit_length): Renamed from bitsize.
-
-Sun Sep 1 00:07:09 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big_bit_length): New method.
- (rb_fix_bit_length): Ditto.
- [ruby-core:56247] [Feature #8700]
-
-Sat Aug 31 22:18:29 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_getres): New method.
- (timetick2dblnum_reciprocal): New function.
-
- * configure.in: Check clock_getres.
-
- [ruby-core:56780] [Feature #8809] accepted as a CRuby feature at
- DevelopersMeeting20130831Japan
- https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20130831Japan
-
-Sat Aug 31 21:02:07 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c: Use GMP to accelerate big Bignum multiplication.
- (bary_mul_gmp): New function.
- (bary_mul): Use bary_mul_gmp.
- (bigsq): Use different threshold with GMP.
-
- * configure.in: Detect GMP.
-
- [ruby-core:56658] [Feature #8796]
-
-Sat Aug 31 15:03:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * compile.c (NODE_MATCH3): pass CALL_INFO to opt_regexpmatch2
-
- * insns.def (opt_regexpmatch2): use CALL_SIMPLE_METHOD to call =~ if
- the receiver is not a T_STRING [Bug #8847] [ruby-core:56916]
-
-Sat Aug 31 14:07:11 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/securerandom.rb (random_bytes): Use Process.clock_gettime.
-
-Sat Aug 31 00:25:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/encoding.h (rb_{ascii8bit,utf8,usascii}_encindex): get
- rid of conflict with macros defined in internal.h.
+ * vm_method.c: ditto.
-Fri Aug 30 22:37:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * string.c (sym_find): use only rb_check_symbol().
- * thread_pthread.c (native_thread_init_stack): wait the creator thread
- to fill machine stack info, if get_stack_of() is available.
+ * sprintf.c (rb_str_format): use rb_check_symbol_cstr().
- * thread_pthread.c (native_thread_create): fill the created thread
- stack info after starting, if get_stack_of() is available.
+Wed Jul 9 12:21:55 2014 Koichi Sasada <ko1@atdot.net>
- * thread_pthread.c (native_thread_create): define attr only if it is
- used, and merge pthread_create() calls.
+ * parse.y (symbols_i): delete garbage symbols for Symbol.all_symbols.
- * thread_pthread.c (get_main_stack): separate function to get stack of
- main thread.
+Wed Jul 9 05:49:08 2014 Eric Wong <e@80x24.org>
-Thu Aug 29 18:05:33 2013 Koichi Sasada <ko1@atdot.net>
+ * thread_pthread.h (struct rb_global_vm_lock_struct):
+ do not expose pthread type for lock
- * struct.c (rb_struct_define_without_accessor_under): added.
- This function is similar to rb_define_class_under() against
- rb_define_class().
+Wed Jul 9 05:41:40 2014 Eric Wong <e@80x24.org>
- * include/ruby/intern.h: add a declaration of this function.
+ * thread_pthread.h: remove unneeded semaphore.h include
-Thu Aug 29 17:03:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Jul 9 00:12:28 2014 Keiju Ishitsuka <keiju@ishitsuka.com>
- * vm_insnhelper.c (vm_call_method): a method entry refers the based
- class/module, so should search superclass from the origin i-class
- where the entry belongs to, to get rid of infinite loop when zsuper
- in a prepended class/module. [ruby-core:54105] [Bug #8238]
+ * lib/irb/ruby-lex.rb: fix counting indent in identify_string_dvar.
-Thu Aug 29 05:35:58 2013 Eric Hodel <drbrain@segment7.net>
+Tue Jul 8 16:58:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/zlib/zlib.c (zstream_run): Fix handling of deflate streams that
- need a dictionary but are being decompressed by Zlib::Inflate.inflate
- (which has no option to set a dictionary). Now Zlib::NeedDict is
- raised instead of crashing. [ruby-trunk - Bug #8829]
- * test/zlib/test_zlib.rb (TestZlibInflate): Test for the above.
+ * test/ruby/memory_status.rb (Memory::PSCMD): use ps command which
+ outputs expected result. [ruby-dev:48370] [Bug #10010]
-Thu Aug 29 02:40:45 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+Tue Jul 8 14:45:17 2014 Koichi Sasada <ko1@atdot.net>
- * ext/psych/lib/psych/scalar_scanner.rb: invalid floats should be
- treated as strings.
- https://github.com/tenderlove/psych/issues/156
+ * parse.y (dsymbol_alloc): set global_symbols.minor_marked to 0.
- * test/psych/test_string.rb: test for change
+ * parse.y (dsymbol_check): set RSYMBOL(sym)->fstr to 0
+ because we should not touch fstr after that.
-Wed Aug 28 17:20:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * parse.y (rb_gc_free_dsymbol): skip deleting str and sym
+ from tables if fstr == 0.
- * thread_pthread.c (hpux_attr_getstackaddr): basic support for the
- get_stack() under HP-UX. based on the patch by michal@rokos.cz
- (Michal Rokos) at [ruby-core:56645]. [Feature #8793]
+Mon Jul 7 14:31:52 2014 Koichi Sasada <ko1@atdot.net>
-Wed Aug 28 11:24:20 2013 Michal Rokos <michal@rokos.cz>
+ * parse.y: remove global_symbols::pinned_dsym
+ (and ::pinned_dsym_minor_marked).
- * configure.in (sys/pstat.h): fix missing header check for
- missing/setproctitle.c on HP-UX. [ruby-core:56644] [Bug #8792]
+ Mark pinned dsymbols by rb_gc_register_mark_object() because
+ they are immortal.
-Wed Aug 28 04:54:33 2013 Eric Hodel <drbrain@segment7.net>
+ * parse.y (rb_gc_free_dsymbol): rename parameter name `ptr' to `sym'.
- * ext/openssl/ossl_ssl.c (ossl_ssl_read): Replace duplicate
- wait_writable with wait_readable.
+Mon Jul 7 12:45:51 2014 Koichi Sasada <ko1@atdot.net>
-Tue Aug 27 17:18:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * gc.c: revert miss-commit.
- * lib/timeout.rb (Timeout#timeout): skip rescue clause only when no
- exception class is given.
+Mon Jul 7 12:40:59 2014 Koichi Sasada <ko1@atdot.net>
-Tue Aug 27 17:02:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * parse.y: need to use updated (re-created) symbols.
- * io.c (copy_stream_body): should write in binary mode. based on a
- patch by godfat (Lin Jen-Shin) at [ruby-core:56556].
- [ruby-core:56518] [Bug #8767]
+Mon Jul 7 11:02:55 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Tue Aug 27 17:02:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * tool/mkconfig.rb: remove not to require rbconfig/obsolete.rb.
- * io.c (copy_stream_body): move common open flags.
+ * lib/rbconfig/obsolete.rb: removed.
-Tue Aug 27 16:56:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Jul 7 10:52:03 2014 Koichi Sasada <ko1@atdot.net>
- * enumerator.c (enumerator_size): use rb_check_funcall() instead of
- respond_to? and call.
+ * parse.y: do not use rb_gc_resurrect(), but create a new dynamic
+ symbol for garbage dynamic symbol.
- * enumerator.c (enumerator_each): ensure that argument array size
- does not overflow at appending.
+ * common.mk: use gc.h by parse.y.
-Tue Aug 27 16:46:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Jul 7 02:18:42 2014 Koichi Sasada <ko1@atdot.net>
- * array.c (rb_ary_index, rb_ary_rindex): use optimized equality to
- improve performance. [Feature #8820]
+ * string.c (fstr_update_callback): do not use rb_gc_resurrect()
+ any more.
- * vm_insnhelper.c (rb_equal_opt): optimized equality function.
+ Make new frozen string and replace with garbage frozen string.
-Tue Aug 27 16:11:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * common.mk: use gc.h from string.c.
- * vm_insnhelper.c (opt_eq_func): use RBASIC_CLASS() instead of HEAP_CLASS_OF().
+Mon Jul 7 00:36:13 2014 Koichi Sasada <ko1@atdot.net>
- * insns.def (opt_plus, opt_minus, opt_mult, opt_div, opt_mod, opt_lt),
- (opt_gt, opt_ltlt, opt_aref, opt_aset, opt_length, opt_size),
- (opt_empty_p, opt_succ): ditto.
+ * gc.c: rename is_dying_object() to is_garbage_object().
-Tue Aug 27 16:08:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * gc.h: rb_objspace_garbage_object_p() as an exported function.
- * vm_eval.c (rb_check_funcall, rb_check_funcall_with_hook): constify
- argv.
+Sun Jul 6 21:30:35 2014 Koichi Sasada <ko1@atdot.net>
-Tue Aug 27 13:03:33 2013 Koichi Sasada <ko1@atdot.net>
+ * gc.c (is_dying_object): fix missed condition.
- * ext/stringio/stringio.c (strio_read_nonblock): declare local
- variables at the first of function.
+ * gc.c (is_live_object): move frequent path first.
-Tue Aug 27 11:51:37 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+Sun Jul 6 21:00:11 2014 Koichi Sasada <ko1@atdot.net>
- * enumerator.c: Allow Enumerator size argument to be any callable.
- Patch by Avdi Grimm. [bug #8641] [ruby-core:56032] [fix GH-362]
+ * gc.c: rename is_dead_object() to is_dying_object().
+ This function is not opposite against is_live_object()
+ because is_dying_object() does *not* check object type.
- * test/ruby/test_enumerator.rb: Test for above
+ * gc.c (is_dying_object): change condition.
-Tue Aug 27 11:46:31 2013 Koichi Sasada <ko1@atdot.net>
+ * gc.c (is_live_object): use T_NONE instead of 0.
- * gc.c (gc_profile_clear): do rest_sweep() before clearing
- profile.current_record.
+ * gc.c (rb_objspace_dying_object_p): added.
-Tue Aug 27 07:35:05 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+Sun Jul 6 13:37:27 2014 Koichi Sasada <ko1@atdot.net>
- * io.c (io_read_nonblock): support non-blocking reads without raising
- exceptions. As in: `io.read_nonblock(size, exception: false)`
- [ruby-core:38666] [Feature #5138]
- * ext/openssl/ossl_ssl.c (ossl_ssl_read_internal): ditto
- * ext/stringio/stringio.c (strio_sysread): ditto
- * io.c (rb_io_write_nonblock): support non-blocking writes without
- raising an exception.
- * ext/openssl/ossl_ssl.c (ossl_ssl_write_internal): ditto
- * test/openssl/test_pair.rb (class OpenSSL): tests
- * test/ruby/test_io.rb (class TestIO): ditto
- * test/socket/test_nonblock.rb (class TestSocketNonblock): ditto
- * test/stringio/test_stringio.rb (class TestStringIO): ditto
+ * gc.c (rb_gc_register_mark_object): change data structure.
+ From single array, to array of arrays. Each array only has 1024
+ entries.
-Tue Aug 27 05:24:34 2013 Eric Hodel <drbrain@segment7.net>
+ * vm.c (Init_vm_objects): change default capa from 1 to 128.
- * lib/rubygems: Import RubyGems 2.1.0 Release Candidate
- * test/rubygems: ditto.
-
-Mon Aug 26 16:24:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_nextc): warn carriage return in middle of line.
- [ruby-core:56240] [Feature #8699]
-
-Mon Aug 26 15:27:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/timeout.rb (Timeout#timeout): should not be caught by rescue
- clause. [Bug #8730]
-
-Mon Aug 26 14:44:26 2013 Koichi Sasada <ko1@atdot.net>
-
- * array.c (rb_ary_splice): use RARRAY_PTR_USE() without WB because
- there are not new relations.
-
- * enum.c (enum_sort_by): ditto.
-
- * struct.c (setup_struct): use RARRAY_RAWPTR().
-
- * vm_eval.c (yield_under): ditto.
-
- * ext/pathname/pathname.c (path_entries): use RARRAY_AREF().
-
- * ext/pathname/pathname.c (path_s_glob): ditto.
-
-Mon Aug 26 13:11:10 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-
- * array.c (ary_ensure_room_for_push): fix typo in r42658.
-
-Mon Aug 26 12:37:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * template/sizes.c.tmpl: generate automatically by extracting
- RUBY_CHECK_SIZEOF from configure.in.
-
-Mon Aug 26 10:16:59 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-
- * process.c (gcd_timetick_int): Renamed from gcd_timtick_int.
-
-Sun Aug 25 21:02:15 2013 Tanaka Akira <akr@fsij.org>
-
- * sizes.c (Init_sizes): Define the size of clock_t.
-
-Sun Aug 25 01:47:47 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (BARY_SHORT_MUL): Renamed from BARY_MUL1.
- (bary_short_mul): Renamed from bary_mul1.
-
-Sat Aug 24 10:35:09 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_gettime): The emulated clock names changed.
-
-Fri Aug 23 22:22:07 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_gettime): Add a cast to fix compile error by
- -Werror,-Wshorten-64-to-32.
-
-Fri Aug 23 22:12:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * process.c (rb_intern): no symbol cache while initialization.
-
-Fri Aug 23 22:07:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (clock_t): needs time.h.
-
-Fri Aug 23 21:37:28 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (reduce_factors): New function.
- (timetick2dblnum): Use reduce_factors.
- (timetick2integer): Ditto.
- (make_clock_result): Follow the above change.
- (rb_clock_gettime): Ditto.
-
-Fri Aug 23 21:00:55 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (timetick_int_t): Renamed from timetick_giga_count_t.
- (gcd_timtick_int): Renamed from gcd_ul and make the arguments
- timetick_giga_count_t.
- (reduce_fraction): Make the arguments timetick_int_t.
- (timetick2integer): Ditto.
- (make_clock_result): Ditto.
- (timetick2dblnum): Fix the return type.
- (rb_clock_gettime): Use timetick_int_t.
-
-Fri Aug 23 20:50:40 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (gcd_ul): New function.
- (reduce_fraction): Ditto.
- (reduce_fraction): Ditto.
- (timetick2dblnum): Ditto.
- (timetick2integer): Ditto.
- (make_clock_result): Use timetick2dblnum and timetick2integer.
- (rb_clock_gettime): Follow the make_clock_result change.
-
-Fri Aug 23 18:39:04 2013 Koichi Sasada <ko1@atdot.net>
-
- * array.c (ary_make_shared): shared ary as shady. Need more effort to
- make it normal object.
-
- * array.c (rb_ary_modify): use RARRAY_PTR_USE() without WB because
- there are not new relations.
-
- * array.c (ary_ensure_room_for_unshift): use RARRAY_RAWPTR() because
- there are not new relations.
-
-Fri Aug 23 11:25:57 2013 Koichi Sasada <ko1@atdot.net>
-
- * array.c: introduce ARY_SHARED_OCCUPIED(shared).
-
-Fri Aug 23 11:07:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/Makefile.sub (config.h): now SIZEOF_CLOCK_T is needed for
- unsigned_clock_t.
-
-Thu Aug 22 22:01:04 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_gettime): Strip "s" from unit names.
-
-Thu Aug 22 20:14:59 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (unsigned_clock_t): Defined.
- (rb_clock_gettime): Consider clock_t overflow for
- ISO_C_CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID.
-
- * configure.in: Check the size of clock_t.
-
-Thu Aug 22 16:22:48 2013 Koichi Sasada <ko1@atdot.net>
-
- * compile.c (build_postexe_iseq): fix to setup the local table.
-
-Thu Aug 22 15:42:43 2013 Koichi Sasada <ko1@atdot.net>
-
- * compile.c (rb_iseq_compile_node): accept NODE_IFUNC to support
- custom compilation.
-
- * compile.c (NODE_POSTEXE): compile to
- "ONCE{ VMFrozenCore::core#set_postexe{...} }" with a new custom
- compiler `build_postexe_iseq()'.
-
- * vm.c (m_core_set_postexe): remove parameters (passed by a block).
-
-Thu Aug 22 06:54:15 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_gettime): Change emulation symbols for
- Process.clock_gettime.
-
-Thu Aug 22 06:24:54 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (make_clock_result): Extracted from rb_clock_gettime.
-
-Wed Aug 21 22:30:51 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_gettime): clock() based CLOCK_PROCESS_CPUTIME_ID
- emulation implemented.
-
-Wed Aug 21 21:02:37 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_proc_times): Use RB_GC_GUARD to guard objects from GC.
-
-Wed Aug 21 20:33:01 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (get_clk_tck): Extracted from rb_proc_times.
- (rb_clock_gettime): times() based CLOCK_PROCESS_CPUTIME_ID emulation
- is implemented.
-
-Wed Aug 21 19:31:48 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c: POSIX_GETTIMEOFDAY_CLOCK_REALTIME is renamed to
- SUS_GETTIMEOFDAY_CLOCK_REALTIME.
-
-Wed Aug 21 19:17:46 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_gettime): CLOCK_PROCESS_CPUTIME_ID emulation
- using getrusage is implemented.
-
-Wed Aug 21 17:34:27 2013 Tanaka Akira <akr@fsij.org>
-
- * gc.c (getrusage_time): Fallback clock_gettime to getrusage when
- clock_gettime fails.
- Reported by Eric Saxby. [ruby-core:56762] [Bug #8805]
-
-Wed Aug 21 02:32:32 2013 Koichi Sasada <ko1@atdot.net>
-
- * insns.def: fix regexp's once option behavior.
- fix [ruby-trunk - Bug #6701]
-
- * insns.def: remove `onceinlinecache' and introduce `once' instruction.
- `once' doesn't use `setinlinecache' insn any more.
-
- * vm_core.h: `union iseq_inline_storage_entry' to store once data.
-
- * compile.c: catch up above changes.
-
- * iseq.c: ditto.
-
- * vm.c, vm_insnhelper.c: ditto. fix `m_core_set_postexe()' which
- is depend on `onceinlinecache' insn.
-
- * test/ruby/test_regexp.rb: add tests.
-
- * iseq.c: ISEQ_MINOR_VERSION to 1 (should increment major?)
-
-Wed Aug 21 02:30:15 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_gcdebug_print_obj_condition): add printing information.
-
-Tue Aug 20 13:38:00 2013 Naohisa Goto <ngotogenome@gmail.com>
-
- * test/gdbm/test_gdbm.rb: skip TestGDBM#test_s_open_lock on Solaris.
- On Solaris (and platforms which do not have flock and have lockf),
- with GDBM 1.10, gdbm_open(3) blocks when opening already locked
- gdbm file. [Bug #8790] [ruby-dev:47631]
-
-Tue Aug 20 02:32:52 2013 Zachary Scott <e@zzak.io>
-
- * lib/test/: [DOC] Document Test::Unit, hide most submodules and
- classes from rdoc. Since lib/test is only present as a compatibility
- layer with the legacy test suite many test/unit users will be using
- minitest or the test/unit gem instead. It is recommended to use one
- of these alternatives for writing new tests.
-
- This patch was based on a patch submitted by Steve Klabnik.
- [ruby-core:56694] [Bug #8778]
-
-Tue Aug 20 02:10:19 2013 Zachary Scott <e@zzak.io>
-
- * lib/rss/rss.rb: [DOC] Document for constants by Steve Klabnik
- [ruby-core:56705] [Bug #8798]
-
-Tue Aug 20 02:01:10 2013 Zachary Scott <e@zzak.io>
-
- * lib/rss/xmlparser.rb: [DOC] Hide legacy constant from rdoc
- Patch by Steve Klabnik [ruby-core:56708] [Bug #8799]
-
-Tue Aug 20 01:52:05 2013 Zachary Scott <e@zzak.io>
-
- * ext/socket/unixserver.c: [DOC] Document #accept
- * ext/socket/tcpserver.c: ditto
- * ext/socket/udpsocket.c: [DOC] Fix indentation of documentation
- * ext/socket/socket.c: ditto
- Patches by David Rodr'iguez [ruby-core:56734] [Bug #8802]
-
-Tue Aug 20 01:19:22 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Define ac_cv_func_clock_gettime to yes for mingw*.
-
-Mon Aug 19 21:31:35 2013 Tanaka Akira <akr@fsij.org>
-
- * include/ruby/defines.h: Fix a compilation error with
- i586-mingw32msvc-gcc of gcc-mingw32 package on Debian squeeze.
- ruby/missing.h should be included before include/ruby/win32.h
- because struct timespec, used in the clock_gettime declaration in
- include/ruby/win32.h, is defined in ruby/missing.h instead of
- system headers.
-
-Mon Aug 19 20:55:12 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: fix around GC_DEBUG.
-
- * gc.c (RVALUE::line): should be VALUE. On some environment
- (such as mswin64), `int' introduces alignment mismatch.
-
- * gc.c (newobj_of): add an assertion to check VALUE alignment.
-
- * gc.c (aligned_malloc): `&' is low priority than `=='.
-
- * gc.c: define GC_DEBUG everytime and use it as value 0 or 1.
-
-Mon Aug 19 17:43:44 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/ruby/test_fiber.rb: collect garbage fibers immediately.
-
-Mon Aug 19 17:41:49 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/profile_test_all.rb: add `failed?' information.
-
-Mon Aug 19 17:00:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * process.c (retry_fork): retry with GC if ENOMEM occurred, to free
- swap/kernel space.
-
-Mon Aug 19 13:28:47 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * include/ruby/win32.h (CLOCK_MONOTONIC): typo.
-
- * win32/win32.c: removed duplicated declarations.
-
-Mon Aug 19 13:03:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (clock_gettime): should not overwrite cache variable
- with different condition. otherwise -lrt is not linked and the link
- fails, after reconfig.
-
-Mon Aug 19 12:56:49 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (Init_process): Add constants: CLOCK_REALTIME_ALARM and
- CLOCK_BOOTTIME_ALARM.
-
-Sun Aug 18 20:17:41 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * variable.c, vm_method.c: remove dead code.
-
- * test/ruby/test_fiber.rb, test/ruby/test_thread.rb:
- change accordingly.
-
-Sun Aug 18 19:32:26 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * error.c, file.c, gc.c, hash.c, thread.c, variable.c, vm_eval.c, bin/erb:
- $SAFE=4 is obsolete.
-
-Sun Aug 18 14:30:47 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_gettime): Rename POSIX_TIME_CLOCK_REALTIME to
- ISO_C_TIME_CLOCK_REALTIME.
-
-Sun Aug 18 14:22:45 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Revert r42604. It causes linking librt on systems
- with newer glibc uselessly.
-
-Sun Aug 18 13:18:38 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (Init_process): Add constants: CLOCK_REALTIME_COARSE,
- CLOCK_MONOTONIC_COARSE and CLOCK_BOOTTIME.
-
-Sun Aug 18 12:41:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (clock_gettime): need to check with -lrt prior to check
- for the function only. otherwise -lrt is not linked and the link
- fails, when ac_cv_func_clock_gettime is cached as yes.
-
-Sun Aug 18 10:05:12 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big2str1): Make an expression more explicit.
-
-Sun Aug 18 03:18:45 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big2str1): Use power_level instead of bitsize(xn).
-
-Sun Aug 18 00:44:58 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (BIGDIVREM_EXTRA_WORDS): Redefine to 1.
- (bigdivrem_num_extra_words): Removed.
- (bigdivrem_normal): Simplified.
- (big2str_karatsuba): Ditto.
-
-Sat Aug 17 23:25:19 2013 Benoit Daloze <eregontp@gmail.com>
-
- * test/ruby/test_time.rb: use the in_timezone() helper
- and define it at the top with other helpers.
-
-Sat Aug 17 22:20:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * time.c (time_mload): ignore auxiliary data, offset and zone, if
- invalid. [ruby-core:56648] [Bug #8795]
-
-Sat Aug 17 20:11:49 2013 Benoit Daloze <eregontp@gmail.com>
-
- * process.c: [DOC] MACH_ABSOLUTE_TIME_CLOCK_MONOTONIC is an
- available emulation for a monotonic clock on Darwin.
- https://developer.apple.com/library/mac/qa/qa1398/_index.html
-
-Fri Aug 16 18:12:05 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/profile_test_all.rb: fix typo.
-
-Fri Aug 16 18:09:20 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/profile_test_all.rb: remove space characters from test names.
-
-Fri Aug 16 17:32:02 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/profile_test_all.rb: refactoring memory profiling tool for
- test-all.
- Add profiling targets /proc/meminfo and /proc/self/status.
-
- * test/runner.rb: accept other than 'true'.
-
-Fri Aug 16 11:23:35 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * file.c (rb_file_size, rb_file_flock): improve performance of Windows.
-
- * file.c (rb_file_truncate): removed unnecessary #ifdef.
-
- * test/test_file.rb (TestFile#test_truncate_size): added an assertion
- for File#size.
-
-Fri Aug 16 10:07:59 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigdivrem_single1): Renamed from bigdivrem_single. Add
- x_higher_bdigit argument.
- (bigdivrem_single): Just call bigdivrem_single1.
- (bigdivrem_restoring): Use bigdivrem_single1 to avoid memmove.
-
-Fri Aug 16 09:17:00 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_small_rshift): Specify the higher BDIGIT instead of
- sign bit.
- (big_shift3): Follow the above change.
-
-Fri Aug 16 02:20:39 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_mul_toom3): Reduce a branch.
-
-Fri Aug 16 02:14:09 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * process.c (rb_clock_gettime): add CLOCK_MONOTONIC support on OS X.
- http://developer.apple.com/library/mac/qa/qa1398/_index.html
- [Feature #8658]
-
-Fri Aug 16 01:37:43 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigdivrem_single): Use shift when y is a power of two.
-
-Fri Aug 16 01:09:33 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigdivrem_restoring): Use bigdivrem_single if non-topmost
- BDIGITs of y are zero.
-
-Fri Aug 16 00:33:12 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big2str1): Truncate topmost zeros of x.
-
-Fri Aug 16 00:00:57 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_divmod): Simplify an expression.
-
-Thu Aug 15 23:26:12 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigdivrem_normal): Remove a local variable.
-
-Thu Aug 15 23:08:32 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_karatsuba): Use bigdivrem_restoring directly to
- reduce working buffer and memory copy.
- (rb_big2str1): Allocate working buffer for big2str_karatsuba here.
-
-Thu Aug 15 20:51:29 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * io.c, internal.h (rb_io_flush_raw): new function to select calling
- fsync() (on Windows).
-
- * io.c (rb_io_flush_raw): use above function.
-
- * file.c (rb_file_truncate): use above function.
-
- * test/ruby/test_file.rb (TestFile#test_truncate_size): test for
- above changes.
-
-Thu Aug 15 18:39:31 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/win32.c (clock_gettime): improve precision when freq is less
- than and nearly equals 10**9.
-
-Thu Aug 15 17:43:15 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_lazy_sweep): remove heap_increment() here because heap_inc
- may be 0.
-
-Thu Aug 15 16:59:56 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * io.c (rb_io_rewind): remove fsync() for Windows to improve the
- performance.
-
-Thu Aug 15 16:30:23 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * test/fileutils/test_fileutils.rb (TestFileUtils#test_rmdir):
- FileUtils.rmdir ignores Errno::ENOTEMPTY, so, in such cases, this
- assertion is nonsense.
-
-Thu Aug 15 15:49:35 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_gettime): [DOC] FreeBSD 7.1 supports
- CLOCK_THREAD_CPUTIME_ID.
- http://www.freebsd.org/releases/7.1R/relnotes.html
-
-Thu Aug 15 14:30:23 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * include/ruby/win32.h, win32/Makefile.sub, win32/win32.c
- (clock_gettime): [experimental] emulates clock_gettime(2) of posix.
-
-Thu Aug 15 02:32:40 2013 Zachary Scott <e@zzak.io>
-
- * hash.c (rb_hash_aset): [DOC] Document key dup patch by @kachick
- [Fixes GH-382] https://github.com/ruby/ruby/pull/382
-
-Wed Aug 14 14:28:39 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * proc.c (rb_mod_define_method): now they return the symbols of the
- defined methods, not the methods/procs themselves.
- [ruby-dev:42151] [Feature #3753]
-
- * NEWS: documents about above change and def-expr (see r42337).
-
- * test/ruby/test_module.rb: tests about above change.
-
-Wed Aug 14 00:51:14 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigdivrem_restoring): xn argument removed.
- (bigdivrem_normal): Follow the above change.
-
-Wed Aug 14 00:18:39 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big_div_struct): Remove xn and j field. Add zn field.
- (bigdivrem1): Follow the above change.
- (bigdivrem_restoring): Ditto.
-
-Tue Aug 13 23:38:17 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big_div_struct): ynzero field removed.
- (bigdivrem1): Follow the above change.
- (bigdivrem_restoring): Ditto.
-
-Tue Aug 13 23:01:16 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigdivrem_restoring): Extracted from bigdivrem_normal.
-
-Tue Aug 13 22:12:59 2013 Kenichi Kamiya <kachick1@gmail.com>
-
- * random.c (rb_random_ulong_limited): coerce before check negative.
- [Fixes GH-379]
-
-Tue Aug 13 21:52:15 2013 Kenichi Kamiya <kachick1@gmail.com>
-
- * object.c (Init_Object): undef Module#prepend_features on Class, as
- well as Module#append_features. [Fixes GH-376]
-
- * test_class.rb: Added test for above. And ensure type checking
- on similar methods as module_function.
-
-Tue Aug 13 08:52:18 2013 Zachary Scott <e@zzak.io>
-
- * doc/syntax/literals.rdoc: [DOC] String literal concat by @cknadler
- [Fixes GH-380] https://github.com/ruby/ruby/pull/380
-
-Mon Aug 12 23:07:21 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (gc_marks_test): inhibit gc for st's operation.
-
-Mon Aug 12 15:59:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_whole_match_p): treat CR in middle of a line as a
- mere whitespace.
-
-Mon Aug 12 15:16:58 2013 Koichi Sasada <ko1@atdot.net>
-
- * class.c (rb_prepend_module): make T_ICLASS object shady because
- this T_ICLASS object seems to share method table with other class
- objects. It was causes WB miss.
- TODO: need to know the data structure.
-
- * test/ruby/test_module.rb: add a test for WB miss.
-
-Mon Aug 12 13:47:54 2013 Zachary Scott <e@zzak.io>
-
- * process.c: [DOC] RDoc formatting of Process.clock_gettime
-
-Mon Aug 12 13:29:09 2013 Zachary Scott <e@zzak.io>
-
- * lib/yaml/dbm.rb: [DOC] Document call-seq for YAML::DBM
-
-Mon Aug 12 12:57:26 2013 Zachary Scott <e@zzak.io>
-
- * ext/dbm/extconf.rb: [DOC] Hide from RDoc
- Some libraries might want to document extconf.rb so RDoc treats it
- like any other ruby program. However, DBM users shouldn't care about
- these methods.
-
-Mon Aug 12 12:53:39 2013 Zachary Scott <e@zzak.io>
-
- * ext/dbm/dbm.c: [DOC] Reformat headings of DBM class
-
-Mon Aug 12 12:46:31 2013 Zachary Scott <e@zzak.io>
-
- * lib/yaml.rb, lib/yaml/: [DOC] Document YAML::DBM#key and add
- references to similar methods with more detail. This patch brings
- lib/yaml to 100% documentation coverage.
-
-Mon Aug 12 02:51:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/readline/readline.c (readline_s_set_input): on OS X with editline,
- Readline.readline doesn't work because readline_get doesn't use
- rl_getc. The difference is introduced by r42402 [ruby-dev:47509]
- [Bug #8644]. Before it rb_io_stdio_file set ifp->stdio_file.
- Therefore add manually setting the value.
-
- * ext/readline/readline.c (readline_s_set_output): ditto.
-
-Sun Aug 11 23:27:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * file.c (rb_str_encode_ospath): OS path encoding on Mac OS X is also
- fixed.
-
-Sun Aug 11 22:57:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * test/ruby/test_require.rb (assert_require_nonascii_path): OS path
- encoding on Windows is fixed, so encoding of __FILE__ should be it.
- [ruby-core:56498] [Bug #8764]
-
-Sun Aug 11 19:11:45 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/parser/test_sax2.rb: Expand abbreviated class name.
-
-Sun Aug 11 19:06:03 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/sax2listener.rb (REXML::SAX2Listener#notationdecl): Fix
- wrong number of arguments in the template listener.
- [Bug #8731] [ruby-dev:47582]
- Reported by Ippei Obayashi.
- * test/rexml/parser/test_sax2.rb: Add tests for parsing notation
- declarations with SAX2 API.
-
-Sun Aug 11 18:44:04 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/sax2listener.rb (REXML::SAX2Listener#elementdecl): Fix wrong
- examples. [Bug #8731] [ruby-dev:47582]
- Reported by Ippei Obayashi.
-
-Sun Aug 11 18:42:13 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/sax2parser.rb
- (REXML::Parsers::SAX2Parser#handle_entitydecl): Extract.
-
-Sun Aug 11 18:40:25 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse):
- Fix wrong "%" position in parameter entity declaration event argument.
- * test/rexml/parser/test_sax2.rb: Add tests for the above case.
-
-Sun Aug 11 18:08:40 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse):
- Support NDATA in external ID entity declaration.
- * test/rexml/parser/test_sax2.rb: Add tests for the above case.
-
-Sun Aug 11 18:07:39 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/baseparser.rb
- (REXML::Parsers::BaseParser#pull_event): Support optional NDATA
- in external ID entity declaration.
-
-Sun Aug 11 17:54:07 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * NEWS (REXML::Parsers::SAX2Parser): Add about this change.
- * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse):
- Fix wrong number of arguments. Document says "an array of the
- entity declaration" but it passes two or more arguments.
- This is a bug but it break backward compatibility.
- Reported by Ippei Obayashi. [Bug #8731] [ruby-dev:47582]
- * lib/rexml/sax2listener.rb (REXML::SAX2Listener#entitydecl): ditto.
- The listener template accepted two arguments.
- * test/rexml/parser/test_sax2.rb: Add tests for external ID case.
-
-Sun Aug 11 17:41:41 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/parser/test_sax2.rb: Add SAX2 API test.
-
-Sun Aug 11 15:10:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (rb_enc_symname_type): allow ID_ATTRSET for ID_INSTANCE,
- ID_GLOBAL, ID_CLASS, ID_JUNK too. [Bug #8756]
-
-Sun Aug 11 13:17:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * include/ruby/encoding.h: Reduce ENCODING_INLINE_MAX to 127 as this
- should be sufficient to represent all the encodings Ruby supports.
-
-Sun Aug 11 11:54:38 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c (rb_clock_gettime): New method.
- This is accepted in the meeting:
- https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20130809
- This method is accepted as a CRuby feature.
- I.e. Other Ruby implementations don't need to implement it.
- [ruby-core:56087] [Feature #8658]
-
-Sun Aug 11 10:40:48 2013 Zachary Scott <e@zzak.io>
-
- * lib/time.rb: [DOC] Correcting rdoc visibility of time.rb constants
- Reported by Tanaka Akira [ruby-core:56517]
-
-Sun Aug 11 04:48:14 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * file.c (rb_str_normalize_ospath):
- HFS Plus (Mac OS Extended) uses a variant of Normal Form D in which
- U+2000 through U+2FFF, U+F900 through U+FAFF, and U+2F800 through
- U+2FAFF are not decomposed (this avoids problems with round trip
- conversions from old Mac text encodings).
- http://developer.apple.com/library/mac/qa/qa1173/_index.html
- Therefore fix r42457 to exclude the range.
-
-Sun Aug 11 03:26:07 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bitsize): Fix a conditional expression.
-
-Sun Aug 11 02:44:03 2013 Zachary Scott <e@zzak.io>
-
- * lib/time.rb: [DOC] Document constants by @markijbema [Fixes GH-377]
- https://github.com/ruby/ruby/pull/377
-
-Sun Aug 11 01:28:52 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Revert r42458.
- It removes the HAVE_CLOCK_GETTIME from config.h.
- http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130809T044800Z.diff.html.gz
-
-Sat Aug 10 13:53:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (rb_id_attrset): allow other than ID_ATTRSET.
-
- * parse.y (intern_str): ditto. try stem ID for ID_INSTANCE,
- ID_GLOBAL, ID_CLASS, ID_JUNK too. [Bug #8756]
-
-Sat Aug 10 12:49:50 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/baseparser.rb
- (REXML::Parsers::BaseParser::CDATA_END): Use "\A" instead of "^".
- It is not an used constant but I fix it. (Or should I remove it?)
-
-Sat Aug 10 12:47:19 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser):
- Fix wrong constant name. "]>" pattern match is the same but
- it is used for "<!DOCTYPE" end mark not "<![CDATA[" end mark.
-
-Sat Aug 10 12:43:15 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser):
- Use "\A" instead of "^" in document type declaration patterns
- because they are used as the head match in content not the head
- match in line. They don't cause any problems in the current code
- but it should be fixed.
-
-Sat Aug 10 12:39:00 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/parse/test_document_type_declaration.rb: Add tests for
- parsing document type declaration.
-
-Sat Aug 10 12:00:45 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser::SYSTEM):
- Fix loose "head" match regular expression. It doesn't cause any
- problem in the current code but it should be fixed because readers
- may confuse it.
- Patch by Ippei Obayashi. Thanks!!!
-
-Sat Aug 10 11:58:24 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/parse/test_notation_declaration.rb (#test_system_public):
- Add a test for PUBLIC notation and SYSTEM notation order case.
-
-Sat Aug 10 11:31:35 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser::PUBLIC):
- Fix loose "head" match regular expression.
- [Bug #8701] [ruby-dev:47551]
- Patch by Ippei Obayashi. Thanks!!!
- * test/rexml/parse/test_notation_declaration.rb (#test_system_public):
- Add a test for the above case.
-
-Sat Aug 10 09:20:21 2013 Zachary Scott <e@zzak.io>
-
- * NEWS: [DOC] typo in example reported by @moretea
- https://github.com/ruby/ruby/commit/a39e724#commitcomment-3831489
-
-Sat Aug 10 09:19:04 2013 Zachary Scott <e@zzak.io>
-
- * proc.c: [DOC] rdoc code formatting
-
-Sat Aug 10 09:12:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (rb_id_attrset): check if the argument is valid type as an
- attribute.
-
-Sat Aug 10 05:44:08 2013 Zachary Scott <e@zzak.io>
-
- * lib/rss/trackback.rb: [DOC] Hide RSS::Trackback from rdoc
- Patch by Steve Klabnik [Bug #8755] [ruby-core:56456]
-
-Sat Aug 10 04:52:21 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big_div_struct): Use size_t.
- (bigdivrem1): Ditto.
- (bigdivrem_num_extra_words): Ditto.
- (bigdivrem_single): Ditto.
- (bigdivrem_normal): Ditto.
- (bary_divmod): Ditto.
-
-Fri Aug 9 23:47:15 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rss/rexmlparser.rb: Remove needless REXML version check.
- Both RSS Parser and REXML are bundled in Ruby. RSS Parser can
- always use the latest REXML. [Bug #8754] [ruby-core:56454]
- Patch by Steve Klabnik. Thanks!!!
-
-Fri Aug 9 22:51:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (XLDFLAGS, LIBRUBYARG_STATIC): CoreFoundation framework
- option is now needed always, regardless enable-shared.
- [ruby-core:56467] [Bug #8759]
-
-Fri Aug 9 22:20:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ruby.c (load_file_internal): use rb_parser_compile_string_path and
- rb_parser_compile_file_path, String path name versions. [Bug #8753]
-
-Fri Aug 9 07:16:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * ext/io/console/console.c: delete redefinition of rb_cloexec_open.
- drop support for 1.8 and 1.9 from the next release of io-console gem.
-
-Fri Aug 9 19:13:54 2013 Koichi Sasada <ko1@atdot.net>
-
- * NEWS: update about new methods for Binding.
-
-Fri Aug 9 18:48:09 2013 Koichi Sasada <ko1@atdot.net>
-
- * proc.c: add Binding#local_variable_get/set/defined?
- to access local variables which a binding contains.
- Most part of implementation by nobu.
-
- * test/ruby/test_proc.rb: add a tests for above.
-
- * vm.c, vm_core.h (rb_binding_add_dynavars): add a new function
- to add a new environment to create space for new local variables.
-
-Fri Aug 9 14:02:01 2013 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-
- * tool/make-snapshot: Fix order of priority for option parameter.
-
-Fri Aug 9 12:06:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * file.c (rb_str_normalize_ospath): normalize to Normalization Form C
- using CFString.
-
-Fri Aug 9 10:53:57 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * time.c (get_timeval, get_new_timeval): use rb_obj_class()
- instead of CLASS_OF() because CLASS_OF() may return
- a singleton class.
-
-Fri Aug 9 10:42:11 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * vm_insnhelper.c (vm_invoke_block): returning from lambda proc
- now always exits from the Proc. [ruby-core:56193] [Feature #8693]
-
- * NEWS, test/ruby/test_lambda.rb: ditto. Patch by nobu.
-
-Fri Aug 9 00:10:32 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * enumerator.c (lazy_zip_func): fix non-single argument. fix
- out-of-bound access and pack multiple yielded values.
- [ruby-core:56383] [Bug #8735]
-
-Thu Aug 8 23:01:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * object.c (rb_mod_singleton_p): new method Module#singleton_class? to
- return whether the receiver is a singleton class or not.
- [ruby-core:51087] [Feature #7609]
-
-Thu Aug 8 21:56:44 2013 Tanaka Akira <akr@fsij.org>
-
- * time.c (time_overflow_p): Avoid signed integer overflow.
- (rb_time_new): Fix overflow condition.
-
-Thu Aug 8 19:58:02 2013 Koichi Sasada <ko1@atdot.net>
-
- * thread.c (rb_threadptr_pending_interrupt_check_mask):
- use RARRAY_RAWPTR() instead of RARRAY_PTR() because
- there is no new reference.
-
-Thu Aug 8 19:56:52 2013 Koichi Sasada <ko1@atdot.net>
-
- * string.c (rb_str_format_m): use RARRAY_RAWPTR() instead of
- RARRAY_PTR() because there is no new reference.
-
-Thu Aug 8 19:55:51 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: define USE_RGENGC_LOGGING_WB_UNPROTECT.
-
-Thu Aug 8 16:44:25 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: add old macro name `RUBY_EVENT_SWITCH'.
- This macro name is obsolete because it is renamed to
- RUBY_INTERNAL_EVENT_SWITCH, but it has compatibility problem
- using this macro name like ruby-prof.
- I want to remove this macro after ruby 2.1.
-
-Thu Aug 8 15:37:53 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * test/coverage/test_coverage.rb (TestCoverage#test_big_code): use `1'
- instead of `p' to get rid of a side effect.
- Kernel#p without any argument seems to do nothing, but flushes stdout.
- and, if stdout is redirected to file, fsync() will be called on
- Windows. so, when running test-all on Windows with redirection, such
- as CI environment, this test took a lot of time.
-
-Thu Aug 8 14:54:18 2013 Shugo Maeda <shugo@ruby-lang.org>
-
- * NEWS: add description of incompatibility introduced by r42396.
- [ruby-core:56329] [Bug #8722]
-
-Thu Aug 8 14:50:36 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * common.mk (mini): portable target to build miniruby
-
- * common.mk (bisect): run git-bisect with miniruby
-
- * common.mk (bisect-ruby): run git-bisect with ruby
-
- * tool/bisect.sh: script for git-bisect
-
-Thu Aug 8 12:11:43 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * test/webrick/test_httpresponse.rb (test_send_body_*_chunked): these
- expectations assumes that the IOs are binmode. fixed test failures
- introduced at r42427 on Windows.
-
-Thu Aug 8 10:27:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * range.c (range_last): revert r42400. [Bug #8739]
-
-Thu Aug 8 10:26:25 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * file.c (rb_str_normalize_ospath): extract and move from dir.c.
-
-Thu Aug 8 05:59:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * test/openssl/test_ssl.rb: Fix test for CVE-2013-4073.
- Patch by Antonio Terceiro. [Bug #8750] [ruby-core:56437]
-
-Thu Aug 8 03:37:38 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/webrick/httpresponse.rb: Allow #body to be an IO-like object
- that responds to #readpartial and #read.
- [ruby-trunk - Feature #8155]
- * NEWS: NEWS for above
- * test/webrick/test_httpresponse.rb: Tests for above.
-
-Wed Aug 7 23:06:26 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * ruby.c (Process.argv0): New method to return the original value
- of $0. [Feature #8696]
-
-Wed Aug 7 23:05:55 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * ruby.c (Process.setproctitle): New method to change the title of
- the running process that is shown in ps(1). [Feature #8696]
-
-Wed Aug 7 20:05:38 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big_odd_p): Check the bignum length.
- (rb_big_even_p): Ditto.
-
-Wed Aug 7 19:29:26 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (dbl2big): A condition simplified.
-
-Wed Aug 7 16:34:30 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * test/webrick/test_cgi.rb (TestWEBrickCGI#{start_cgi_server,test_cgi}):
- mswin is not only mswin32 but also mswin64. [Bug #8746]
-
-Wed Aug 7 16:19:12 2013 Koichi Sasada <ko1@atdot.net>
-
- * cont.c (rb_fiber_start): use RARRAY_RAWPTR() instead of
- RARRAY_PTR() because there is no new reference.
-
- * proc.c (curry): ditto.
-
- * proc.c (rb_proc_call): remove line break.
-
-Wed Aug 7 13:20:12 2013 Koichi Sasada <ko1@atdot.net>
-
- * random.c (random_load): use RARRAY_RAWPTR() instead of
- RARRAY_PTR() because there is no new reference.
-
-Wed Aug 7 12:58:23 2013 Koichi Sasada <ko1@atdot.net>
-
- * thread.c (thread_start_func_2): use RARRAY_RAWPTR() instead of
- RARRAY_PTR() because there is no new reference.
-
-Wed Aug 7 09:00:24 2013 Zachary Scott <e@zzak.io>
-
- * string.c: [DOC] Description of rb_str_equal [Fixes GH-375]
- Based on a patch by @markijbema
- https://github.com/ruby/ruby/pull/375
-
-Wed Aug 7 08:30:38 2013 Zachary Scott <e@zzak.io>
-
- * ext/openssl/ossl_hmac.c: [DOC] Documentation for OpenSSL::HMAC
- based on a patch by @repah documenting-ruby/ruby#14
- https://github.com/documenting-ruby/ruby/pull/14
-
-Wed Aug 7 07:46:23 2013 Zachary Scott <e@zzak.io>
-
- * lib/rss/utils.rb: [DOC] RSS::Utils by Steve Klabnik [Bug #8745]
-
-Wed Aug 7 07:38:39 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (nlz16): Removed.
- (nlz32): Ditto.
- (nlz64): Ditto.
- (nlz128): Ditto.
- (nlz_int): New function.
- (nlz_long): New function.
- (nlz_long_long): New function.
- (nlz_int128): New function.
- (nlz): Follow above changes.
- (bitsize): Follow above changes.
-
-Tue Aug 6 22:38:15 2013 Zachary Scott <e@zzak.io>
-
- * time.c: [DOC] Typo in Time overview by @sparr [Fixes GH-374]
- https://github.com/ruby/ruby/pull/374
-
-Tue Aug 6 22:35:32 2013 Zachary Scott <e@zzak.io>
-
- * lib/rss/1.0.rb: [DOC] Document RSS10 by Steve Klabnik [Bug #8740]
-
-Tue Aug 6 22:14:11 2013 Kouji Takao <kouji.takao@gmail.com>
-
- * ext/readline/readline.c (readline_s_delete_text): remove
- checking "$SAFE == 4".
-
- * ext/readline/readline.c: fix rdoc, remove "Raises SecurityError"
- and add "Raises NotImplementedError".
-
-Tue Aug 6 22:04:38 2013 Kouji Takao <kouji.takao@gmail.com>
-
- * ext/readline/readline.c, test/readline/test_readline.rb: fix
- indent.
-
-Tue Aug 6 21:59:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * range.c (range_last): return nil for empty range, or in the case the
- predecessor is smaller than the begin. [Bug #8739]
-
-Tue Aug 6 21:48:31 2013 Kouji Takao <kouji.takao@gmail.com>
-
- * ext/readline/readline.c (readline_s_set_point, Init_readline):
- add Readline.point=(pos). Patched by naruse. [ruby-dev:47535]
- [Feature #8675]
-
-Tue Aug 6 21:14:11 2013 Kouji Takao <kouji.takao@gmail.com>
-
- * ext/readline/readline.c (Init_readline, readline_s_set_output)
- (clear_rl_outstream, readline_s_set_input, clear_rl_instream)
- (readline_readline): fix causing SEGV if closed IO object that is
- set Readline.input or Readline.output. Patched by akr
- [ruby-dev:47509] [Bug #8644]
+Sat Jul 5 05:05:53 2014 Vipul A M <vipulnsward@gmail.com>
-Tue Aug 6 17:56:40 2013 Koichi Sasada <ko1@atdot.net>
+ * lib/irb/locale.rb (IRB::Locale#modifier): fix wrong attr_reader
+ `modifieer` => `modifier` from irb locale. [fix GH-656]
- * vm_insnhelper.c (vm_push_frame): change type of stack_max to size_t.
+Fri Jul 4 20:45:26 2014 Koichi Sasada <ko1@atdot.net>
-Tue Aug 6 17:42:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * parse.y: rename symbols::sym_id to symbols::str_id.
+ This table is not {Symbol => ID} table, but
+ {String => ID} table.
- * range.c (range_last): exclude the last number of the exclusive range
- if the end is Numeric. [ruby-dev:47587] [Bug #8739]
+ * parse.y (lookup_sym_id): also rename lookup_sym_id() to
+ lookup_str_id() because key is not Symbol, but String.
-Tue Aug 6 17:42:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Jul 4 18:42:04 2014 Koichi Sasada <ko1@atdot.net>
- * win32/win32.c (rb_w32_conv_from_wchar): converted string to CP_UTF8
- should have UTF-8 encoding. otherwise no conversion takes place
- later.
-
-Tue Aug 6 17:21:38 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_insnhelper.c (vm_push_frame): fix stack overflow check codes.
- Stack overflow check should be done *after* pushing a stack frame.
- However, some stack overflow checking codes checked *before*
- pushing a stack frame with iseq->stack_max.
- To solve this problem, add a new parameter `stack_max' to specify
- a possible consuming stack size.
-
- * vm_core.h (CHECK_VM_STACK_OVERFLOW0): add to share the stack overflow
- checking code.
-
- * insns.def: catch up this change.
-
- * vm.c, vm_eval.c: ditto.
-
- * test/ruby/test_exception.rb: add a stack overflow test.
- This code is reported by nobu.
-
-Tue Aug 6 17:02:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/win32.c (rb_w32_conv_from_wchar): use WideCharToMultiByte(),
- as like as mbstr_to_wstr(), in the first step of the conversion from
- WCHAR.
-
-Tue Aug 6 16:14:32 2013 Shugo Maeda <shugo@ruby-lang.org>
-
- * vm_eval.c (eval_string_with_cref): copy cref to limit the scope of
- refinements in the eval string. [ruby-core:56329] [Bug #8722]
-
- * test/ruby/test_refinement.rb: related test.
-
-Tue Aug 6 12:23:12 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big_realloc): Use VALGRIND_MAKE_MEM_UNDEFINED to
- declare undefined memory area.
- (bignew_1): Ditto.
-
- * internal.h (VALGRIND_MAKE_MEM_DEFINED): Moved from gc.c
- (VALGRIND_MAKE_MEM_UNDEFINED): Ditto.
-
-Tue Aug 6 01:40:37 2013 Zachary Scott <e@zzak.io>
-
- * process.c: [DOC] Document caveats of command form of Process.spawn
- with regard to the shell and OS. Patched by Steve Klabnik [Bug #8550]
-
-Tue Aug 6 01:28:35 2013 Zachary Scott <e@zzak.io>
-
- * lib/rss/0.9.rb: [DOC] Typo in example [Bug #8732]
-
-Tue Aug 6 01:22:37 2013 Zachary Scott <e@zzak.io>
-
- * lib/rss/2.0.rb: [DOC] Document RSS::Rss by Steve Klabnik #8740
- * lib/rss/atom.rb: [DOC] Typo in rdoc by Steve Klabnik
-
-Mon Aug 5 23:47:59 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c: Rename local variables.
-
-Mon Aug 5 22:23:59 2013 Zachary Scott <e@zzak.io>
-
- * vm_trace.c: [DOC] Fix TracePoint return values in examples
- Based on a patch by @sho-h [Fixes GH-373]
- https://github.com/ruby/ruby/pull/373
-
-Mon Aug 5 17:38:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/win32.c (rb_w32_write_console): use MultiByteToWideChar() for
- the last step of conversion to WCHAR, to get rid of warnings from
- rb_enc_find() in miniruby. [ruby-dev:47584] [Bug #8733]
-
- * win32/win32.c (wstr_to_mbstr, mbstr_to_wstr): fix wrong trimming.
- WideCharToMultiByte() and MultiByteToWideChar() do not count
- NUL-terminator in the size for conversion result, unless the input
- length is -1.
-
-Mon Aug 5 11:51:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * include/ruby/encoding.h: document which user flags are used by
- ENCODING_MASK for better greppability
-
-Mon Aug 5 10:01:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * object.c (rb_class_inherited_p): allow iclasses to be tested for
- inheritance. [Bug #8686] [ruby-core:56174]
-
- * test/ruby/test_method.rb: add test
-
-Mon Aug 5 06:13:48 2013 Zachary Scott <e@zzak.io>
-
- * enumerator.c: [DOC] Remove reference to Enumerator::Lazy#cycle
- Patch by @kachick [Fixes GH-372]
- https://github.com/ruby/ruby/pull/372
-
-Mon Aug 5 03:57:16 2013 Zachary Scott <e@zzak.io>
-
- * lib/rss/0.9.rb: [DOC] Document RSS09 by Steve Klabnik [Bug #8732]
-
-Mon Aug 5 03:35:11 2013 Zachary Scott <e@zzak.io>
-
- * lib/rexml/attribute.rb: [DOC] Update example for #namespace
- Patch by Ippei Obayashi [Bug #8685] [ruby-core:56173]
-
-Sun Aug 4 21:08:29 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * array.c (rb_ary_zip): performance implement by using
- ALLOCA_N() to allocate tmp buffer.
-
-Sun Aug 4 07:14:49 2013 Tanaka Akira <akr@fsij.org>
-
- * README.EXT, README.EXT.ja: Mention rb_integer_pack and
- rb_integer_unpack.
-
-Sun Aug 4 01:54:45 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (BARY_TRUNC): New macro.
- (bary_cmp): Use BARY_TRUNC.
- (bary_mul_toom3): Ditto.
- (bary_divmod): Ditto.
- (abs2twocomp): Ditto.
- (bigfixize): Ditto.
- (rb_cstr_to_inum): Ditto.
- (big2str_karatsuba): Ditto.
- (bigdivrem): Ditto.
-
-Sun Aug 4 00:57:58 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_karatsuba): Don't allocate new temporary buffer
- if the buffer is enough for current invocation.
-
-Sun Aug 4 00:22:34 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary2bdigitdbl): New function.
- (bdigitdbl2bary): Ditto.
- (bary_mul_single): Use bdigitdbl2bary.
- (power_cache_get_power): Ditto.
- (bary_divmod): Use bary2bdigitdbl.
- (big2str_orig): Ditto.
- (bigdivrem): Ditto.
-
-Sat Aug 3 22:47:11 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c: The branch condition of selecting multiplication
- algorithms should check smaller argument because Karatsuba and Toom3
- is effective only if both arguments are big.
- (bary_mul_toom3_branch): Compare the smaller argument to
- TOOM3_MUL_DIGITS.
- (bary_mul): Compare the smaller argument to KARATSUBA_MUL_DIGITS.
-
-Sat Aug 3 22:23:31 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_orig): Receive the number to stringize as
- BDIGIT array and size.
- (big2str_karatsuba): Receive the number to stringize as BDIGIT array
- and size. Use an temporary array of BDIGIT.
- (rb_big2str1): Follow the above change.
-
-Sat Aug 3 13:30:04 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (MAX_BASE36_POWER_TABLE_ENTRIES): Renamed from
- MAX_BIG2STR_TABLE_ENTRIES.
- (base36_power_cache): Renamed from big2str_power_cache.
- (base36_numdigits_cache): Renamed from big2str_numdigits_cache.
-
-Sat Aug 3 10:33:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_set_integer_literal): use rb_rational_raw1() for
- integral rational because no reduction is needed with 1.
-
-Sat Aug 3 09:46:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/etc/etc.c (setup_passwd, setup_group): set proper encodings to
- string members.
-
-Sat Aug 3 09:30:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * struct.c (rb_struct_define_under): new function to define Struct
- under the given namespace, not under Struct. [Feature #8264]
-
- * ext/etc/etc.c: use rb_struct_define_under.
-
-Sat Aug 3 06:55:29 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * parse.y (value_expr_gen): now NODE_DEFN and NODE_DEFS are not void
- value expressions. get rid of wrong warning with -w, and make to
- pass tests with chkbuild. ref. [Feature #3753]
-
-Sat Aug 3 04:23:48 2013 Eric Hodel <drbrain@segment7.net>
-
- * doc/syntax/refinements.rdoc: Remove mention of instance_eval and
- module_eval from scope section per:
- http://twitter.com/shugomaeda/status/363219951336693761
-
-Sat Aug 3 02:22:05 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_orig): Refactored.
-
-Sat Aug 3 01:20:19 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigadd_core): Removed.
- (bigadd): Use bary_add instead of bigadd_core.
-
-Sat Aug 3 00:52:43 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big2str1): Simplify power_level calculation.
-
-Sat Aug 3 00:34:20 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * array.c (rb_ary_zip): use rb_ary_new2() to create buffer
- if rb_block_arity() > 1.
-
-Sat Aug 3 00:12:00 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * NEWS: Add the description that IO#seek supports SEEK_DATA
- and SEEK_HOLE.
-
-Fri Aug 2 23:57:57 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * vm.c (m_core_define_method, m_core_define_singleton_method): now
- the value of def-expr is the Symbol of the name of the method, not
- nil.
- ref. [ruby-dev:42151] [Feature #3753]
-
- * test/ruby/test_syntax.rb (TestSyntax#test_value_of_def): test for
- above changes.
-
-Fri Aug 2 23:54:11 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * array.c (rb_ary_zip): performance improvement by avoiding
- array creation if rb_block_arity() > 1.
-
-Fri Aug 2 23:50:53 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (power_cache_get_power): Apply bigtrunc to the result of
- bigsq.
- (big2str_karatsuba): Fix number of leading zero characters.
-
-Fri Aug 2 23:48:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_yylex): calculate denominator directly as powers of
- ten, not parsing string.
-
- * parse.y (parser_number_literal_suffix): return bit set of found
- suffixes.
-
- * parse.y (parser_set_number_literal, parser_set_integer_literal):
- split from parser_number_literal_suffix to set yylval.
-
- * parse.y (parser_yylex): parse rational number literal with decimal
- point precisely.
-
- * parse.y (simple_numeric): integrate numeric literals and simplify
- numeric rules.
-
- * ext/ripper/eventids2.c (ripper_init_eventids2): ripper support for
- new literals, tRATIONAL and tIMAGINARY.
-
-Fri Aug 2 18:33:28 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_karatsuba): Reduce power_level more than one at
- recursion, if possible.
- (rb_big2str1): Follow the above change.
-
-Fri Aug 2 12:25:15 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_mul): Swap x and y for bary_mul1 if x is longer than y.
- [ruby-dev:47565] [Bug #8719] Reported by Narihiro Nakamura.
-
-Fri Aug 2 10:39:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * parse.y (negate_lit): add T_RATIONAL and T_COMPLEX to the switch
- statement, and call rb_bug() if an unknown type is passed to
- negate_lit(). [ruby-core:56316] [Bug #8717]
-
- * bootstraptest/test_literal_suffix.rb (assert_equal): add test
-
-Fri Aug 2 09:14:47 2013 Eric Hodel <drbrain@segment7.net>
+ * parse.y (must_be_dynamic_symbol): fix missed-condition.
- * doc/syntax/refinements.rdoc: Improve description of where you may
- activate refinements.
+Fri Jul 4 18:38:11 2014 Koichi Sasada <ko1@atdot.net>
-Fri Aug 2 07:45:55 2013 Tanaka Akira <akr@fsij.org>
+ * parse.y (rb_pin_dynamic_symbol): should be `static' function.
- * bignum.c (big2str_orig): Remove len argument.
- (big2str_karatsuba): Ditto.
- (rb_big2str1): Follow above change.
+Fri Jul 4 18:03:35 2014 Koichi Sasada <ko1@atdot.net>
-Thu Aug 2 02:32:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * parse.y (must_be_dynamic_symbol): refactoring.
+ * add `inline'.
+ * use UNLIKELY().
+ * check only DYNAMIC_SYM_P(), otherwise it is a bug.
+ * lookup_id_str() is not needed in second condition.
- * NEWS: Add the description of number literal suffixes.
+Fri Jul 4 11:53:56 2014 Koichi Sasada <ko1@atdot.net>
-Thu Aug 2 00:02:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * parse.y: remove unused code
+ surrounded by `#if ENABLE_SELECTOR_NAMESPACE'
- * bootstraptest/test_literal_suffix.rb: add two test cases to
- examine that "1if true" and "1rescue nil" are recognized as 1.
+Fri Jul 4 10:08:24 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Thu Aug 1 23:45:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * test/rubygems/test_gem_package.rb: avoid tempfile leaks using Tempfile#close!
+ * test/rubygems/test_gem_request_set.rb: ditto.
+ * test/rubygems/test_gem_request_set_gem_dependency_api.rb: ditto.
- * rational.c (rb_flt_rationalize_with_prec): new public C function
- to rationalize a Float instance with a precision.
+Fri Jul 4 04:42:05 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * rational.c (rb_flt_rationalize): new public C function to
- rationalize a Float instance. A precision is calculated from
- the given float number.
+ * lib/net/http/response.rb (Net::Inflater#inflate_adapter):
+ prevent automatic encoding conversion.
- * include/ruby/intern.h: Add rb_flt_rationalize_with_prec and
- rb_flt_rationalize.
+Fri Jul 4 04:39:52 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * parse.y: implement number literal suffixes, 'r' and 'i'.
- [ruby-core:55096] [Feature #8430]
+ * lib/net/http/response.rb (Net::HTTPResponse.each_response_header):
+ raise first exception even if inflate_body_io.finish raises error.
+ when begin block raises error, finish usually raises error too.
- * bootstraptest/test_literal_suffix.rb: add tests for parser to scan
- number literals with the above tsuffixes.
+Fri Jul 4 02:56:04 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Thu Aug 1 23:55:08 2013 Tanaka Akira <akr@fsij.org>
+ * lib/uri/generic.rb (URI::Generic#query=): remove validation, just
+ escape. [Feature #2542]
- * bignum.c (rb_big2str1): Remove a local variable.
+ * lib/uri/generic.rb (URI::Generic#fragment=): ditto.
-Thu Aug 1 23:33:01 2013 Tanaka Akira <akr@fsij.org>
+ * lib/uri/generic.rb (URI::Generic#check_query): removed.
- * bignum.c (rb_cstr_to_inum): Use power_cache_get_power.
+ * lib/uri/generic.rb (URI::Generic#set_query): ditto.
-Thu Aug 1 21:02:48 2013 Tanaka Akira <akr@fsij.org>
+ * lib/uri/generic.rb (URI::Generic#check_fragment): ditto.
- * bignum.c (rb_big2str1): Raise an error for too big number.
+ * lib/uri/generic.rb (URI::Generic#set_fragment): ditto.
-Thu Aug 1 20:46:29 2013 Tanaka Akira <akr@fsij.org>
+Thu Jul 3 12:40:22 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * bignum.c (power_cache_get_power): Hide cached Bignum objects.
+ * configure.in (--with-static-linked-ext): fix for extensions to
+ be linked statically.
-Thu Aug 1 19:15:05 2013 Tanaka Akira <akr@fsij.org>
+ * Makefile.in, common.mk: use ENCSTATIC for enc directory.
- * bignum.c (rb_big2str1): Remove non-trim mode.
- (rb_big2str0): Non-trim mode implemented here.
- (big2str_find_n1): Change the result type to long again.
- (big2str_base_powerof2): Don't take arguments: len and trim.
- (rb_big2str): Follow above change.
+ * ext/extmk.rb: supply dependencies of statically linked extension
+ libraries.
-Thu Aug 1 12:37:58 2013 Tanaka Akira <akr@fsij.org>
+Wed Jul 2 15:45:49 2014 Koichi Sasada <ko1@atdot.net>
- * bignum.c (big2str_alloc): New function to allocate the result string.
- It is called after actual length is calculated.
- (big2str_struct): Add fields: negative, result and ptr.
- (big2str_orig): Write out the result via b2s->ptr.
- (big2str_orig): Ditto.
- (rb_big2str1): Don't allocate the result string at beginning.
+ * gc.c (gc_heap_lazy_sweep): simplify logic.
-Thu Aug 1 07:36:27 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c (gc_page_sweep): return TRUE if empty slots are available.
- * bignum.c (big2str_orig): Use temporary buffer when trim mode.
+Wed Jul 2 09:48:42 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Thu Aug 1 06:28:48 2013 Tanaka Akira <akr@fsij.org>
+ * logger.rb: removed unmaintained code.
+ [Feature #9860][ruby-core:62724]
+ * test/logger/test_application.rb: ditto.
- * bignum.c (big2str_orig): Simplified because RBIGNUM_LEN(x) <= 2 now.
- (big2str_struct): Two fields added: hbase2, hbase2_numdigits.
- (rb_big2str1): Initialize above fields.
+Wed Jul 2 03:20:00 2014 Charlie Somerville <charliesome@ruby-lang.org>
-Thu Aug 1 04:06:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/rdoc/options.rb (RDoc#finish): include root path in include
- paths, to work in another directory than the source directory.
- [ruby-core:56282] [Bug #8712]
-
- * test/test_rdoc_markup_pre_process.rb (TestRDocMarkupPreProcess#setup):
- fix input_file_name, as the test script is not pre-processed.
-
-Thu Aug 1 01:45:18 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_karatsuba): Fix a condition of power_level.
-
-Thu Aug 1 01:09:02 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (LOG2_KARATSUBA_BIG2STR_DIGITS): Removed.
- (KARATSUBA_BIG2STR_DIGITS): Removed.
- (big2str_numdigits_cache): New variable.
- (power_cache_get_power): Merged with power_cache_get_power0.
- This function returns maxpow_in_bdigit_dbl(base)**(2**power_level).
- (rb_big2str1): use power_cache_get_power.
-
-Wed Jul 31 23:59:28 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_find_n1): Change the return type to size_t.
- (big2str_orig): Ditto.
- (big2str_karatsuba): Ditto.
- (rb_big2str1): Follow the above changes.
-
-Wed Jul 31 23:19:06 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (power_cache_get_power): Change numdigits_ret to size_t *.
- (big2str_orig): Change len argument to size_t.
- (big2str_karatsuba): Ditto.
- (rb_big2str1): Follow the above changes.
-
-Wed Jul 31 22:59:47 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/parse/test_notation_declaration.rb: Change class
- name to follow file name change.
-
-Wed Jul 31 22:57:50 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_parsetest.rb: Rename to ...
- * test/rexml/parse/test_notation_declaration.rb: ... this.
-
-Wed Jul 31 22:54:39 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_mixin.rb: Remove duplicated tests.
-
-Wed Jul 31 22:52:55 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_parsetest.rb: Fix typos in expected
- value.
- pubilc ->
- public
- ^^
-
-Wed Jul 31 22:50:51 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_parsetest.rb: Add tests that focus
- system literal in external ID system notation declaration.
-
-Wed Jul 31 22:36:21 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_cmp): Extracted from rb_big_cmp.
- (power_cache_get_power): Change n1 argument (number of digits) to
- power_level which is just passed to power_cache_get_power0.
- (big2str_karatsuba): Ditto.
- (rb_big2str1): Calculate the initial power_level.
-
-Wed Jul 31 22:04:36 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_parsetest.rb: Fix a typo.
- Extern ID ->
- ExternalID
- ^^
-
-Wed Jul 31 22:01:36 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_parsetest.rb: Add tests that focus
- public ID in external ID notation declaration.
-
-Wed Jul 31 22:01:24 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-
- * parse.y: fix build error with bison-3.0.
-
-Wed Jul 31 21:58:53 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_parsetest.rb: Split test patterns.
-
-Wed Jul 31 21:42:33 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_parsetest.rb: Group tests.
-
-Wed Jul 31 21:37:51 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_mixin.rb (TestNotationDecl#test_name):
- Move to ...
- * test/rexml/test_notationdecl_parsetest.rb
- (TestNotationDecl#test_name): ... here.
-
-Wed Jul 31 21:37:47 2013 Kouhei Sutou <kou@cozmixng.org>
-
-Wed Jul 31 21:31:49 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_parsetest.rb: Remove setup because it
- doesn't share anything with other tests.
-
-Wed Jul 31 21:24:55 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_attributes_mixin.rb: Remove a needless shebang.
- * test/rexml/test_notationdecl_mixin.rb: ditto.
- * test/rexml/test_doctype.rb: ditto.
- * test/rexml/test_xml_declaration.rb: ditto.
- * test/rexml/test_changing_encoding.rb: ditto.
-
-Wed Jul 31 21:20:08 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/rexml/test_notationdecl_parsetest.rb: remove a needless shebang.
-
-Wed Jul 31 20:11:01 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * string.c (rb_str_rindex): fix bug introduced in r42269.
- "".rindex("") should return 0.
- (str_rindex): ditto.
-
-Wed Jul 31 19:55:33 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (MAX_BIG2STR_TABLE_ENTRIES): Use SIZEOF_SIZE_T.
- (power_cache_get_power0): Add rb_bug call for too bit i argument.
- (power_cache_get_power): Simplified.
-
-Wed Jul 31 18:32:25 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/uri/common.rb (URI.decode_www_form_component): Use String#b.
-
-Wed Jul 31 18:24:02 2013 Shugo Maeda <shugo@ruby-lang.org>
-
- * eval.c (rb_mod_refine, mod_using, top_using): don't show
- warnings because Refinements are no longer experimental.
- [ruby-core:55993] [Feature #8632]
-
- * test/ruby/test_refinement.rb: related test.
-
- * NEWS: fixes for the above change.
-
-Wed Jul 31 17:55:55 2013 Shota Fukumori <her@sorah.jp>
-
- * lib/uri/common.rb (URI.decode_www_form_component):
- Don't raise error when str includes multibyte characters.
-
-Wed Jul 31 17:45:39 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * string.c (rb_str_rindex): performance improvement by using
- memrchr(3).
-
-Wed Jul 31 16:43:30 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * string.c (rb_str_rindex): refactoring and avoid to call str_nth() if
- pos == 0.
-
-Wed Jul 31 14:41:36 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/set.rb: [DOC] Add a couple of notes on Hash as storage.
- ref. [Feature #6589]
-
-Wed Jul 31 14:38:52 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/set.rb: [DOC] Fix example result. Hash is now ordered.
-
-Wed Jul 31 14:38:10 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/set.rb: [DOC] Use the term "sorted" instead of "ordered"
- when mentioning SortSet.
-
-Wed Jul 31 12:18:47 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2str_struct): New structure.
- (big2str_orig): Use big2str_struct.
- (big2str_karatsuba): Ditto.
- (rb_big2str1): Ditto.
-
-Wed Jul 31 12:02:16 2013 Zachary Scott <e@zzak.io>
-
- * lib/rubygems.rb: [DOC] typo in url patch by @Red54 [Fixes #369]
- https://github.com/ruby/ruby/pull/369
-
-Wed Jul 31 07:09:07 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Import RubyGems from master as of commit 523551c
- * test/rubygems: ditto.
-
-Tue Jul 30 22:21:54 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * test/ruby/test_hash.rb: add a test for enumeration order of Hash.
-
-Tue Jul 30 18:52:27 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/set.rb (Set#intersect?, Set#disjoint?): Add new methods for
- testing if two sets have any element in common.
- [ruby-core:45641] [Feature #6588] Based on the code by marcandre.
-
-Tue Jul 30 17:16:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * sprintf.c (ruby__sfvextra): add QUOTE flag to escape unprintable
- characters.
-
-Tue Jul 30 11:00:52 2013 Zachary Scott <e@zzak.io>
-
- * ext/curses/extconf.rb: [DOC] nodoc to reduce Object pollution
-
-Tue Jul 30 08:19:42 2013 Tanaka Akira <akr@fsij.org>
-
- * sizes.c (Init_sizes): Define sizes only if the type actually exists.
-
-Mon Jul 29 22:55:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * sizes.c (Init_sizes): define RbConfig::SIZEOF. [Feature #8568]
+ * node.c (dump_node): handle nd_value == (NODE *)-1 to mean this
+ keyword argument is required
-Mon Jul 29 22:25:20 2013 Zachary Scott <e@zzak.io>
+Wed Jul 2 02:57:27 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/curses/curses.c: [DOC] Update location of samples
- * samples/curses/*: Move Curses samples and refactor from mixin
- The samples are included in rdoc for module and use of mixin is
- confusing
+ * vm.c (rb_vm_env_local_variables): returns array of local
+ variable name symbols in the environment by envval.
-Mon Jul 29 22:16:11 2013 Tanaka Akira <akr@fsij.org>
+ * proc.c (bind_local_variables): use rb_vm_env_local_variables.
- * bignum.c (LOG2_KARATSUBA_BIG2STR_DIGITS): Renamed from
- LOG2_KARATSUBA_DIGITS.
- (KARATSUBA_BIG2STR_DIGITS): Renamed from KARATSUBA_DIGITS.
+Wed Jul 2 02:23:52 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Mon Jul 29 22:04:45 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * proc.c (bind_receiver): new method to return the bound receiver
+ of the binding object. [ruby-dev:47613] [Feature #8779]
- * hash.c (rb_hash_compare_by_id): add function prototype.
+Wed Jul 2 02:14:37 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Mon Jul 29 21:53:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * proc.c (bind_local_variables): update env from envval for each
+ iterations. [ruby-dev:48351] [Bug #10001]
- * hash.c (rb_hash_compare_by_id): don't call rb_hash_rehash()
- if self.compare_by_identity? == true.
+Tue Jul 1 23:46:34 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-Mon Jul 29 21:29:48 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * NEWS: [DOC] mention about Binding#local_variables, introduced at
+ r44392 (see [Feature #8773]).
- * hash.c (rb_hash_assoc): performance improvement by replacing
- compare function in RHASH(hash)->ntbl->type temporarily like r42224.
- it falls back to rb_hash_foreach() if st_lookup() doesn't find the key.
+Tue Jul 1 23:30:51 2014 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
- * test/ruby/test_hash.rb: add a test for above.
+ * numeric.c (num_step_scan_args): table argument of rb_get_kwargs() is
+ array of IDs, not Symbols. [ruby-dev:48353] [Bug #9811]
-Mon Jul 29 21:15:30 2013 Akinori MUSHA <knu@iDaemons.org>
+Tue Jul 1 16:18:22 2014 Akinori MUSHA <knu@iDaemons.org>
- * test/ruby/test_lazy_enumerator.rb
- (TestLazyEnumerator#test_initialize): Make sure
- Enumerator::Lazy#initialize raises error if the object is
- frozen. The check was performed by rb_ivar_set() before
- rb_check_frozen() was added to enumerator_init().
+ * ext/digest/lib/digest/hmac.rb, test/digest/test_digest_hmac.rb:
+ Digest::HMAC is finally removed as previously noticed.
+ [fix GH-648]
-Mon Jul 29 21:06:42 2013 Akinori MUSHA <knu@iDaemons.org>
+Tue Jul 1 11:13:43 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * enumerator.c (enumerator_init): Add a frozenness check to
- prevent a frozen Enumerator object from being reinitialized with
- a different enumerable object. This is the least we should do,
- and more fixes will follow. [Fixes GH-368] Patch by Kenichi
- Kamiya.
+ * ext/date/lib/date/format.rb: removed empty file by @vipulnsward.
+ * ext/date/lib/date.rb: removed needless require.
+ [fix GH-647]
- * enumerator.c (generator_init): Ditto.
+Mon Jun 30 16:42:52 2014 Koichi Sasada <ko1@atdot.net>
-Mon Jul 29 20:14:24 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * gc.c (gc_stat_internal): return size_t value instead of VALUE
+ and remove `out' parameter.
- * hash.c (rb_hash_assoc): revert r42224. table->type->compare is
- called only if hashes are matched.
+ * gc.c: add braces for `if' statements.
- * test/ruby/test_hash.rb: add a test to check using #== to compare.
+ * gc.c (gc_stat_internal): fix comment.
-Mon Jul 29 17:00:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Jun 30 15:07:34 2014 Koichi Sasada <ko1@atdot.net>
- * parse.y (yycompile): store file name as String to keep the encoding.
+ * gc.c: support `USE_RGENGC == 0'.
- * parse.y (rb_parser_compile_string_path, rb_parser_compile_file_path):
- new functions to pass file name as a String.
+ * test/ruby/test_gc.rb: ditto.
- * parse.y (gettable_gen): return a copy of the original file name, not
- a copy in filesystem encoding.
+Mon Jun 30 11:36:04 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * vm_eval.c (eval_string_with_cref): use Qundef instead of "(eval)".
+ * file.c: [DOC] document File.join returns a string.
+ Contributed by @dapplebeforedawn. [fix GH-646]
-Mon Jul 29 16:53:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Jun 28 22:57:01 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * hash.c (rb_hash_initialize_copy): copy st_table type even if empty.
- [ruby-core:56256] [Bug #8703]
+ * ext/pathname/pathname.c (path_birthtime): Windows support.
+ see [Feature #9857] [ruby-dev:48339]
-Mon Jul 29 16:34:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Jun 28 22:44:16 2014 Tanaka Akira <akr@fsij.org>
- * hash.c (rb_hash_initialize_copy): clear old table before copy new
- table.
+ * ext/pathname/pathname.c (path_birthtime): New method,
+ Pathname#birthtime.
+ Proposed by Kazuhiro NISHIYAMA. [ruby-dev:48232] [Feature #9857]
-Mon Jul 29 16:34:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Jun 28 20:29:03 2014 Simon Baird <simon.baird@gmail.com>
- * hash.c (rb_hash_assoc): aggregate object can be initialized only
- with link time constants.
+ * ext/bigdecimal/lib/bigdecimal/math.rb (BigMath#PI): change error
+ message about zero or negative precision for clarity and
+ consistency with other methods. [GH-644]
-Mon Jul 29 14:54:44 2013 Masaki Matsushita <glass.saga@gmail.com>
+Sat Jun 28 15:32:57 2014 Tanaka Akira <akr@fsij.org>
- * hash.c (rb_hash_assoc): performance improvement by replacing
- compare function in RHASH(hash)->ntbl->type temporarily.
+ * lib/webrick/utils.rb (create_listeners): Close socket objects.
-Mon Jul 29 14:52:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Jun 28 13:58:48 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/mkmf.rb (xsystem): expand environment variable in all macros not
- expanded with RbConfig. [Bug #8702]
+ * eval.c (setup_exception): should not overwrite SystemStackError
+ backtrace if set already. [ruby-core:63377] [Feature #6216]
- * test/mkmf/test_framework.rb (create_framework): replace all $@ not
- only once.
+ * eval.c (setup_exception): get rid of method calls before raising
+ stack overflow, not to cause stack overflow again.
-Mon Jul 29 06:54:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * defs/id.def: add IDs for backtraces.
- * win32/win32.c (rb_w32_pipe): use enum for compile time constants,
- instead of const int for debugging.
+Sat Jun 28 04:08:22 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Mon Jul 29 00:11:49 2013 Tanaka Akira <akr@fsij.org>
+ * lib/uri/mailto.rb: update to latest specs, RFC 6068 and HTML5.
- * bignum.c (bigdivrem): Specialized implementation added for
- nx == 2 && ny == 2
+ * lib/uri/mailto.rb (HEADER_PATTERN): removed.
-Sun Jul 28 20:28:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * lib/uri/mailto.rb (HEADER_REGEXP): use RFC 6068 hfields.
- * io.c (io_getpartial): use rb_str_locktmp_ensure().
- [ruby-core:56121] [Bug #8669]
+ * lib/uri/mailto.rb (EMAIL_REGEXP): use HTML5 email regexp.
- * io.c (rb_io_sysread): ditto.
+ * lib/uri/mailto.rb (URI::MailTo.build): support multiple to addresses.
- * test/ruby/test_io.rb: add tests for above.
+ * lib/uri/mailto.rb (URI::MailTo#initialize): Support multiple to
+ addresses. Don't check with regexp, only split.
-Sun Jul 28 20:10:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/uri/mailto.rb (URI::MailTo#check_to): verify by matching
+ URI path-rootless and HTML5 email regexp with unescaped one.
- * ext/extmk.rb (extmake): should make static libraries for extensions
- to be statically linked. [Bug #7948]
+ * lib/uri/mailto.rb (URI::MailTo#check_headers): verify only by
+ HEADER_REGEXP.
-Sun Jul 28 17:38:32 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * lib/uri/mailto.rb (URI::MailTo#set_headers): don't check by
+ HEADER_REGEXP, only split it.
- * string.c: add internal API rb_str_locktmp_ensure().
+Sat Jun 28 00:35:10 2014 Lauri Tirkkonen <lotheac@iki.fi>
- * io.c (io_fread): use rb_str_locktmp_ensure().
- [ruby-core:56121] [Bug #8669]
+ * tool/mkconfig.rb: fix empty RbConfig::CONFIG["prefix"] when
+ configured --with-rubyarchprefix, remove prefix from rubyarchdir
+ after expansion for the case it does not start with '$(prefix)'.
+ [fix GH-643]
- * test/ruby/test_io.rb: add a test for above.
+Fri Jun 27 15:20:12 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Sun Jul 28 13:04:39 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * lib/rubygems/test_case.rb: rescue Gem::LoadError in Gem::TestCase.
+ because it's effected by removing minitest from stdlib.
- * io.c (interpret_seek_whence): support SEEK_DATA and SEEK_HOLE.
- These are whences for lseek(2) supported by Linux since version 3.1.
- [ruby-core:56123] [Feature #8671]
+Fri Jun 27 12:29:37 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * test/ruby/test_io.rb: Add tests for above.
+ * lib/rubygems/specification.rb: fixed broken condition caused
+ by removing YAML::ENGINE.
+ * lib/rubygems/package/old.rb: ditto.
-Sun Jul 28 12:41:39 2013 Tanaka Akira <akr@fsij.org>
+Fri Jun 27 05:33:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * bignum.c (absint_numwords_generic): The char_bit variable changed
- to static constant.
+ * hash.c (env_shift): fix memory leak on Windows, free environment
+ strings block always. [ruby-dev:48332] [Bug #9983]
-Sun Jul 28 12:03:23 2013 Tanaka Akira <akr@fsij.org>
+Fri Jun 27 03:41:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * bignum.c: Constify bary_* functions.
+ * sprintf.c (GETASTER): should not use the numbered argument to be
+ formatted, raise ArgumentError instead.
+ [ruby-dev:48330] [Bug #9982]
-Sun Jul 28 11:12:07 2013 Tanaka Akira <akr@fsij.org>
+Thu Jun 26 18:18:28 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * include/ruby/intern.h (rb_absint_size): Declaration moved from
- internal.h to calculate required buffer size to pack integers.
- (rb_absint_numwords): Ditto.
- (rb_absint_singlebit_p): Ditto.
- [ruby-core:42813] [Feature #6065]
+ * test/with_different_ofs.rb: move into test library directory.
+ * test/csv/base.rb: fix require path for with_different_ofs.rb.
+ * test/digest/test_digest_extend.rb: ditto.
-Sun Jul 28 10:54:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu Jun 26 18:06:50 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * win32/win32.c (rb_w32_pipe): fix pipe name formatting. as "%x" may
- not contain '0' at all, fill at fixed position instead.
+ * test/profile_test_all.rb: move into test library directory.
+ * test/runner.rb: fix require path for profile_test_all.rb.
-Sun Jul 28 00:35:14 2013 Tanaka Akira <akr@fsij.org>
+Thu Jun 26 17:57:57 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * bignum.c (rb_big_size): Return the bignum "bytewise" size.
- [ruby-core:55578] [Feature #8553]
- This is accepted by matz on DevelopersMeeting20130727Japan.
+ * lib/webrick/httpproxy.rb: remove useless assigned variables.
+ * lib/webrick/httpservlet/cgihandler.rb: ditto.
+ * lib/webrick/httpservlet/erbhandler.rb: ditto.
+ * lib/webrick/server.rb: ditto.
-Sun Jul 28 00:07:48 2013 Tanaka Akira <akr@fsij.org>
+Thu Jun 26 08:28:01 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * include/ruby/intern.h (rb_integer_pack): Declaration moved from
- internal.h.
- (rb_integer_unpack): Ditto.
- [ruby-core:42813] [Feature #6065]
+ * hash.c (env_select): fix memory leak and crash on Windows, make
+ keys array first instead of iterating on environ directly.
+ [ruby-dev:48325] [Bug #9978]
-Fri Jul 26 23:18:13 2013 Kouhei Sutou <kou@cozmixng.org>
+Thu Jun 26 02:45:04 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * NEWS: Add a new feature that REXML::Parsers::StreamParser
- supports "entity" event.
+ * eval_error.c (error_print): put a newline after an anonymous
+ exception class name.
-Fri Jul 26 23:14:31 2013 Kouhei Sutou <kou@cozmixng.org>
+Wed Jun 25 22:31:32 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/rexml/parsers/streamparser.rb
- (REXML::Parsers::StreamParser#parse): Add "entity" event support to
- listener. [Bug #8689] [ruby-dev:47542]
- Reported by Ippei Obayashi.
- * test/rexml/test_stream.rb (StreamTester#entity): Add a test for
- the above case.
+ * hash.c (ruby_setenv): fix memory leak on Windows, free
+ environment strings block after check for the size.
+ [ruby-dev:48323] [Bug #9977]
-Fri Jul 26 23:05:27 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Jun 25 15:44:12 2014 Eric Wong <e@80x24.org>
- * parse.y (parser_yylex): separate numeric literal from succeeding
- token, and treat 'e' as floating point number only if followed by
- exponent part.
+ * ccan/container_of/container_of.h (container_off_var):
+ avoid warning with -Wcast-qual
+ [ccan ba5ad771af4aa9e085498de6c3c665c52694460f (Rusty Russell)]
-Fri Jul 26 22:14:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Jun 25 10:19:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * vm_exec.h (CHECK_VM_STACK_OVERFLOW_FOR_INSN): surround with
- do/while (0), and remove unnecessary casts.
+ * hash.c (env_aset, env_has_key, env_assoc, env_has_value),
+ (env_rassoc, env_key): prohibit tainted strings if $SAFE is
+ non-zero. [Bug #9976]
-Fri Jul 26 20:12:07 2013 Akinori MUSHA <knu@iDaemons.org>
+Tue Jun 24 14:46:17 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ext/syslog/lib/syslog/logger.rb (Syslog::Logger): Add facility
- to Syslog::Logger. [Fixes GH-305] patch by Max Shytikov
- https://github.com/ruby/ruby/pull/305
+ * lib/gserver.rb: remove redundant use of to_s in interpolation.
+ * lib/logger.rb: ditto.
+ * lib/optparse.rb: ditto.
+ * lib/rbconfig/obsolete.rb: ditto.
+ * lib/resolv.rb: ditto.
+ * lib/webrick/httpresponse.rb: ditto.
-Fri Jul 26 19:25:17 2013 Koichi Sasada <ko1@atdot.net>
+Tue Jun 24 10:50:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * vm_exec.h, tool/instruction.rb: not an error, but a BUG if stack
- overflow checking failed just before/after the beginning of an
- instruction. It should be treated as a BUG.
- Please tell us if your code cause BUG with this problem.
- This check will removed soon (for performance).
+ * hash.c (env_path_str_new): make PATH environment variable
+ string, to be frozen.
-Fri Jul 26 18:30:14 2013 Koichi Sasada <ko1@atdot.net>
+Tue Jun 24 10:40:52 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * array.c (ary_memcpy): cast to int to suppress a warning.
+ * tool/make-snapshot: download bundle gems when package making.
+ [Feature #9852][ruby-core:62676]
+ * gems/bundled_gems: listed bundled gems for Ruby 2.2.
-Fri Jul 26 18:21:58 2013 Koichi Sasada <ko1@atdot.net>
+Tue Jun 24 10:20:35 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * array.c (ary_memcpy): try to enable optimization.
- At least on my environments, I don't see any errors
- with many trials. Please tell us if you find any GC bugs.
+ * tool/downloader.rb: make Downloader class to general download utility.
+ It can be used without config.guess and config.sub.
+ * tool/get-config_files: ditto.
+ * tool/make-snapshot: ditto.
-Fri Jul 26 17:49:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Jun 24 06:17:52 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * win32/file.c (fix_string_encoding): fix target encoding. the
- parameter `encoding' is not the target encoding but the original
- encoding.
+ * eval.c (setup_exception): "mesg == sysstack_error" and
+ sysstack_error_p(mesg) are duplicated.
+ r46502 seems to want to use latter.
-Fri Jul 26 14:05:19 2013 Zachary Scott <e@zzak.io>
+Tue Jun 24 06:15:36 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/fiddle/*: [DOC] More doc on dlopen and RTLD_DEFAULT from r42184
+ * ext/tk/tcltklib.c: fix format specifiers for VALUE and
+ Tcl_Interp*. [ruby-core:63283] [Bug #9972]
-Fri Jul 26 13:08:53 2013 Zachary Scott <e@zzak.io>
+Tue Jun 24 05:40:41 2014 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
- * ext/fiddle/lib/fiddle.rb: [DOC] Document Fiddle.dlopen(nil)
- * ext/fiddle/handle.c: [DOC] Document Fiddle::Handle.new(nil)
+ * nacl/nacl-config.rb: Use File.exist? instead of executable?
+ for irt_core. Recent nacl_sdk has non-executable irt_core.
+ Patch by Shinichiro Hamaji.
+ [Fixes GH-529] https://github.com/ruby/ruby/pull/529
-Fri Jul 26 13:04:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Jun 23 18:44:45 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * load.c (rb_load_internal): use rb_load_file_str() to keep path
- encoding.
+ * tool/config_files.rb: rename class ConfigFiles to Downloader.
+ * tool/get-config_files: ditto.
+ * tool/make-snapshot: ditto.
- * load.c (rb_require_safe): search in OS path encoding for Windows.
+Mon Jun 23 18:03:13 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * ruby.c (rb_load_file_str): load file with keeping path encoding.
+ * tool/rbinstall.rb: support to install bundle gems.
- * win32/file.c (rb_file_load_ok): use WCHAR type API assuming incoming
- path is encoded in UTF-8. [ruby-core:56136] [Bug #8676]
+Mon Jun 23 17:33:11 2014 Akinori MUSHA <knu@iDaemons.org>
- * file.c (rb_str_encode_ospath): simplify using rb_str_conv_enc().
+ * lib/net/imap.rb (Net::IMAP#fetch): [DOC] Describe how a range in
+ +set+ is interpreted, and mention -1 which can be used for '*'.
- * win32/file.c (fix_string_encoding): simplify with rb_str_conv_enc().
+Mon Jun 23 16:22:50 2014 URABE Shyouhei <shyouhei@ruby-lang.org>
- * win32/file.c (convert_mb_to_wchar): use bare pointer instead of
- VALUE, and remove useless argument.
+ * include/ruby/ruby.h (struct RHash): no longer. [Feature #9889]
-Fri Jul 26 11:42:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * include/ruby/ruby.h (RHASH): ditto.
- * rational.c (f_round_common): Rational is expected to be returned by
- Rational#*, but mathn.rb breaks that assumption. [ruby-core:56177]
- [Bug #8687]
+ * include/ruby/ruby.h (RHASH_ITER_LEV): deprecated. Will be deleted later.
-Fri Jul 26 01:37:45 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * include/ruby/ruby.h (RHASH_IFNONE): ditto.
- * include/ruby/ruby.h: check defined(USE_RGENGC_LOGGING_WB_UNPROTECT)
+ * internal.h (struct RHash): moved here.
-Fri Jul 26 01:21:41 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * internal.h (RHASH): ditto.
- * file.c (rb_file_expand_path_internal): fix r42160; skip '~'.
+ * hash.c (rb_hash_iter_lev): do not use this.
-Thu Jul 25 17:53:18 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * hash.c (rb_hash_ifnone): ditto.
- * lib/net/http.rb (Net::HTTP#connect): disable Nagle's algorithm on
- HTTP connection. [ruby-core:56158] [Feature #8681]
+Mon Jun 23 13:30:11 2014 URABE Shyouhei <shyouhei@ruby-lang.org>
-Thu Jul 25 17:49:42 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * include/ruby/ruby.h (struct RComplex): no longer. [Feature #9888]
- * re.c (rb_reg_to_s): convert closing parenthesis to the target encoding
- if it is ASCII incompatible encoding. [ruby-core:56063] [Bug #8650]
+ * include/ruby/ruby.h (RCOMPLEX): ditto.
-Thu Jul 25 17:21:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * include/ruby/ruby.h (RCOMPLEX_SET_REAL): deprecated. Will be deleted later.
- * encoding.c (is_obj_encoding): new macro to check if obj is an
- Encoding. obj can be any type while is_data_encoding expects T_DATA
- only.
+ * include/ruby/ruby.h (RCOMPLEX_SET_IMAG): ditto.
-Thu Jul 25 17:17:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * internal.h (struct RFloat): moved here.
- * file.c (rb_file_expand_path_internal): should clear coderange after
- copying user name as binary data.
+ * internal.h (RCOMPLEX): ditto.
-Thu Jul 25 16:17:55 2013 Koichi Sasada <ko1@atdot.net>
+ * complex.c (rb_complex_set_real): do not use this.
- * encoding.c (check_encoding): Check T_DATA or not.
- is_data_encoding(obj) assumes that `obj' is T_DATA.
+ * complex.c (rb_complex_set_imag): ditto.
-Thu Jul 25 13:06:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Jun 23 13:10:15 2014 URABE Shyouhei <shyouhei@ruby-lang.org>
- * dir.c (dir_s_home): use rb_home_dir_of and rb_default_home_dir.
+ * include/ruby/ruby.h (struct RFloat): no longer. [Feature #9863]
- * file.c (rb_home_dir_of): split from rb_home_dir() for the home
- directry of the given user, and the user name is a VALUE, not a bare
- pointer. should raise if the user does not exist.
+ * include/ruby/ruby.h (RFLOAT): ditto.
- * file.c (rb_default_home_dir): split from rb_home_dir() for the home
- directry of the current user.
+ * internal.h (struct RFloat): moved here.
-Thu Jul 25 12:32:11 2013 Koichi Sasada <ko1@atdot.net>
+ * internal.h (RFLOAT): ditto.
- * ext/openssl/ossl.c: support additional three thread synchronization
- functions. [ruby-trunk - Bug #8386]
+Mon Jun 23 12:01:42 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Thu Jul 25 07:15:58 2013 Eric Hodel <drbrain@segment7.net>
+ * lib/uri/generic.rb (check_port): allow strings for port= as
+ described in rdoc.
- * lib/rubygems: Import RubyGems from master as of commit 4ff70cc
- * test/rubygems: ditto.
+ * lib/uri/rfc3986_parser.rb (regexp): implementation detail of above.
-Wed Jul 24 20:57:44 2013 Koichi Sasada <ko1@atdot.net>
+Mon Jun 23 11:35:01 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * compile.c (iseq_set_arguments): use RARRAY_RAWPTR() instead of
- RARRAY_PTR() because there is no new reference.
+ * eval.c (setup_exception): set backtrace in system stack error
+ other than the pre-allocated sysstack_error. [Feature #6216]
- * compile.c (iseq_set_exception_table): ditto.
+ * proc.c (Init_Proc): freeze the pre-allocated sysstack_error.
-Wed Jul 24 19:49:54 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * vm_insnhelper.c (vm_stackoverflow): raise new instance for each
+ times without calling any methods to keep the backtrace with no
+ further stack overflow.
- * lib/uri/generic.rb (find_proxy): raise BadURIError if the URI is
- a relative URI. [Bug #8645]
+ * object.c (rb_obj_copy_ivar): extract function to copy instance
+ variables only for T_OBJECT from init_copy.
-Wed Jul 24 18:56:06 2013 Koichi Sasada <ko1@atdot.net>
+Mon Jun 23 11:11:16 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * vm_insnhelper.c (vm_expandarray): use RARRAY_RAWPTR() instead of
- RARRAY_PTR() because there is no new reference.
+ * signal.c (check_stack_overflow): drop the last tag too close to
+ the fault page, to get rid of stack overflow deadlock.
+ [Bug #9971]
- * vm_insnhelper.c (vm_caller_setup_args): ditto.
+Sun Jun 22 09:11:15 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * vm_insnhelper.c (vm_yield_setup_block_args): ditto.
+ * lib/uri/generic.rb: remove registry.
+ 'registry' is not used and RFC3986 doesn't use it.
-Wed Jul 24 18:40:11 2013 Koichi Sasada <ko1@atdot.net>
+Sun Jun 22 09:10:09 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * array.c, gc.c: move ary_unprotect_logging() into
- rb_gc_unprotect_logging() which is general version
+ * lib/uri/rfc3986_parser.rb: raise exception when given a URI string
+ has non ASCII in order to keep the regexp compiled for US-ASCII.
- * include/ruby/ruby.h: add USE_RGENGC_LOGGING_WB_UNPROTECT
- to enable.
+Sun Jun 22 09:05:42 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Wed Jul 24 17:37:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/uri/common.rb (URI::REGEXP): move to lib/uri/rfc2396_parser.rb.
- * file.c (rb_file_expand_path_internal): preserve the file name
- encoding in an exception message.
+ * lib/uri/common.rb (URI::Parser): ditto.
-Wed Jul 24 08:04:49 2013 Koichi Sasada <ko1@atdot.net>
+ * lib/uri/common.rb (URI.split): use RFC3986_Parser. [Feature #2542]
- * test/-ext-/tracepoint/test_tracepoint.rb: add GC on/off to count
- GC events strictly.
+ * lib/uri/common.rb (URI.parse): ditto.
-Tue Jul 23 23:19:24 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * lib/uri/common.rb (URI.join): ditto.
- * ext/openssl/extconf.rb (CRYPTO_THREADID): check exist or not.
+ * lib/uri/common.rb (URI.extract): deprecated.
- * ext/openssl/ossl.c (ossl_thread_id): use rb_nativethread_self()
- implemented at r42137 to allow threads which doesn't associated with
- Ruby thread to use openssl functions.
+ * lib/uri/common.rb (URI.regexp): ditto.
- * ext/openssl/ossl.c (Init_ossl_locks): If CRYPTO_THREADID is defined
- (OpenSSL 1.0.0 or later has it) use CRYPTO_THREADID_set_callback()
- instead of CRYPTO_set_id_callback() because its argument is
- unsigned long; it may cause id collision on mswin64
- whose sizeof(unsigned long) < sizeof(void*).
- http://www.openssl.org/docs/crypto/threads.html
+ * lib/uri/rfc2396_parser.rb: added.
- * ext/openssl/ossl.c (ossl_threadid_func): defined for above.
+ * lib/uri/rfc3986_parser.rb: added.
-Tue Jul 23 20:47:36 2013 Tanaka Akira <akr@fsij.org>
+Sun Jun 22 09:04:50 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * bignum.c: Move functions.
+ * lib/uri/mailto.rb (initialize): as previous commit, fix arg_check
-Tue Jul 23 20:14:55 2013 Tanaka Akira <akr@fsij.org>
+Sun Jun 22 09:01:47 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * bignum.c (bary_divmod): Add special cases for x < y easily detected
- and nx == 2 && ny == 2.
+ * lib/uri/ftp.rb (initialize): argument checking flag is arg_check,
+ but arg[-1] is fragment.
-Tue Jul 23 19:48:38 2013 Koichi Sasada <ko1@atdot.net>
+ * lib/uri/ftp.rb (initialize): explicitly specify arguments.
- * thread_(pthread|win32).h: rename rb_thread_cond_t to
- rb_nativethread_cond_t.
+Sat Jun 21 12:50:32 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * thread.c, thread_pthread.c, thread_win32.c, vm_core.h: catch up
- renaming.
+ * ext/fiddle/extconf.rb: supply 0 to fill RUBY_LIBFFI_MODVERSION
+ with 3-digit. libffi 3.1 returns just 2-digit.
+ [ruby-core:62920] [Bug #9897]
-Tue Jul 23 19:44:32 2013 Koichi Sasada <ko1@atdot.net>
+Sat Jun 21 07:06:13 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * thread_native.h: add rb_nativethread_self() which returns
- current running native thread identifier.
+ * encoding.c (enc_find): [DOC] never accepted a symbol.
+ [ruby-dev:48308] [Bug #9966]
- * thread_[pthread|win32].c: implement rb_nativethread_self().
+Fri Jun 20 17:15:43 2014 Koichi Sasada <ko1@atdot.net>
-Tue Jul 23 19:34:11 2013 Koichi Sasada <ko1@atdot.net>
+ * test/lib/tracepointchecker.rb: add to check TracePoint healthiness.
- * thread_pthread.h, thread_win32.h: rename rb_thread_id_t to
- rb_nativethread_id_t.
+ * test/runner.rb: use it.
- * thread_pthread.c, vm_core.h: use rb_nativethread_id_t.
+Fri Jun 20 07:26:44 2014 Koichi Sasada <ko1@atdot.net>
-Tue Jul 23 18:56:11 2013 Koichi Sasada <ko1@atdot.net>
+ * test/ruby/test_settracefunc.rb: rewrite tests with
+ assert_consistent_call_return().
- * ext/openssl/ossl.c: use system native (system provided)
- thread locking APIs added by last commit.
- This patch fixes [Bug #8386].
- "rb_mutex_*" APIs control only "Ruby" threads.
- Not for native threads.
+ assert_consistent_call_return() is also modified to check
+ consistency.
-Tue Jul 23 18:44:15 2013 Koichi Sasada <ko1@atdot.net>
+Fri Jun 20 07:07:28 2014 Koichi Sasada <ko1@atdot.net>
- * thread_native.h: added.
- Move native thread related lines from vm_core.h.
- And declare several functions "rb_nativethread_lock_*",
- manipulate locking.
+ * compile.c (rb_iseq_compile_node): put start label of block after
+ trace (b_call).
+ [Bug #9964]
- * common.mk: add thread_native.h.
+ * test/ruby/test_settracefunc.rb: add a test.
- * thread.c: add functions "rb_nativethread_lock_*".
+ added assert_consistent_call_return() method check call/return
+ consistency.
- * thread.c, thread_[pthread,win32].[ch]: rename rb_thread_lock_t
- to rb_nativethread_lock_t to make it clear that this lock is for
- native threads, not for ruby threads.
+Fri Jun 20 05:26:27 2014 Koichi Sasada <ko1@atdot.net>
-Tue Jul 23 16:14:57 2013 Koichi Sasada <ko1@atdot.net>
+ * vm_eval.c (rb_catch_protect): fix same problem of [Bug #9961].
- * gc.c (gc_before_sweep): fix spacing.
+ * vm_eval.c (rb_iterate): ditto.
-Tue Jul 23 15:57:11 2013 Koichi Sasada <ko1@atdot.net>
+Thu Jun 19 21:41:30 2014 Koichi Sasada <ko1@atdot.net>
- * gc.c (heap_get_freeobj): clear slot->freelist here.
- This means that this slot doesn't have any free objects.
- And store this slot with objspace->heap.using_slot.
+ * vm.c (rb_vm_rewind_cfp): add new function to rewind specified cfp
+ with invoking RUBY_EVENT_C_RETURN.
+ [Bug #9961]
- * gc.c (gc_before_sweep): restore objspace->freelist
- into objspace->heap.using_slot->freelist.
- This means that using_slot has free objects which are
- pointed from objspace->freelist.
+ * vm_core.h: ditto.
- * gc.c (gc_slot_sweep): do not need to clear slot->freelist.
+ * eval.c (rb_protect): use it.
-Tue Jul 23 09:34:49 2013 Zachary Scott <e@zzak.io>
+ * eval.c (rb_rescue2): ditto.
- * sample/drb/README*.rdoc: [DOC] migrate DRb sample READMEs to rdoc
+ * vm_eval.c (rb_iterate): ditto.
-Tue Jul 23 09:28:05 2013 Zachary Scott <e@zzak.io>
+ * test/ruby/test_settracefunc.rb: add a test.
- * lib/drb/invokemethod.rb: [DOC] nodoc InvokeMethod18Mixin
+ * vm_core.h (rb_vm_rewind_cfp): add the prototype declaration.
-Tue Jul 23 08:44:37 2013 Eric Hodel <drbrain@segment7.net>
+Thu Jun 19 19:47:21 2014 Koichi Sasada <ko1@atdot.net>
- * ext/openssl/ossl_asn1.c (asn1time_to_time): Implement YYMMDDhhmmZ
- format for ASN.1 UTCTime. [ruby-trunk - Bug #8664]
- * test/openssl/test_asn1.rb: Test for the above.
+ * vm.c (invoke_block_from_c): move call/return event timing for
+ bmethod. It can invoke inconsistent call event if this call raises
+ argument error.
+ [Bug #9959]
-Tue Jul 23 08:11:32 2013 Zachary Scott <e@zzak.io>
+ * vm_insnhelper.c (vm_call_bmethod_body): ditto.
- * lib/rexml/streamlistener.rb: [DOC] Fix examples in
- REXML::StreamListener#entitydecl patch by Ippei Obayashi [Bug #8665]
+ * test/ruby/test_settracefunc.rb: add a test.
-Tue Jul 23 07:44:59 2013 Eric Hodel <drbrain@segment7.net>
+Thu Jun 19 18:14:47 2014 Koichi Sasada <ko1@atdot.net>
- * lib/rubygems: Import RubyGems from master as of commit b165260
- * test/rubygems: ditto.
+ * vm_core.h: add VM_FRAME_MAGIC_RESCUE to recognize normal block or
+ rescue clause.
-Tue Jul 23 07:14:31 2013 Tanaka Akira <akr@fsij.org>
+ * vm.c (vm_exec): use VM_FRAME_MAGIC_RESCUE on at rescue/ensure.
- * bignum.c (bary_mulsub_1xN): New function.
- (bary_mul_toom3): Use bary_mulsub_1xN.
+ * test/ruby/test_settracefunc.rb: should not invoke b_return at rescue
+ clause.
+ [Bug #9957]
-Tue Jul 23 03:32:23 2013 Tanaka Akira <akr@fsij.org>
+ * vm_dump.c (control_frame_dump): check VM_FRAME_MAGIC_RESCUE.
- * bignum.c (KARATSUBA_BALANCED): New macro.
- (TOOM3_BALANCED): Ditto.
- (bary_mul_balance_with_mulfunc): Use KARATSUBA_BALANCED and
- TOOM3_BALANCED.
- (rb_big_mul_balance): Relax a condition.
- (rb_big_mul_karatsuba): Use KARATSUBA_BALANCED.
- (rb_big_mul_toom3): Use TOOM3_BALANCED.
- (bary_mul_karatsuba_branch): Use KARATSUBA_BALANCED.
- (bary_mul_toom3_branch): Use TOOM3_BALANCED.
+ * vm_dump.c (vm_stack_dump_each): ditto.
-Tue Jul 23 01:34:45 2013 Tanaka Akira <akr@fsij.org>
+Thu Jun 19 13:39:11 2014 Arne Brasseur <arne@arnebrasseur.net>
- * bignum.c (bigdivrem_mulsub): Extracted from bigdivrem1.
- (bigdivrem1): Use bary_add.
+ * proc.c (rb_method_curry): Implement Method#curry, which delegates
+ to to_proc.curry. [ruby-core:62212] [Feature #9783]
-Mon Jul 22 18:39:52 2013 Masaki Matsushita <glass.saga@gmail.com>
+Tue Jun 17 16:41:49 2014 Shugo Maeda <shugo@ruby-lang.org>
- * string.c (rb_str_enumerate_chars): specify array capa
- with str_strlen().
+ * lib/net/ftp.rb (gets, readline): read lines without LF properly.
+ [ruby-core:63205] [Bug #9949]
- * string.c (rb_str_enumerate_codepoints): ditto.
+ * test/net/ftp/test_buffered_socket.rb: related test.
-Mon Jul 22 18:01:33 2013 Masaki Matsushita <glass.saga@gmail.com>
+Tue Jun 17 12:35:24 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * string.c (rb_str_enumerate_chars): specify array capa.
+ * eval.c (extract_raise_opts): pass unknown options to the
+ exception, so that exception class can receive a hash argument.
+ [ruby-core:63203] [Feature #8257]
-Mon Jul 22 17:24:14 2013 Masaki Matsushita <glass.saga@gmail.com>
+Tue Jun 17 12:24:57 2014 Koichi Sasada <ko1@atdot.net>
- * string.c (rb_str_each_char_size): performance improvement by
- using rb_str_length().
+ * gc.c (obj_memsize_of): memsize_of(T_ZOMBIE) returns 0, not a rb_bug.
+ ObjectSpace.count_objects_size() uses memsize_of(T_ZOMBIE).
-Mon Jul 22 16:32:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ This bug introduced at r46348.
- * vm_eval.c (eval_string_with_cref): check by Check_TypedStruct
- instead of rb_obj_is_kind_of.
+Mon Jun 16 19:00:11 2014 Koichi Sasada <ko1@atdot.net>
-Mon Jul 22 13:19:22 2013 Koichi Sasada <ko1@atdot.net>
+ * test/runner.rb: failure message should be passed as an argument.
- * array.c (ary_resize_capa): use RARRAY_RAWPTR() because
- this code creates no new references.
+Mon Jun 16 18:42:57 2014 Koichi Sasada <ko1@atdot.net>
-Mon Jul 22 12:58:18 2013 Koichi Sasada <ko1@atdot.net>
+ * test/runner.rb: capture TracePoint stat before setup and compare
+ it after teardown.
- * array.c (ary_memfill): added.
+Mon Jun 16 14:33:56 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * array.c (rb_ary_initialize): use ary_memfill().
+ * process.c (open): use UTF-8 version function to support
+ non-ascii path properly. [ruby-core:63185] [Bug #9946]
- * array.c (rb_ary_fill): ditto.
+Sat Jun 14 10:54:08 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * array.c (rb_ary_slice_bang): use RARRAY_RAWPTR() because
- this code creates no new references.
+ * array.c (rcombinate0): remove recursion, by looping with indexes
+ stored in `p`.
-Mon Jul 22 10:09:46 2013 Koichi Sasada <ko1@atdot.net>
+ * array.c (rpermute0): remove recursion, by looping with indexes
+ stored in `p`.
- * gc.c (gc_slot_sweep): need to add empty RVALUE as freeobj.
+ * array.c (permute0): remove recursion, by looping with indexes
+ stored in `p`. [ruby-core:63103] [Bug #9932]
-Mon Jul 22 09:48:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Jun 14 10:52:15 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * vm_eval.c (eval_string_with_cref): use the given file name unless
- eval even if scope is given. additional fix for [Bug #8436].
- based on the patch by srawlins at [ruby-core:56099] [Bug #8662].
+ * string.c (rb_str_resize): update capa only when buffer get
+ reallocated.
+ http://d.hatena.ne.jp/nagachika/20140613/ruby_trunk_changes_46413_46420#r46413
-Mon Jul 22 09:24:19 2013 Kouji Takao <kouji@takao7.net>
+Sat Jun 14 08:28:59 2014 Zachary Scott <e@zzak.io>
- * ext/readline/readline.c (Init_readline): added
- Readline.delete_text. [ruby-dev:45789] [Feature #6626]
- * ext/readline/extconf.rb: check for rl_delete_text() in Readline library.
+ * man/rake.1: [DOC] Update links for Rake, patch by @hsbt [Bug #9904]
+ [Fixes GH-628] https://github.com/ruby/ruby/pull/628
- Thanks, Nobuyoshi Nakada, for the patch.
+Fri Jun 13 17:58:58 2014 Koichi Sasada <ko1@atdot.net>
-Mon Jul 22 03:15:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * vm_trace.c: add new method TracePoint.stat to debug
+ TracePoint mechanism.
- * ext/date/date_parse.c (rfc2822_cb): check if wday is given, since it
- can be omitted.
+ Ruby users should not use this method. So I don't note this method
+ in the NEWS file.
-Mon Jul 22 00:15:20 2013 Tanaka Akira <akr@fsij.org>
+ * test/runner.rb: detect zombie active TracePoints with
+ TracePoint.stat.
- * bignum.c (bary_sq_fast): Refine expressions.
+Fri Jun 13 17:46:31 2014 Koichi Sasada <ko1@atdot.net>
-Sun Jul 21 21:08:59 2013 Tanaka Akira <akr@fsij.org>
+ * vm_trace.c: clear and restore recursive checking thread local data
+ to avoid unexpected throw from TracePoint.
+ [Bug #9940]
- * bignum.c (bary_mul): Use simple multiplication if yl is small.
- (rb_cstr_to_inum): Invoke bigsq instead of bigmul0.
- (bigsq): Re-implemented.
- (bigmul0): Invoke bigsq if two arguments are identical.
+ * test/ruby/test_settracefunc.rb: add a test.
-Sun Jul 21 09:58:19 2013 Tanaka Akira <akr@fsij.org>
+ * thread.c: added
+ * rb_threadptr_reset_recursive_data(rb_thread_t *th);
+ * rb_threadptr_restore_recursive_data(rb_thread_t *th, VALUE old);
- * bignum.c (bary_mul_toom3): New function based on bigmul1_toom3.
- (bary_mul_toom3_branch): Call bary_mul_toom3.
- (rb_big_mul_toom3): Ditto.
- (bigmul1_toom3): Removed.
- (big_real_len): Ditto.
- (big_split): Ditto.
- (big_split3): Ditto.
+ * vm_core.h: ditto.
-Sun Jul 21 08:12:16 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+Fri Jun 13 17:33:14 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * proc.c (proc_to_s): use PRIsVALUE to preserve the result encoding.
+ * array.c (rb_ary_combination): iterate on a shared copy, and use
+ array of indexes instead of array of chosen objects.
+ [ruby-core:63149] [Bug #9939]
-Sun Jul 21 03:36:18 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * array.c (yield_indexed_values): extract from permute0(),
+ rpermute0(), and rcombinate0().
- * hash.c (rb_hash_flatten): use NUM2INT to raise TypeError on 32bit
- platform. it's introduced by r42039
+Fri Jun 13 13:42:58 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sun Jul 21 01:07:45 2013 Benoit Daloze <eregontp@gmail.com>
+ * array.c (rb_ary_permutation): `p` is the array of size `r`, as
+ commented at permute0(). since `n >= r` here, buffer overflow
+ never happened, just reduce unnecessary allocation though.
- * common.mk (help): Fix environment variable name and argument.
- Actually it can also be a directory or any argument for
- test/unit runner. [Fixes GH-363]
+Thu Jun 12 20:32:28 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jul 20 22:44:50 2013 Zachary Scott <e@zzak.io>
+ * string.c (rb_str_resize): should consider the capacity instead
+ of the old length, as pointed out by nagachika.
- * common.mk: Document running a single test [Fixes GH-363]
- Patch by Avdi Grimm https://github.com/ruby/ruby/pull/363
+Thu Jun 12 18:31:01 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Sat Jul 20 22:39:56 2013 Zachary Scott <e@zzak.io>
+ * lib/net/http/responses.rb: added Net::HTTPPermanentRedirect(308)
+ Contributed by @yorkie [fix GH-638]
- * sample/*: whitespace patch by Sergio Campama [Fixes GH-364]
- https://github.com/ruby/ruby/pull/364
+Thu Jun 12 13:27:38 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jul 20 22:33:13 2013 Zachary Scott <e@zzak.io>
+ * string.c (rb_str_freeze): shrink the buffer before freezing, as
+ pointed out by Eric Wong at [ruby-core:63119].
- * doc/regexp.rdoc: [DOC] Fix typo in example [Fixes GH-365]
- Patch by Juanito Fatas https://github.com/ruby/ruby/pull/365
+Thu Jun 12 13:09:03 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jul 20 17:46:03 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * file.c (expand_path): shrink expanded path which no longer needs
+ rooms to append. [ruby-core:63114] [Bug #9934]
- * string.c (rb_str_succ): add missing case NEIGHBOR_WRAPPED.
- r42078 caused buggy behavior like "\xFF".b -> "\x01\xFF".b
+Wed Jun 11 17:37:48 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jul 20 15:22:38 2013 Koichi Sasada <ko1@atdot.net>
+ * configure.in (rb_cv_scalar_pthread_t): pthread_t is not required
+ to be a scalar type.
- * array.c (rb_ary_resize): use simple memcpy because there are no new
- references.
+ * thread.c (fill_thread_id_string, thread_id_str): dump pthread_t
+ in hexadecimal form if it is not a scalar type, assume it can be
+ represented in a pointer form otherwise. based on the patch by
+ Rei Odaira at [ruby-core:62867]. [ruby-core:62857] [Bug #9884]
-Sat Jul 20 15:02:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * thread_pthread.c (Init_native_thread, thread_start_func_1),
+ (native_thread_create): set thread_id_str if needed.
- * safe.c (ruby_safe_level_4_warning): define for old extension
- libraries. [Bug #8652]
+ * vm_core.h (rb_thread_t): add thread_id_string if needed.
-Sat Jul 20 14:38:00 2013 Koichi Sasada <ko1@atdot.net>
+Wed Jun 11 01:53:22 2014 Koichi Sasada <ko1@atdot.net>
- * array.c (ary_make_shared): make shared array shady.
- Making non-shady shared array causes SEGV (see rubyci).
- It seems a bug around shared array.
+ * gc.c: invoke GC before memory allocation (xmalloc/xrealloc)
+ when GC.stress = true.
+ [Bug #9859]
-Sat Jul 20 12:14:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/ruby/test_gc.rb: add a test.
- * string.c (enc_succ_char, enc_pred_char): consider wchar case.
- [ruby-core:56071] [Bug #8653]
+Tue Jun 10 13:20:14 2014 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
- * string.c (rb_str_succ): do not replace with invalid char.
+ * lib/cgi/core.rb: Provide a mechanism to specify the
+ max_multipart_length of multipart data.
+ [Feature #8370] patch by Leif Eriksen <leif.eriksen.au@gmail.com>
- * encoding.c (rb_enc_code_to_mbclen): add new function which returns
- mbclen from codepoint like as rb_enc_codelen() but 0 for invalid
- char.
+Tue Jun 10 10:57:07 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * include/ruby/encoding.h (rb_enc_code_to_mbclen): declaration and
- shortcut macro.
+ * lib/csv.rb (CSV#<<): honor explicitly given encoding. based on
+ the patch by DAISUKE TANIWAKI <daisuketaniwaki AT gmail.com> at
+ [ruby-core:62113]. [Bug #9766]
-Fri Jul 19 21:59:12 2013 Koichi Sasada <ko1@atdot.net>
+Mon Jun 9 20:40:48 2014 Koichi Sasada <ko1@atdot.net>
- * gc.c: declare type_name() at the beginning of file.
+ * gc.c: change full GC timing to keep lower memory usage.
-Fri Jul 19 21:35:09 2013 Koichi Sasada <ko1@atdot.net>
+ Extend heap only at
+ (1) after major GC
+ or
+ (2) after several (two times, at current) minor GC
- * array.c: reduce shady operations.
+ Details in https://bugs.ruby-lang.org/issues/9607#note-9
+ [Bug #9607]
- * array.c (rb_ary_modify, ary_make_partial, rb_ary_splice,
- rb_ary_replace, rb_ary_eql, rb_ary_compact_bang):
- use RARRAY_RAWPTR() instead of RARRAY_PTR().
+Mon Jun 9 16:01:41 2014 Masahiro Ide <imasahiro9@gmail.com>
- * array.c (rb_ary_shift): use RARRAY_PTR_USE() without WB because
- there are not new relations.
+ * gc.c (gcdebug_sentinel): fix typo, "sentinel" not "sential".
+ [fix GH-634]
- * array.c (ary_ensure_room_for_unshift): ditto.
+Mon Jun 9 00:04:25 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * array.c (rb_ary_sort_bang): ditto.
+ * configure.in (posix_fadvise): disable use of posix_fadvise
+ itself on 32-bit AIX. [ruby-core:62968] [Bug #9914]
- * array.c (rb_ary_delete_at): ditto.
+Sun Jun 8 23:28:00 2014 <kanemoto@ruby-lang.org>
- * array.c (rb_ary_reverse_m): use RARRAY_RAWPTR() because
- there are not new relations.
+ * io.c (rb_io_advise): AIX currently does not support a 32-bit call to
+ posix_fadvise() if _LARGE_FILES is defined. Patch by Rei Odaira.
+ [ruby-core:62968] [Bug #9914]
-Fri Jul 19 20:58:20 2013 Koichi Sasada <ko1@atdot.net>
+Sun Jun 8 04:52:40 2014 Jun Hiroe <Jun.Hiroe@gmail.com>
- * array.c: reduce shade operations.
+ * string.c (rb_str_slice_bang): [DOC] update return value against
+ a fixnum, which has changed because of M17N. [fix GH-631]
- * array.c (rb_ary_modify): use RARRAY_RAWPTR().
+Sat Jun 7 22:13:42 2014 Benoit Daloze <eregontp@gmail.com>
- * array.c (ary_make_substitution, rb_ary_s_create, ary_make_partial,
- rb_ary_splice, rb_ary_resize, rb_ary_rotate_m, rb_ary_times):
- use ary_memcpy().
+ * numeric.c (do_coerce): Add a warning when an exception is raised
+ or an invalid value is returned in #coerce called by
+ numeric comparison operators and the exception
+ thrown by the caller has no information on the failure.
+ In the next release such exception should not be rescued or
+ should be the cause of the caller exception. nil is accepted
+ as the "no possible coercion" return value. See #7688.
-Fri Jul 19 19:55:28 2013 Koichi Sasada <ko1@atdot.net>
+ * test/ruby/test_numeric.rb: Add corresponding test.
- * array.c (ary_mem_clear): added. This operation doesn't need WB
- because this operation creates a reference to Qnil.
+Sat Jun 7 18:15:33 2014 Benoit Daloze <eregontp@gmail.com>
- * array.c (ary_make_shared, rb_ary_store, rb_ary_shift_m,
- rb_ary_splice, rb_ary_resize, rb_ary_fill): use ary_mem_clear()
- instead of rb_mem_clear().
+ * numeric.c (bit_coerce): remove constant parameter `err'
+ (always TRUE) of bit_coerce().
- * array.c (ary_make_shared): use RARRAY_RAWPTR() instead of RARRAY_PTR().
+Sat Jun 7 16:01:57 2014 Yutaka Kanemoto <kanemoto@ruby-lang.org>
-Fri Jul 19 19:18:51 2013 Koichi Sasada <ko1@atdot.net>
+ * cont.c (rb_fiber_struct): keep context.uc_stack.ss_sp and context.uc_stack.ss_size
+ for later use. Patch by Rei Odaira. [ruby-core:62945] [Bug #9905]
- * array.c: fix commit miss.
- RGENGC_UNPROTECT_LOGGING should be 0.
+Sat Jun 7 12:51:51 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Jul 19 19:15:30 2013 Koichi Sasada <ko1@atdot.net>
+ * io.c (read_all): truncate the buffer before appending read data,
+ instead of truncating before reading.
+ [ruby-core:55951] [Bug #8625]
- * array.c (rb_ary_resurrect): use RARRAY_RAWPTR() because there is no
- writing.
+Sat Jun 7 12:28:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * array.c (rb_ary_new_from_values): use ary_memcpy().
+ * ext/digest/digest.c (rb_digest_instance_equal): no need to call
+ `to_s` twice. [Bug #9913]
-Fri Jul 19 19:07:31 2013 Koichi Sasada <ko1@atdot.net>
+Sat Jun 7 11:35:01 2014 Tanaka Akira <akr@fsij.org>
- * array.c (ary_memcpy): add a function to copy VALUEs into ary
- with write barrier. If ary is promoted, use write barrier correctly.
+ * object.c (rb_mod_initialize_clone): Override Kernel#initialize_clone
+ to avoid an exception on Class.new.freeze.clone.to_s.
+ Reported by Andrew Grimm. [ruby-core:41858] [Bug #5828]
- * array.c (rb_ary_cat, rb_ary_unshift_m, rb_ary_dup,
- rb_ary_sort_bang, rb_ary_replace, rb_ary_plus): use ary_memcpy().
+Sat Jun 7 06:03:11 2014 Benoit Daloze <eregontp@gmail.com>
-Fri Jul 19 15:32:57 2013 Koichi Sasada <ko1@atdot.net>
+ * ext/digest/digest.c (rb_digest_instance_equal):
+ fix #== for non-string arguments. [ruby-core:62967] [Bug #9913]
- * array.c (rb_ary_store): use RARRAY_PTR_USE() instead of RARRAY_PTR().
- Clearing memory space doesn't need WBs.
+ * test/digest/test_digest.rb: add test for above.
-Fri Jul 19 15:19:37 2013 Koichi Sasada <ko1@atdot.net>
+Fri Jun 6 22:19:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * array.c (ary_ensure_room_for_push): use RARRAY_RAWPTR() instead of
- RARRAY_PTR. In this code, there are no "write" operation.
+ * compile.c (private_recv_p): check by node type, instead of a
+ magic number.
- * array.c (rb_ary_equal): ditto.
+ * node.h (NODE_PRIVATE_RECV), parse.y (attrset_gen): remove
- * array.c (recursive_equal): ditto.
+Fri Jun 6 17:07:08 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Jul 19 15:09:22 2013 Koichi Sasada <ko1@atdot.net>
+ * compile.c (iseq_compile_each), parse.y (new_attr_op_assign_gen):
+ allow op assign to a private attribute.
+ [ruby-core:62949] [Bug #9907]
- * gc.c, internal.h (rb_gc_writebarrier_remember_promoted): add a new
- function to remember an specified object. This api is only
- experimental (strongly depend on WB/rgengc strategy).
+Fri Jun 6 13:39:32 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Jul 19 14:56:00 2013 Koichi Sasada <ko1@atdot.net>
+ * io.c (io_setstrbuf, io_read): should not shorten the given buffer until
+ read succeeds. [ruby-core:55951] [Bug #8625]
- * array.c (ary_unprotect_logging): use (void *) for first parameter
- because VALUE is not defined before including ruby/ruby.h.
+Fri Jun 6 07:41:41 2014 Aaron Patterson <aaron@tenderlovemaking.com>
-Fri Jul 19 14:19:48 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: dump empty symbols with a
+ tag so that they can be parsed on input. [Bug #9873] [ruby-core:62825]
+ * test/psych/test_symbol.rb: test for change
- * ext/pathname/pathname.c (path_inspect): use PRIsVALUE to preserve
- the result encoding.
+Thu Jun 5 16:08:39 2014 Koichi Sasada <ko1@atdot.net>
-Fri Jul 19 12:35:41 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c (gc_page_sweep): refactoring.
- * test/socket/test_tcp.rb (test_initialize_failure): Use EADDRNOTAVAIL
- to test an error message generated by bind() failure.
+ * gc.c (gc_page_sweep): should not set, but add final_slots into
+ sweep_page->final_slots.
-Fri Jul 19 11:27:38 2013 Zachary Scott <e@zzak.io>
+Thu Jun 5 14:36:24 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/racc/parser.rb: [DOC] Capitalize "Ruby" in documentation
- Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+ * configure.in (jemalloc): check for the header regardless drop-in
+ libjemalloc is found, for `malloc_conf` declaration.
-Fri Jul 19 11:26:28 2013 Zachary Scott <e@zzak.io>
+ * version.c (ruby_show_version): show `malloc_conf` if set.
+ [Feature #9113]
- * ext/psych/lib/psych*: [DOC] Capitalize "Ruby" in documentation
- Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+ * configure.in (with-jemalloc): also check for header, for ABIs
+ which JEMALLOC_MANGLE is needed, i.e., Mach-O and PE-COFF
+ platforms. [ruby-core:62939] [Feature #9113]
-Fri Jul 19 11:25:12 2013 Zachary Scott <e@zzak.io>
+ * include/ruby/missing.h: include alternative malloc header to
+ replace memory management functions.
- * lib/rdoc/*: [DOC] Capitalize "Ruby" in documentation
- Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+ * dln.c, io.c, parse.y, st.c: undef malloc family before
+ re-definition to suppress warnings.
-Fri Jul 19 11:23:55 2013 Zachary Scott <e@zzak.io>
+Thu Jun 5 12:52:18 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * lib/rubygems*: [DOC] Capitalize "Ruby" in documentation
- Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+ * man/ruby.1: remove rubyforge entry.
-Fri Jul 19 11:16:54 2013 Akinori MUSHA <knu@iDaemons.org>
+Thu Jun 5 12:45:32 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * lib/set.rb (Set#to_set): Define Set#to_set so that aSet.to_set
- returns self. [Fixes GH-359]
+ * misc/README: use github link instead of rubyforge.
-Fri Jul 19 11:10:23 2013 Zachary Scott <e@zzak.io>
+Thu Jun 5 10:03:29 2014 Koichi Sasada <ko1@atdot.net>
- * lib/rake/*: [DOC] Capitalize "Ruby" in documentation
- Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+ * gc.c (obj_free): check also FL_PROMOTED bit by RVALUE_OLD_P().
-Fri Jul 19 01:04:14 2013 Tanaka Akira <akr@fsij.org>
+Thu Jun 5 03:45:28 2014 Eric Wong <e@80x24.org>
- * ext/-test-/bignum/intpack.c: Renamed from ext/-test-/bignum/pack.c.
- (Init_intpack): Renamed from Init_pack.
- Reported by Naohisa Goto. [ruby-dev:47526] [Bug #8655]
+ * configure.in: add --with-jemalloc option
+ [ruby-core:62912]
-Fri Jul 19 00:54:27 2013 Benoit Daloze <eregontp@gmail.com>
+Wed Jun 4 22:28:14 2014 Koichi Sasada <ko1@atdot.net>
- * test/ruby/test_array.rb (test_count): add a test case for #count
- with an argument. See Bug #8654.
+ * gc.c: introduce RZombie to manage zombie objects.
+ Rewrite finalizing logics with this type.
-Thu Jul 18 23:45:06 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * gc.c (gc_verify_internal_consistency): verify zombie (finalizing)
+ objects count.
- * array.c (rb_ary_eql): compare RARRAY_PTR() for performance
- improvement in case of that self and other are shared.
+Wed Jun 4 22:09:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Jul 18 22:46:42 2013 Zachary Scott <e@zzak.io>
+ * re.c (match_aref, rb_reg_regsub): consider encoding of captured
+ names, encoding-incompatible should not match.
+ [ruby-dev:48278] [Bug #9903]
- * lib/cgi.rb: [DOC] Capitalize "Ruby" in documentation [Fixes GH-341]
- Patch by Dave Worth https://github.com/ruby/ruby/pull/341
- * lib/webrick.rb: ditto
- * lib/scanf.rb: ditto
- * lib/xmlrpc/config.rb: ditto
- * lib/resolv.rb: ditto
- * lib/e2mmap.rb: ditto
- * lib/fileutils.rb: ditto
- * lib/mkmf.rb: ditto
- * lib/cgi/session.rb: ditto
- * lib/yaml.rb: ditto
- * lib/erb.rb: ditto
- * lib/irb.rb: ditto
- * lib/tracer.rb: ditto
- * lib/net/http.rb: ditto
- * ext/syslog/lib/syslog/logger.rb: ditto
- * sample/pty/expect_sample.rb: ditto
+Wed Jun 4 21:23:52 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Jul 18 21:30:50 2013 Tanaka Akira <akr@fsij.org>
+ * re.c (match_aref): should not ignore name after NUL byte.
+ [ruby-dev:48275] [Bug #9902]
- * bignum.c (bary_sq_fast): Specialize the last iteration of the
- outer loop.
- (bigfixize): A condition simplified.
+Wed Jun 4 04:08:37 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Jul 18 21:15:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * vm.c (core_hash_merge_kwd): should return the result hash, which
+ may be converted from and differ from the given argument.
+ [ruby-core:62921] [Bug #9898]
- * array.c (rb_ary_equal): compare RARRAY_PTR() for performance
- improvement in case of that self and other are shared.
+Tue Jun 3 23:32:34 2014 Tanaka Akira <akr@fsij.org>
-Thu Jul 18 20:44:51 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * ruby.c (load_file_internal2): Extracted from load_file_internal.
+ (load_file_internal): Invoke load_file_internal2 using rb_protect.
+ Close an opened FD if load_file_internal2 raises an exception.
- * array.c (rb_ary_fill): use memfill().
+Tue Jun 3 19:11:45 2014 Koichi Sasada <ko1@atdot.net>
-Thu Jul 18 20:35:14 2013 Benoit Daloze <eregontp@gmail.com>
+ * gc.c (rb_objspace_free): should not rest_sweep() here.
+ Some data structures are already freed.
- * array.c (rb_ary_count): check length to avoid SEGV
- while iterating. Remove other pointer loop when arg is given.
+Tue Jun 3 18:43:51 2014 Koichi Sasada <ko1@atdot.net>
- * test/ruby/test_array.rb (test_count): add test for bug.
- [ruby-core:56072] [Bug #8654]
+ * test/ruby/test_gc.rb: allocate more objects to invoke GC by newobj.
+ GC allows extending pages depends on heap_increment.
-Thu Jul 18 18:14:36 2013 Masaki Matsushita <glass.saga@gmail.com>
+Tue Jun 3 18:01:27 2014 Koichi Sasada <ko1@atdot.net>
- * array.c (rb_ary_count): iterate items appropriately.
- [Bug #8654]
+ * gc.c (rb_gc_call_finalizer_at_exit): add
+ gc_verify_internal_consistency() when RGENGC_CHECK_MODE >= 2.
-Thu Jul 18 17:35:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+Tue Jun 3 17:54:21 2014 Koichi Sasada <ko1@atdot.net>
- * hash.c (rb_hash_flatten): performance improvement by not using
- rb_hash_to_a() to avoid array creation with rb_assoc_new().
+ * gc.c: change the counting method for young objects.
+ clear counter at the beginning of every GC and
+ count promoted (infant->young) objects.
-Thu Jul 18 16:16:17 2013 Koichi Sasada <ko1@atdot.net>
+ Some promotions (infant->young) are transition of promoting to old
+ objects. We should not count such promotions.
- * array.c: add logging feature for RGenGC's write barrier unprotect
- event.
+ With this technique, we don't need to check young objects
+ at obj_free().
-Thu Jul 18 15:45:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Jun 3 16:38:19 2014 Koichi Sasada <ko1@atdot.net>
- * include/ruby/ruby.h (RUBY_SAFE_LEVEL_CHECK): make only
- rb_set_safe_level(4) an error always but make rb_secure(4) an error
- only in the core. [ruby-dev:47517] [Bug #8652]
+ * gc.c: add verifying counters code in gc_verify_internal_consistency().
+ gc_verify_internal_consistency() counts all
+ - live objects
+ - young objects (if age2 promotion)
+ - old objects
+ in all pages and compares with objspace managing counters.
-Thu Jul 18 15:42:01 2013 Koichi Sasada <ko1@atdot.net>
+ * gc.c (gc_after_sweep): do gc_verify_internal_consistency()
+ when RGENGC_CHECK_MODE >= 2.
- * include/ruby/ruby.h: fix spell miss.
+Tue Jun 3 13:14:04 2014 Shugo Maeda <shugo@ruby-lang.org>
-Thu Jul 18 15:11:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/net/imap.rb (body_type_1part): Gmail IMAP reports a body
+ type as "MIXED" followed immediately by params
+ [ruby-core:62864] [Bug #9885]
+ Patch by @rayners (David Raynes). [Fixes GH-622]
+ https://github.com/ruby/ruby/pull/622
- * include/ruby/ruby.h (ruby_safe_level_4): get rid of special
- character. [ruby-dev:47512] [misc #8646]
+Tue Jun 3 13:18:24 2014 Koichi Sasada <ko1@atdot.net>
-Thu Jul 18 14:51:39 2013 Koichi Sasada <ko1@atdot.net>
+ * gc.c (objspace_live_slot): live slot count should not include final
+ slot (contains T_ZOMBIE) count.
- * array.c (ary_alloc): slim setup process.
+Tue Jun 3 13:03:21 2014 Koichi Sasada <ko1@atdot.net>
-Thu Jul 18 14:37:57 2013 Koichi Sasada <ko1@atdot.net>
+ * gc.c (obj_free): fix spacing.
- * string.c (str_alloc): no need to clear RString (already cleared).
+Tue Jun 3 12:59:32 2014 Koichi Sasada <ko1@atdot.net>
-Thu Jul 18 12:57:47 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c (check_gen_consistency): fix error message.
- * bignum.c (BDIGITS_ZERO): Defined.
- (bary_pack): Use BDIGITS_ZERO.
- (bary_unpack): Ditto.
- (bary_mul_single): Ditto.
- (bary_mul_normal): Ditto.
- (bary_sq_fast): Ditto.
- (bary_mul_balance_with_mulfunc): Ditto.
- (bary_mul_precheck): Ditto.
- (bary_mul_toom3_branch): Ditto.
- (rb_cstr_to_inum): Ditto.
- (big_shift3): Ditto.
- (bigmul1_toom3): Ditto.
- (bary_divmod): Ditto.
+Tue Jun 3 12:40:23 2014 Koichi Sasada <ko1@atdot.net>
-Thu Jul 18 06:30:02 2013 Koichi Sasada <ko1@atdot.net>
+ * gc.c: count old/young objects more correctly.
- * gc.c: rename gc related functions with prefix "gc_".
- * before_gc_sweep() -> gc_before_sweep().
- * after_gc_sweep() -> gc_after_sweep().
- * lazy_sweep() -> gc_lazy_sweep().
- * rest_sweep() -> gc_rest_sweep().
- * slot_sweep() -> gc_slot_sweep().
+ * gc.c (RVALUE_DEMOTE_FROM_OLD): decrement old object count.
- * gc.c: rename a heap management function with prefix "heap_".
- * get_freeobj() -> heap_get_freeobj().
+ * gc.c (RVALUE_DEMOTE_FROM_YOUNG): decrement young object count.
- * gc.c: rename markable_object_p() to is_markable_object().
+ * gc.c (rb_gc_resurrect): increment old object count.
-Wed Jul 17 22:57:40 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * gc.c (gc_marks_body): should not add old object count.
+ This code is completely my misunderstanding.
- * hash.c (delete_if_i): use ST_DELETE.
+ * gc.c (rb_gc_force_recycle): decrement young or old object count
+ correctly.
-Wed Jul 17 22:34:47 2013 Tanaka Akira <akr@fsij.org>
+Tue Jun 3 12:26:47 2014 Koichi Sasada <ko1@atdot.net>
- * bignum.c: An static assertion for relation of SIZEOF_LONG and
- SIZEOF_BDIGITS is added.
- (bary_mul_precheck): Reduce comparisons.
- (bary_mul): Invoke bary_sq_fast or bary_mul1 if the bignum size is
- small.
- (bigfixize): Resize the argument bignum here.
- (bignorm): Don't call bigtrunc after bigfixize.
+ * test/ruby/memory_status.rb: add $LOAD_PATH to load test/unit
+ correctly for fiddle/import unavailable environments.
-Wed Jul 17 22:13:26 2013 Masaki Matsushita <glass.saga@gmail.com>
+Tue Jun 3 09:45:13 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * hash.c (rb_hash_replace): performance improvement by using
- st_copy().
+ * test/openssl/test_ssl.rb (OpenSSL::TestSSL#test_verify_result):
+ shouldn't use same server for respective tests, because the 1st
+ test sometimes kills the server main loop silently.
+ [Bug #9881] [ruby-dev:48266]
-Wed Jul 17 17:19:54 2013 Koichi Sasada <ko1@atdot.net>
+Tue Jun 3 01:34:59 2014 Zachary Scott <e@zzak.io>
- * gc.c: rename heap management functions with prefix "heap_".
- * allocate_sorted_array() -> heap_allocate_sorted_array().
- * slot_add_freeobj() -> heap_slot_add_freeobj().
- * assign_heap_slot() -> heap_assign_slot().
- * add_heap_slots() -> heap_add_slots().
- * init_heap() -> heap_init().
- * set_heap_increment() -> heap_set_increment().
+ * README.EXT: [DOC] Add rb_call_super when subclassing from @robin850
+ [Fixes GH-623] https://github.com/ruby/ruby/pull/623
- * gc.c (initial_expand_heap): inlined in rb_gc_set_params().
+Mon Jun 2 17:14:49 2014 Koichi Sasada <ko1@atdot.net>
-Wed Jul 17 17:12:23 2013 Matthew M. Boedicker <matthewm@boedicker.org>
+ * vm.c (ruby_vm_destruct): remove useless call of
+ rb_gc_force_recycle().
- * hash.c (env_fetch): Add key name to message on ENV.fetch KeyError,
- as well as Hash#fetch. [ruby-core:56062] [Feature #8649]
+ At this line, a VM object is already freed
+ (is changed to T_NONE) by rb_gc_call_finalizer_at_exit().
-Wed Jul 17 15:59:33 2013 Koichi Sasada <ko1@atdot.net>
+Mon Jun 2 15:50:24 2014 Koichi Sasada <ko1@atdot.net>
- * gc.c: catch up last changes for debugging/checking mode.
+ * eval.c (rb_using_refinement): add write-barriers for
+ cref->nd_refinements.
-Wed Jul 17 15:50:10 2013 Koichi Sasada <ko1@atdot.net>
+Mon Jun 2 12:26:08 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * gc.c (rb_objspace_free): free slot itself.
+ * CONTRIBUTING.md: added contributing guide for github. [fix GH-625]
- * gc.c (objspace_each_objects): fix condition.
- Use slot->body instead of slot.
+Mon Jun 2 07:30:33 2014 Tanaka Akira <akr@fsij.org>
- * gc.c (count_objects): use "slot" variable.
+ * test/ruby/envutil.rb (default_warning): New method.
-Wed Jul 17 15:21:10 2013 Koichi Sasada <ko1@atdot.net>
+ * test/ruby/test_autoload.rb: Use EnvUtil.default_warning.
- * gc.c (unlink_heap_slot): fix memory leak.
- free slot itself at free_heap_slot().
+Mon Jun 2 07:05:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- Reproduce-able code is here:
- N1 = 100_000; N2 = 1_000_000
- N1.times{ary = []; N2.times{ary << ''}}
- Maybe this problem is remaining in Ruby 2.0.0.
+ * include/ruby/encoding.h: constify `rb_encoding` arguments.
- * gc.c (unlink_heap_slot): remove not working code.
+ * include/ruby/oniguruma.h: constify `OnigEncoding` arguments.
-Wed Jul 17 14:31:13 2013 Koichi Sasada <ko1@atdot.net>
+Sun Jun 1 12:05:10 2014 Tanaka Akira <akr@fsij.org>
- * gc.c: re-design the heap structure.
+ * test/drb: Wrap tests definitions by DRbTests module. This makes
+ several tests (ACLEntryTest, TestBug4409, etc.) easier to understand
+ that they are tests for DRb.
- (1) The heap is consists of a set of slots.
- (2) Each "slot" has a "slot_body".
- slot::start and slot::limit specify RVALUE beginning address
- and number of RVALUE in a "slot_body".
- (3) "slot_body" contains a pointer to slot (slot_body::header::slot)
- and an array of RVALUE.
- (4) heap::sorted is an array of "slots", sorted by an address of
- slot::body.
+Sun Jun 1 11:36:25 2014 Tanaka Akira <akr@fsij.org>
- See https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/GC_design
- for more details (figure).
+ * lib/rinda/ring.rb (RingFinger#make_socket): Close the socket on
+ exception.
- * gc.c: Avoid "heaps" terminology. It is ambiguous.
+Sun Jun 1 06:55:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Wed Jul 17 13:29:16 2013 Koichi Sasada <ko1@atdot.net>
+ * parse.y (intern_str): dynamic attrset ID is registered by
+ `rb_id_attrset()` already, so no further registration is needed.
+ [ruby-core:62861]
- * gc.c: fix heaps_header and heaps_slot to reduce memory consumption.
- (1) move heaps_header::start and limit to heaps_slot.
- (2) remove heaps_header::end which can be calculated by start+limit.
+Sun Jun 1 04:52:47 2014 Zachary Scott <e@zzak.io>
- * gc.c: catch up above change.
+ * lib/English.rb: [DOC] $LOADED_FEATURES moved to load.c [Fixes GH-620]
+ Patch submitted by @leafac in https://github.com/ruby/ruby/pull/620
+ * doc/globals.rdoc: Added $LOADED_FEATURES to list
-Wed Jul 17 12:30:05 2013 Tanaka Akira <akr@fsij.org>
+Sat May 31 22:30:14 2014 Tanaka Akira <akr@fsij.org>
- * include/ruby/st.h (st_strcasecmp): Macro defined for compatibility.
- (st_strncasecmp): Ditto.
+ * test/lib/leakchecker.rb: Leak checker extracted from
+ test/lib/minitest/unit.rb.
-Wed Jul 17 11:57:45 2013 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
+Sat May 31 21:15:43 2014 URABE Shyouhei <shyouhei@ruby-lang.org>
- * lib/cgi/util.rb (CGI::Util#escape, unescape): Avoid use of regexp
- special global variable. [Feature #8648] Thanks to fotos.
+ * thread.c (rb_thread_atfork_internal): My compiler complains
+ about this variable being used before initialized. I looked at
+ the code and expanded the macro and turned out it was actually
+ USED for pointer arithmetic, not dereferenced. So this was
+ never a serious bug. But is annoying indeed to see warnings
+ every time. I added `=0` and all went healthy.
-Wed Jul 17 11:57:10 2013 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
+ * configure.in: Also, I found that the problematic macro expansion
+ only happens when we lack __typeof__ C extension, which shall
+ not be the case of my compiler. I added AC_C_TYPEOF to kick ass.
- * lib/erb.rb (ERB::Util#url_encode): Avoid use of regexp special global
- variable. [Feature #8648] Thanks to fotos.
+Sat May 31 16:32:50 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Wed Jul 17 08:12:41 2013 Tanaka Akira <akr@fsij.org>
+ * lib/ipaddr.rb: extracted inline tests into test dir.
+ * test/test_ipaddr.rb: ditto.
- * st.c (st_locale_insensitive_strcasecmp): Renamed from st_strcasecmp.
- (st_locale_insensitive_strncasecmp): Renamed from st_strncasecmp.
+Sat May 31 16:29:21 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * include/ruby/st.h: Follow above changes.
+ * ext/digest/lib/digest/hmac.rb: extracted inline tests into test dir.
+ * test/digest/test_digest_hmac.rb: ditto.
- * include/ruby/ruby.h: Ditto.
+Sat May 31 16:02:03 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Wed Jul 17 00:14:59 2013 Tanaka Akira <akr@fsij.org>
+ * test/test_syslog.rb: remove executable.
- * bignum.c (bigmul1_toom3): Use bigdivrem_single instead of bigdivrem.
- (big_three): Removed.
- (Init_Bignum): Don't initialize big_three.
+Sat May 31 08:58:32 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Tue Jul 16 21:46:03 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * enc/unicode.c (init_case_fold_table): no longer need to
+ initialize tables at runtime.
- * configure.in: revert r42008. strcasecmp() uses the current locale.
+ * enc/unicode/case-folding.rb (lookup_hash): make perfect hash to
+ lookup case unfolding table 3.
- * include/ruby/ruby.h: ditto.
+ * enc/unicode/case-folding.rb (lookup_hash): make perfect hash to
+ lookup case unfolding table 2.
- * st.c (st_strcasecmp): ditto.
+ * enc/unicode/case-folding.rb (lookup_hash): make perfect hash to
+ lookup case unfolding table 1.
-Tue Jul 16 21:07:04 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * enc/unicode/case-folding.rb (lookup_hash): make perfect hash to
+ lookup case folding table.
- * configure.in: check strcasecmp().
+ * enc/unicode/case-folding.rb (print_table): merge non-locale and
+ locale tables, and reduce initializing loops.
- * include/ruby/ruby.h: use strcasecmp() as st_strcasecmp() if it
- exists.
+ * enc/unicode/case-folding.rb (CaseFolding): modularize, and add
+ --output-file option.
- * st.c (st_strcasecmp): define the function only if strcasecmp()
- doesn't exist.
+ * enc/unicode/case-folding.rb: script to convert CaseFolding.txt,
+ translated from CaseFolding.py.
-Tue Jul 16 20:21:28 2013 Tanaka Akira <akr@fsij.org>
+Sat May 31 08:31:41 2014 Tanaka Akira <akr@fsij.org>
- * bignum.c (bigsq): Renamed from bigsqr.
+ * test/lib/minitest/unit.rb: Check Tempfile leaks for each test method
+ again.
-Tue Jul 16 19:42:08 2013 Tanaka Akira <akr@fsij.org>
+Sat May 31 03:50:50 2014 Zachary Scott <e@zzak.io>
- * bignum.c (USHORT): Unused macro removed.
+ * lib/delegate.rb: [DOC] Document raise in Delegator class
+ Patch by @lucasmazza. [Fixes GH-621]
+ https://github.com/ruby/ruby/pull/621
-Tue Jul 16 19:18:51 2013 Koichi Sasada <ko1@atdot.net>
+Fri May 30 21:23:26 2014 Tanaka Akira <akr@fsij.org>
- * gc.c: slim a path of newobj_of().
+ * lib/webrick/server.rb: Use a pipe to detect server shutdown.
+ shutdown() or close() for listening socket is not a reliable.
+ Actually, both doesn't work (doesn't wake up select()) on
+ DragonFly BSD 3.6.2.
- * gc.c (objspace): add a new field objspace::freelist, which contains
- available RVALUEs.
+ * test/webrick/utils.rb: :ShutdownSocketWithoutClose is not required
+ now to immediate server shutdown detection.
+ This fixes fd leaks.
- * gc.c (newobj_of): simply call new function `get_freeobj()'.
- get_freeobj() returns objspace::freelist. If objspace::freelist
- is not available, refill objspace::freelist with a slot pointed by
- objspace::heap::free_slots.
+ * test/net/http/utils.rb: Ditto.
- * gc.c (before_gc_sweep): clear objspace::freelist.
+Fri May 30 20:58:37 2014 Tanaka Akira <akr@fsij.org>
- * gc.c (slot_sweep): clear slot::freelist.
+ * test/lib/minitest/unit.rb (check_fd_leak): Sort the inspected
+ objects list for a FD.
- * gc.c (heaps_prepare_freeslot): renamed to heaps_prepare_freeslot.
+Fri May 30 18:06:55 2014 Tanaka Akira <akr@fsij.org>
- * gc.c (unlink_free_heap_slot): remove unused function.
+ * test/lib/minitest/unit.rb (check_fd_leak): Try GC to delete leaked
+ FDs.
- * gc.c (rb_free_const_table): remove unused function.
+Fri May 30 12:05:59 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Tue Jul 16 19:05:12 2013 Tanaka Akira <akr@fsij.org>
+ * test/lib/test/unit/parallel.rb (_run_suite): orig_stdout may be nil
+ though I don't know the reason.
- * bignum.c (big_shift3): Big shift width is not a problem for right
- shift.
+Fri May 30 11:33:35 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Tue Jul 16 18:50:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * string.c (rb_str_substr): need to reset code range for shared
+ string too, not only copied string.
+ [ruby-core:62842] [Bug #9882]
- * array.c (rb_ary_count): [DOC] fix typo. Array#count uses ==, not
- ===. a question at asakusa.rb ML.
+Fri May 30 10:22:21 2014 Mark Lorenz <mlorenz@covermymeds.com>
-Tue Jul 16 18:35:48 2013 Tanaka Akira <akr@fsij.org>
+ * lib/erb.rb (result): [DOC] no longer accepts a Proc, as
+ Kernel.eval does not. [fix GH-619]
- * bignum.c (bary_mul_karatsuba): Avoid duplicate calculation when
- squaring.
- (bary_mul_toom3_branch): Ditto.
+Fri May 30 07:25:46 2014 Tanaka Akira <akr@fsij.org>
-Tue Jul 16 17:43:22 2013 Koichi Sasada <ko1@atdot.net>
+ * ext/-test-/dir: Dir#fileno implemented.
- * gc.c (link_free_heap_slot): removed.
+ * test/lib/minitest/unit.rb (find_fds): Don't return the fd used to
+ scan /proc/$$/fd.
- * gc.c (slot_sweep): use `heaps_add_freeslot' instead of
- `link_free_heap_slot'.
+Fri May 30 04:48:00 2014 Eric Wong <e@80x24.org>
- * gc.c (assign_heap_slot): use local variable `slot' instead of
- `heaps'.
+ * parse.y (rb_gc_mark_parser): remove, empty since r8758
+ * internal.h: ditto, not usable from extensions since 2.0.0
+ * gc.c (gc_mark_roots): remove checkpoint for parser
-Tue Jul 16 17:21:39 2013 Koichi Sasada <ko1@atdot.net>
+Thu May 29 23:27:50 2014 Rei Odaira <Rei.Odaira@gmail.com>
- * gc.c (assign_heap_slot): refactoring variable names.
+ * signal.c (ruby_signal): should return either `old.sa_sigaction`
+ or `old.sa_handler`, depending on whether `SA_SIGINFO` is set in
+ `old.sa_flags`, because they may not be a union.
+ [ruby-core:62836] [Bug #9878]
- * gc.c (slot_add_freeobj): added.
+Thu May 29 23:11:20 2014 Tanaka Akira <akr@fsij.org>
- * gc.c (heaps_add_freeslot): added.
+ * io.c (pipe_open): Close pipes when rb_execarg_fixup() raises
+ an exception.
+ (rb_execarg_fixup_v): New function.
- * gc.c (finalize_list, rb_gc_force_recycle, slot_sweep): use
- `slot_add_freeobj' instead of modifying linked list directly.
+Thu May 29 22:18:57 2014 Tanaka Akira <akr@fsij.org>
-Tue Jul 16 16:30:58 2013 Koichi Sasada <ko1@atdot.net>
+ * test/lib/minitest/unit.rb (capture_subprocess_io): Close fds.
- * gc.c (lazy_sweep): refactoring.
+Thu May 29 19:47:08 2014 Tanaka Akira <akr@fsij.org>
-Tue Jul 16 13:32:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * io.c (rb_io_s_pipe): Close pipes if io_encoding_set() raises an
+ exception.
+ (io_encoding_set_v): New function.
- * encoding.c (enc_set_index): since r41967, old terminator is dealt
- with in str_fill_term(). should not consider it here because this
- function is called before any encoding is set.
+Thu May 29 19:42:49 2014 Tanaka Akira <akr@fsij.org>
-Tue Jul 16 11:12:03 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * lib/csv.rb (CSV.open): Close the opened file when an exception
+ occur.
- * proc.c (rb_block_arity): raise ArgumentError if no block given.
+Thu May 29 19:31:10 2014 Tanaka Akira <akr@fsij.org>
-Tue Jul 16 08:15:22 2013 Zachary Scott <e@zzak.io>
+ * ext/openssl/lib/openssl/ssl.rb (SSLServer#accept): Close a socket
+ if any exception occur.
- * ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] document top-level
- classes from BigDecimal utils native extensions
+Thu May 29 05:05:29 2014 Eric Wong <e@80x24.org>
-Tue Jul 16 03:23:03 2013 Zachary Scott <e@zzak.io>
+ * include/ruby/ruby.h: Hide Symbol internals.
+ (struct RSymbol): moved to internal.h
+ (RSYMBOL): ditto
- * numeric.c: [DOC] improve rdoc formatting for parameters and links
+Thu May 29 00:28:56 2014 Tanaka Akira <akr@fsij.org>
-Mon Jul 15 14:40:00 2013 Tanaka Akira <akr@fsij.org>
+ * ext/socket/unixsocket.c (rsock_init_unixsock): Open a socket
+ after path length check.
+ This fixes a fd leak by TestSocket_UNIXSocket#test_too_long_path.
- * include/ruby/intern.h (rb_big2str0): Deprecated.
+Wed May 28 23:04:35 2014 Tanaka Akira <akr@fsij.org>
- * bignum.c (rb_big2str1): Renamed from rb_big2str0.
- (rb_big2str0): Deprecated wrapper for rb_big2str1.
- (rb_big2str): Invoke rb_big2str1 instead of rb_big2str0.
+ * test/ruby/test_io.rb (test_flush_in_finalizer1): Use
+ ObjectSpace.each_object to close files.
+ GC.start is not reliable.
-Mon Jul 15 14:13:02 2013 Masaki Matsushita <glass.saga@gmail.com>
+Wed May 28 19:00:31 2014 Tanaka Akira <akr@fsij.org>
- * struct.c (rb_struct_each_pair): use rb_yield_values(2, key, value)
- instead of rb_yield(rb_assoc_new(key, value)) if rb_block_arity()
- is greater than 1.
+ * lib/net/imap.rb (Net::IMAP#initialize): Close the opened socket when
+ any exception occur.
+ This fixes a fd leak by IMAPTest#test_imaps_post_connection_check
+ which start_tls_session() raises an exception.
-Mon Jul 15 13:46:26 2013 Tanaka Akira <akr@fsij.org>
+Wed May 28 18:06:13 2014 Tanaka Akira <akr@fsij.org>
- * bignum.c: Add static assertions.
+ * ext/openssl/ossl_ssl.c (ossl_ssl_close): Fix sync_close to work
+ when SSL is not started.
+ This fix the fd leak by test_https_proxy_authentication in
+ test/net/http/test_https_proxy.rb.
-Mon Jul 15 13:36:02 2013 Masaki Matsushita <glass.saga@gmail.com>
+Wed May 28 10:29:28 2014 Eric Wong <e@80x24.org>
- * hash.c (rb_hash_each_pair): performance improvement by using
- rb_block_arity().
+ * vm.c (rb_vm_living_threads_foreach): remove function
+ [ruby-core:62745]
+ * thread.c (terminate_i): remove
+ * thread.c (terminate_all): implement (inlines old terminate_i)
+ * thread.c (rb_thread_terminate_all): use terminate_all
+ * thread.c (rb_thread_fd_close_i): remove
+ * thread.c (rb_thread_fd_close): iterate inline
+ * thread.c (thread_list_i): remove
+ * thread.c (rb_thread_list): iterate inline
+ * thread.c (rb_thread_atfork_internal): iterate inline
+ * thread.c (terminate_atfork_i): update types to remove casts
+ * thread.c (terminate_atfork_before_exec_i): ditto
+ * thread.c (struct thgroup_list_params): remove definition
+ * thread.c (thgroup_list_i): remove
+ * thread.c (thgroup_list): iterate inline
+ * thread.c (check_deadlock_i): remove
+ * thread.c (debug_deadlock_check): implement (inlines check_deadlock_i)
+ * thread.c (debug_i): remove
+ * thread.c (rb_check_deadlock): iterate inline
+ * vm.c (vm_mark_each_thread_func): remove
+ * vm.c (rb_vm_mark): iterate inline
+ * vm_core.h (rb_vm_living_threads_remove): remove
+ * vm_trace.c (clear_trace_func_i): remove
+ * vm_trace.c (rb_clear_trace_func): iterate inline
-Mon Jul 15 13:15:37 2013 Masaki Matsushita <glass.saga@gmail.com>
+Wed May 28 09:30:51 2014 Eric Wong <e@80x24.org>
- * proc.c (rb_block_arity): create internal API rb_block_arity().
- it returns arity of given block.
+ * signal.c (signal_exec): ignore immediate cmd for SIG_IGN
+ * signal.c (trap_handler): set cmd to true for SIG_IGN
+ * signal.c (trap): handle nil and true values for oldcmd
+ [Bug #9835]
-Mon Jul 15 13:07:27 2013 Yuki Yugui Sonoda <yugui@yugui.jp>
+Wed May 28 01:02:54 2014 Tanaka Akira <akr@fsij.org>
- * lib/prime.rb (Prime::EratosthenesGenerator,
- Prime::EratosthenesSieve): New implementation by
- robertjlooby <robertjlooby AT gmail.com>.
+ * lib/tempfile.rb (Tempfile#inspect): Show "(closed)" if the tempfile
+ is closed.
- * test/test_prime.rb: updated with new method name
+Wed May 28 00:38:09 2014 Tanaka Akira <akr@fsij.org>
-Mon Jul 15 11:32:46 2013 Zachary Scott <e@zzak.io>
+ * test/lib/minitest/unit.rb: Use Tempfile#close! instead of
+ Tempfile#unlink to close file descriptors.
- * numeric.c (rb_cNumeric): [DOC] Added comment for Numeric to fix doc
+ * test/openssl/test_config.rb: Ditto.
-Mon Jul 15 11:24:48 2013 Tanaka Akira <akr@fsij.org>
+ * test/ruby/test_io.rb: Ditto.
- * bignum.c (maxpow_in_bdigit_dbl): Useless #if removed.
+Wed May 28 00:06:18 2014 Tanaka Akira <akr@fsij.org>
-Mon Jul 15 11:10:46 2013 Zachary Scott <e@zzak.io>
+ * lib/net/ftp.rb (transfercmd): Close TCP server socket even if an
+ exception occur.
- * bignum.c (rb_big_coerce): [DOC] Add docs for Bignum#coerce
- Based on patch by Juanito Fatas [Fixes GH-360]
- https://github.com/ruby/ruby/pull/360
+Tue May 27 23:50:07 2014 Tanaka Akira <akr@fsij.org>
-Mon Jul 15 10:56:01 2013 Zachary Scott <e@zzak.io>
+ * lib/cgi/core.rb: Use Tempfile#close! instead of Tempfile#unlink
+ to close file descriptors.
- * thread.c (mutex_sleep): [DOC] Awake thread will reacquire lock
- By Tim Abdulla [Fixes GH-342] https://github.com/ruby/ruby/pull/342
+Tue May 27 23:06:46 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Mon Jul 15 10:45:09 2013 Tanaka Akira <akr@fsij.org>
+ * parse.y (parser_number_literal_suffix): refine error message for
+ extra dot and digits.
- * bignum.c (nlz16): Use __builtin_clz if possible.
- (nlz32): Use __builtin_clz or __builtin_clzl if possible.
- (nlz64): Use __builtin_clzl or __builtin_clzll if possible.
- (nlz128): Use __builtin_clzll if possible.
+Tue May 27 22:44:20 2014 Tanaka Akira <akr@fsij.org>
- * configure.in: Check __builtin_clz, __builtin_clzl and
- __builtin_clzll.
+ * test/rexml: Avoid fd leaks.
-Mon Jul 15 09:39:07 2013 Tanaka Akira <akr@fsij.org>
+Tue May 27 22:24:25 2014 Kouhei Sutou <kou@cozmixng.org>
- * bignum.c (power_cache_get_power): Use bitsize instead of ceil_log2.
- (ones): Removed.
- (next_pow2): Removed.
- (floor_log2): Removed.
- (ceil_log2): Removed.
+ * test/rexml/test_document.rb: Indent.
- * configure.in (__builtin_popcountl): Don't check.
+Tue May 27 22:15:29 2014 Kouhei Sutou <kou@cozmixng.org>
-Mon Jul 15 02:47:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/rexml/test_document.rb: Wrap by REXMLTests module.
- * localeinit.c (rb_locale_charmap, Init_enc_set_filesystem_encoding):
- move from encoding.c.
+Tue May 27 22:11:10 2014 Kouhei Sutou <kou@cozmixng.org>
- * miniinit.c (rb_locale_charmap, Init_enc_set_filesystem_encoding):
- define miniruby specific functions only.
+ * test/rexml/test_encoding_2.rb: Remove a needless file.
-Mon Jul 15 02:32:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue May 27 22:10:30 2014 Kouhei Sutou <kou@cozmixng.org>
- * encoding.c (rb_enc_init): no longer needs NO_PRESERVED_ENCODING.
+ * test/rexml/test_contrib.rb: Indent.
- * encoding.c (enc_inspect): defer loading autoloaded encoding.
+Tue May 27 21:28:16 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * encoding.c (enc_check_encoding): use is_data_encoding() to check
- type consistently.
+ * ext/socket/ifaddr.c (ifaddr_inspect_flags): support IFF_SIMPLEX.
- * encoding.c (must_encoding): return rb_encoding* instead of encoding
- index.
+Tue May 27 21:03:03 2014 Kouhei Sutou <kou@cozmixng.org>
- * encoding.c (enc_check_encoding): use is_data_encoding() to check
- type consistently.
+ * test/rexml/: Use REXMLTests as wrapping module for REXML tests.
+ I avoid using the same module for library in test because
+ it provides "include REXML" environment in test. Normally,
+ users don't use REXML on "include REXML" environment. So I
+ don't want to write tests on "include REXML" environment.
- * encoding.c (must_encoding): return rb_encoding* instead of encoding
- index.
+Tue May 27 20:59:37 2014 Kouhei Sutou <kou@cozmixng.org>
-Mon Jul 15 02:21:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/rexml/test_comment.rb: Remove needless REXML module wrapping.
- * string.c (str_fill_term): consider old terminator length, and should
- not use rb_enc_ascget since it depends on the current encoding which
- may not be compatible with the new terminator. [Bug #8634]
+Tue May 27 20:56:49 2014 Kouhei Sutou <kou@cozmixng.org>
- * encoding.c (enc_inspect): use PRIsVALUE to preserve the result
- encoding.
+ * test/openssl/test_pkcs7.rb: Fix inverted expected and actual values.
-Sun Jul 14 23:21:47 2013 Tanaka Akira <akr@fsij.org>
+Tue May 27 20:26:06 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * configure.in: Check __builtin_popcountl, __builtin_bswap32 and
- __builtin_bswap64.
+ * test/ruby/test_io.rb (test_flush_in_finalizer1): some opened fds are
+ remain before GC, so unlink the tempfile is failed.
- * internal.h (swap32): Use the configure result for the condition to
- use __builtin_bswap32.
- (swap64): Use the configure result for the condition to use
- __builtin_bswap64.
+Tue May 27 19:07:26 2014 Tanaka Akira <akr@fsij.org>
- * bignum.c (ones): Use the configure result for the condition to use
- __builtin_popcountl.
- (bary_unpack_internal): Use appropriate types for swap argument.
+ * io.c (rb_io_autoclose_p): Don't raise on frozen IO.
-Sun Jul 14 22:21:11 2013 Tanaka Akira <akr@fsij.org>
+ * test/lib/minitest/unit.rb: IO#autoclose? may raise IOError.
- * bignum.c (bary_subb): Support xn < yn.
- (bigsub_core): Removed.
- (bigsub): Don't compare before subtraction. Just subtract and
- get the two's complement if the subtraction causes a borrow.
+Tue May 27 19:01:49 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Sun Jul 14 00:36:03 2013 Tanaka Akira <akr@fsij.org>
+ * test/openssl/test_pair.rb: Modify TestSSL#test_read_and_write
+ to handle partial sysreads. [Bug #7398][ruby-core:49563]
+ * test/openssl/test_ssl.rb: ditto.
- * bignum.c (DIGSPERLONG): Unused macro removed.
- (DIGSPERLL): Ditto.
+Tue May 27 18:46:23 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Sun Jul 14 00:32:51 2013 Tanaka Akira <akr@fsij.org>
+ * test/openssl/test_pkcs7.rb: Add tests for PKCS7#type= and add_data.
+ [Feature #7399][ruby-core:49565]
- * bignum.c (rb_big_aref): Less scan when the number is negative.
+Tue May 27 17:45:09 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Sun Jul 14 00:17:42 2013 Tanaka Akira <akr@fsij.org>
+ * test/openssl/test_hmac.rb (test_binary_update): Added Test for
+ HMAC signing with UTF-8 String. [Bug #7512][ruby-core:50559]
- * bignum.c (big_shift): Avoid signed integer overflow.
+Tue May 27 17:10:14 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Sun Jul 14 00:14:15 2013 Tanaka Akira <akr@fsij.org>
+ * test/runner.rb: fixed randomly test failure.
+ [Bug #6573][ruby-core:45563]
- * bignum.c (bary_mul_precheck): Use bary_small_lshift or
- bary_mul_normal if xl is 1.
+Tue May 27 16:58:12 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Sat Jul 13 22:58:16 2013 Tanaka Akira <akr@fsij.org>
+ * test/test_timeout.rb (test_timeout): inverted test condition.
+ [Bug #8523]
- * bignum.c (big_shift3): New function.
- big_lshift and big_rshift are merged.
- (big_shift2): New function.
- (big_lshift): Use big_shift3.
- (big_rshift): Ditto.
- (check_shiftdown): Removed.
- (rb_big_lshift): Use big_shift2 and big_shift3.
- (rb_big_rshift): Ditto.
- (big_lshift): Removed.
- (big_rshift): Ditto.
+Tue May 27 12:24:22 2014 Tanaka Akira <akr@fsij.org>
-Sat Jul 13 15:51:38 2013 Tanaka Akira <akr@fsij.org>
+ * test/lib/minitest/unit.rb: Show leaked file descriptors.
- * bignum.c (bary_small_lshift): Use size_t instead of long.
- (bary_small_rshift): Ditto.
+Tue May 27 11:12:56 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jul 13 15:33:33 2013 Tanaka Akira <akr@fsij.org>
+ * io.c (rb_io_fileno, rb_io_inspect): non-modification does not
+ error on frozen IO. [ruby-dev:48241] [Bug #9865]
- * bignum.c (bary_small_lshift): Functions moved to remove
- declaration.
- (bary_small_rshift): Ditto.
+Tue May 27 00:00:21 2014 yui-knk <spiketeika@gmail.com>
-Sat Jul 13 12:27:34 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * insns.def (defineclass): fix typo in the instruction comment.
+ [fix GH-618]
- * encoding.c (rb_enc_associate_index): fill new terminator length, not
- old one.
+Mon May 26 16:33:15 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-Sat Jul 13 12:24:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/ruby/test_file.rb: skip the test of atime on Windows, because
+ Windows delays updating atime about 1 hour.
+ see more details:
+ http://msdn.microsoft.com/en-us/library/windows/desktop/ms724290%28v=vs.85%29.aspx
- * ext/win32: move from ext/dl and ext/fiddle. since ext/extmk.rb
- builds extensions in alphabetical order, compiled?('fiddle') under
- ext/dl makes no sense.
+Mon May 26 12:25:36 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jul 13 09:26:09 2013 Tanaka Akira <akr@fsij.org>
+ * lib/optionparser.rb, lib/optparse.rb (OptParse): aliases.
+ [ruby-core:62751] [Feature #9864]
- * bignum.c (biglsh_bang): Removed.
- (bigrsh_bang): Ditto.
- (bigmul1_toom3): Use bary_small_lshift and bary_small_rshift.
+Mon May 26 07:59:34 2014 Tanaka Akira <akr@fsij.org>
-Sat Jul 13 01:04:43 2013 Zachary Scott <e@zzak.io>
+ * test/lib/minitest/unit.rb: Show Finished threads line-by-line.
- * lib/rubygems/psych_additions.rb: Ignore Psych docs here
+Mon May 26 01:39:02 2014 Zachary Scott <e@zzak.io>
-Fri Jul 12 18:10:46 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * lib/csv.rb: Reject nil as data source for CSV.new, patch by @Peeja.
+ [Fixes GH-580] https://github.com/ruby/ruby/pull/580
- * ext/fiddle/win32/lib/win32/registry.rb
- (Win32::Registry::API#make_wstr): same as r41922.
+Mon May 26 01:07:51 2014 Tanaka Akira <akr@fsij.org>
-Fri Jul 12 16:28:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/lib/minitest/unit.rb: Show leaked threads and tempfiles
+ line-by-line.
- * encoding.c (rb_enc_associate_index): refill the terminator if it
- becomes longer than before. [ruby-dev:47500] [Bug #8624]
+Sun May 25 23:02:06 2014 Tanaka Akira <akr@fsij.org>
- * string.c (str_null_char, str_fill_term): get rid of out of bound
- access.
+ * test/lib/minitest/unit.rb (MiniTest::Assertions#diff): Remove
+ tempfiles.
- * string.c (rb_str_fill_terminator): add a parameter for the length of
- new terminator.
+Sun May 25 22:42:27 2014 Tanaka Akira <akr@fsij.org>
-Fri Jul 12 11:26:25 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * test/lib/minitest/unit.rb: Check tempfile leak for each test class.
- * hash.c (rb_hash_reject_bang): do not call rb_hash_foreach() if RHash
- has ntbl and it is empty.
+Sun May 25 20:31:49 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Jul 12 11:17:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * configure.in (ac_cv_func_{getcontext,setcontext}): do not
+ disable ucontext.h entirely, but disable use of functions only.
+ `ucontext_t` is necessary in the signal handler now.
- * hash.c (recursive_hash): use RHASH_SIZE() to check hash size.
+Sun May 25 20:00:23 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Jul 12 00:20:00 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * signal.c (check_stack_overflow): revert part of r46100, the
+ previous condition was correct, and fix compilation error on
+ other architecture linux. [ruby-core:62746] [Bug #9862]
- * hash.c (rb_hash_size): use RHASH_SIZE().
+Sun May 25 17:09:13 2014 Tanaka Akira <akr@fsij.org>
-Fri Jul 12 00:08:24 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * test/lib/minitest/unit.rb: Less ObjectSpace.each_object(Tempfile)
+ invocation.
- * hash.c (rb_hash_values): set array capa to RHASH_SIZE().
+Sun May 25 16:54:06 2014 Tanaka Akira <akr@fsij.org>
-Thu Jul 11 23:54:45 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * test/lib/minitest/unit.rb: Use Thread.list instead of
+ ObjectSpace.each_object(Thread).
- * hash.c (rb_hash_keys): set array capa to RHASH_SIZE().
+Sun May 25 15:53:54 2014 Tanaka Akira <akr@fsij.org>
-Thu Jul 11 21:30:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/rinda/ring.rb (Rinda::RingServer#shutdown): Join the killed
+ threads.
- * win32/win32.c (rb_w32_pow): undef pow to get rid of infinite
- recursive call. re-fix [Bug #8495]. [ruby-core:55923] [Bug #8621]
+Sun May 25 15:26:17 2014 Tanaka Akira <akr@fsij.org>
-Thu Jul 11 20:18:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/webrick/utils.rb: Override the inspect method of the thread
+ used in WEBrick::Utils::TimeoutHandler.
- * ext/dl/win32/lib/win32/registry.rb (Win32::Registry::API#make_wstr):
- remove workaround to append WCHAR terminator.
+Sun May 25 14:22:30 2014 Tanaka Akira <akr@fsij.org>
- * transcode.c (str_encode_associate): fill terminator after conversion.
+ * test/openssl: Join threads.
- * string.c (rb_enc_str_new, rb_str_set_len, rb_str_resize): fill
- minimum length of the encoding as the terminator.
+Sun May 25 12:46:47 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * string.c (str_buf_cat, rb_str_buf_append, rb_str_splice_0): ditto.
+ * error.c (rb_bug_context): new function to report bug with
+ context.
- * string.c (str_make_independent_expand, rb_str_modify_expand): make
- the capacity enough for multi-byte terminator.
+ * vm_dump.c (rb_vm_bugreport): accepts `ucontext_t` argument to
+ dump machine registers. based on [GH-584].
- * string.c (rb_string_value_cstr): fill minimum length of the encoding
- as the terminator.
+ * signal.c (sigbus, sigsegv): dump machine registers if available.
- * string.c (rb_string_value_cstr): check null char in char, not in
- byte.
+Sun May 25 12:32:42 2014 Tanaka Akira <akr@fsij.org>
-Thu Jul 11 14:48:35 2013 Zachary Scott <e@zzak.io>
+ * test/lib/minitest/unit.rb: Sort leaked threads and tempfiles.
- * array.c: Replace confusing example for #reverse_each in overview
- Patch by Earl St Sauver [Fixes documenting-ruby/ruby-12]
- https://github.com/documenting-ruby/ruby/pull/12
+Sun May 25 12:15:30 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Jul 11 14:22:37 2013 Zachary Scott <e@zzak.io>
+ * signal.c (check_stack_overflow): fix condition to use ucontext
+ register, mcontext_t dereference, and its member names, on Mac
+ OS X.
- * test/drb/ut_eq.rb: Use localhost for drb tests [Bug #7311]
- Patch by Vit Ondruch [ruby-core:49101]
- * test/drb/ut_array.rb: ditto
- * test/drb/ut_array_drbssl.rb: ditto
+Sun May 25 11:58:26 2014 Zachary Scott <e@zzak.io>
-Thu Jul 11 13:48:03 2013 Zachary Scott <e@zzak.io>
+ * enumerator.c: [DOC] Fix example to show Enumerator#peek behavior
+ Patch by Erik Hollembeak [Bug #9814]
- * sprintf.c: Fix typo patch by @hynkle [Fixes GH-357]
- https://github.com/ruby/ruby/pull/357
+Sun May 25 11:56:33 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Jul 11 13:00:34 2013 Zachary Scott <e@zzak.io>
+ * vsnprintf.c (BSD_vfprintf): fix string width when precision is
+ given. as the result of `memchr` is NULL or its offset from the
+ start cannot exceed the size, the comparison was always false.
+ [ruby-core:62737] [Bug #9861]
- * lib/securerandom.rb: Refactor conditions by Rafal Chmiel
- [Fixes GH-326] https://github.com/ruby/ruby/pull/326
+Sun May 25 11:32:42 2014 Zachary Scott <e@zzak.io>
-Thu Jul 11 12:04:47 2013 Tanaka Akira <akr@fsij.org>
+ * lib/yaml.rb: Remove Psych::EngineManager [Bug #8344]
+ * test/psych/*: ditto.
- * bignum.c: Don't use toom3 after once karatsuba is chosen.
- (mulfunc_t): New type.
- (bary_mul_toom3_start): Renamed from bary_mul.
- (bary_mul_karatsuba_start): Renamed from bary_mul.
- (bary_mul_balance_with_mulfunc): Renamed from bary_mul_balance and
- new argument, mulfunc, is added.
- (rb_big_mul_balance): Invoke bary_mul_balance_with_mulfunc with
- bary_mul_toom3_start.
- (bary_mul_karatsuba): Invoke bary_mul_karatsuba_start instead of
- bary_mul.
- (bary_mul_precheck): Extracted from bary_mul.
- (bary_mul_karatsuba_branch): Extracted from bary_mul.
- (bary_mul_karatsuba_start): New function to call bary_mul_precheck
- and bary_mul_karatsuba_branch.
- (bary_mul_toom3_branch): Extracted from bary_mul.
- (bary_mul_toom3_start): New function to call bary_mul_precheck and
- bary_mul_toom3_branch.
- (bary_mul): Just call bary_mul_toom3_start.
- Arguments for work memory are removed.
- (rb_cstr_to_inum): Follow the bary_mul change.
- (bigmul0): Ditto.
+Sun May 25 10:34:15 2014 Zachary Scott <e@zzak.io>
-Thu Jul 11 10:46:38 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * doc/regexp.rdoc: [DOC] Clarify whitespace matching by @allolex
+ [Fixes GH-606] https://github.com/ruby/ruby/pull/606
- * tool/probes_to_wiki.rb: fix usage comment. use Enumerable#grep
- which yields each elements to reduce unnecessary array.
+Sun May 25 10:19:34 2014 Zachary Scott <e@zzak.io>
-Thu Jul 11 10:09:18 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * enum.c: [DOC] Use #find in example to clarify alias by @rachellogie
+ Patch submitted via documenting-ruby/ruby#34
- * process.c (rb_daemon): daemon(3) is implemented with fork(2).
- Therefore it needs rb_thread_atfork(). (and revert r41903)
+Sun May 25 10:16:43 2014 Zachary Scott <e@zzak.io>
-Thu Jul 11 03:22:10 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+ * cont.c: [DOC] Fix rdoc in example for Fiber#transfer by @majjoha
+ Patch submitted via documenting-ruby/ruby#33
- * tool/probes_to_wiki.rb: adding a script to convert probes.d to wiki
- format for easy wiki updates.
+Sun May 25 10:01:11 2014 Zachary Scott <e@zzak.io>
-Thu Jul 11 00:54:07 2013 Zachary Scott <zachary@zacharyscott.net>
+ * lib/irb.rb: [DOC] Fixed syntax error in example by @jasdeepsingh.
+ Patch submitted via documenting-ruby/ruby#32
- * man/ri.1: Incorrect use of .Dd macro [Bug #8620] by Tristan Hill
+Sun May 25 09:58:02 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Thu Jul 11 00:48:29 2013 Zachary Scott <zachary@zacharyscott.net>
+ * test/fileutils/test_fileutils.rb (test_chown_R): Add tests for
+ chown_R. [Feature #9383][ruby-core:59641]
- * lib/delegate.rb: Add example for __setobj__ and __getobj__
- [Bug #8615] Patch by Caleb Thompson
+Sun May 25 09:57:09 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Wed Jul 10 23:29:22 2013 Zachary Scott <zachary@zacharyscott.net>
+ * test/fileutils/test_fileutils.rb: Added recursively chown tests.
+ [Feature #9303][ruby-core:59325]
- * lib/logger.rb: Use :call-seq: for method signature rdoc
+Sun May 25 09:41:56 2014 Zachary Scott <e@zzak.io>
-Wed Jul 10 23:23:18 2013 Zachary Scott <zachary@zacharyscott.net>
+ * class.c: [DOC] Fixed grammar and examples of instance_methods.
+ By @alex-frost via documenting-ruby/ruby#31
- * lib/logger.rb (#add): Remove incorrect rdoc for return value
- [Bug #8567] Reported by Tim Pease.
+Sun May 25 09:40:44 2014 Tanaka Akira <akr@fsij.org>
-Wed Jul 10 23:12:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/lib/minitest/unit.rb: Show leaked threads and tempfiles.
- * string.c (rb_str_subpos): make public function.
+Sun May 25 08:54:38 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Wed Jul 10 22:44:19 2013 Tanaka Akira <akr@fsij.org>
+ * test/openssl/test_partial_record_read.rb: Testing read_nonblock on
+ a partial TLS record results in IO::WaitReadable by @mohamedhafez.
+ [fix GH-547]
- * bignum.c: Add a static assertion for RBIGNUM_EMBED_LEN_MAX.
+Sun May 25 08:43:16 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Wed Jul 10 22:31:25 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * lib/logger.rb: refactored to include Logger::Period.
- * string.c (rb_str_index): cache single byte flag and some
- cosmetic changes.
+Sun May 25 06:50:19 2014 Zachary Scott <e@zzak.io>
-Wed Jul 10 22:03:27 2013 Tanaka Akira <akr@fsij.org>
+ * vm_eval.c: [DOC] Improve instance_eval description when given a
+ block or String arguments. By @nathanl via documenting-ruby/ruby#28
- * bignum.c (bary_2comp): Don't use bary_plus_one.
- (bary_add_one): Replaced by the implementation of bary_plus_one.
+Sun May 25 06:29:39 2014 Zachary Scott <e@zzak.io>
-Wed Jul 10 20:48:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * array.c: [DOC] Clarify default argument for Array.new.
+ By @Elffers [Fixes GH-610]
- * bignum.c (sizeof_bdigit_dbl): check sizeof(BDIGIT_DBL).
+Sat May 24 22:37:20 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * internal.h (STATIC_ASSERT): move from enum.c.
+ * array.c: [DOC] Add more documents to shuffle! and shuffle.
+ Contributed by @JuanitoFatas [ci skip][fix GH-612]
-Wed Jul 10 20:08:21 2013 Tanaka Akira <akr@fsij.org>
+Sat May 24 22:28:55 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * bignum.c (SIZEOF_BDIGIT_DBL): Add a ifdef guard for test.
+ * test/lib/minitest/.document: removed unused configuration.
-Wed Jul 10 14:18:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat May 24 19:08:47 2014 Tanaka Akira <akr@fsij.org>
- * process.c (fork_daemon): kill the other threads all and abandon the
- kept mutexes.
+ * test/lib/minitest/spec.rb: Unused file removed.
-Wed Jul 10 11:35:36 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * test/lib/minitest/autorun.rb: Don't require minitest/spec.
- * test/net/http/test_http.rb (TestNetHTTP_v1_2#test_get,
- TestNetHTTP_v1_2_chunked#test_get): shouldn't check
- HttpResponse#decode_content if Zlib is not available.
- ko1 complained via IRC.
+ * test/lib/minitest/benchmark.rb: Ditto.
-Wed Jul 10 10:20:07 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Sat May 24 18:45:30 2014 Tanaka Akira <akr@fsij.org>
- * tool/rbinstall.rb: always require rubygems to stabilize rubygems
- related status like whether Gem::Specification is defined or not.
+ * test/benchmark/test_benchmark.rb: Use test/unit.
- * tool/rbinstall.rb (Gem::Specification.unresolved_deps): define stub.
+Sat May 24 16:20:59 2014 Eric Wong <e@80x24.org>
-Wed Jul 10 08:21:15 2013 Eric Hodel <drbrain@segment7.net>
+ * process.c (proc_getgroups, proc_setgroups): use ALLOCV_N
+ [Bug #9856]
- * lib/rubygems: Import RubyGems 2.1
- * test/rubygems: Ditto.
+Sat May 24 15:49:39 2014 Tanaka Akira <akr@fsij.org>
-Wed Jul 10 07:34:34 2013 Eric Hodel <drbrain@segment7.net>
+ * test/lib/minitest/unit.rb (parallelize_me!): Removed.
+ This fixes the line-by-line structure of the test result in verbose
+ mode. [ruby-core:54905]
- * lib/rubygems/ext/ext_conf_builder.rb: Remove siteconf file after
- building the gem.
- * test/rubygems/test_gem_ext_ext_conf_builder.rb: Test for the above.
+ * test/lib/minitest/parallel_each.rb: Removed.
- * lib/rubygems/psych_tree.rb (module Gem): Add backward compatibility
- for r41148
+ * test/minitest/test_minitest_mock.rb: Don't call parallelize_me!.
- * test/rubygems/test_gem_package.rb: Add backward compatibility for
- double-slash elimination.
+ * test/minitest/test_minitest_spec.rb: Ditto.
-Wed Jul 10 06:22:27 2013 Tadayoshi Funaba <tadf@dotrb.org>
+ * test/minitest/test_minitest_unit.rb: Ditto.
+ Tests for parallel feature removed.
- * ext/date/date_parse.c (date_zone_to_diff): [ruby-core:55831].
+Sat May 24 15:29:10 2014 Tanaka Akira <akr@fsij.org>
-Wed Jul 10 00:41:42 2013 Tanaka Akira <akr@fsij.org>
+ * test/lib/minitest/hell.rb: Unused file removed.
- * bignum.c (bary_mul): x*1 is x.
+ * test/lib/minitest/pride.rb: Ditto.
-Tue Jul 9 22:24:39 2013 Tanaka Akira <akr@fsij.org>
+Sat May 24 15:05:32 2014 yui-knk <spiketeika@gmail.com>
- * bignum.c (bary_mul1): No need to invoke MEMZERO at last.
- (bary_mul_single): Invoke MEMZERO here.
+ * enumerator.c (yielder_yield_push): Insert a break after the
+ method return value. [fix GH-617]
-Tue Jul 9 21:40:01 2013 Kouhei Sutou <kou@cozmixng.org>
+Sat May 24 14:59:12 2014 Tanaka Akira <akr@fsij.org>
- * test/rexml/test_text.rb: Add missing tests for Text#<<.
- Reported by nagachika. Thanks!!!
+ * test/lib/minitest: Remove comments not appropriate now.
-Tue Jul 9 18:02:38 2013 Akinori MUSHA <knu@iDaemons.org>
+ * test/minitest: Ditto.
- * lib/fileutils.rb (FileUtils#chown_R): Do not skip traversal even
- if user and group are both nil, to be consistent with #chown and
- other commands.
+Sat May 24 14:02:04 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Tue Jul 9 17:58:26 2013 Akinori MUSHA <knu@iDaemons.org>
+ * NEWS: added minitest changes.
- * test/fileutils/test_fileutils.rb
- (TestFileUtils#assert_output_lines): New utility assertion
- method for testing verbose output.
+Sat May 24 13:42:46 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Tue Jul 9 17:43:57 2013 Koichi Sasada <ko1@atdot.net>
+ * test/lib/test/unit/test-unit.gemspec: removed needless gemspec file.
- * test/test_tracer.rb: catch up recent rubygems changes.
+Sat May 24 09:39:06 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Tue Jul 9 16:58:30 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * defs/default_gems: removed minitest entry.
- * ext/{dl,fiddle}/win32/lib/win32/registry.rb: hope that the final
- resolution to fix the failure of test-all. and includes Win64
- support (fixed a potential bug).
+Sat May 24 06:17:33 2014 Ryan Davis <ryand-ruby@zenspider.com>
-Tue Jul 9 15:57:20 2013 Akinori MUSHA <knu@iDaemons.org>
+ * lib/minitest: minitest 4.7.5 removed. Need to support proper
+ gem packaging / installation before minitest 5 can be added.
- * object.c: Fix rdoc for Kernel#<=>. [Fixes GH-352]
+Sat May 24 05:54:06 2014 Tanaka Akira <akr@fsij.org>
-Tue Jul 9 15:53:51 2013 Akinori MUSHA <knu@iDaemons.org>
+ * ext/socket/mkconstants.rb: More constants
- * lib/fileutils.rb (FileUtils#mode_to_s): Define mode_to_s() also
- as singleton method, or FileUtils.chmod fails in verbose mode.
+Sat May 24 00:25:34 2014 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
-Tue Jul 9 15:16:02 2013 Akinori MUSHA <knu@iDaemons.org>
+ * NEWS: add information of incompatibility about Prime.prime?
+ * lib/prime.rb: fix docs.
- * test/fileutils/fileasserts.rb
- (Test::Unit::FileAssertions#assert_not_symlink): Add a missing
- optional argument "message".
+Fri May 23 21:36:28 2014 Josh Goebel <dreamer3@gmail.com>
-Tue Jul 9 15:03:24 2013 Akinori MUSHA <knu@iDaemons.org>
+ * net/protocol.rb (using_each_crlf_line): fix SMTP dot-stuffing
+ for messages not ending with a new-line.
+ [ruby-core:61441] [Bug #9627] [fix GH-616]
- * lib/fileutils.rb (FileUtils#chown, FileUtils#chown_R): If user
- and group are both nil, print ":".
+Fri May 23 03:48:08 2014 Eric Wong <e@80x24.org>
-Tue Jul 9 12:47:08 2013 Masaki Matsushita <glass.saga@gmail.com>
+ * gc.c (rb_free_m_tbl): mark function as static
- * io.c (appendline): use READ_CHAR_PENDING_XXX macros and
- RSTRING_END().
+ * method.h (rb_free_m_tbl): remove prototype
- * io.c (rb_io_getline_1): rewrite nested if statement into one
- statement.
+Thu May 22 22:58:27 2014 Tanaka Akira <akr@fsij.org>
-Tue Jul 9 11:04:35 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * ext/socket/mkconstants.rb: More TCP option constants.
+ Describe Linux and glibc versions.
- * ext/{dl,fiddle}/win32/lib/win32/registry.rb (Win32::Registry#check):
- should report the position of the error.
+Thu May 22 20:38:10 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * ext/{dl,fiddle}/win32/lib/win32/registry.rb
- (Win32::Registry#QueryValue): workaround for test-all crash.
+ * file.c (stat_birthtime): add birthtime support [Feature #9647]
-Tue Jul 9 10:27:56 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * file.c (rb_stat_birthtime): add File::Stat.birthtime
- * ext/{dl,fiddle}/win32/lib/win32/registry.rb
- (Win32::Registry.expand_environ): use suitable encoding for the
- string.
+ * file.c (rb_file_s_birthtime): add File.birthtime
- * ext/{dl,fiddle}/win32/lib/win32/registry.rb (Win32::Registry#read):
- should return REG_SZ, REG_EXPAND_SZ and REG_MULTI_SZ values with
- the expected encoding -- assumed as the same encoding of name.
+ * file.c (rb_file_birthtime): add File#birthtime
-Tue Jul 9 10:02:45 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * configure.in: check struct stat.st_birthtimespec.
- * ext/{dl,fiddle}/win32/lib/win32/registry.rb
- (Win32::Registry::Error#initialize): use suitable encoding for the
- string.
+Thu May 22 19:38:14 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Tue Jul 9 09:46:53 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * file.c: remove IO::Statfs because of reject. [Feature #9772]
- * ext/dl/win32/lib/win32/registry.rb (Win32::Registry.expand_environ):
- use suitable encoding for the string. fixed a test-all error of
- r41838.
+Thu May 22 14:02:13 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/fiddle/win32/lib/win32/registry.rb: same changes of r41838 and
- this revision of dl's win32/registry.rb.
+ * enc/jis/props.kwd: constify character property tables of JIS
+ based encodings by perfect hash.
-Tue Jul 9 07:39:45 2013 Eric Hodel <drbrain@segment7.net>
+ * enc/euc_jp.c, enc/shift_jis.c: use character property functions.
- * lib/rubygems: Update to RubyGems 2.0.4. See
- https://github.com/rubygems/rubygems/blob/2.0/History.txt for changes
+Wed May 21 12:21:10 2014 Tanaka Akira <akr@fsij.org>
-Tue Jul 9 01:47:16 2013 Tanaka Akira <akr@fsij.org>
+ * ext/socket/option.c: Fix compilation error on Android.
+ Bionic doesn't define TCP state constants.
- * bignum.c (biglsh_bang): Don't shift a BDIGIT with BITSPERDIG bits.
- (bigrsh_bang): Ditto.
+Wed May 21 11:42:31 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Tue Jul 9 01:17:57 2013 Tanaka Akira <akr@fsij.org>
+ * configure.in: workaround for Info.plist to get rid of `dsymutil`
+ crash by wrong files in parent directories.
+ [ruby-core:62594] [Bug #9840]
- * bignum.c (bigrsh_bang): Fix bignum digits overrun.
+Tue May 20 20:57:34 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Tue Jul 9 00:46:22 2013 Tanaka Akira <akr@fsij.org>
+ * test/ruby/test_dir.rb (test_glob): added testcase of double
+ slash path.
- * bignum.c (biglsh_bang): Fix bignum digits under-run.
+Tue May 20 04:58:54 2014 Tanaka Akira <akr@fsij.org>
-Mon Jul 8 23:36:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/socket/extconf.rb: Don't check fields of struct tcp_info if the
+ structure is not available.
- * ext/dl/win32/lib/win32/registry.rb (Error, API): use WCHAR
- interfaces. c.f. [Bug #8508]
+Mon May 19 23:13:33 2014 Tanaka Akira <akr@fsij.org>
-Mon Jul 8 23:13:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/socket/option.c (inspect_tcp_info): Permit longer data. (glibc
+ 2.7 adds tcpi_rcv_rtt, tcpi_rcv_space and tcpi_total_retrans to
+ struct tcp_info.)
- * win32/win32.c (rb_w32_pow): move from win32.h and disable strict
- ANSI mode macro to let _controlfp() stuff defined.
- [ruby-core:55312] [Bug #8495]
+Mon May 19 20:49:07 2014 Tanaka Akira <akr@fsij.org>
- * numeric.c (finite): add declaration for strict ANSI.
- [ruby-core:55312] [Bug #8495]
+ * ext/socket/option.c (inspect_tcp_info): New function to inspect
+ struct tcp_info.
+ (sockopt_inspect): Use inspect_tcp_info.
- * thread_win32.c (w32_thread_start_func, thread_start_func_1),
- (timer_thread_func): use __stdcall instead of _stdcall which is
- unavailable in strict ANSI mode. [ruby-core:55312] [Bug #8495]
+ * ext/socket/extconf.rb: Check tcp_info related things.
- * win32/win32.c (gettimeofday): use __cdecl instead of _cdecl.
+ * ext/socket/rubysocket.h: Include netinet/tcp_fsm.h if available.
-Mon Jul 8 22:41:12 2013 Tanaka Akira <akr@fsij.org>
+Mon May 19 19:36:39 2014 Tanaka Akira <akr@fsij.org>
- * bignum.c (bary_mul): Arguments for work memory added.
- (bary_mul_balance): Ditto.
- (bary_mul_karatsuba): Ditto.
+ * test/dbm/test_dbm.rb: Use Etc.uname.
-Mon Jul 8 22:03:30 2013 Tanaka Akira <akr@fsij.org>
+ * test/gdbm/test_gdbm.rb: Ditto.
- * bignum.c (rb_big_sq_fast): New function for testing.
- (rb_big_mul_toom3): Ditto.
+Mon May 19 16:54:22 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * internal.h (rb_big_sq_fast): Declared.
- (rb_big_mul_toom3): Ditto.
+ * ext/etc/etc.c (etc_uname): add support for Windows using
+ GetVersionExW(), GetSystemInfo(), and GetComputerNameExW() with
+ `ComputerNameDnsHostname`. [Feature #9842]
-Mon Jul 8 21:59:34 2013 Tanaka Akira <akr@fsij.org>
+Mon May 19 16:29:48 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * bignum.c (bary_mul_balance): Initialize a local variable to suppress
- a warning.
+ * string.c (rb_pat_search): advance by byte offset but not by char
+ offset. [ruby-core:62669] [Bug #9849]
-Mon Jul 8 20:55:22 2013 Tanaka Akira <akr@fsij.org>
+Mon May 19 14:06:18 2014 Shota Fukumori <her@sorah.jp>
- * bignum.c (bary_mul_balance): Reduce work memory.
+ * bin/testrb: Removed. Forgot to remove in r45971.
+ [Feature #9711] [ruby-core:62620]
-Mon Jul 8 08:26:15 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+Sun May 18 16:42:08 2014 Tanaka Akira <akr@fsij.org>
- * test/openssl/test_pkey_ec.rb: Skip tests for "Oakley" curves as
- they are not suitable for ECDSA.
- [ruby-core:54881] [Bug #8384]
+ * test/ruby/test_m17n_comb.rb (test_str_crypt): Use Etc.confstr to
+ detect the glibc version.
+ libc.so is not an executable on Debian GNU/kFreeBSD 7.0 (wheezy).
-Mon Jul 8 08:03:01 2013 Tanaka Akira <akr@fsij.org>
+Sun May 18 12:15:54 2014 Jonathan Mukai-Heidt <johnnymukai@gmail.com>
- * bignum.c (bary_mul): Add a RB_GC_GUARD.
+ * io.c (argf_each_line, argf_inplace_mode_set): [DOC] Update ARGF
+ documentation examples. `ARGF.lines` has been deprecated in
+ favor of `ARGF.each_line`. [Fixes GH-615]
-Sun Jul 7 23:56:32 2013 Tanaka Akira <akr@fsij.org>
+Sun May 18 11:59:25 2014 Tanaka Akira <akr@fsij.org>
- * bignum.c (bary_mul_karatsuba): Unreachable code removed. Remove
- several branches.
+ * missing/nextafter.c: Include ruby/missing.h.
-Sun Jul 7 22:59:06 2013 Tanaka Akira <akr@fsij.org>
+Sun May 18 11:09:28 2014 Tanaka Akira <akr@fsij.org>
- * internal.h (rb_big_mul_normal): Declared.
- (rb_big_mul_balance): Ditto.
- (rb_big_mul_karatsuba): Ditto.
+ * win32/Makefile.sub: Add nextafter.obj to MISSING.
- * bignum.c (rb_big_mul_normal): New function for tests.
- (rb_big_mul_balance): Ditto.
- (rb_big_mul_karatsuba): Ditto.
+Sun May 18 10:46:04 2014 Tanaka Akira <akr@fsij.org>
-Sun Jul 7 19:21:30 2013 Tanaka Akira <akr@fsij.org>
+ * ext/etc/etc.c: Etc.sysconf, Etc.confstr and IO#pathconf implemented.
- * bignum.c: Reorder functions to decrease forward reference.
+ * ext/etc/extconf.rb: Check sysconf(), confstr() and fpathconf().
-Sun Jul 7 14:41:57 2013 Tanaka Akira <akr@fsij.org>
+ * ext/etc/mkconstants.rb: New file.
- * bignum.c: (bigsub_core): Use bary_sub.
- (bary_sub): Returns a borrow flag. Use bary_subb.
- (bary_subb): New function for actually calculating subtraction with
- borrow.
- (bary_sub_one): New function.
- (bigadd_core): Use bary_add.
- (bary_add): Returns a carry flag. Use bary_addc.
- (bary_addc): New function for actually calculating addition with
- carry.
- (bary_add_one): New function.
- (bary_muladd_1xN): Extracted from bary_mul_normal.
- (bigmul1_normal): Removed.
- (bary_mul_karatsuba): New function.
- (bary_mul1): Invoke rb_thread_check_ints after bary_mul_normal.
- (bary_mul): Remove most and least significant zeros before actual
- multiplication. Use bary_sq_fast, bary_mul_balance,
- bary_mul_karatsuba and bigmul1_toom3 as bigmul0.
- (bigmul1_balance): Removed.
- (bigmul1_karatsuba): Removed.
- (bigsqr_fast): Removed.
- (bary_sparse_p): Extracted from big_sparse_p.
- (big_sparse_p): Removed.
- (bigmul0): Use bary_mul.
+ [ruby-core:62600] [Feature #9842]
-Sun Jul 7 11:54:33 2013 Kouhei Sutou <kou@cozmixng.org>
+Sun May 18 09:58:17 2014 Tanaka Akira <akr@fsij.org>
- * NEWS: Add REXML::Text#<< related updates.
+ * ext/etc/etc.c: Etc.uname method implemented.
-Sun Jul 7 11:49:19 2013 Kouhei Sutou <kou@cozmixng.org>
+ * ext/etc/extconf.rb: Check uname() function.
- * lib/rexml/text.rb (REXML::Text#<<): Support appending in not
- "raw" mode. [Bug #8602] [ruby-dev:47482]
- Reported by Ippei Obayashi. Thanks!!!
+ [ruby-core:62139] [Feature #9770]
-Sun Jul 7 11:43:13 2013 Kouhei Sutou <kou@cozmixng.org>
+Sun May 18 09:16:33 2014 Tanaka Akira <akr@fsij.org>
- * lib/rexml/text.rb (REXML::Text#<<): Support method chain use by "<<"
- like other objects.
+ * configure.in: Check nextafter() availability.
-Sun Jul 7 11:34:18 2013 Kouhei Sutou <kou@cozmixng.org>
+ * include/ruby/missing.h (nextafter): New optional declaration.
- * lib/rexml/text.rb (REXML::Text#clear_cache): Extract common
- cache clear code.
+ * missing/nextafter.c: New file.
-Sun Jul 7 11:01:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * numeric.c: Float#next_float and Float#prev_float implemented.
- * configure.in (RUBY_DTRACE_POSTPROCESS): dtrace version SUN D 1.11
- introduces a check in the dtrace compiler to ensure that probes
- actually exist. If there are no probes, then the -G step will
- fail. As this test is only being used to determine whether -G is
- necessary (for instance, on OSX it is not), adding a real probe to
- the conftest allows it to succeed on newer versions of dtrace.
- Patch by Eric Saxby <sax AT livinginthepast.org> at
- [ruby-core:55826]. [Fixes GH-351], [Bug #8606].
+ [ruby-core:62562] [Feature #9834]
-Sun Jul 7 10:07:22 2013 Tanaka Akira <akr@fsij.org>
+Sun May 18 09:02:17 2014 Tanaka Akira <akr@fsij.org>
- * bignum.c (bary_sq_fast): Extracted from bigsqr_fast and
- ensure not to access zds[2*xn].
- (bigsqr_fast): Allocate the result bignum with 2*xn words.
+ * enum.c: Enumerable#slice_after implemented.
-Sat Jul 6 07:37:43 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+ * enumerator.c: Enumerator::Lazy#slice_after implemented.
- * ext/openssl/ossl_pkey_ec.c: Ensure compatibility to builds of
- OpenSSL with OPENSSL_NO_EC2M defined, but OPENSSL_NO_EC not
- defined.
- * test/openssl/test_pkey_ec.rb: Iterate over built-in curves
- (and assert their non-emptiness!) instead of hard-coding them, as
- this may cause problems with respect to the different availability
- of individual curves in individual OpenSSL builds.
- [ruby-core:54881] [Bug #8384]
+ Requested by Tsuyoshi Sawada. [ruby-core:58123] [Feature #9071]
- Thanks to Vit Ondruch for providing the patch!
+Sun May 18 08:22:25 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jul 6 07:12:39 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+ * io.c (io_setstrbuf): always check if the buffer is modifiable.
+ [ruby-core:62643] [Bug #9847]
- * test/openssl/test_x509crl.rb: Remove unused variable.
- [ruby-core:53501] [Bug #8114]
+Sun May 18 01:21:23 2014 Tanaka Akira <akr@fsij.org>
- Thanks, Vipul Amler, for pointing this out!
+ * include/ruby/ruby.h: Hide Rational internal.
+ (RRational): Moved to internal.h
+ (RRATIONAL): Ditto.
+ (RRATIONAL_SET_NUM): Moved to rational.c.
+ (RRATIONAL_SET_DEN): Ditto.
-Sat Jul 6 06:37:10 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+ * rational.c (rb_rational_num): New function.
+ (rb_rational_den): Ditto.
- * ext/openssl/ossl.c: Provide CRYPTO_set_locking_callback() and
- CRYPTO_set_id_callback() callback functions ossl_thread_id and
- ossl_lock_callback to ensure the OpenSSL extension is usable in
- multi-threaded environments.
- [ruby-core:54900] [Bug #8386]
+ * include/ruby/intern.h (rb_rational_num): Declared.
+ (rb_rational_den): Ditto.
- Thanks, Dirkjan Bussink, for the patch!
+ * ext/bigdecimal/bigdecimal.c: Follow the above change.
-Sat Jul 6 06:06:16 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+ * ext/date/date_core.c: Ditto.
- * lib/openssl/ssl.rb: Fix SSL client connection crash for SAN marked
- critical.
- The patch for CVE-2013-4073 caused SSL crash when a SSL server returns
- the certificate that has critical SAN value. X509 extension could
- include 2 or 3 elements in it:
+ [ruby-core:60665] [Feature #9513]
- [id, criticality, octet_string] if critical,
- [id, octet_string] if not.
+Sat May 17 17:04:32 2014 Shota Fukumori <her@sorah.jp>
- Making sure to pick the last element of X509 extension and use it as
- SAN value.
- [ruby-core:55685] [Bug #8575]
+ * NEWS: Add news about removal of lib/test/**/*.rb.
- Thank you @nahi for providing the patch!
+Sat May 17 16:57:33 2014 Shota Fukumori <her@sorah.jp>
-Sat Jul 6 04:49:38 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+ * lib/test: Removed because ruby's test cases now independent to
+ lib/test by r45970. [Feature #9711] [ruby-core:62620]
- * ext/psych/lib/psych/visitors/yaml_tree.rb: register time objects so
- they are referenced as ids during output.
- * test/psych/test_date_time.rb: corresponding test.
+ I'm still considering about the future of lib/minitest, lib/test.
+ (bundling gems?)
-Fri Jul 5 20:46:39 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+Sat May 17 15:06:40 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * test/ruby/test_unicode_escape.rb (TestUnicodeEscape#test_basic): this
- assertion doesn't seems to be checking the unicode string on command
- line, but seems to be checking how to treat the unicode string from
- stdin. so, should escape '\' before 'u'. this fixes a test failure
- on Windows.
+ * test/runner.rb: remove dependency test-unit and minitest
+ from stdlib when running with test-all.
+ [Feature #9711][ruby-core:61890]
+ * test/testunit/*.rb: ditto.
+ * test/lib: ditto.
-Fri Jul 5 19:05:40 2013 Akinori MUSHA <knu@iDaemons.org>
+Sat May 17 11:02:49 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/fileutils.rb (FileUtils#chown, FileUtils#chown_R): Fix the
- wrong output message when user is nil, which should be "chown
- :group file" instead of "chown group file".
+ * dir.c (glob_helper): try match PLAIN as well as ALPHA, which are
+ separated by previous commits. [ruby-core:61552] [Bug #9648]
-Fri Jul 5 16:21:56 2013 Akinori MUSHA <knu@iDaemons.org>
+ * dir.c (glob_make_pattern): set PLAIN for non-magical path to
+ skip parts which not need to glob.
+ [ruby-core:61552] [Bug #9648]
- * test/ruby/test_regexp.rb
- (TestRegexp#test_options_in_look_behind)
- (TestRegexp#assert_match_at): Add tests for another problem
- fixed in Onigmo 5.13.5. Previously Onigmo did not allow option
- enclosures in look-behind, which makes it impossible to
- interpolate a regexp into another in the middle of a look-behind
- pattern. cf. https://github.com/k-takata/Onigmo/pull/17
+ * dir.c (has_magic): return ALPHA at alphabetical name regardless
+ FNM_CASEFOLD flag.
- * test/ruby/test_regexp.rb
- (TestRegexp#test_options_in_look_behind)
- (TestRegexp#assert_match_at): Parse regexps in run time rather
- than in compile time.
+ * dir.c (glob_helper): fix conditions for ALPHA.
+ [ruby-core:61552] [Bug #9648]
-Fri Jul 5 12:14:40 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+Sat May 17 01:49:27 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/ruby/test_rubyoptions.rb (TestRubyOptions#test_notfound): after
- r41710, the path of command uses backslash as the separator on
+ * dir.c (glob_helper): reduce matching at non-magical path on
Windows.
-Fri Jul 5 11:29:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/test/unit/assertions.rb (assert_raise_with_message): move from
- test/fileutils/test_fileutils.rb. this is still experimental and
- the interface may be changed.
-
-Fri Jul 5 11:08:00 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/win32.c (w32_spawn): r41710 made that if the command starts with
- a quote and includes slash, removed the top quote and NOT removed the
- last quote.
- this fixes test failures on test/ruby/test_process.rb and
- test/webrick.
-
-Fri Jul 5 09:53:15 2013 NARUSE, Yui <naruse@ruby-lang.org>
- * lib/mkmf.rb (CONFIG['CPPOUTFILE']): fix r41769; CONFIG['CPPOUTFILE']
- may be nil.
-
-Fri Jul 5 05:39:53 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (BARY_MUL1): Renamed from BARY_MUL.
- (bary_mul1): Renamed from bary_mul.
- (bary_mul): Renamed from bary_mul2.
-
-Fri Jul 5 04:58:05 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_mul_balance): Extracted from bigmul1_balance and
- use bary_mul2 and bary_add to decrease allocations.
-
-Fri Jul 5 02:14:00 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/fileutils.rb (FileUtils#symbolic_modes_to_i): Fix the wrong
- character class [+-=], which happened to match all desired
- characters but also match undesired characters.
-
- * lib/fileutils.rb (FileUtils.chmod{,_R}): Enhance the symbolic
- mode parser to support the permission symbols u/g/o and multiple
- actions as defined in SUS, so that chmod("g=o+w", file) works as
- expected. Invalid symbolic modes are now rejected with
- ArgumentError.
-
-Fri Jul 5 00:25:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb (have_framework): allow header file to check.
- [ruby-core:55745] [Bug #8593]
-
-Thu Jul 4 22:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * object.c (rb_obj_equal): Fixed an rb_obj_equal documentation typo
- where "a" was used instead of "obj".
- Fixes GH-349. Patch by @adnandoric
-
-Thu Jul 4 20:39:20 2013 Tanaka Akira <akr@fsij.org>
-
- * tool/make-snapshot: Exit with EXIT_FAILURE when it fails.
-
-Thu Jul 4 20:20:23 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (maxpow_in_bdigit_dbl): Use tables if available.
- (maxpow_in_bdigit): Ditto.
- (U16): New macro.
- (U32): Ditto.
- (U64): Ditto.
- (U128): Ditto.
- (maxpow16_exp): New table.
- (maxpow16_num): New table.
- (maxpow32_exp): New table.
- (maxpow32_num): New table.
- (maxpow64_exp): New table.
- (maxpow64_num): New table.
- (maxpow128_exp): New table.
- (maxpow128_num): New table.
-
-Thu Jul 4 18:25:25 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_cstr_to_inum): Avoid temporary buffer allocation except
- very big base non-power-of-2 numbers.
-
-Thu Jul 4 15:51:56 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * string.c (rb_str_succ): use ONIGENC_MBCLEN_CHARFOUND_P correctly.
-
- * string.c (rb_str_dump): ditto.
-
-Thu Jul 4 10:04:11 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * regcomp.c (): Merge Onigmo 5.13.5 23b523076d6f1161.
-
- * [bug] (thanks Akinori MUSHA and Ippei Obayashi)
- Fix a renumbering bug in condition regexp with a named
- capture. [Bug #8583]
- * [spec] (thanks Akinori MUSHA)
- Allow ENCLOSE_OPTION in look-behind.
-
-Thu Jul 4 00:36:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * internal.h (SIGNED_INTEGER_MAX): suppress warning C4146 on VC6.
- seems a logical ORed expression becomes unsigned.
-
-Thu Jul 4 00:13:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ruby_atomic.h (rb_w32_atomic_cas): call InterlockedCompareExchange
- directly.
-
- * ruby_atomic.h (ATOMIC_CAS): fix missing function call.
-
-Wed Jul 3 23:47:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ruby_atomic.h (ATOMIC_CAS): suppress C4022 and C4047 warnings in
- VC6. only InterlockedCompareExchange is declared using PVOID.
-
-Wed Jul 3 22:29:20 2013 Tanaka Akira <akr@fsij.org>
-
- * internal.h (ruby_digit36_to_number_table): Declared.
-
- * util.c (ruby_digit36_to_number_table): Moved from scan_digits.
-
- * bignum.c (conv_digit): Use ruby_digit36_to_number_table.
-
- * pack.c (hex2num): Ditto.
-
-Wed Jul 3 18:12:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb (install_dirs): revert DESTDIR prefix by r39841, since
- it is fixed by r41648. [ruby-core:55760] [Bug #8115]
-
-Wed Jul 3 14:15:25 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * dir.c (do_stat): use rb_w32_ustati64() in win32.c to get rid of
- mysterious behavior of FindFirstFile() Windows API which treat "<"
- and ">" like as wildcard characters. [ruby-core:55764] [Bug #8597]
-
-Wed Jul 3 12:06:42 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (maxpow_in_bdigit): Renamed from calc_hbase and return
- maxpow.
-
-Tue Jul 2 23:47:50 2013 Tanaka Akira <akr@fsij.org>
+Sat May 17 01:49:23 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * bignum.c (roomof): Cast to long.
- (rb_ull2big): Fix bignew arguments.
+ * dir.c (glob_pattern_type): separate names with alphabet but no
+ magical from plain.
-Tue Jul 2 21:17:37 2013 Tanaka Akira <akr@fsij.org>
+ * dir.c (glob_helper): match plain names as-is to treat super-root
+ same as the root. [ruby-core:61552] [Bug #9648]
- * bignum.c (rb_cstr_to_inum): Merge two temporary buffers.
+Fri May 16 17:38:22 2014 Koichi Sasada <ko1@atdot.net>
-Tue Jul 2 20:25:04 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c (gc_marks, gc_marks_body): increase the counter of young objects
+ at the major GC because AGE2Promotion changes all old objects into
+ young objects at major GC.
- * bignum.c (rb_cstr_to_inum): Use BDIGIT_DBL to collect adjacent digits.
- (BDIGIT_DBL_MAX): New macro.
- (maxpow_in_bdigit_dbl): New function.
+Fri May 16 17:26:24 2014 Koichi Sasada <ko1@atdot.net>
-Tue Jul 2 17:23:33 2013 Shugo Maeda <shugo@ruby-lang.org>
+ * gc.c (gc_before_sweep): heap_pages_swept_slots should contains
+ heap_pages_increment.
- * doc/syntax/refinements.rdoc: add description of Module#using and
- refinement inheritance by module inclusion.
+ For example, GC by exceeding malloc_limit can remain
+ heap_pages_increment.
-Tue Jul 2 17:22:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu May 15 21:18:43 2014 Hiroshi Shirosaki <h.shirosaki@gmail.com>
- * internal.h: add EUC-JP and Windows-31J.
-
- * re.c (rb_char_to_option_kcode): use built-in encoding indexes in
- internal.h.
-
- * internal.h: add UTF8-MAC.
-
- * dir.c (rb_utf8mac_encoding): use built-in encoding indexes in
- internal.h.
-
- * internal.h: add UTF-{16,32} dummy encodings.
-
- * string.c (rb_str_inspect, str_scrub0): use built-in encoding indexes
- in internal.h.
-
- * internal.h: add UTF-{16,32}{BE,LE}.
-
- * io.c (io_strip_bom): use built-in encoding indexes in internal.h.
-
- * internal.h (rb_{ascii8bit,utf8,usascii}_encindex): use built-in
- encoding indexes for optimization.
-
- * encoding.c (enc_inspect, rb_locale_encindex),
- (enc_set_filesystem_encoding, rb_filesystem_encindex): use built-in
- encoding indexes directly.
-
- * encoding.c (rb_enc_set_index, rb_enc_associate_index): validate
- argument encoding index.
-
- * include/ruby/encoding.h (ENCODING_SET): use rb_enc_set_index()
- instead of setting inlined bits directly.
-
- * encoding.c (rb_enc_init): register preserved indexes.
-
- * internal.h (ruby_preserved_encindex): move from encoding.c.
-
-Tue Jul 2 11:14:36 2013 Shota Fukumori <sorah@cookpad.com>
-
- * lib/mkmf.rb (try_config): Fix to not replace $LDFLAGS with $libs
- (1.9.3 behavior) [ruby-core:55752] [Bug #8595]
-
-Tue Jul 2 00:39:59 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/ipsocket.c (init_inetsock_internal): Don't try mismatched
- address family if already failed.
-
-Mon Jul 1 23:07:38 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * template/encdb.h.tmpl: define encoding index macros to use the index
- statically from C source.
-
-Mon Jul 1 22:57:19 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_mul2): New function.
- (rb_cstr_to_inum): Use a better algorithm to compose the result
- if input length is very long.
-
-Mon Jul 1 20:22:00 2013 Kenta Murata <mrkn@cookpad.com>
-
- * ext/bigdecimal/bigdecimal.h (RB_UNUSED_VAR, UNREACHABLE):
- import macros from ruby.h for 1.9.3.
- [Bug #8588] [ruby-core:55730]
-
- * ext/bigdecimal/bigdecimal.gemspec: Bump version to 1.2.1.
-
-Mon Jul 1 20:03:39 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/ipsocket.c (init_inetsock_internal): Use an address
- family for local address which is different to the remote
- address if no other choice.
-
-Mon Jul 1 15:05:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/csv.rb (CSV#<<): use StringIO#set_encoding instead of creating
- new StringIO instance with String#force_encoding, forcing encoding
- discards the cached coderange bits and can make further operations
- very slow. [ruby-core:55714] [Bug #8585]
-
- * ext/stringio/stringio.c (strio_write): keep coderange of
- ptr->string.
-
- * string.c (rb_enc_cr_str_buf_cat, rb_str_append): consider an empty
- string 7bit-clean and should not discard cached coderange of string
- to be appended.
-
-Mon Jul 1 12:56:41 2013 Shugo Maeda <shugo@ruby-lang.org>
-
- * eval.c (rb_using_module): activate refinements in the ancestors of
- the argument module to support refinement inheritance by
- Module#include. [ruby-core:55671] [Feature #8571]
-
- * test/ruby/test_refinement.rb: related test.
-
-Mon Jul 1 12:02:39 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_cstr_to_inum): Skip leading zeros.
-
-Mon Jul 1 00:59:23 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (nlz16): New function.
- (nlz32): Ditto.
- (nlz64): Ditto.
- (nlz128): Ditto.
- (nlz): Redefined using an above function.
- (bitsize): New macro.
- (rb_cstr_to_inum): Use bitsize instead of nlz.
-
-Sun Jun 30 22:40:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * lib/prime.rb: Corrected a few comments. Patch by @Nullset14.
- Fixes GH-346.
-
-Sun Jun 30 21:53:38 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_cstr_to_inum): Use rb_integer_unpack if base is a power
- of 2.
-
-Sun Jun 30 10:59:23 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/win32.c (join_argv): use backslash instead of slash in program
- path, otherwise cannot invoke "./c\u{1ee7}a.exe" for some reason.
- [ruby-core:24309] [Bug #1771]
-
- * io.c (spawnv, spawn): use UTF-8 spawn family. [Bug #1771]
-
- * process.c (proc_exec_sh, proc_spawn_cmd, proc_spawn_sh): ditto.
-
- * win32/win32.c (translate_char, join_argv, has_redirection): make
- codepage aware.
-
- * win32/win32.c (rb_w32_udln_find_exe_r, rb_w32_udln_find_file_r):
- codepage independent versions.
-
- * win32/win32.c (w32_spawn): extract codepage aware code from
- rb_w32_spawn().
-
- * win32/win32.c (rb_w32_uspawn): add UTF-8 version function.
-
- * win32/win32.c (w32_aspawn_flags): extract codepage aware code from
- rb_w32_aspawn_flags().
-
- * win32/win32.c (rb_w32_uaspawn_flags, rb_w32_uaspawn_flags): add
- UTF-8 version functions.
-
- * win32/win32.c (w32_getenv): extract codepage aware code from
- rb_w32_ugetenv() and rb_w32_getenv().
-
- * win32/win32.c (w32_stati64): extract codepage aware code from
- rb_w32_ustati64() and rb_w32_stati64().
-
- * dln.h (DLN_FIND_EXTRA_ARG, DLN_FIND_EXTRA_ARG_DECL): allow extra
- arguments to dln_find_{exe,file}_r().
-
- * dln_find.c (dln_find_exe_r, dln_find_file_r): add extract arguments.
-
- * process.c (EXPORT_STR, EXPORT_DUP): convert to default process
- encoding if defined.
-
- * process.c (check_exec_env_i): convert environment variables too.
-
- * process.c (rb_exec_fillarg): convert program path and arguments too.
-
-Sun Jun 30 01:57:08 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big_rshift): Use abs2twocomp and twocomp2abs_bang.
-
-Sun Jun 30 00:14:20 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (RBIGNUM_SET_NEGATIVE_SIGN): New macro.
- (RBIGNUM_SET_POSITIVE_SIGN): Ditto.
- (rb_big_neg): Inline get2comp to avoid double negation.
-
-Sat Jun 29 23:26:41 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_neg): Extracted from bary_2comp.
- (bary_plus_one): Extracted from bary_2comp.
- (bary_2comp): Use bary_neg and bary_plus_one.
- (big_extend_carry): Extracted from get2comp.
- (get2comp): Use big_extend_carry.
- (rb_integer_unpack): Use big_extend_carry.
- (rb_big_neg): Use bary_neg.
-
-Sat Jun 29 22:31:59 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_2comp): Simplified.
-
-Sat Jun 29 09:33:53 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigor_int): Return -1 if y == -1.
-
-Sat Jun 29 09:07:16 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigor_int): Use RB_GC_GUARD.
- (bigxor_int): Take xn and hibitsx arguments. Use twocomp2abs_bang.
- (rb_big_xor): Use abs2twocomp and twocomp2abs_bang.
-
-Sat Jun 29 08:19:58 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigand_int): Don't apply bitwise and for BDIGIT and long.
- (bigor_int): Take xn and hibitsx arguments. Use twocomp2abs_bang.
- (rb_big_or): Use abs2twocomp and twocomp2abs_bang.
-
-Fri Jun 29 01:08:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * numeric.c (fix_mul): remove FIT_SQRT_LONG test as it was causing
- fix_mul to return an incorrect result for -2147483648*-2147483648
- on 64 bit platforms
-
- * test/ruby/test_integer_comb.rb (class TestIntegerComb): add test case
-
-Fri Jun 28 12:26:53 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big_and): Allocate new bignum with same size to shorter
- argument if it's high bits are zero.
-
-Fri Jun 28 12:14:04 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/ipsocket.c (init_inetsock_internal): Don't use local
- addresses which address family is different to remote address.
-
-Fri Jun 28 08:06:22 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigand_int): Add arguments, xn and hibitsx.
- Use twocomp2abs_bang.
-
-Thu Jun 27 23:58:13 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (abs2twocomp_bang): Removed.
- (abs2twocomp): Take n_ret argument to return actual length.
- (rb_big_and): Follow above change.
-
-Thu Jun 27 22:52:19 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (get2comp): Use bary_2comp.
- (abs2twocomp_bang): New function.
- (abs2twocomp): New function.
- (twocomp2abs_bang): New function.
- (rb_big_and): Use abs2twocomp and twocomp2abs_bang.
-
-Thu Jun 27 20:03:13 2013 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * ext/openssl/lib/openssl/ssl.rb (verify_certificate_identity): fix
- hostname verification. Patched by nahi.
-
- * test/openssl/test_ssl.rb (test_verify_certificate_identity): test for
- above.
-
-
-Thu Jun 27 00:23:57 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big_pow): Retry if y is a Bignum and it is
- representable as a Fixnum.
- Use rb_absint_numwords.
-
-Wed Jun 26 23:53:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * ext/bigdecimal/bigdecimal.c (BigDecimal_save_rounding_mode): fix typo.
- Fixes GH-343. Patch by @jgarber.
-
-Wed Jun 26 23:22:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * enumerator.c (rb_enumeratorize_with_size): use strict definition
- rb_enumerator_size_func.
-
-Wed Jun 26 23:11:14 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * gc.c (is_before_sweep): Add a missing space before a parenthesis.
- * gc.c (rb_gc_force_recycle): Add a missing space around a parenthesis.
-
-Wed Jun 26 22:44:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/intern.h (rb_enumeratorize_with_size): cast for
- backward compatibility.
-
- * include/ruby/intern.h (rb_enumerator_size_func): define strict
- function declaration for rb_enumeratorize_with_size().
-
-Wed Jun 26 21:01:22 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-
- * test/ruby/test_io.rb (TestIO#test_write_32bit_boundary): skip if
- writing a file is slow.
- [ruby-core:55541] [Bug #8519]
-
-Wed Jun 26 16:42:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb: should use expanded values for header directories
- unless extmk. patch by vo.x (Vit Ondruch) at [ruby-core:55653]
- [Bug #8115], rhbz#921650.
-
-Wed Jun 26 12:48:22 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigxor_int): Fix a buffer over read.
-
-Wed Jun 26 12:13:12 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigand_int): Consider negative values.
- (bigor_int): The allocated bignum should have enough size
- to store long.
- This fixes (bignum fits in a BDIGIT) | (fixnum bigger than BDIGIT)
- on platforms which SIZEOF_BDIGITS < SIZEOF_LONG,
- such as LP64 with 32bit BDIGIT (no int128).
-
-Wed Jun 26 12:08:51 2013 Tanaka Akira <akr@fsij.org>
-
- * test/socket/test_udp.rb: Close sockets explicitly.
- Don't use fixed port number.
-
-Wed Jun 26 07:27:17 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigand_int): Fix a buffer over read.
-
-Wed Jun 26 06:48:07 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigadd_int): Fix a buffer over read.
-
-Wed Jun 26 01:18:13 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (is_before_sweep): Add new helper function that check the object
- is before sweep?
- * gc.c (rb_gc_force_recycle): Have to clear mark bit if object's slot
- already ready to minor sweep.
-
-Wed Jun 26 01:17:29 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigsub_int): Fix a buffer over read.
-
-Tue Jun 25 22:45:43 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_absint_singlebit_p): Use POW2_P.
- (bary_pack): Ditto.
- (rb_big2str0): Ditto.
- (POW2_P): Moved to top.
-
-Tue Jun 25 22:28:07 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/rubygems/ext/builder.rb (Gem::Ext::Builder.make): Pass
- DESTDIR via command line to override what's in MAKEFLAGS. This
- fixes an installation problem under a package building
- environment where DESTDIR is specified in the (parent) command
- line. [Fixes GH-327]
-
-Tue Jun 25 21:43:13 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2dbl): Use (BDIGIT)1 instead of 1UL.
- (bary_mul_normal): Remove a useless cast.
-
-Tue Jun 25 21:26:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Fix for the cases when
- the argument x is not a BigDecimal.
- This change is based on the patch made by Heesob Park and Garth Snyder.
- [Bug #6862] [ruby-core:47145]
- [Fixes GH-332] https://github.com/ruby/ruby/pull/332
-
-Tue Jun 25 20:36:31 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2ulong): "check" argument removed.
- (rb_big2ulong): Follow above change.
- (rb_big2long): Ditto.
- (rb_big_rshift): Ditto.
- (rb_big_aref): Ditto.
-
-Tue Jun 25 20:08:29 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big2ulong_pack): Use rb_integer_pack.
- (rb_big_aref): Call big2ulong with TRUE for "check" argument.
- It should be non-effective.
-
-Tue Jun 25 19:07:33 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (LSHIFTX): Revert r41611.
- The redundant expression suppresses a warning, C4293, by Visual
- Studio.
- http://ruby-mswin.cloudapp.net/vc10-x64/ruby-trunk/log/20130625T072854Z.log.html.gz#miniruby
-
-Tue Jun 25 19:03:00 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2ulong): Add a cast.
- (big2ull): Add a specialized code for SIZEOF_LONG_LONG <=
- SIZEOF_BDIGITS.
-
-Tue Jun 25 12:42:57 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (integer_unpack_single_bdigit): Use "1 + ~u" instead of
- "-u" to suppress warning (C4146) by Visual Studio.
- Reported by ko1 via IRC.
-
-Tue Jun 25 12:28:57 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2ulong): Add code specialized for SIZEOF_LONG <=
- SIZEOF_BDIGITS.
- This prevents shift width warning from "num <<= BITSPERDIG".
-
-Tue Jun 25 12:23:30 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: fix oldgen/remembered_shady counting algorithm.
-
- * gc.c (rgengc_check_shady): increment
- `objspace->rgengc.remembered_shady_object_count' here.
-
- * gc.c (rgengc_remember): return FALSE if obj is already remembered.
-
- * gc.c (rgengc_rememberset_mark): make it void.
-
- * gc.c (gc_mark_children): fix to double counting oldgen_object_count
- at minor GC.
-
-Tue Jun 25 12:07:18 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (MSB): Removed.
- (BDIGIT_MSB): Defined using BIGRAD_HALF.
- (bary_2comp): Apply BIGLO after possible over flow of BDIGIT.
- (get2comp): Ditto.
- (bary_unpack_internal): Use BDIGIT_MSB.
- Apply BIGLO after possible over flow of BDIGIT.
- (rb_integer_unpack): Use BDIGIT_MSB.
- (calc_hbase): Use BDIGMAX.
- (big2dbl): Use BDIGMAX.
- Apply BIGLO after possible over flow of BDIGIT.
- (rb_big_neg): Apply BIGLO after possible over flow of BDIGIT.
- (biglsh_bang): Ditto.
- (bigrsh_bang): Ditto.
- (bary_divmod): Use BDIGIT_MSB.
- (bigdivrem): Ditto.
- (bigxor_int): Apply BIGLO after possible over flow of BDIGIT.
-
- * marshal.c (shortlen): Use SIZEOF_BDIGITS instead of sizeof(BDIGIT).
-
- * ext/openssl/ossl_bn.c (ossl_bn_initialize): Use SIZEOF_BDIGITS
- instead of sizeof(BDIGIT).
-
-Tue Jun 25 11:40:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * bignum.c (big2ulong): suppress shorten-64-to-32 warning. BDIGIT can
- be bigger than long now.
-
- * bignum.c (LSHIFTX): remove redundant never-true expression.
-
-Tue Jun 25 00:55:54 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (typedef struct rb_objspace): Change members for monitor objects.
- * gc.c (gc_marks_test): Check all WriteBarrier Errors and track them in obj-tree.
- * gc.c (rgengc_check_shady): Ditto.
- * gc.c (gc_marks): Move 2 function calls to gc_marks_test for test initialize.
-
-Mon Jun 24 23:30:31 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (integer_unpack_single_bdigit): Refine code to filling
- higher bits and use BIGLO.
-
-Mon Jun 24 22:26:31 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-
- * test/rinda/test_rinda.rb (RingIPv6#prepare_ipv6):
- ifindex() function may not be implemented on Windows. We use another
- check for the case.
-
-Mon Jun 24 22:11:37 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-
- * test/gdbm/test_gdbm.rb (TestGDBM#test_s_open_nolock):
- skip a failing test on Windows because flock() implementation is
- different from Unix.
-
-Mon Jun 24 22:06:14 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-
- * test/rubygems/test_gem_installer.rb (test_install_extension_flat):
- use ruby in build directory in case ruby is not installed.
- [ruby-core:53265] [Bug #8058]
-
-Mon Jun 24 22:04:02 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-
- * ext/dl/cfunc.c (rb_dlcfunc_call): fix conversion from Bignum to
- pointer. sizeof(DLSTACK_TYPE) is larger than sizeof(long) on
- Windows x64 and higher bits over sizeof(long) of DLSTACK_TYPE was
- zero even if a pointer value was over 32 bits which causes SEGV on
- DL::TestCPtr#test_to_ptr_io. Adding a cast solves the bug.
-
-Mon Jun 24 22:04:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * eval_error.c (warn_printf): use rb_vsprintf instead so ruby specific
- extensions like PRIsVALUE can be used in format strings
- * eval_error.c (error_print): use warn_print_str (alias for
- rb_write_error_str) to print a string value instead of using
- RSTRING_PTR and RSTRING_LEN manually
- * eval.c (setup_exception): use PRIsVALUE instead of %s and RSTRING_PTR
-
-Mon Jun 24 20:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * compile.c (make_name_for_block): use PRIsVALUE in format string
- instead of %s and RSTRING_PTR to protect objects from being garbage
- collected too soon
- * encoding.c (str_to_encindex): ditto
- * hash.c (rb_hash_fetch_m): ditto
- * io.c (rb_io_reopen): ditto
- * parse.y (reg_fragment_check_gen): ditto
- * parse.y (reg_compile_gen): ditto
- * parse.y (ripper_assert_Qundef): ditto
- * re.c (rb_reg_raise): ditto
- * ruby.c (set_option_encoding_once): ditto
- * vm_eval.c (rb_throw_obj): ditto
-
-Mon Jun 24 07:57:18 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (after_gc_sweep): Have to record malloc info before reset.
- * gc.c (gc_prof_timer_start): Pick out part of new record creation as gc_prof_setup_new_record.
- * gc.c (gc_prof_set_malloc_info): Move point of recording allocation size to front of mark.
-
-Mon Jun 24 02:53:09 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * array.c: Return value in Array overview example found by @PragTob
- [Fixes GH-336] https://github.com/ruby/ruby/pull/336
-
-Mon Jun 24 02:45:51 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * array.c (rb_ary_zip): typo by @PragTob [Fixes GH-337]
- https://github.com/ruby/ruby/pull/337
-
-Mon Jun 24 02:42:01 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * win32/README.win32: grammar typo by @blankenshipz [Fixes GH-334]
- https://github.com/ruby/ruby/pull/334
-
-Mon Jun 24 00:59:35 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (BIGUP): Use LSHIFTX and avoid cast to consider the type
- of x is bigger than BDIGIT_DBL.
- (big2ulong): Use unsigned long to store the result.
- (big2ull): Use unsigned LONG_LONG to store the result.
- (bigand_int): Use long for num to avoid data loss.
- (bigor_int): Ditto.
- (bigxor_int): Ditto.
-
-Sun Jun 23 23:05:58 2013 Tanaka Akira <akr@fsij.org>
-
- * include/ruby/defines.h (BDIGIT): Define it only if it is not defined
- yet. This eases tests and debug.
- (SIZEOF_BDIGITS): Ditto.
- (BDIGIT_DBL): Ditto.
- (BDIGIT_DBL_SIGNED): Ditto.
- (PRI_BDIGIT_PREFIX): Ditto.
- (PRI_BDIGIT_DBL_PREFIX): Ditto.
- (PRIdBDIGIT): Define it only if PRI_BDIGIT_PREFIX is defined.
- (PRIiBDIGIT): Ditto.
- (PRIoBDIGIT): Ditto.
- (PRIuBDIGIT): Ditto.
- (PRIxBDIGIT): Ditto.
- (PRIXBDIGIT): Ditto.
- (PRIdBDIGIT_DBL): Ditto.
- (PRIiBDIGIT_DBL): Ditto.
- (PRIoBDIGIT_DBL): Ditto.
- (PRIuBDIGIT_DBL): Ditto.
- (PRIxBDIGIT_DBL): Ditto.
- (PRIXBDIGIT_DBL): Ditto.
-
- * include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): Define it only if it is
- not defined yet.
-
-Sun Jun 23 17:29:51 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (integer_unpack_single_bdigit): Use a cast.
-
-Sun Jun 23 15:38:07 2013 Koichi Sasada <ko1@atdot.net>
-
- * bootstraptest/test_thread.rb: rescue resource limitation errors.
-
-Sun Jun 23 08:19:27 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (integer_unpack_single_bdigit): Extracted from
- bary_unpack_internal.
-
-Sun Jun 23 07:41:52 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_unpack_internal): Suppress warnings (C4146) on Visual Studio.
- Reported by ko1 via IRC.
-
-Sun Jun 23 06:49:28 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h, gc.c: rename macros and functions:
- OBJ_WB_GIVEUP() -> OBJ_WB_UNPROTECT(),
- rb_obj_wb_giveup() -> rb_obj_wb_unprotect(),
- rb_gc_giveup_promoted_writebarrier() ->
- rb_gc_writebarrier_unprotect_promoted(),
-
- * class.c, eval.c, hash.c: use OBJ_WB_UNPROTECT().
-
-Sun Jun 23 05:41:32 2013 Koichi Sasada <ko1@atdot.net>
-
- * class.c (rb_include_class_new), eval.c (rb_using_refinement):
- make classes/modules (who share method table) shady.
- If module `a' and `b' shares method table m_tbl and new method
- with iseq is added, then write barrier is applied only `a' or `b'.
- To avoid this issue, shade such classes/modules.
-
- * vm_method.c (rb_method_entry_make): add write barriers.
-
-Sun Jun 23 01:27:54 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bytes_zero_p): Removed.
- (bary_pack): Don't call bytes_zero_p.
-
-Sun Jun 23 00:51:29 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bytes_zero_p): Extracted from bary_pack.
- (bary_pack): Use bytes_zero_p.
-
-Sun Jun 23 00:16:57 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (MSB): New macro.
- (bary_unpack_internal): Use MSB.
- (bary_divmod): Ditto.
- (bigdivrem): Ditto.
-
-Sat Jun 22 23:45:22 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_swap): New function.
- (bary_pack): Use bary_swap.
- (bary_unpack_internal): Ditto.
-
-Sat Jun 22 23:18:39 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bytes_2comp): Renamed from quad_buf_complement.
- (bary_pack): Use bytes_2comp.
- (rb_quad_pack): Use rb_integer_pack.
- (rb_quad_unpack): Use rb_integer_unpack.
-
-Sat Jun 22 21:46:18 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_integer_unpack): Don't allocate a Bignum if possible.
-
-Sat Jun 22 21:03:58 2013 Tanaka Akira <akr@fsij.org>
-
- * pack.c (pack_unpack): Remove specialized unpackers for integers.
-
-Sat Jun 22 20:36:50 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_unpack_internal): Specialized unpacker implemented.
- (bary_unpack): Support INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION.
- (rb_integer_unpack): Support INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION.
-
-Sat Jun 22 18:53:10 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_pack): Support
- INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION flag.
- Fix byte order and word order handling in code specialized for
- wordsize % SIZEOF_BDIGITS == 0.
-
- * internal.h (INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION): Defined.
-
-Sat Jun 22 15:41:25 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rgengc_check_shady): add new WB miss checking
- on RGENGC_CHECK_MODE >= 2.
-
- (1) Save bitmaps before marking
- (2) Run full marking
- (3) On each traceable object,
- (a) object was not oldgen (== newly or shady object) &&
- (b) parent object was oldgen &&
- (c) parent object was not remembered &&
- (d) object was not remembered
- then, it should be WB miss.
-
- This idea of this checker is by Masaya Tarui <tarui@ruby-lang.org>.
-
-Sat Jun 22 15:25:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * ext/etc/etc.c (setup_passwd): revert r41560, unnecessary
-
-Sat Jun 22 14:39:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * ext/etc/etc.c (Init_etc): omit 'passwd' from definition of Etc::Passwd
- if HAVE_STRUCT_PASSWD_PW_PASSWD is not defined to prevent mismatch of
- fields and values in setup_passwd
-
-Sat Jun 22 14:35:40 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/dl/cfunc.c (rb_dlcfunc_call): Use rb_big_pack instead of
- rb_big2ulong_pack and rb_big2ull.
-
- * include/ruby/intern.h (rb_big2ulong_pack): Deprecated.
-
-Sat Jun 22 14:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * ext/etc/etc.c (setup_passwd): pass 0 as VALUE to rb_struct_new to
- prevent segfault if the compiler passes it as a 32 bit integer on
- a 64 bit ruby
-
-Sat Jun 22 13:47:13 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_pack): MEMZERO can be used even if nails is not zero.
-
-Sat Jun 22 13:43:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * ext/etc/etc.c (etc_getpwnam): use PRIsVALUE in format string instead
- of %s and RSTRING_PTR
-
- * ext/etc/etc.c (etc_getgrnam): ditto
-
-Sat Jun 22 13:07:15 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (CLEAR_LOWBITS): Rewritten without RSHIFTX.
- (RSHIFTX): Removed.
-
-Sat Jun 22 10:38:03 2013 Tanaka Akira <akr@fsij.org>
-
- * pack.c (num2i32): Removed.
- (pack_pack): Don't use num2i32.
-
-Sat Jun 22 09:55:13 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (LSHIFTX): Defined to suppress a warning.
- (RSHIFTX): Ditto.
- (CLEAR_LOWBITS): Use LSHIFTX and RSHIFTX.
- (FILL_LOWBITS): Use LSHIFTX.
- Reported by ko1 via IRC.
-
-Sat Jun 22 09:11:33 2013 Ryan Davis <ryand-ruby@zenspider.com>
-
- * lib/minitest/*: Imported minitest 4.7.5 (r8724)
- * test/minitest/*: ditto
-
-Sat Jun 22 07:20:30 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_prof_set_heap_info, after_gc_sweep): call
- gc_prof_set_heap_info() just after sweeping to calculate
- live object number correctly.
- (live object number = total generated number (before marking) -
- total freed number (after sweeping))
-
- * gc.c (gc_marks): record `oldgen_object_count' into current profile`
- record directly.
-
- * gc.c (rgengc_rememberset_mark): same for remembered_normal_objects
- and remembered_shady_objects.
-
-Sat Jun 22 06:46:04 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_objspace::profile): rename rb_objspace::profile::record to
- records (because it points a set of records) and add a field
- rb_objspace::profile::current_record to point a current profiling
- record.
-
- * gc.c: use above fields.
-
-Sat Jun 22 06:05:36 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_gc_giveup_promoted_writebarrier): remove `rest_sweep()'
- because all of remembered objects are called for gc_mark_children().
-
-Sat Jun 22 05:08:03 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rgengc_rememberset_mark): call gc_mark_children() for
- remembered objects directly instead of pushing on the mark stack.
-
-Sat Jun 22 04:48:53 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h (OBJ_WRITE): cast to (VALUE *) for second
- parameter `slot'. You don't need to write a cast (VALUE *) any more.
-
- * class.c, compile.c, hash.c, iseq.c, proc.c, re.c, variable.c,
- vm.c, vm_method.c: remove cast expressions for OBJ_WRITE().
-
-Sat Jun 22 04:37:08 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (slot_sweep_body): rename to slot_sweep().
- No need to separate major/minor GC.
-
- * gc.c (gc_setup_mark_bits): remove gc_clear_mark_bits() and unify to
- this function.
-
-Sat Jun 22 04:20:21 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (check_bitmap_consistency): add to check flag and bitmap consistency.
- Use this function in several places.
-
-Sat Jun 22 02:18:07 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_pack): Specialized packers implemented.
- (HOST_BIGENDIAN_P): New macro.
- (ALIGNOF): New macro.
- (CLEAR_LOWBITS): New macro.
- (FILL_LOWBITS): New macro.
- (swap_bdigit): New macro.
- (bary_2comp): Returns an int.
-
- * internal.h (swap16): Moved from pack.c
- (swap32): Ditto.
- (swap64): Ditto.
-
-Fri Jun 21 21:29:49 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (typedef enum): Introduce flags of major gc reason.
- * gc.c (garbage_collect_body): Ditto.
- * gc.c (gc_profile_flags): Ditto.
- * gc.c (gc_profile_dump_on): Ditto.
-
-Fri Jun 21 21:11:53 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (allocate_sorted_heaps): remove unused variable `add'.
-
-Fri Jun 21 20:50:32 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: constify RArray::as::ary and RArray::heap::ptr.
- Use RARRAY_ASET() or RARRAY_PTR_USE() to modify Array objects.
-
- * array.c, gc.c: catch up above changes.
-
-Fri Jun 21 20:32:13 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_eval.c (eval_string_with_cref): fix WB miss.
-
-Fri Jun 21 20:15:49 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: support write barrier protection for T_STRUCT.
- Introduce the following C APIs:
- * RSTRUCT_RAWPTR(st) returns pointer (do WB on your risk).
- The type of returned pointer is (const VALUE *).
- * RSTRUCT_GET(st, idx) returns idx-th value of struct.
- * RSTRUCT_SET(st, idx, v) set idx-th value by v with WB.
- And
- * RSTRUCT_PTR(st) returns pointer with shady operation.
- The type of returned pointer is (VALUE *).
-
- * struct.c, re.c, gc.c, marshal.c: rewrite with above APIs.
-
-Fri Jun 21 19:38:37 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (BDIGMAX): Use BIGRAD.
- (BIGLO): Use BDIGMAX.
- (bigdivrem1): Ditto.
- (bigor_int): Ditto.
- (rb_big_or): Ditto.
-
-Fri Jun 21 19:18:48 2013 Tanaka Akira <akr@fsij.org>
-
- * pack.c (pack_pack): Move the implementation for 'c' directive after
- pack_integer label.
-
-Fri Jun 21 19:11:56 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h, re.c: support write barrier for T_REGEXP.
-
- Note: T_MATCH object is also easy to support write barriers.
- However, most of T_MATCH objects are short-lived objects.
- So I skipped to support non-shady T_MATCH.
-
-Fri Jun 21 18:56:58 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigsub_int): Use bdigit_roomof.
- (bigadd_int): Ditto.
- (bigand_int): Ditto.
- (bigor_int): Ditto.
- (bigxor_int): Ditto.
-
-Fri Jun 21 17:56:25 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/gc/gcbench.rb: fix summary of benchmark result notation.
-
-Fri Jun 21 16:38:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * ext/openssl/ossl_x509attr.c: change OSSL_X509ATTR_IS_SINGLE and
- OSSL_X509ATTR_SET_SINGLE macros to use ->value.set rather than
- ->set to fix compile failure
-
-Fri Jun 21 15:26:45 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_sweep): profile sweep time correctly when LAZY_SWEEP is
- disabled.
-
- * gc.c (gc_marks_test): store oldgen count and shady count
- before test marking and restore them after marking.
-
-Fri Jun 21 15:07:42 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: enable lazy sweep (commit miss).
-
-Fri Jun 21 14:31:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * hash.c (ruby_setenv): refine error message so include the variable
- name.
-
-Fri Jun 21 14:15:08 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: fix to use total_allocated_object_num and heaps_used
- at the GC time for profiler.
-
-Fri Jun 21 12:35:35 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: RGENGC_CHECK_MODE should be 0.
-
-Fri Jun 21 11:18:25 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_marks_body): fix to get `th' in this function.
-
-Fri Jun 21 10:21:44 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (heaps_header/heaps_slot): embed bitmaps into heaps_slot.
- no need to maintain allocation/free bitmaps.
-
-Fri Jun 21 09:22:16 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (slot_sweep_body): add counters at a time.
-
- * gc.c (gc_profile_dump_on): fix line break position.
-
-Fri Jun 21 08:14:00 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c: refactoring bitmaps. introduce bits_t type and some Consts.
-
-Fri Jun 21 08:04:32 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: fix to support USE_RGENGC == 0 (disable RGenGC).
- If USE_RGENGC==0, it caused compilation error.
-
-Fri Jun 21 08:08:11 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (lazy_sweep): Use is_lazy_sweeping()
- * gc.c (rest_sweep): Ditto.
- * gc.c (gc_prepare_free_objects): Ditto.
-
-Fri Jun 21 07:34:47 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_profile_record::oldgen_objects): added.
-
- * gc.c (gc_profile_dump_on): print the following information:
- * Living object counts
- * Free object counts
- If RGENGC_PROFILE > 0 then
- * Oldgen object counts
- * Remembered normal object counts
- * Remembered shady object counts
-
-Fri Jun 21 06:43:59 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_ull2big): Refactored.
- (rb_uint2big): Useless code removed.
-
-Fri Jun 21 05:37:39 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_prof_sweep_timer_stop): accumulate sweep time only when
- record->gc_time > 0.
-
-Fri Jun 21 00:37:31 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/bigdecimal: Workaround fix for bigdecimal test failures caused
- by [ruby-dev:47413] [Feature #8509]
-
- * ext/bigdecimal/bigdecimal.h (BDIGIT): Make it independent from the
- definition for bignum.c.
- (SIZEOF_BDIGITS): Ditto.
- (BDIGIT_DBL): Ditto.
- (BDIGIT_DBL_SIGNED): Ditto.
- (PRI_BDIGIT_PREFIX): Undefine the definition.
- (PRI_BDIGIT_DBL_PREFIX): Ditto.
-
- * ext/bigdecimal/bigdecimal.c (RBIGNUM_ZERO_P): Use rb_bigzero_p.
- (bigzero_p): Removed.
- (is_even): Use rb_big_pack.
-
-Thu Jun 20 22:52:42 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigmul1_toom3): Don't call bignorm twice.
-
-Thu Jun 20 22:49:27 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bignorm): Don't call bigtrunc if the result is a fixnum.
-
-Thu Jun 20 22:29:42 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_uint2big): Refactored.
-
-Thu Jun 20 22:24:41 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (dump_bignum): Use SIZEOF_BDIGITS.
-
-Thu Jun 20 22:22:46 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big2ulong): Change the return type to unsigned long.
- (rb_big2ulong_pack): Follow the above change.
- (rb_big2long): Ditto.
- (rb_big_lshift): Ditto.
- (rb_big_rshift): Ditto.
- (rb_big_aref): Ditto.
-
-Thu Jun 20 22:02:46 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bary_unpack_internal): Return -2 when negative overflow.
- (bary_unpack): Set the overflowed bit if an extra BDIGIT exists.
- (rb_integer_unpack): Set the overflowed bit.
-
-Thu Jun 20 21:17:19 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rgengc_rememberset_mark): record
- (1) normal objects count in remember set
- (2) shady objects count in remember set
- each GC timing.
-
- * gc.c (gc_profile_record_get): enable to access above information
- and REMOVING_OBJECTS, EMPTY_OBJECTS.
-
-Thu Jun 20 18:29:26 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/gc/gcbench.rb: Do not use GC::Profiler::disable because
- GC::Profiler::disable prohibit to access profiling data. It should
- be spec bug.
-
- Skip GC::Profiler::report if RUBY_VERSION < '2.0.0'
-
-Thu Jun 20 17:59:08 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/gc/gcbench.rb: stop GC::Profiler before output results.
- Generating GC::Profiler result under profiling causes infinite loop.
-
-Thu Jun 20 17:24:24 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/gc/gcbench.rb: don't use __dir__ to make compatible
- with ruby 1.9.3.
-
-Thu Jun 20 16:57:19 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/bm_app_aobench.rb: use attr_accessor/reader instead of
- defining methods.
-
-Thu Jun 20 16:46:46 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/bm_app_aobench.rb: added.
-
- * benchmark/gc/aobench.rb: added.
-
-Thu Jun 20 16:28:33 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/bm_so_binary_trees.rb: disable `puts' method
- and change iteration parameter to increase execution time.
-
- * benchmark/gc/binarytree.rb: added.
-
-Thu Jun 20 16:06:37 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/gc/pentomino.rb: added.
- Simply load pentomino puzzle in the benchmark/ directory.
-
-Thu Jun 20 15:32:56 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/gc/redblack.rb: import red black tree benchmark from
- https://github.com/jruby/rubybench/blob/master/time/bench_red_black.rb
-
- * benchmark/gc/ring.rb: add a benchmark. This benchmark create many
- old objects.
-
-Thu Jun 20 15:14:00 2013 Koichi Sasada <ko1@atdot.net>
-
- * benchmark/gc: create a directory to store GC related benchmark.
-
- * benchmark/gc/gcbench.rb: moved from tool/gcbench.rb.
-
- * benchmark/gc/hash(1|2).rb: ditto.
-
- * benchmark/gc/rdoc.rb: ditto.
-
- * benchmark/gc/null.rb: added.
-
- * common.mk: fix rule.
-
-Thu Jun 20 14:09:54 2013 Koichi Sasada <ko1@atdot.net>
-
- * tool/hashbench1.rb: fix parameter too. Increase temporary objects.
-
-Thu Jun 20 14:01:35 2013 Koichi Sasada <ko1@atdot.net>
-
- * tool/hashbench1.rb: fix parameters.
-
-Thu Jun 20 14:00:34 2013 Koichi Sasada <ko1@atdot.net>
-
- * common.mk: remove dependency from ruby.
-
-Thu Jun 20 13:14:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * error.c (rb_check_backtrace): evaluate RARRAY_AREF only once.
- the first argument of RB_TYPE_P is expanded twice for non-immediate
- types.
-
-Thu Jun 20 08:09:29 2013 Koichi Sasada <ko1@atdot.net>
-
- * tool/gcbench.rb: Summary in one line.
-
- * common.mk: separate gcbench-hash to gcbench-hash1 and gcbench-hash2.
-
-Thu Jun 20 08:07:23 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (BIGSIZE): New macro.
- (bigfixize): Use BIGSIZE.
- (big2ulong): Ditto.
- (check_shiftdown): Ditto.
- (rb_big_aref): Ditto.
-
-Thu Jun 20 07:46:48 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (rb_gc_writebarrier): give up rescan A and register B directly
- if A has huge number of children.
-
-Thu Jun 20 07:30:35 2013 Koichi Sasada <ko1@atdot.net>
-
- * common.mk: add new rules `gcbench-rdoc', `gcbench-hash'.
-
- * tool/gcbench.rb: separate GC bench framework and process.
-
- * tool/hashbench1.rb, tool/hashbench2.rb: add two types GC bench.
- hashbench1: many temporal objects (GC by newobj)
- hashbench2: hash size becomes bigger and bigger (GC by malloc)
- Two benches are executed by `gcbench-hash' rule.
-
- * tool/rdocbench.rb: separated.
-
-Thu Jun 20 06:25:39 2013 Koichi Sasada <ko1@atdot.net>
-
- * tool/rdocbench.rb: add summary.
-
-Thu Jun 20 06:18:01 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_profile_total_time): check objspace->profile.next_index > 0.
-
-Thu Jun 20 05:47:41 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_prof_sweep_timer_start): fix merge miss.
-
- * gc.c (GC_PROFILE_MORE_DETAIL): set it 0.
-
-Thu Jun 20 05:38:56 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: Accumulate sweep time to GC time.
- Now [GC time] is [mark time] + [sweep time] + [misc].
- ([GC time] >= [mark time] + [sweep time])
-
- * gc.c (gc_prof_sweep_slot_timer_start/stop): rename to
- gc_prof_sweep_timer_start/stop and locate at lazy_sweep().
-
- * gc.c (elapsed_time_from): add a utility function.
-
-Thu Jun 20 05:08:53 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_marks): fix wrong option. FALSE means major/full GC.
- It should be TRUE (minor marking).
-
-Thu Jun 20 02:44:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/win32.c (waitpid): should not return 0 but wait until exit
- unless WNOHANG is given. waiting huge process may return while
- active, for some reason.
-
-Thu Jun 20 01:34:15 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bdigit_roomof): Use SIZEOF_BDIGITS.
- (bigfixize): Refine an ifdef condition.
- (rb_absint_size): Use bdigit_roomof.
- (rb_absint_singlebit_p): Ditto.
- (rb_integer_pack): Ditto.
- (integer_pack_fill_dd): Use BITSPERDIG.
- (integer_unpack_push_bits): Use BITSPERDIG, BIGLO and BIGDN.
-
-Thu Jun 20 01:07:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (MARKED_IN_BITMAP, FL_TEST2): return boolean value since always
- used as boolean value.
-
- * gc.c (MARK_IN_BITMAP, CLEAR_IN_BITMAP): evaluate bits once.
-
-Thu Jun 20 00:05:07 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (RVALUE_PROMOTED): fix type.
-
-Wed Jun 19 23:39:01 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_marks_test): rewrite checking code.
- When RGENGC_CHECK_MODE >= 2, all minor marking, run normal minor
- marking *and* major/full marking. After that, compare the results
- and shows BUG if a object living with major/full marking but dead
- with minor marking.
- After detecting bugs, print references information.
- (RGENGC_CHECK_MODE == 2, show references to dead object)
- (RGENGC_CHECK_MODE == 3, show all references)
-
-Wed Jun 19 23:51:48 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bigfixize): Use rb_absint_size.
- (check_shiftdown): Ditto.
- (big2ulong): Use bdigit_roomof.
-
-Wed Jun 19 23:32:23 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (RVALUE_PROMOTED): check consistency between oldgen flag and
- oldgen bitmap if RGENGC_CHECK_MODE > 0.
-
-Wed Jun 19 23:29:29 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_gc_force_recycle): clear oldgen bitmap, too.
-
-Wed Jun 19 21:02:13 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_uint2big): Consider environments BDIGIT is bigger than
- long.
- (big2ulong): Ditto.
- (rb_big_aref): Ditto.
- (rb_big_pack): Just call rb_integer_pack.
- (rb_big_unpack): Just call rb_integer_unpack.
-
-Wed Jun 19 20:51:21 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-
- * gc.c (gc_stress_get): GC.stress can be Fixnum.
-
-Wed Jun 19 19:31:30 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (DIGSPERLONG): Don't define if BDIGIT is bigger than long.
- (DIGSPERLL): Don't define if BDIGIT is bigger than LONG_LONG
- (rb_absint_size): Consider environments BDIGIT is bigger than long.
- Use BIGLO and BIGDN.
- (rb_absint_singlebit_p): Ditto.
- (rb_integer_pack): Ditto.
- (bigsub_int): Consider environments BDIGIT is bigger than long.
- Use SIZEOF_BDIGITS instead of sizeof(BDIGIT).
- (bigadd_int): Ditto.
- (bigand_int): Ditto.
- (bigor_int): Ditto.
- (bigxor_int): Ditto.
-
-Wed Jun 19 15:14:30 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h (struct rb_data_type_struct), gc.c: add
- rb_data_type_struct::flags. Now, this flags is passed
- at T_DATA object creation. You can specify FL_WB_PROTECTED
- on this flag.
-
- * iseq.c: making non-shady iseq objects.
-
- * class.c, compile.c, proc.c, vm.c: add WB for iseq objects.
-
- * vm_core.h, iseq.h: constify fields to detect WB insertion.
-
-Wed Jun 19 15:11:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (gc_mark_children): show more info for broken object.
-
-Wed Jun 19 14:04:41 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-
- * test/ruby/envutil.rb (EnvUtil#rubybin): remove unnecessary
- unless expression.
-
-Wed Jun 19 07:47:48 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (garbage_collect_body): use FIX2INT for ruby_gc_stress.
-
-Wed Jun 19 07:44:31 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_objspace::gc_stress): int -> VALUE to store Fixnum object.
-
-Wed Jun 19 07:25:35 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (make_deferred): clear flags to T_ZOMBIE.
-
- * gc.c (slot_sweep_body): fix indent.
-
-Wed Jun 19 07:18:47 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big_aref): Apply BIGLO to ~xds[i] for environment which
- BDIGIT is 16bit.
-
-Wed Jun 19 07:09:26 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rgengc_remember): fix output level.
-
- * gc.c (rgengc_rememberset_mark): fix to output clear count.
- (shady_object_count + clear_count = count of remembered objects)
-
-Wed Jun 19 07:06:21 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rgengc_remember): check T_NONE and T_ZOMBIE
- if RGENGC_CHECK_MODE > 0.
-
-Wed Jun 19 07:02:19 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (RGENGC_CHECK_MODE): add new check mode `3'.
- In this mode, show all references if there is
- a miss-corrected object.
-
-Wed Jun 19 06:31:08 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_stress_set): add special option of GC.stress.
- `GC.stress=(flag)' accepts integer to control behavior of GC.
- See code for details. Of course, this feature is only for MRI.
-
- You can debug RGenGC (WB) using `GC.stress = 1'.
- Using this option, do minor marking at all possible places.
-
- GC::STRESS_MINOR_MARK = 1 and GC::STRESS_LAZY_SWEEP = 2
- seem good to add.
-
-Wed Jun 19 06:29:31 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm.c (kwmerge_i): add WB.
-
-Wed Jun 19 06:26:49 2013 Koichi Sasada <ko1@atdot.net>
-
- * hash.c: `st_update()' also has same issue of last fix.
- write barriers at callback function are too early.
- All write barriers are executed after `st_update()'
-
-Wed Jun 19 04:33:22 2013 Koichi Sasada <ko1@atdot.net>
-
- * variable.c (rb_const_set): fix WB miss.
-
- WBs had located before creating reference between a klass
- and constant value. It causes GC bug.
-
- # pseudo code:
- WB(klass, value); # WB and remember klass
- st_insert(klass->const_table, const_id, value);
-
- `st_insert()' can cause GC before inserting `value' and
- forget `klass' from the remember set. After that, relationship
- between `klass' and `value' are created with constant table.
- Now, `value' can be young (shady) object and `klass' can be old
- object, without remembering `klass' object.
- At the next GC, old `klass' object will be skipped and
- young (shady) `value' will be miss-collected. -> GC bug
-
- Lesson: The place of a WB is important.
-
-Tue Jun 18 22:01:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * vm_insnhelper.c (vm_call_method): ensure methods of type
- VM_METHOD_TYPE_ATTR_SET are called with 1 argument
-
- * test/ruby/test_module.rb
- (TestModule#test_attr_writer_with_no_arguments): add test
- [ruby-core:55543] [Bug #8540]
-
-Tue Jun 18 22:36:23 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (gc_profile_record_flag): fix typo.
-
-Tue Jun 18 22:08:53 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/objspace/object_tracing.c: Return for ::allocation_generation
-
-Tue Jun 18 22:04:35 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/objspace/object_tracing.c: Document object_tracing methods.
-
-Tue Jun 18 21:58:17 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * gc.c: Rename rb_mObSpace -> rb_mObjSpace
-
-Tue Jun 18 20:55:05 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/objspace/objspace.c: Document ObjectSpace::InternalObjectWrapper.
-
-Tue Jun 18 20:39:04 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/objspace/object_tracing.c: Teach rdoc object_tracing.c [Bug #8537]
-
-Tue Jun 18 20:29:47 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/.document: add object_tracing.c to document file
-
-Tue Jun 18 20:20:27 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/objspace/objspace.c: rdoc on require to overview from r41355
-
-Tue Jun 18 18:39:58 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Check __int128.
-
- * include/ruby/defines.h (BDIGIT_DBL): Use uint128_t if it is available.
- (BDIGIT): Use uint64_t if uint128_t is available.
- (SIZEOF_BDIGITS): Defined for above case.
- (BDIGIT_DBL_SIGNED): Ditto.
- (PRI_BDIGIT_PREFIX): Ditto.
-
- * include/ruby/ruby.h (PRI_64_PREFIX): Defined.
-
- * bignum.c (rb_big_pow): Don't use BITSPERDIG for the condition which
- rb_big_pow returns Float or Bignum.
-
- [ruby-dev:47413] [Feature #8509]
-
-Tue Jun 18 16:43:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_heredoc_restore): clear lex_strterm always to get
- rid of marking recycled node. this bug is revealed by r41372 with
- GC.stress=true.
-
-Tue Jun 18 12:53:25 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (nlz): Cast the result explicitly.
- (big2dbl): Don't assign BDIGIT values to int variable.
-
-Tue Jun 18 12:25:16 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big_xor): Non-effective code removed.
-
-Tue Jun 18 11:26:05 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_stat): add `generated_normal_object_count_types' for
- RGENGC_PROFILE >= 2.
-
-Tue Jun 18 11:02:18 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_mark_maybe): check to skip T_NONE.
-
- * gc.c (markable_object_p): do not need to check (flags == 0) here.
-
-Tue Jun 18 10:17:37 2013 Koichi Sasada <ko1@atdot.net>
-
- * variable.c (rb_autoload): fix WB miss.
-
-Tue Jun 18 04:20:18 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_mark_children): don't need to care about T_ZOMBIE here.
-
-Mon Jun 17 22:16:02 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * test/ruby/test_proc.rb (TestProc#test_block_given_method_to_proc):
- run test for r41359.
-
-Mon Jun 17 21:42:18 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+ * configure.in: enable SSE2 on mingw. target='i386-pc-mingw32'.
+ [ruby-core:62095] [Bug #8358]
- * include/ruby/ruby.h, vm_eval.c (rb_funcall_with_block):
- new function to invoke a method with a block passed
- as an argument.
+Thu May 15 21:04:06 2014 Hiroshi Shirosaki <h.shirosaki@gmail.com>
- * string.c (sym_call): use the above function to avoid
- a block sharing. [ruby-dev:47438] [Bug #8531]
+ * lib/test/unit/parallel.rb: fix test-all parallel failure if a test
+ is skipped after raise.
+ DL::TestFunc#test_sinf is skipped after raise on mingw ruby.
+ But it causes Marshal.load failure due to undefined class/module
+ DL::DLError when doing test-all parallel and test-all doesn't
+ complete. We create new MiniTest::Skip object to avoid Marshal.load
+ failure.
+ [ruby-core:62133] [Bug #9767]
- * vm_insnhelper.c (vm_yield_with_cfunc): don't set block
- in the frame.
+ * test/testunit/test_parallel.rb (TestParallel): add a test.
- * test/ruby/test_symbol.rb (TestSymbol#test_block_given_to_proc):
- run related tests.
+ * test/testunit/tests_for_parallel/ptest_forth.rb: ditto.
-Mon Jun 17 21:33:27 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+Thu May 15 18:57:23 2014 Koichi Sasada <ko1@atdot.net>
- * include/ruby/intern.h, proc.c (rb_method_call_with_block):
- new function to invoke a Method object with a block passed
- as an argument.
+ * gc.c (garbage_collect_body): move gc_heap_prepare_minimum_pages()
+ from gc_sweep().
- * proc.c (bmcall): use the above function to avoid a block sharing.
- [ruby-core:54626] [Bug #8341]
+Thu May 15 18:51:25 2014 Koichi Sasada <ko1@atdot.net>
- * test/ruby/test_proc.rb (TestProc#test_block_persist_between_calls):
- run related tests.
+ * gc.c (heap_extend_pages): calculate next growing heap size.
-Mon Jun 17 20:53:21 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c (heap_set_increment): accept addition pages instead of
+ minimum pages.
- * loadpath.c (RUBY_REVISION): Defined to suppress revision.h
- inclusion actually. r41352 removes the dependency.
+ * gc.c (gc_after_sweep): use heap_etend_pages().
-Mon Jun 17 18:15:57 2013 Benoit Daloze <eregontp@gmail.com>
+ * gc.c (gc_heap_prepare_minimum_pages): add only 1 page.
- * ext/objspace/objspace.c: let rdoc know about objspace methods.
- Specify 'objspace' should be required. See #8537.
+ * gc.c (heap_ready_to_gc): add only 1 page.
-Mon Jun 17 17:44:31 2013 Benoit Daloze <eregontp@gmail.com>
+Thu May 15 18:42:49 2014 Koichi Sasada <ko1@atdot.net>
- * gc.c (ObjectSpace): is a module not a class.
+ * gc.c: introduce macros to remove magic number.
- * ext/objspace/objspace.c: try to include overview in rdoc,
- see #8537.
+ GC_HEAP_FREE_SLOTS_MIN_RATIO = 0.3: guarantee minimum empty slots
+ ratio after sweep.
+ GC_HEAP_FREE_SLOTS_MAX_RATIO = 0.8: allow to free pages 0.2 (= 1-0.8)
+ of current existing slots.
-Mon Jun 17 17:38:24 2013 Benoit Daloze <eregontp@gmail.com>
+Thu May 15 17:32:51 2014 Hiroshi Shirosaki <h.shirosaki@gmail.com>
- * gc.c: fix example of ObjectSpace.define_finalizer in overview
+ * thread_win32.c (rb_w32_stack_overflow_handler): use Structured
+ Exception Handling by AddVectoredExceptionHandler() for machine
+ stack overflow on mingw.
+ This would be equivalent to the handling using __try and __except
+ on mswin introduced by r43748.
-Mon Jun 17 16:59:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed May 14 19:31:03 2014 Koichi Sasada <ko1@atdot.net>
- * ext/tk/tkutil/tkutil.c: use rb_sprintf(), rb_id2str(), and
- rb_intern_str() instead of rb_intern() and RSTRING_PTR() with
- RB_GC_GUARD(), to prevent temporary objects from GC.
- [ruby-core:39000] [Bug #5199]
+ * ext/openssl/depend: remove dependency from internal headers.
+ [Feature #9612]
-Mon Jun 17 14:27:54 2013 Zachary Scott <zachary@zacharyscott.net>
+ * ext/openssl/ossl.c (ossl_fips_mode_set): ditto.
- * vm_backtrace.c: Update rdoc for Backtrace#label with @_ko1
+ * ext/coverage/depend: ditto.
-Mon Jun 17 13:04:01 2013 Akinori MUSHA <knu@iDaemons.org>
+ * include/ruby/thread_native.h: added.
- * tool/ifchange (until): Fix the condition, although harmless in
- this case.
+ This header file only provides wrapper functions to control
+ native threads. These wrapper functions are used by MRI
+ implementation.
-Mon Jun 17 11:50:29 2013 Koichi Sasada <ko1@atdot.net>
+ * vm_core.h: use include/ruby/thread_native.h.
- * gc.c (gc_mark_maybe): added. check `is_pointer_to_heap()' and
- type is not T_ZOMBIE.
+ * thread.c: ditto.
- * gc.c: use `gc_mark_maybe()'. T_ZOMBIE objects should not be pushed
- to the mark stack.
+ * thread_pthread.h: ditto.
-Mon Jun 17 07:56:24 2013 Tanaka Akira <akr@fsij.org>
+ * thread_win32.h: ditto.
- * bignum.c (bary_small_lshift): Renamed from bdigs_small_lshift.
- (bary_small_rshift): Renamed from bdigs_small_rshift.
+ * thread_native.h: removed.
-Mon Jun 17 07:38:48 2013 Tanaka Akira <akr@fsij.org>
+Wed May 14 18:03:28 2014 Koichi Sasada <ko1@atdot.net>
- * bignum.c (absint_numwords_bytes): Removed.
- (rb_absint_numwords): Don't call absint_numwords_bytes.
+ * gc.c: enable RGENGC_AGE2_PROMOTION.
-Sun Jun 16 23:14:58 2013 Tanaka Akira <akr@fsij.org>
+Wed May 14 18:02:30 2014 Koichi Sasada <ko1@atdot.net>
- * bignum.c (BARY_ADD): New macro.
- (BARY_SUB): Ditto.
- (BARY_MUL): Ditto.
- (BARY_DIVMOD): Ditto.
- (BARY_ZERO_P): Ditto.
- (absint_numwords_generic): Use these macros.
+ * gc.c (rgengc_rememberset_mark): promote remembered object earlier.
-Sun Jun 16 21:41:39 2013 Tanaka Akira <akr@fsij.org>
+Mon May 12 23:57:15 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * bignum.c (bary_2comp): Extracted from get2comp.
- (integer_unpack_num_bdigits): Extracted from
- rb_integer_unpack_internal.
- (bary_unpack_internal): Renamed from bary_unpack and support
- INTEGER_PACK_2COMP.
- (bary_unpack): New function to validate arguments and invoke
- bary_unpack_internal.
- (rb_integer_unpack_internal): Removed.
- (rb_integer_unpack): Invoke bary_unpack_internal.
- (rb_integer_unpack_2comp): Removed.
+ * configure.in (rb_cv_atan2_inf_c99): check whether runtime atan2
+ handles Inf as C99. [ruby-core:62536] [Bug #9831]
- * internal.h (rb_integer_unpack_2comp): Removed.
+Mon May 12 20:33:01 2014 Tanaka Akira <akr@fsij.org>
- * pack.c: Follow the above change.
+ * configure.in: Invoke AC_REPLACE_FUNCS for each function.
-Sun Jun 16 18:41:42 2013 Tanaka Akira <akr@fsij.org>
+Mon May 12 19:52:11 2014 Koichi Sasada <ko1@atdot.net>
- * internal.h (INTEGER_PACK_2COMP): Defined.
- (rb_integer_pack_2comp): Removed.
+ * gc.c: count young object correctly and show it in GC.stat
+ on RGENGC_AGE2_PROMOTION.
- * bignum.c (bary_pack): Support INTEGER_PACK_2COMP.
- (rb_integer_pack): Invoke bary_pack directly.
- (rb_integer_pack_2comp): Removed.
- (rb_integer_pack_internal): Ditto.
- (absint_numwords_generic): Follow the above change.
+ * gc.c (RVALUE_PROMOTE_YOUNG): decrement young object count on
+ YOUNG->OLD.
- * pack.c (pack_pack): Ditto.
+ * gc.c (obj_free): decrement young object count when young object
+ freed.
- * sprintf.c (rb_str_format): Ditto.
+ * gc.c (gc_marks): should not clear young object count.
-Sun Jun 16 17:48:14 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c (gc_stat_internal): GC.stat :young_object information.
- * bignum.c (absint_numwords_generic): rb_funcall invocations removed.
+Mon May 12 01:30:59 2014 Tanaka Akira <akr@fsij.org>
-Sun Jun 16 16:04:38 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * ext/socket/ifaddr.c (IS_IFADDRS): Unused macro removed.
- * tool/config_files.rb: use URI.read to allow it runs with Ruby 1.8.5.
+ * ext/strscan/strscan.c (BUFSIZE): Ditto.
-Sun Jun 16 14:32:25 2013 Tanaka Akira <akr@fsij.org>
+ * ext/zlib/zlib.c (OBJ_IS_FREED): Ditto.
- * bignum.c (bary_pack) Extracted from rb_integer_pack_internal.
- (absint_numwords_generic): Use bary_pack.
+Sun May 11 22:27:18 2014 Tanaka Akira <akr@fsij.org>
-Sun Jun 16 11:01:57 2013 Kouhei Sutou <kou@cozmixng.org>
+ * compile.c (BUFSIZE): Unused macro removed.
- * NEWS (XMLRPC::Client#http): Add.
- [ruby-core:55197] [Feature #8461]
+ * vm.c (BUFSIZE): Ditto.
-Sun Jun 16 10:38:45 2013 Tanaka Akira <akr@fsij.org>
+ * pack.c (INT64toNUM): Ditto.
+ (UINT64toNUM): Ditto.
+ (BYTEWIDTH): Ditto.
- * bignum.c (bary_add): New function.
- (bary_zero_p): Extracted from bigzero_p.
- (absint_numwords_generic): Use bary_zero_p and bary_add.
- (bary_mul): Fix an argument for bary_mul_single.
- (bary_divmod): Use size_t for arguments.
+ * time.c (lshift): Ditto.
+ (UINT64toNUM): Ditto.
+ (id_lshift): Unused variable removed.
-Sun Jun 16 08:55:22 2013 Tanaka Akira <akr@fsij.org>
+Sun May 11 21:23:27 2014 Tanaka Akira <akr@fsij.org>
- * bignum.c (bigdivrem): Use a BDIGIT variable to store the return
- value of bigdivrem_single.
+ * pack.c (swaps): Unused macro removed.
+ (swapi): Ditto.
+ (swapl): Ditto.
+ (swapll): Ditto.
-Sun Jun 16 08:43:59 2013 Tanaka Akira <akr@fsij.org>
+Sun May 11 08:02:49 2014 Eric Wong <e@80x24.org>
- * bignum.c (bary_divmod): New function.
- (absint_numwords_generic): Use bary_divmod.
- (bigdivrem_num_extra_words): Extracted from bigdivrem.
- (bigdivrem_single): Ditto.
- (bigdivrem_normal): Ditto.
- (BIGDIVREM_EXTRA_WORDS): Defined.
+ * vm_core.h (rb_vm_t): list_head and counter for living_threads
+ (rb_thread_t): vmlt_node for living_threads linkage
+ (rb_vm_living_threads_init): new function wrapper
+ (rb_vm_living_threads_insert): ditto
+ (rb_vm_living_threads_remove): ditto
+ * vm.c (rb_vm_living_threads_foreach): new function wrapper
+ * thread.c (terminate_i, thread_start_func_2, thread_create_core,
+ thread_fd_close_i, thread_fd_close): update to use new APIs
+ * vm.c (vm_mark_each_thread_func, rb_vm_mark, ruby_vm_destruct,
+ vm_memsize, vm_init2, Init_VM): ditto
+ * vm_trace.c (clear_trace_func_i, rb_clear_trace_func): ditto
+ * benchmark/bm_vm_thread_close.rb: added to show improvement
+ * ccan/build_assert/build_assert.h: added as a dependency of list.h
+ * ccan/check_type/check_type.h: ditto
+ * ccan/container_of/container_of.h: ditto
+ * ccan/licenses/BSD-MIT: ditto
+ * ccan/licenses/CC0: ditto
+ * ccan/str/str.h: ditto (stripped of unused macros)
+ * ccan/list/list.h: ditto
+ * common.mk: add CCAN_LIST_INCLUDES
+ [ruby-core:61871][Feature #9632 (part 1)]
-Sun Jun 16 05:51:51 2013 Masaya Tarui <tarui@ruby-lang.org>
+Sun May 11 01:10:31 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * gc.c: Fixup around GC by MALLOC.
- Add allocate size to malloc_increase before GC
- for updating limit in after_gc_sweep.
- Reset malloc_increase into garbage_collect()
- for preventing GC again soon.
+ * signal.c (rb_f_kill): directly enqueue an ignored signal to self,
+ except for SIGSEGV and SIGBUS. [ruby-dev:48203] [Bug #9820]
-Sun Jun 16 05:15:36 2013 Masaya Tarui <tarui@ruby-lang.org>
+Sat May 10 22:37:56 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * gc.c: Add some columns to more detail profile.
- new columns: Allocated size, Prepare Time, Removing Objects, Empty Objects
+ * dir.c (push_glob): match in UTF-8 on Mac OS X.
+ [ruby-dev:48213] [Bug #9825]
-Sun Jun 16 02:04:40 2013 Masaya Tarui <tarui@ruby-lang.org>
+Sat May 10 13:32:18 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * gc.c (gc_prof_timer_stop): Merge function codes of GC_PROFILE_MORE_DETAIL and !GC_PROFILE_MORE_DETAIL.
- * gc.c (gc_prof_mark_timer_start): Ditto.
- * gc.c (gc_prof_mark_timer_stop): Ditto.
- * gc.c (gc_prof_sweep_slot_timer_start): Ditto.
- * gc.c (gc_prof_sweep_slot_timer_stop): Ditto.
- * gc.c (gc_prof_set_malloc_info): Ditto.
- * gc.c (gc_prof_set_heap_info): Ditto.
+ * thread.c (thread_start_func_2): stop if forked in a sub-thread,
+ the thread has become the main thread.
+ [ruby-core:62070] [Bug #9751]
-Sat Jun 15 23:50:24 2013 Tanaka Akira <akr@fsij.org>
+Sat May 10 09:32:19 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * bignum.c (bary_sub): New function.
- (absint_numwords_generic): Use bary_sub.
- (bigsub_core): Skip unnecessary copy.
+ * man/ruby.1: remove deadlink. [ruby-core:62145][Bug #9773]
-Sat Jun 15 22:05:30 2013 Tanaka Akira <akr@fsij.org>
+Sat May 10 08:47:36 2014 Tanaka Akira <akr@fsij.org>
- * bignum.c (bary_mul): New function.
- (absint_numwords_generic): Use bary_mul.
- (bary_mul_single): Extracted from bigmul1_single.
- (bary_mul_normal): Extracted from bigmul1_normal.
+ * signal.c (trap): Return "SYSTEM_DEFAULT" if SIG_DFL is set.
-Sat Jun 15 20:13:46 2013 Tanaka Akira <akr@fsij.org>
+Fri May 9 14:27:05 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * bignum.c (bary_unpack): Extracted from rb_integer_unpack_internal.
- (absint_numwords_generic): Use bary_unpack.
- (roomof): Defined.
- (bdigit_roomof): Defined.
- (BARY_ARGS): Defined.
- (bary_unpack): Declared.
+ * configure.in (RUBY_SETJMP_TYPE): check for setjmp type after
+ CCDLFLAGS is appended to CFLAGS, since __builtin_setjmp can be
+ affected. [ruby-core:62469] [Bug #9818]
-Sat Jun 15 19:35:04 2013 Tanaka Akira <akr@fsij.org>
+Fri May 9 03:59:06 2014 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
- * bignum.c (absint_numwords_bytes): Make it static.
- (absint_numwords_small): Ditto.
- (absint_numwords_generic): Ditto.
+ * lib/delegate.rb: Fix example of using delegator.
+ patched from Andrey Koleshko. [Fixes GH-505]
-Sat Jun 15 17:14:32 2013 Tanaka Akira <akr@fsij.org>
+Fri May 9 03:42:43 2014 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
- * bignum.c (bigmul1_normal): Shrink the result Bignum length.
+ * lib/shell.rb: add documentation in lib/shell.rb
+ patched from reprah. [Fixes GH-516]
-Sat Jun 15 10:19:42 2013 Zachary Scott <zachary@zacharyscott.net>
+Fri May 9 03:28:04 2014 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
- * ext/bigdecimal/bigdecimal.c: Update overview formatting of headers
+ * lib/fileutils.rb: show fileutils require at top.
+ patched from Richard Schneeman. [Fixes GH-604]
-Sat Jun 15 10:19:06 2013 Zachary Scott <zachary@zacharyscott.net>
+Fri May 9 03:07:09 2014 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
- * ext/bigdecimal/bigdecimal.gemspec: Update authors
+ * lib/prime.rb (Prime#prime?): negative numbers can't be primes
+ by definition. reported by Ivan Kataitsev. [Bug #7395]
+ * test/test_prime.rb: add test.
-Sat Jun 15 10:02:26 2013 Tanaka Akira <akr@fsij.org>
+Thu May 8 14:34:29 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * bignum.c (bdigs_small_rshift): Extracted from big_rshift.
- (bigdivrem): Use bdigs_small_rshift.
+ * class.c (rb_mod_init_copy): always clear instance variable,
+ constant and method tables first, regardless the source tables.
+ [ruby-dev:48182] [Bug #9813]
-Sat Jun 15 08:37:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu May 8 10:53:14 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * vm_eval.c (eval_string_with_cref): propagate absolute path from the
- binding if it is given explicitly. patch by Gat (Dawid Janczak) at
- [ruby-core:55123]. [Bug #8436]
+ * configure.in: OpenBSD needs to include sys/param.h before include
+ sys/mount.h. [ruby-dev:48167]
-Sat Jun 15 02:40:18 2013 Tanaka Akira <akr@fsij.org>
+Thu May 8 10:17:04 2014 Karsten Sperling <karsten@sperling.co.nz>
- * bignum.c (bdigs_small_lshift): Extracted from big_lshift.
- (bigdivrem): Use bdigs_small_lshift.
+ * lib/webrick/httpserver.rb (WEBrick::HTTPServer#run): stop
+ handling requests on shutdown, even if the socket is readable
+ and IO.select() returns true. [Fixes GH-607]
-Fri Jun 14 20:47:41 2013 Tanaka Akira <akr@fsij.org>
+ * lib/webrick/server.rb (WEBrick::GenericServer#start): IO.select()
+ raises ENOTSOCK on shutdown on Windows.
- * bignum.c (bigdivrem): Reduce number of digits before bignew() for div.
+Wed May 7 21:45:00 2014 Tanaka Akira <akr@fsij.org>
-Fri Jun 14 20:12:37 2013 Tanaka Akira <akr@fsij.org>
+ * ext/openssl/lib/openssl/ssl.rb (OpenSSL::SSL::SSLServer#accept):
+ Consider Socket#accept as well as TCPServer#accept.
+ Reported by Sam Stelfox. [ruby-core:62064] [Bug #9750]
- * bignum.c (bigdivrem): Use bignew when ny == 1.
+Wed May 7 17:24:07 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Jun 14 18:52:51 2013 Koichi Sasada <ko1@atdot.net>
+ * numeric.c (num_step_scan_args): check keyword arguments and fail
+ if they conflict with positional arguments.
+ [ruby-dev:48177] [Bug #9811]
- * compile.c (rb_iseq_compile_node): fix location of a `trace'
- instruction (b_return event).
- [ruby-core:55305] [ruby-trunk - Bug #8489]
- (need a backport to 2.0.0?)
+Wed May 7 12:06:14 2014 Koichi Sasada <ko1@atdot.net>
- * test/ruby/test_settracefunc.rb: add a test.
+ * benchmark/driver.rb: remove debug output and output results into
+ specified file.
-Fri Jun 14 18:18:07 2013 Koichi Sasada <ko1@atdot.net>
+Wed May 7 11:55:40 2014 Koichi Sasada <ko1@atdot.net>
- * class.c, include/ruby/ruby.h: add write barriers for T_CLASS,
- T_MODULE, T_ICLASS.
+ * benchmark/driver.rb: add '--rawdata-output=[FILE] option to output
+ raw results into FILE.
- * constant.h: constify rb_const_entry_t::value and file to detect
- assignment.
+Wed May 7 11:25:41 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * variable.c, internal.h (rb_st_insert_id_and_value, rb_st_copy):
- added. update table with write barrier.
+ * vm_eval.c (rb_f_local_variables): exclude variables hidden by
+ shadowing. [ruby-core:60501] [Bug #9486]
- * method.h: constify some variables to detect assignment.
+ * vm.c (collect_local_variables_in_iseq): ditto.
- * object.c (init_copy): add WBs.
+Tue May 6 23:29:05 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * variable.c: ditto.
+ * parse.y (new_bv_gen): no duplicated names, if already added in
+ shadowing_lvar().
- * vm_method.c (rb_add_method): ditto.
+ * parse.y (local_tbl_gen): remove local variables duplicated with
+ arguments.
+ [ruby-core:60501] [Bug #9486]
-Fri Jun 14 14:33:47 2013 Shugo Maeda <shugo@ruby-lang.org>
+Tue May 6 18:48:50 2014 Tanaka Akira <akr@fsij.org>
- * NEWS: add a note for Module#using.
+ * lib/time.rb (Time.make_time): Adjust the time zone of "now".
-Fri Jun 14 13:40:27 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue May 6 18:33:12 2014 Tadayoshi Funaba <tadf@dotrb.org>
- * .travis.yml (before_script): update config files.
+ * io.c (io_{read,write}_nonblock): use rb_get_kwargs instead of
+ rb_hash_aref.
- * common.mk ($(srcdir)/tool/config.{guess,sub}): use get-config_files.
+Tue May 6 18:03:05 2014 Tanaka Akira <akr@fsij.org>
- * tool/config_files.rb: split get-config_files.
+ * lib/time.rb (Time.make_time): Argument validation code moved from
+ Time.parse and Time.strptime.
- * common.mk (update-config_files): rule to download config files.
+Tue May 6 17:27:06 2014 Tanaka Akira <akr@fsij.org>
- * tool/config.guess, tool/config.sub: remove and download from the
- upstream.
+ * lib/time.rb (Time.parse): [DOC] Fix an example in the documentation
+ to use EST.
+ Reported by Marcus Stollsteimer.
+ [ruby-core:60778] [Bug #9521] and [ruby-core:61718] [Bug #9682]
- * tool/config_files.rb: download config files from GNU.
+Tue May 6 04:31:48 2014 Tadayoshi Funaba <tadf@dotrb.org>
-Fri Jun 14 12:21:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * file.c (rb_f_test): removed meaningless "case 'a'".
- * include/ruby/ruby.h (RUBY_SAFE_LEVEL_CHECK): suppress warnings
- "left-hand operand of comma expression has no effect", on gcc 4.4.
+Tue May 6 01:28:14 2014 Tanaka Akira <akr@fsij.org>
-Fri Jun 14 09:48:48 2013 Shugo Maeda <shugo@ruby-lang.org>
+ * lib/open-uri.rb (OpenURI.open_uri): Call StringIO#close only if
+ the StringIO object is not closed yet.
+ Reported by Jordi Massaguer Pla. [ruby-core:42538] [Bug #6010]
- * NEWS: add notes for $SAFE.
+Tue May 6 01:08:01 2014 Koichi Sasada <ko1@atdot.net>
- * doc/security.rdoc: remove the description of $SAFE=4.
+ * benchmark/driver.rb: define File::NULL if not defined and /dev/null
+ is available to run benchmark driver on ruby 1.9.2.
-Fri Jun 14 00:14:29 2013 Tanaka Akira <akr@fsij.org>
+Mon May 5 23:53:24 2014 Tanaka Akira <akr@fsij.org>
- * bignum.c (bigdivrem): Zero test condition simplified.
+ * ext/socket/mkconstants.rb: Add IP_TRANSPARENT.
+ IP_TRANSPARENT is provieded since glibc-2.12.
+ Reported by Eliezer Croitoru. [ruby-core:50372] [Bug #7476]
-Thu Jun 13 23:43:11 2013 Zachary Scott <zachary@zacharyscott.net>
+Mon May 5 22:29:47 2014 Tanaka Akira <akr@fsij.org>
- * ext/bigdecimal/*: improve documentation, nodoc samples with @mrkn
+ * process.c (check_exec_redirect): Open the file in write mode for
+ redirect from [:out, :err].
+ Proposed and implemented by Yusuke Endoh.
+ [ruby-dev:41430] [Feature #3348]
-Thu Jun 13 23:02:14 2013 Kouhei Sutou <kou@cozmixng.org>
+Mon May 5 21:52:35 2014 Tanaka Akira <akr@fsij.org>
- * lib/xmlrpc/client.rb (XMLRPC::Client#http): Add reader for raw
- Net::HTTP. [ruby-core:55197] [Feature #8461]
- Reported by Herwin Weststrate. Thanks!!!
+ * ext/pathname/lib/pathname.rb (cleanpath_aggressive): make all
+ separators File::SEPARATOR from File::ALT_SEPARATOR.
+ Reported by Daniel Rikowski.
+ Fixed by Nobuyoshi Nakada. [Bug #9618]
-Thu Jun 13 22:44:52 2013 Kouhei Sutou <kou@cozmixng.org>
+ * ext/pathname/lib/pathname.rb (cleanpath_conservative): ditto.
- * lib/xmlrpc/client.rb (XMLRPC::Client#parse_set_cookies): Support
- multiple names in a response. [ruby-core:41711] [Bug #5774]
- Reported by Roman Riha. Thanks!!!
- * test/xmlrpc/test_client.rb (XMLRPC::ClientTest#test_cookie_override):
- Add a test of the above case.
+Mon May 5 21:48:04 2014 Tanaka Akira <akr@fsij.org>
-Thu Jun 13 22:35:50 2013 Kouhei Sutou <kou@cozmixng.org>
+ * ext/pathname/lib/pathname.rb (Pathname#/): Aliased to Pathname#+.
+ Suggested by Alexey Muranov. [ruby-core:61432] [Feature #9625]
- * lib/xmlrpc/client.rb (XMLRPC::Client#parse_set_cookies): Use
- guard style.
+Mon May 5 17:26:09 2014 Tadayoshi Funaba <tadf@dotrb.org>
-Thu Jun 13 22:12:32 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * math.c (rb_math_sqrt): omitted exporting an unused function,
+ anyway.
+ * internal.h: follows the above change.
- * lib/fileutils.rb (FileUtils#rmdir): fix traversal loop, not trying
- remove same directory only.
+Mon May 5 11:44:03 2014 Tanaka Akira <akr@fsij.org>
-Thu Jun 13 21:30:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/time.rb (Time.strptime): Raise ArgumentError if Date._strptime
+ doesn't extract date information.
+ Reported by tadayoshi funaba. [ruby-core:62349]
- * configure.in (opt-dir), tool/ifchange: get rid of "alternate value"
- expansion for legacy sh. [ruby-dev:47420] [Bug #8524]
+Mon May 5 01:12:27 2014 Tadayoshi Funaba <tadf@dotrb.org>
-Thu Jun 13 21:24:09 2013 Tanaka Akira <akr@fsij.org>
+ * ext/date/date_core.c (rt_rewrite_frags): a new feature (not a
+ bug fix) of strptime. applies offset even if the given date is
+ not local time (%s and %Q). This is an exceptional feature and
+ I do NOT recommend to use this at all. Thank you git community.
- * bignum.c (bigdivrem): Refactored to use ALLOCV_N for temporary
- buffers.
+Sun May 4 20:51:32 2014 Tanaka Akira <akr@fsij.org>
-Thu Jun 13 18:54:11 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * lib/time.rb (Time.force_zone!): Use usual local time if it has
+ expected offset from UTC.
- * bignum.c (integer_unpack_num_bdigits_generic): reorder terms (but not
- changed the intention of the expression) because VC++ reports a
- warning for it. reported by ko1 via IRC.
+Sun May 4 17:58:12 2014 Tanaka Akira <akr@fsij.org>
-Thu Jun 13 18:53:14 2013 Tanaka Akira <akr@fsij.org>
+ * lib/time.rb (Time.force_zone!): New private method.
+ (Time.make_time): Use Time.force_zone!.
+ (Time.strptime): Ditto.
+ (Time.rfc2822): Ditto.
+ (Time.xmlschema): Ditto.
- * test/ruby/test_thread.rb (test_thread_local_security): Don't create
- an unused thread.
+ * lib/rss/rss.rb (Time.w3cdtf): Use Time.force_zone!.
-Thu Jun 13 18:34:20 2013 Tanaka Akira <akr@fsij.org>
+Sun May 4 10:22:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * bignum.c (bigdivrem): Use nlz.
+ * math.c (math_atan2): return values like as expected by C99 if
+ both two arguments are infinity. based on the patch by cremno
+ phobia <cremno AT mail.ru> in [ruby-core:62310]. [Feature #9799]
-Thu Jun 13 14:51:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun May 4 03:46:42 2014 Tanaka Akira <akr@fsij.org>
- * include/ruby/ruby.h (RUBY_SAFE_LEVEL_CHECK): check constant safe
- level at compile time.
+ * lib/time.rb (Time.httpdate): Always return a UTC Time object.
-Thu Jun 13 14:39:08 2013 Shugo Maeda <shugo@ruby-lang.org>
+Sun May 4 03:26:39 2014 Tanaka Akira <akr@fsij.org>
- * test/-ext-/test_printf.rb, test/rss/test_parser.rb,
- test/ruby/test_array.rb, test/ruby/test_hash.rb,
- test/ruby/test_m17n.rb, test/ruby/test_marshal.rb,
- test/ruby/test_object.rb, test/ruby/test_string.rb: don't use
- untrusted?, untrust, and trust to avoid warnings in case $VERBOSE is
- true.
+ * lib/time.rb (Time.make_time): Refactored.
-Thu Jun 13 10:47:16 2013 Shugo Maeda <shugo@ruby-lang.org>
+Sun May 4 02:53:17 2014 Tanaka Akira <akr@fsij.org>
- * bootstraptest/test_autoload.rb, bootstraptest/test_method.rb:
- remove tests for $SAFE=4.
+ * lib/time.rb (Time.rfc2822): Fix year completion.
+ Produce fixed-offset time object if appropriate.
+ (Time.xmlschema): Produce fixed-offset time object if appropriate.
- * lib/pp.rb: use taint instead of untrust to avoid warnings when
- $VERBOSE is set to true.
+Sat May 3 23:52:20 2014 Tanaka Akira <akr@fsij.org>
-Thu Jun 13 06:12:18 2013 Tanaka Akira <akr@fsij.org>
+ * lib/time.rb (make_time): Produce fixed-offset time object if
+ appropriate.
+ (Time.strptime): Use d[:zone] instead of d[:offset].
- * bignum.c (integer_unpack_num_bdigits_small): Fix a compile error on
- clang -Werror,-Wshorten-64-to-32
- Reported by Eric Hodel. [ruby-core:55467] [Bug #8522]
+ * lib/rss/rss.rb (Time.w3cdtf): Produce fixed-offset time object if
+ appropriate.
-Thu Jun 13 05:32:13 2013 Eric Hodel <drbrain@segment7.net>
+Sat May 3 20:21:38 2014 Tanaka Akira <akr@fsij.org>
- * ext/socket/extconf.rb: Enable RFC 3542 IPV6 socket options for OS X
- 10.7+. [ruby-trunk - Bug #8517]
+ * lib/time.rb (Time.strptime): Use d[:offset] if d[:seconds] is not
+ given.
+ Reported by tadayoshi funaba. [ruby-core:62322]
-Thu Jun 13 00:17:18 2013 Tanaka Akira <akr@fsij.org>
+Sat May 3 04:04:16 2014 Eric Wong <e@80x24.org>
- * bignum.c (rb_integer_unpack_2comp): New function.
- (rb_integer_unpack_internal): Extracted from rb_integer_unpack and
- nlp_bits_ret argument added.
- (integer_unpack_num_bdigits_small): nlp_bits_ret argument added to
- return number of leading padding bits.
- (integer_unpack_num_bdigits_generic): Ditto.
+ * complex.c (parse_comp): replace ALLOCA_N with ALLOCV_N/ALLOCV_END
+ [Bug #9608]
+ * rational.c (read_digits): ditto
- * internal.h (rb_integer_unpack_2comp): Declared.
+Sat May 3 00:06:30 2014 Naohisa Goto <ngotogenome@gmail.com>
- * pack.c (pack_unpack): Use rb_integer_unpack_2comp and
- rb_integer_unpack.
+ * file.c (HAVE_STRUCT_STATVFS_F_BASETYPE): File::Statfs#fstypename
+ is supported on AIX, HP-UX, and Solaris, by using the value of
+ struct statvfs.f_basetype.
-Wed Jun 12 23:27:03 2013 Shugo Maeda <shugo@ruby-lang.org>
+ * configure.in (HAVE_STRUCT_STATVFS_F_BASETYPE): check struct
+ statvfs.f_basetype which is available on AIX, HP-UX, and Solaris.
- * eval.c (mod_using): new method Module#using, which activates
- refinements of the specified module only in the current class or
- module definition. [ruby-core:55273] [Feature #8481]
+Fri May 2 21:04:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/ruby/test_refinement.rb: related test.
+ * parse.y (next_id): no reason to set ID_STATIC_SYM here, as ID
+ returned by rb_intern3 can be a dynamic symbol and the static
+ symbol flag is set otherwise. [Bug #9787]
-Wed Jun 12 22:58:48 2013 Shugo Maeda <shugo@ruby-lang.org>
+Fri May 2 11:32:51 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * safe.c (rb_set_safe_level, safe_setter): raise an ArgumentError
- when $SAFE is set to 4. $SAFE=4 is now obsolete.
- [ruby-core:55222] [Feature #8468]
+ * test/ruby/test_io.rb (test_seek, test_seek_symwhence): defer
+ File::Statfs#type call which may not be implemented, to mitigate
+ errors on platforms where SEEK_DATA is available but f_type in
+ struct statfs is not. [ruby-dev:48154] [Bug #9789]
- * object.c (rb_obj_untrusted, rb_obj_untrust, rb_obj_trust):
- Kernel#untrusted?, untrust, and trust are now deprecated.
- Their behavior is same as tainted?, taint, and untaint,
- respectively.
+Fri May 2 10:37:55 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * include/ruby/ruby.h (OBJ_UNTRUSTED, OBJ_UNTRUST): OBJ_UNTRUSTED()
- and OBJ_UNTRUST() are aliases of OBJ_TAINTED() and OBJ_TAINT(),
- respectively.
+ * parse.y (rb_id_attrset): turn dynamically interned Symbol into
+ an ID, since rb_str_dynamic_intern returns a Symbol but not an
+ ID. [ruby-core:62226] [Bug #9787]
- * array.c, class.c, debug.c, dir.c, encoding.c, error.c, eval.c,
- ext/curses/curses.c, ext/dbm/dbm.c, ext/dl/cfunc.c,
- ext/dl/cptr.c, ext/dl/dl.c, ext/etc/etc.c, ext/fiddle/fiddle.c,
- ext/fiddle/pointer.c, ext/gdbm/gdbm.c, ext/readline/readline.c,
- ext/sdbm/init.c, ext/socket/ancdata.c, ext/socket/basicsocket.c,
- ext/socket/socket.c, ext/socket/udpsocket.c,
- ext/stringio/stringio.c, ext/syslog/syslog.c, ext/tk/tcltklib.c,
- ext/win32ole/win32ole.c, file.c, gc.c, hash.c, io.c, iseq.c,
- load.c, marshal.c, object.c, proc.c, process.c, random.c, re.c,
- safe.c, string.c, thread.c, transcode.c, variable.c,
- vm_insnhelper.c, vm_method.c, vm_trace.c: remove code for
- $SAFE=4.
+Thu May 1 22:19:34 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
- * test/dl/test_dl2.rb, test/erb/test_erb.rb,
- test/readline/test_readline.rb,
- test/readline/test_readline_history.rb, test/ruby/test_alias.rb,
- test/ruby/test_array.rb, test/ruby/test_dir.rb,
- test/ruby/test_encoding.rb, test/ruby/test_env.rb,
- test/ruby/test_eval.rb, test/ruby/test_exception.rb,
- test/ruby/test_file_exhaustive.rb, test/ruby/test_hash.rb,
- test/ruby/test_io.rb, test/ruby/test_method.rb,
- test/ruby/test_module.rb, test/ruby/test_object.rb,
- test/ruby/test_pack.rb, test/ruby/test_rand.rb,
- test/ruby/test_regexp.rb, test/ruby/test_settracefunc.rb,
- test/ruby/test_struct.rb, test/ruby/test_thread.rb,
- test/ruby/test_time.rb: remove tests for $SAFE=4.
+ * file.c: Change AND condition to nested condition.
-Wed Jun 12 22:18:23 2013 Tanaka Akira <akr@fsij.org>
+Thu May 1 00:36:26 2014 Naohisa Goto <ngotogenome@gmail.com>
- * bignum.c (integer_unpack_num_bdigits_generic): Rewritten without
- rb_funcall.
- (integer_unpack_num_bdigits_bytes): Removed.
- (rb_integer_unpack): integer_unpack_num_bdigits_bytes invocation
- removed.
+ * file.c (FSTATFS): check availability of struct statfs and
+ struct statvfs in addition to fstatfs(2) and fstatvfs(2).
+ This fixes error in Solaris. [Bug #9788] [ruby-dev:48145]
-Wed Jun 12 20:18:03 2013 Kouhei Sutou <kou@cozmixng.org>
+Wed Apr 30 19:46:23 2014 Narihiro Nakamura <authornari@gmail.com>
- * lib/xmlrpc/client.rb (XMLRPC::Client#parse_set_cookies): Extract.
+ * gc.c (gc_after_sweep): suppress unnecessary expanding heap.
+ Tomb heap pages are freed pages here, so expanding heap is
+ not required.
-Wed Jun 12 18:19:41 2013 Tanaka Akira <akr@fsij.org>
+Wed Apr 30 17:58:40 2014 Koichi Sasada <ko1@atdot.net>
- * bignum.c (validate_integer_pack_format): supported_flags argument
- added and validate given flags.
- (rb_integer_pack_internal): Specify supported_flags.
- (rb_integer_unpack): Ditto.
+ * vm.c (invoke_block_from_c): add VM_FRAME_FLAG_BMETHOD to record
+ it is bmethod frame.
-Wed Jun 12 16:41:38 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * vm.c (vm_exec): invoke RUBY_EVENT_RETURN event if rollbacked frame
+ is VM_FRAME_FLAG_BMETHOD.
+ [Bug #9759]
- * array.c (rb_ary_sort_bang): remove duplicated assertions.
- ARY_HEAP_PTR() implies ary not to be embedded. [ruby-dev:47419]
- [Bug #8518]
+ * test/ruby/test_settracefunc.rb: add a test for TracePoint/set_trace_func.
-Wed Jun 12 12:44:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * vm_core.h: rename rb_thread_t::passed_me to
+ rb_thread_t::passed_bmethod_me to clarify the usage.
- * io.c (io_getc): fix 7bit coderange condition, check if ascii read
- data instead of read length. [ruby-core:55444] [Bug #8516]
+ * vm_insnhelper.c (vm_call_bmethod_body): use renamed member.
-Wed Jun 12 12:35:13 2013 Tanaka Akira <akr@fsij.org>
+Wed Apr 30 17:06:49 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * pack.c (pack_pack): Use rb_integer_pack_2comp.
+ * parse.y (rb_id_attrset): pin down dynamic symbol only. it is
+ possible that attrset ID can be registered as a static symbol
+ after the corresponding attrget ID has been registered as a
+ dynamic, and then the latter may be collected.
+ [ruby-core:62226] [Bug #9787]
-Wed Jun 12 12:07:04 2013 Tanaka Akira <akr@fsij.org>
+Tue Apr 29 14:17:57 2014 Tanaka Akira <akr@fsij.org>
- * sprintf.c (rb_str_format): Fix a dynamic format string.
+ * lib/tmpdir.rb: Rescue LoadError on etc.so for miniruby.
+ Revert r45707, r45711, r45717.
-Wed Jun 12 12:04:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Apr 29 12:50:02 2014 Tanaka Akira <akr@fsij.org>
- * array.c (rb_ary_uniq_bang): must not be modified once frozen even in
- a callback method.
+ * lib/fileutils.rb: Don't need to define fu_get_gid and fu_get_gid in
+ rescue LoadError on 'etc'.
-Wed Jun 12 12:03:43 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Apr 29 10:21:38 2014 Kazuki Tsujimoto <kazuki@callcc.net>
- * array.c (rb_ary_sort_bang): must not be modified once frozen even in
- a callback method.
+ * parse.y (symbols_i): like r45492, call rb_gc_resurrect().
-Wed Jun 12 12:00:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Apr 29 04:29:05 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
- * array.c (FL_SET_EMBED): shared object is frozen even when get
- unshared.
+ * file.c (HAVE_STRUCT_STATFS_T_F_FSTYPENAME): Add new macro for
+ statfs_t.
+ * file.c (HAVE_STRUCT_STATFS_T_F_TYPE): ditto.
- * array.c (rb_ary_modify): ARY_SET_CAPA needs unshared array.
+ * file.c (rb_io_statfs): check FSTATFS macro only instead of
+ HAVE_FSTATFS and HAVE_FSTATVFS.
-Wed Jun 12 07:32:01 2013 Tanaka Akira <akr@fsij.org>
+ * file.c (statfs_type): use new macro.
+ * file.c (statfs_fstypename): ditto.
+ * file.c (statfs_inspect): ditto.
- * random.c (rand_int): Use rb_big_uminus.
+Tue Apr 29 00:20:26 2014 Rajarshi Das <rajarshid@cybage.com>
-Wed Jun 12 07:12:54 2013 Eric Hodel <drbrain@segment7.net>
+ * bootstraptest/test_literal.rb: fix typo of "dynamic". [ci skip]
- * struct.c: Improve documentation: replace "instance variable" with
- "member", recommend the use of a block to customize structs, note
- that member accessors are created, general cleanup.
+ * regexp.rdoc: fix typo of "organized". [ci skip]
-Wed Jun 12 06:35:01 2013 Tanaka Akira <akr@fsij.org>
+ * lib/session.rb: fix typo of "recognized". [ci skip]
- * internal.h (INTEGER_PACK_NEGATIVE): Defined.
- (rb_integer_unpack): sign argument removed.
+Mon Apr 28 21:40:27 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * bignum.c (rb_integer_unpack): sign argument removed.
- Non-negative integers generated by default.
- INTEGER_PACK_NEGATIVE flag is used to generate non-positive integers.
+ * configure.in (HAVE_STRUCT_STATFS_F_TYPE): check struct statfs.f_type
+ to support OpenBSD.
- * pack.c (pack_unpack): Follow the above change.
+ * file.c (statfs_type): use above macro to switch.
- * random.c (int_pair_to_real_inclusive): Ditto.
- (make_seed_value): Ditto.
- (mt_state): Ditto.
- (limited_big_rand): Ditto.
+ * file.c (statfs_inspect): ditto.
- * marshal.c (r_object0): Ditto.
+Mon Apr 28 18:06:08 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Wed Jun 12 00:07:46 2013 Kouhei Sutou <kou@cozmixng.org>
+ * configure.in: check struct statvfs and struct statvfs.f_fstypename.
- * test/xmlrpc/test_client.rb (XMLRPC::ClientTest#test_cookie_simple):
- Add a test for the extracted method.
+ * configure.in: on NetBSD fstatfs is obsoleted.
-Tue Jun 11 23:56:24 2013 Kouhei Sutou <kou@cozmixng.org>
+ * file.c: support NetBSD for File::Statfs.
- * test/xmlrpc/test_client.rb (XMLRPC::ClientTest::Fake::HTTP#started):
- Add a missing empty line.
+Mon Apr 28 17:42:42 2014 Narihiro Nakamura <authornari@gmail.com>
-Tue Jun 11 23:37:19 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c: This argument must be a pointer.
- * bignum.c (validate_integer_pack_format): Don't require a word order
- flag if numwords is 1 or less.
- (absint_numwords_generic): Don't specify a word order for
- rb_integer_pack.
+Mon Apr 28 17:40:15 2014 Narihiro Nakamura <authornari@gmail.com>
- * hash.c (rb_hash): Ditto.
+ * gc.c: Fix typos. These are undefined variables.
- * time.c (v2w_bignum): Ditto.
+Sun Apr 27 19:39:42 2014 Tadayoshi Funaba <tadf@dotrb.org>
-Tue Jun 11 23:01:57 2013 Tanaka Akira <akr@fsij.org>
+ * ext/date/date_strptime.c (date__strptime_internal): do not
+ overwrite century.
- * bignum.c (validate_integer_pack_format): Refine error messages.
+Sat Apr 26 11:50:08 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Tue Jun 11 22:25:04 2013 Tanaka Akira <akr@fsij.org>
+ * test/ruby/test_enum.rb (test_flat_map): Added test for flat_map.
+ Contribute from @igaiga. [fix GH-598]
- * bignum.c (validate_integer_pack_format): numwords argument added.
- Move a varidation from rb_integer_pack_internal and rb_integer_unpack.
- (rb_integer_pack_internal): Follow above change.
- (rb_integer_unpack): Ditto.
+Sat Apr 26 10:55:33 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Tue Jun 11 20:52:43 2013 Tanaka Akira <akr@fsij.org>
+ * compile.c (compile_array_): make copy a first hash not to modify
+ the argument itself. keyword splat should be non-destructive.
+ [ruby-core:62161] [Bug #9776]
- * bignum.c (rb_integer_pack_internal): Renamed from rb_integer_pack
- and overflow_2comp argument added.
- (rb_integer_pack): Just call rb_integer_pack_internal.
- (rb_integer_pack_2comp): New function.
+Sat Apr 26 08:05:36 2014 Tanaka Akira <akr@fsij.org>
- * internal.h (rb_integer_pack_2comp): Declared.
+ * test/ruby/test_process.rb (test_rlimit_nofile): Don't limit
+ RLIMIT_NOFILE too small.
+ This fix sporadic "[ASYNC BUG] thread_timer: select" on GNU/Linux.
- * sprintf.c (rb_str_format): Use rb_integer_pack and
- rb_integer_pack_2comp to format binary/octal/hexadecimal integers.
- (ruby_digitmap): Declared.
- (remove_sign_bits): Removed.
- (BITSPERDIG): Ditto.
- (EXTENDSIGN): Ditto.
+Fri Apr 25 22:54:34 2014 Naohisa Goto <ngotogenome@gmail.com>
-Tue Jun 11 16:15:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/fileutils.rb (rmdir): rescue Errno::EEXIST in addition to
+ ENOTEMPTY (and ENOENT), because SUSv3 describes that "If the
+ directory is not an empty directory, rmdir() shall fail and set
+ errno to [EEXIST] or [ENOTEMPTY]" and Solaris uses EEXIST.
+ [Bug #9571] [ruby-dev:48017]
- * array.c (ary_shrink_capa): shrink the capacity so it fits just with
- the length.
+Fri Apr 25 19:16:30 2014 Tanaka Akira <akr@fsij.org>
- * array.c (ary_make_shared): release never used elements from frozen
- array to be shared. [ruby-dev:47416] [Bug #8510]
+ * lib/webrick/utils.rb: Don't rescue LoadError for 'etc' extension.
-Tue Jun 11 12:49:01 2013 Zachary Scott <zachary@zacharyscott.net>
+Fri Apr 25 14:55:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * doc/re.rdoc: Rename to doc/regexp.rdoc
- * re.c: Update rdoc include for rename of file
+ * configure.in (rb_cv_func___builtin_unreachable): try with an
+ external variable not only by a warning, which might not be
+ shown due to the optimization. [ruby-core:61647] [Bug #9665]
-Tue Jun 11 07:13:13 2013 Masaya Tarui <tarui@ruby-lang.org>
+Fri Apr 25 13:11:49 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * eval_error.c (error_print): keep that errat is non-shady object.
- and guard errat from GC.
+ * configure.in: NetBSD's ksh, used by configure, needs escapes.
-Tue Jun 11 05:04:25 2013 Benoit Daloze <eregontp@gmail.com>
+Fri Apr 25 12:51:08 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * ext/racc/cparse/cparse.c: use rb_ary_entry() and
- rb_ary_subseq() instead of RARRAY_PTR.
- Based on a patch by Dirkjan Bussink. See Bug #8399.
+ * configure.in: correct pthread_setname_np's prototype on NetBSD.
+ [Bug #9586]
-Mon Jun 10 23:51:51 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+Thu Apr 24 23:17:25 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * array.c (rb_ary_new_from_values): fix a typo. pointed out by
- nagachika.
- http://d.hatena.ne.jp/nagachika/20130610/ruby_trunk_changes_41199_41220
+ * lib/fileutils.rb (fu_get_uid, fu_get_gid): Etc.getpwnam/getgrnam may
+ returns nil.
-Mon Jun 10 21:51:03 2013 Kouhei Sutou <kou@cozmixng.org>
+ * lib/webrick/utils.rb (su): ditto.
- * ext/socket/raddrinfo.c (nogvl_getaddrinfo): Fix indent.
+Thu Apr 24 22:55:22 2014 Tanaka Akira <akr@fsij.org>
-Mon Jun 10 21:49:43 2013 Kouhei Sutou <kou@cozmixng.org>
+ * bootstraptest/test_io.rb: Add etc.so to $" before require 'tmpdir'.
- * ext/socket/raddrinfo.c (nogvl_getaddrinfo): Add missing return
- value assignment.
+Thu Apr 24 21:09:55 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-Mon Jun 10 20:58:11 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * man/ruby.1: fix broken link.
- * ext/socket/raddrinfo.c (nogvl_getaddrinfo): work around for Ubuntu
- 13.04's getaddrinfo issue with mdns4. [ruby-list:49420]
+Thu Apr 24 20:53:02 2014 Tanaka Akira <akr@fsij.org>
-Mon Jun 10 19:34:39 2013 Tanaka Akira <akr@fsij.org>
+ * lib/tmpdir.rb: Don't need to rescue LoadError for etc.so.
- * bignum.c (rb_integer_pack): Returns sign instead of words.
- (absint_numwords_generic): Follow the above change.
- (big2str_base_powerof2): Follow the above change.
+Thu Apr 24 17:39:53 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * internal.h: Ditto.
+ * file.c (statfs_inspect): suppress warnings.
+ assume those values won't be larger than LONG_LONG_MAX.
- * hash.c (rb_hash): Ditto.
+Thu Apr 24 11:53:28 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * pack.c (pack_pack): Ditto.
+ * ext/openssl/ossl_asn1.c (ossl_asn1_initialize): SYMID on a value
+ other than Symbol is an undefined behavior. fix up r31699.
+ [ruby-core:62142] [Bug #9771]
- * random.c (int_pair_to_real_inclusive): Ditto.
- (rand_init): Ditto.
- (random_load): Ditto.
- (limited_big_rand): Ditto.
+Thu Apr 24 11:21:37 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * time.c (v2w_bignum): Ditto.
+ * parse.y (rb_sym2id, rb_sym2id_without_pindown): return 0 for
+ non-symbol values, for the time being.
-Mon Jun 10 17:20:01 2013 Koichi Sasada <ko1@atdot.net>
+Thu Apr 24 05:50:13 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * gc.c (rgengc_remember): permit promoted object.
- (rb_gc_writebarrier -> remember)
+ * parse.y (dsym_node_gen): like r45492, call rb_gc_resurrect().
-Mon Jun 10 17:14:01 2013 Koichi Sasada <ko1@atdot.net>
+Wed Apr 23 20:36:22 2014 Tanaka Akira <akr@fsij.org>
- * gc.c (RVALUE_PROMOTE): fix parameter name (`x' to `obj')
- and make it inline function (like RVALUE_PROMOTE).
+ * ext/etc/extconf.rb: Build ext/etc unconditionally.
-Mon Jun 10 16:22:50 2013 Koichi Sasada <ko1@atdot.net>
+Wed Apr 23 14:10:50 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * array.c (rb_ary_new_from_values): add assertion
- (ary should be young object).
+ * file.c (statfs_fsid): remove statfs.f_fsid because it doesn't return
+ meaningful value portably. http://togetter.com/li/658517
-Mon Jun 10 16:05:59 2013 Koichi Sasada <ko1@atdot.net>
+Wed Apr 23 11:03:41 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * gc.c (wmap_mark): check allocation of `w->obj2wmap'.
- (no-allocation `w->obj2wmap' will be NULL pointer reference)
+ * ext/stringio/stringio.c (strio_write): use rb_str_append to
+ reuse coderange bits other than ASCII-8BIT, and keep
+ taintedness. [ruby-dev:48118] [Bug #9769]
-Mon Jun 10 15:36:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Apr 23 00:43:00 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * eval_error.c (error_print): use checking functions instead of
- catching exceptions.
+ * win32/win32.c, include/ruby/win32.h (ustatfs): implementation of
+ statfs(2) clone. [EXPERIMENTAL]
- * eval_error.c (error_print): restore errinfo for the case new
- exception raised while printing the message. [ruby-core:55365]
- [Bug #8501]
+ * file.c (rb_io_statfs): use above function.
- * eval_error.c (error_print): reduce calling setjmp.
+ * configure.in, win32/Makefile.sub (struct statfs): available.
-Mon Jun 10 12:10:06 2013 Tanaka Akira <akr@fsij.org>
+Tue Apr 22 23:56:24 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * bignum.c (integer_unpack_num_bdigits_small: Extracted from
- rb_integer_unpack.
- (integer_unpack_num_bdigits_generic): Ditto.
- (integer_unpack_num_bdigits_bytes): New function.
- (rb_integer_unpack): Use above functions.
- Return a Bignum for INTEGER_PACK_FORCE_BIGNUM even when the result
- is zero.
+ * file.c (rb_io_stafs): use statfs(2) if fstatfs(2) is unavailable.
-Mon Jun 10 05:38:23 2013 Tanaka Akira <akr@fsij.org>
+ * configure.in (fstatfs): check it.
- * bignum.c (absint_numwords_small): New function.
- (absint_numwords_generic): Use absint_numwords_small if possible.
+Tue Apr 22 22:15:51 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-Mon Jun 10 01:07:57 2013 Tanaka Akira <akr@fsij.org>
+ * file.c (rb_io_statfs): need to define even if the system doesn't have
+ fstatfs(2).
- * bignum.c (absint_numwords_bytes): New function.
- (absint_numwords_generic): Extracted from rb_absint_numwords.
- (rb_absint_numwords): Use absint_numwords_bytes if possible.
+ * test/ruby/test_file.rb (TestFile#test_statfs): skip if IO#stafs is not
+ implemented.
-Sun Jun 9 21:33:15 2013 Tanaka Akira <akr@fsij.org>
+Tue Apr 22 19:32:48 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * bignum.c (rb_absint_numwords): Return (size_t)-1 when overflow.
- Refine variable names.
- (rb_absint_size): Refine variable names.
+ * file.c: newly added a class File::Statfs. (experimental)
- * internal.h (rb_absint_size): Refine an argument name.
- (rb_absint_numwords): Ditto.
+Tue Apr 22 08:22:33 2014 Koichi Sasada <ko1@atdot.net>
-Sun Jun 9 16:51:41 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c (objspace_malloc_increase): don't cause GC by malloc_increase
+ when memop type is MEMOP_TYPE_REALLOC.
- * bignum.c (rb_absint_numwords): Renamed from rb_absint_size_in_word.
+ GC at realloc is not well maintained.
+ We need a time to make it safe.
+ [ruby-dev:48117]
- * internal.h (rb_absint_numwords): Follow the above change.
+Tue Apr 22 06:54:15 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * pack.c (pack_pack): Ditto.
+ * gc.c (objspace_malloc_increase): run full mark if 0x04 bit is
+ set in ruby_gc_stress. [ruby-core:62103] [Feature #9761]
- * random.c (rand_init): Ditto.
- (limited_big_rand): Ditto.
+ * gc.c (objspace_malloc_increase): run GC after realloc not only
+ malloc and calloc by GC.stress. [ruby-core:62103] [Feature #9761]
-Sun Jun 9 14:41:05 2013 Tanaka Akira <akr@fsij.org>
+Mon Apr 21 19:12:20 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * bignum.c (rb_integer_pack): numwords_allocated argument removed.
+ * string.c (rb_str_coderange_scan_restartable): coderange is always
+ ENC_CODERANGE_VALID if the string is ASCII-8BIT and already has a non
+ ASCII character.
- * internal.h (rb_integer_pack): Follow the above change.
+Mon Apr 21 19:02:44 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * hash.c (rb_hash): Ditto.
+ * string.c (coderange_scan): remove useless condition `p < e` after
+ search_nonascii.
- * time.c (v2w_bignum): Ditto.
+ * string.c (rb_str_coderange_scan_restartable): ditto.
- * pack.c (pack_pack): Ditto.
+Mon Apr 21 18:55:21 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * random.c (int_pair_to_real_inclusive): Ditto.
- (rand_init): Ditto.
- (random_load): Ditto.
- (limited_big_rand): Ditto.
+ * ext/-test-/string/coderange.c: add Bug::String.new#coderange_scan
+ to explicitly scan coderange.
-Sun Jun 9 09:34:44 2013 Tanaka Akira <akr@fsij.org>
+Mon Apr 21 18:19:35 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * bignum.c (big2str_base_powerof2): New function.
- (rb_big2str0): Use big2str_base_powerof2 if base is 2, 4, 8, 16 or 32.
+ * string.c (coderange_scan): remove unused logic.
-Sun Jun 9 00:59:04 2013 Tanaka Akira <akr@fsij.org>
+ * string.c (rb_str_coderange_scan_restartable): ditto.
- * hash.c (rb_hash): Use rb_integer_pack to obtain least significant
- long integer.
+Mon Apr 21 14:11:48 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jun 8 23:56:00 2013 Tanaka Akira <akr@fsij.org>
+ * ext/stringio/stringio.c (strio_putc): fix for non-ascii
+ encoding, like as IO#putc. [ruby-dev:48114] [Bug #9765]
- * numeric.c (rb_num_to_uint): Use rb_absint_size instead of
- RBIGNUM_LEN.
+Sun Apr 20 12:57:15 2014 Masaya Tarui <tarui@ruby-lang.org>
-Sat Jun 8 22:53:45 2013 Tanaka Akira <akr@fsij.org>
+ * st.c (st_foreach_check): change start point of search at check
+ from top to current. [ruby-dev:48047] [Bug #9646]
- * marshal.c (r_object0): Use rb_integer_unpack.
+Sun Apr 20 08:41:33 2014 Andrew DeMaria <ademariad@gmail.com>
-Sat Jun 8 22:18:57 2013 Tanaka Akira <akr@fsij.org>
+ * lib/mkmf.rb (link_command, libpathflag, create_makefile): prefer
+ user specified `$LIBPATH` than `$DEFLIBPATH`. [ruby-core:62100]
+ [ruby-trunk - Bug #9760]
- * time.c (v2w): Use rb_absint_size instead of RBIGNUM_LEN.
+Sun Apr 20 06:01:18 2014 Eric Wong <e@80x24.org>
-Sat Jun 8 21:47:33 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c (rb_gc_writebarrier): drop special case for big hash/array
+ [Bug #9518]
- * time.c (v2w_bignum): Simplified using rb_integer_pack.
- (rb_big_abs_find_maxbit): Removed.
+Sat Apr 19 15:38:29 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jun 8 21:03:40 2013 Tanaka Akira <akr@fsij.org>
+ * parse.y (primary): flush cmdarg flags inside left-paren in a
+ command argument, to allow parenthesed do-block as an argument
+ without arguments parentheses. [ruby-core:61950] [Bug #9726]
- * bignum.c (rb_absint_singlebit_p): New function.
+Sat Apr 19 10:07:24 2014 Tanaka Akira <akr@fsij.org>
- * internal.h (rb_absint_singlebit_p): Declared.
+ * internal.h (struct RBignum): Use size_t for len.
- * time.c (v2w_bignum): Use rb_absint_singlebit_p instead of
- rb_big_abs_find_minbit.
- (rb_big_abs_find_minbit): Removed.
+ * include/ruby/intern.h (rb_big_new): Use size_t instead of long to
+ specify the size of bignum.
+ (rb_big_resize): Ditto.
-Sat Jun 8 20:24:23 2013 Tanaka Akira <akr@fsij.org>
+ * bignum.c: Follow above changes.
- * time.c (rb_big_abs_find_maxbit): Use rb_absint_size.
- (bdigit_find_maxbit): Removed.
+ * rational.c: Follow above changes.
-Sat Jun 8 19:47:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+ * marshal.c: Follow above changes.
- * class.c (include_modules_at): invalidate method cache if included
- module contains constants
+Sat Apr 19 00:32:07 2014 Tanaka Akira <akr@fsij.org>
- * test/ruby/test_module.rb: add test
+ * numeric.c (rb_num2long): Returns a long.
+ (rb_num2ulong): Returns a unsigned long.
-Sat Jun 8 19:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+ * bignum.c (rb_big2long): Returns a long.
+ (rb_big2ulong): Returns a unsigned long.
- * random.c (limited_big_rand): declare rnd, lim and mask as uint32_t
- to avoid 64 bit to 32 bit shorten warnings.
+ * include/ruby/intern.h: Follow above changes.
-Sat Jun 8 19:23:53 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * include/ruby/ruby.h: Follow above changes.
+ (rb_num2long_inline): No need to cast.
+ (rb_num2ulong_inline): Ditto.
- * win32/Makefile.sub: r41163 changed win32/win32.c and configure.in
- but it didn't treat about mswin32/mswin64, so fix it.
- NOTE: this needs a review by usa whether additional condition is
- required or not.
+Sat Apr 19 00:17:20 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jun 8 19:06:26 2013 Tanaka Akira <akr@fsij.org>
+ * string.c (SHARABLE_SUBSTRING_P): predicate if substring can be
+ shared with the original string. true if just at the end of the
+ original string, for the time being. all substring will be able to
+ be shared in the future.
- * random.c: Unused RBignum internal accessing macros removed.
+Fri Apr 18 21:48:24 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jun 8 19:04:15 2013 Tanaka Akira <akr@fsij.org>
+ * string.c (rb_str_new_frozen): consider the shared string at
+ middle.
- * random.c (limited_big_rand): The argument, limit, is changed to
- VALUE. Use rb_integer_pack and rb_integer_unpack.
+ * string.c (rb_str_subseq, rb_str_substr, str_byte_substr): share
+ middle of a string.
-Sat Jun 8 17:15:18 2013 Tanaka Akira <akr@fsij.org>
+Fri Apr 18 15:40:05 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * random.c (make_seed_value): Fix the length given for
- rb_integer_unpack.
+ * string.c: use uintptr_t instead of VALUE because they are not ruby
+ object.
-Sat Jun 8 16:38:02 2013 Tanaka Akira <akr@fsij.org>
+Fri Apr 18 14:51:42 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * bignum.c (rb_integer_unpack): Don't use rb_funcall if possible.
+ * string.c: check str_strlen's argument, and add comment or
+ use NULL if simply it uses str's enc.
- * random.c: Use uint32_t for elements of seed.
- (make_seed_value): Use rb_integer_unpack.
+Fri Apr 18 14:32:40 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sat Jun 8 15:58:18 2013 Tanaka Akira <akr@fsij.org>
+ * string.c (str_strlen): use enc_strlen if the coderange is known.
- * random.c (rand_init): Add a cast to fix clang compile error:
- random.c:410:32: error: implicit conversion loses integer precision:
- 'size_t' (aka 'unsigned long') to 'int' [-Werror,-Wshorten-64-to-32]
- This cast doesn't cause a problem because len is not bigger than
- MT_MAX_STATE.
+Fri Apr 18 14:21:21 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sat Jun 8 15:30:03 2013 Tanaka Akira <akr@fsij.org>
+ * string.c (enc_strlen): move UTF-8 optimization from str_strlen to
+ enc_strlen.
- * random.c (rand_init): Use rb_integer_pack.
- (roomof): Removed.
+Fri Apr 18 08:50:18 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jun 8 14:58:32 2013 Tanaka Akira <akr@fsij.org>
+ * configure.in (rb_cv_getcwd_malloc): check if getcwd allocates
+ buffer if NULL is given [ruby-core:62072] [Bug #9752]
- * internal.h (INTEGER_PACK_FORCE_BIGNUM): New flag constant.
+Thu Apr 17 16:28:10 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * bignum.c (rb_integer_unpack): Support INTEGER_PACK_FORCE_BIGNUM.
+ * prelude.rb: [DOC] Update Thread::exclusive docs by @stevenharman.
- * random.c (int_pair_to_real_inclusive): Use
- INTEGER_PACK_FORCE_BIGNUM to use rb_big_mul instead of rb_funcall.
+Thu Apr 17 10:03:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Jun 8 14:17:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/fileutils.rb (FileUtils#copy_entry): update rdoc about
+ preserve option and permissions, following r31123.
+ [ruby-core:62065] [Bug #9748]
- * configure.in: check for NET_LUID. header macro varies across
- compiler versions.
+Wed Apr 16 23:47:36 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * win32/win32.c: use configured macro.
+ * enum.c (dont_recycle_block_arg): fix condition to recycle block
+ argument. lambda with rest can get internal array directly.
+ [ruby-core:62060] [Bug #9749]
-Sat Jun 8 11:59:55 2013 Tanaka Akira <akr@fsij.org>
+Wed Apr 16 09:51:16 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * random.c (int_pair_to_real_inclusive): Use rb_funcall instead of
- rb_big_mul because rb_integer_unpack can return a Fixnum.
+ * ext/openssl/ossl_pkey.c (ossl_pkey_verify): as EVP_VerifyFinal()
+ finalizes only a copy of the digest context, the context must be
+ cleaned up after initialization by EVP_MD_CTX_cleanup() or a
+ memory leak will occur. [ruby-core:62038] [Bug #9743]
-Sat Jun 8 11:17:39 2013 Tanaka Akira <akr@fsij.org>
+Tue Apr 15 19:36:42 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * random.c (int_pair_to_real_inclusive): Use rb_integer_pack.
+ * include/ruby/win32.h (rb_w32_cmdvector): removed.
-Sat Jun 8 09:49:42 2013 Tanaka Akira <akr@fsij.org>
+ * win32/win32.c (rb_w32_sysinit): use WCHAR version of GetCommandLine()
+ internally.
- * random.c (int_pair_to_real_inclusive): Use rb_integer_unpack.
+ * win32/win32.c (w32_cmdvector): renamed from rb_w32_cmdvector. use
+ WCHAR* instead of char* internally.
-Sat Jun 8 08:12:22 2013 Tanaka Akira <akr@fsij.org>
+ these changes are expected to not changing the behavior yet.
- * random.c (random_load): Use rb_integer_pack.
+Tue Apr 15 19:26:05 2014 Tanaka Akira <akr@fsij.org>
-Sat Jun 8 06:15:46 2013 Tanaka Akira <akr@fsij.org>
+ * ext/extmk.rb: Re-generate extmk.mk and dummy makefiles only if
+ really required.
+ This fixes a problem to run multiple test-all concurrently as:
+ make test-all & make test-all & make test-all & ...
- * random.c (numberof): Removed.
+Tue Apr 15 12:49:53 2014 Sam Rawlins <sam.rawlins@gmail.com>
-Sat Jun 8 06:00:47 2013 Tanaka Akira <akr@fsij.org>
+ * enum.c (enum_each_slice, enum_each_cons): make more efficient by
+ allocating less and recycling block argument arrays if possible.
+ [Fixes GH-596]
- * random.c: include internal.h.
- (mt_state): Use rb_integer_unpack.
+Mon Apr 14 18:44:45 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sat Jun 8 00:55:51 2013 Tanaka Akira <akr@fsij.org>
+ * addr2line.c (fill_lines): get base addrs in fill_lines to use it
+ with dladdr_fbases introduced at r45563.
+ it didn't get before if the executable is not pie.
- * bignum.c (integer_pack_loop_setup): word_num_nailbytes_ret argument
- removed.
- (rb_integer_pack): Follow the above change.
- (rb_integer_unpack): Follow the above change.
+Mon Apr 14 18:05:48 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sat Jun 8 00:37:32 2013 Tanaka Akira <akr@fsij.org>
+ * addr2line.c (main_exe_path): support FreeBSD.
+ At least sh, csh, tcsh, bash, and zsh sets realpath of the main
+ executable for dladdr, but gdb doesn't.
- * bignum.c (validate_integer_pack_format): Renamed from
- validate_integer_format.
- (integer_pack_loop_setup): Renamed from integer_format_loop_setup.
- (integer_pack_fill_dd): Renamed from int_export_fill_dd.
- (integer_pack_take_lowbits): Renamed from int_export_take_lowbits.
- (integer_unpack_push_bits): Renamed from int_import_push_bits.
+Mon Apr 14 17:20:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Jun 7 23:58:06 2013 Tanaka Akira <akr@fsij.org>
+ * proc.c (umethod_bind): use the ancestor iclass instead of new
+ iclass to get rid of infinite recursion, if the defined module
+ is already included. [ruby-core:62014] [Bug #9721]
- * bignum.c (rb_integer_pack): Arguments changed. Use flags to
- specify word order and byte order.
- (rb_integer_unpack): Ditto.
- (validate_integer_format): Follow the above change.
- (integer_format_loop_setup): Ditto.
+Sun Apr 13 12:46:58 2014 Tanaka Akira <akr@fsij.org>
- * pack.c: Ditto.
+ * bignum.c (SIZEOF_BDIGIT): Renamed from SIZEOF_BDIGITS.
* internal.h: Ditto.
- (INTEGER_PACK_MSWORD_FIRST): Defined.
- (INTEGER_PACK_LSWORD_FIRST): Ditto.
- (INTEGER_PACK_MSBYTE_FIRST): Ditto.
- (INTEGER_PACK_LSBYTE_FIRST): Ditto.
- (INTEGER_PACK_NATIVE_BYTE_ORDER): Ditto.
- (INTEGER_PACK_LITTLE_ENDIAN): Ditto.
- (INTEGER_PACK_BIG_ENDIAN): Ditto.
-
-Fri Jun 7 22:10:50 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * lib/rubygems/specification.rb (Gem::Specification#to_yaml):
- use Gem::NoAliasYAMLTree.create instead of Gem::NoAliasYAMLTree.new
- to suppress deprecated warnings.
-
-Fri Jun 7 21:39:39 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_integer_pack): Renamed from rb_int_export.
- (rb_integer_unpack): Renamed from rb_int_import.
-
- * internal.h, pack.c: Follow the above change.
-
-Fri Jun 7 21:05:26 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (integer_format_loop_setup): Extracted from rb_int_export
- and rb_int_import.
-
-Fri Jun 7 19:48:38 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (validate_integer_format): Extracted from rb_int_export and
- rb_int_import.
-
-Fri Jun 7 19:23:15 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_absint_size): Use numberof.
- (rb_int_export): Ditto.
-
-Fri Jun 7 18:58:56 2013 Tanaka Akira <akr@fsij.org>
-
- * internal.h (numberof): Gathered from various files.
-
- * array.c, math.c, thread_pthread.c, iseq.c, enum.c, string.c, io.c,
- load.c, compile.c, struct.c, eval.c, gc.c, parse.y, process.c,
- error.c, ruby.c: Remove the definitions of numberof.
-
-Fri Jun 7 18:24:39 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_absint_size): Declare a variable, i, just before used
- to suppress a warning.
- (rb_int_export): Ditto.
-
-Fri Jun 7 17:41:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * bignum.c (rb_absint_size): explicit cast to BDIGIT to avoid implicit
- 64 bit to 32 bit shortening warning
- * bignum.c (rb_int_export): ditto
- * bignum.c (int_import_push_bits): ditto
-
-Fri Jun 7 17:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * internal.h (RCLASS_SUPER): use descriptive variable name
- * internal.h (RCLASS_SET_SUPER): ditto
-
-Fri Jun 7 13:25:27 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/json/fbuffer/fbuffer.h (fbuffer_append_str): change the place of
- RB_GC_GUARD. it should be after the object is used.
-
-Fri Jun 7 13:22:43 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * gc.c (before_gc_sweep): noinline can also avoid the segv instead of
- -O0 of r41084. this way is expected less slow.
-
-Fri Jun 7 11:45:42 2013 Kenta Murata <mrkn@cookpad.com>
-
- * rational.c (numeric_quo): move num_quo in numeric.c to numeric_quo
- in rational.c to refer canonicalization state for mathn support.
- [ruby-core:41575] [Bug #5736]
-
- * numeric.c (num_quo): ditto.
-
- * test/test_mathn.rb: add a test for the change at r41109.
-
-Fri Jun 7 11:41:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: revert r41106. size_t may not be unsigned
-
- * bignum.c (rb_absint_size_in_word, rb_int_export, rb_int_import): use
- NUM2SIZET() and SIZET2NUM() already defined in ruby/ruby.h.
-
-Fri Jun 7 11:28:37 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c: use oldgen bitmap as initial mark bitmap when major gc.
- so can skip oldgen bitmap check around mark & sweep.
- * gc.c (slot_sweep_body): change scan algorithm for performance:
- from object's pointer base to bitmap one.
-
-Fri Jun 7 11:25:56 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c: introduce oldgen bitmap for preparing performance tuning.
-
-Fri Jun 7 11:20:57 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (MARKED_IN_BITMAP, MARK_IN_BITMAP, CLEAR_IN_BITMAP): bring
- bitmap macros in one place, and introduce BITMAP_BIT.
-
-Fri Jun 7 11:18:35 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * array.c (ary_new): change order of allocation in order
- to remove FL_OLDGEN operation.
-
-Fri Jun 7 11:16:28 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * tool/rdocbench.rb: add gc total time information.
-
-Fri Jun 7 10:12:01 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: remove "Sunny" terminology.
- "Sunny" doesn't mean antonym of "Shady" (questionable, doubtful, etc).
- Instead of "Sunny", use "non-shady" or "normal".
-
-Fri Jun 7 09:29:33 2013 Kenta Murata <mrkn@cookpad.com>
-
- * bignum.c (rb_int_import): explicitly casting BDIGIT_DBL to BDIGIT
- to prevent warning.
-
-Fri Jun 7 07:29:33 2013 Tanaka Akira <akr@fsij.org>
-
- * internal.h (rb_int_export): countp argument is split into
- wordcount_allocated and wordcount.
-
- * bignum.c (rb_int_export): Follow the above change.
-
- * pack.c (pack_pack): Ditto.
-
-Fri Jun 7 07:17:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * NEWS: describe a compatibility issue of Numeric#quo
- introduced at r41109.
-
-Fri Jun 7 07:15:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * NEWS: fix style.
-
-Fri Jun 7 06:48:17 2013 Benoit Daloze <eregontp@gmail.com>
-
- * numeric.c: remove unused ID id_to_r introduced in r41109.
-
-Fri Jun 7 06:15:31 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_int_import): New function.
- (int_import_push_bits): Ditto.
-
- * internal.h (rb_int_import): Declared.
-
- * pack.c (pack_unpack): Use rb_int_import for BER compressed integer.
-
-Thu Jun 6 22:24:00 2013 Kenta Murata <mrkn@mrkn.jp>
-
- * numeric.c (num_quo): Use to_r method to convert the receiver to
- rational. [ruby-core:41575] [Bug #5736]
-
- * test/ruby/test_numeric.rb: add a test for the above change.
-
-Thu Jun 6 20:40:17 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Invoke RUBY_REPLACE_TYPE for size_t.
- Don't invoke RUBY_CHECK_PRINTF_PREFIX for size_t to avoid conflict
- with RUBY_REPLACE_TYPE.
-
- * internal.h (rb_absint_size): Declared.
- (rb_absint_size_in_word): Ditto.
- (rb_int_export): Ditto.
-
- * bignum.c (rb_absint_size): New function.
- (rb_absint_size_in_word): Ditto.
- (int_export_fill_dd): Ditto.
- (int_export_take_lowbits): Ditto.
- (rb_int_export): Ditto.
-
- * pack.c (pack_pack): Use rb_int_export for BER compressed integer.
-
-Thu Jun 6 19:31:33 2013 Tadayoshi Funaba <tadf@dotrb.org>
-
- * ext/date/date_core.c: fixed coding error [ruby-core:55337].
- reported by Riley Lynch.
-
-Thu Jun 6 14:16:37 2013 Narihiro Nakamura <authornari@gmail.com>
-
- * ext/objspace/object_tracing.c: rename allocation_info to
- lookup_allocation_info. At times I confused "struct
- allocation_info" with "function allocation_info".
-
-Thu Jun 6 13:57:06 2013 Narihiro Nakamura <authornari@gmail.com>
-
- * ext/objspace/object_tracing.c: allocation_info function isn't
- called by any other file.
-
-Thu Jun 6 09:41:00 2013 Kenta Murata <mrkn@cookpad.com>
-
- * numeric.c (num_quo): should return a Float for a Float argument.
- [ruby-dev:44710] [Bug #5515]
-
- * test/ruby/test_fixnum.rb: Add an assertion for the above change.
-
- * test/ruby/test_bignum.rb: ditto.
-
-Thu Jun 6 00:59:44 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (gc_mark): get rid of pushing useless objects.
- * gc.c (rgengc_rememberset_mark): bypass gc_mark() in order to push
- sunny old object at minor gc.
- * gc.c (gc_mark_children): move sunny old check to gc_mark().
- * gc.c (rgengc_check_shady): remove DEMOTE that already unnecessary.
- * gc.c (rb_gc_writebarrier): ditto.
-
- change sunny old check point in order to save mark stack and
- remove unnatural rest_sweep & demote.
-
-Thu Jun 6 00:52:42 2013 Masaya Tarui <tarui@ruby-lang.org>
-
- * gc.c (rgengc_rememberset_mark): change scan algorithm for performance:
- from object's pointer base to bitmap one.
-
-Thu Jun 6 00:30:04 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * win32/win32.c (NET_LUID): define it on MinGW32.
- mingw-w64 has NET_LUID but mingw32 (mingw.org) still doesn't have
- NET_LUID. reported by taco on IRC
-
-Thu Jun 6 00:05:08 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * string.c (String#b): Allow code range scan to happen later so
- ascii_only? on a result string returns the correct value.
- [ruby-core:55315] [Bug #8496]
-
-Wed Jun 5 22:40:42 2013 Shugo Maeda <shugo@ruby-lang.org>
-
- * lib/net/imap.rb (capability_response): should ignore trailing
- spaces. Thanks, Peter Kovacs. [ruby-core:55024] [Bug #8415]
-
- * test/net/imap/test_imap_response_parser.rb: related test.
-
-Wed Jun 5 21:17:08 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (big_fdiv): Use nlz() instead of bdigbitsize().
- (bdigbitsize): Removed.
-
-Wed Jun 5 20:32:00 2013 Kenta Murata <mrkn@cookpad.com>
-
- * include/ruby/ruby.h: fix alignment in comment.
-
-Wed Jun 5 20:05:29 2013 Tanaka Akira <akr@fsij.org>
-
- * random.c (int_pair_to_real_inclusive): Add a cast to BDIGIT.
- (random_load): Fix shift width for fixnums.
- Re-implement bignum extraction without ifdefs.
-
-Wed Jun 5 15:26:10 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * gc.c (before_gc_sweep): don't optimize it to avoid segv on Ubuntu
- 10.04 gcc 4.4.
- http://u32.rubyci.org/~chkbuild/ruby-trunk/log/20130527T190301Z.diff.html.gz
-
-Wed Jun 5 09:46:46 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * test/fileutils/test_fileutils.rb (TestFileUtils#test_mkdir): add
- EACCES for Windows.
-
-Wed Jun 5 08:13:37 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_big_pow): Don't need to multiply SIZEOF_BDIGITS.
- Use nlz instead of bitlength_bdigit.
- (bitlength_bdigit): Removed.
-
-Wed Jun 5 07:14:18 2013 Tadayoshi Funaba <tadf@dotrb.org>
-
- * ext/date/date_core.c (d_lite_cmp, d_lite_equal): simplified.
-
-Wed Jun 5 07:07:01 2013 Tadayoshi Funaba <tadf@dotrb.org>
-
- * ext/date/date_core.c: fixed a bug [ruby-core:55295]. reported
- by Riley Lynch.
-
-Wed Jun 5 06:44:08 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems: Update to RubyGems 2.0.3
-
- * test/rubygems: Tests for the above.
-
- * NEWS: Added RubyGems 2.0.3 note.
-
-Wed Jun 5 06:35:15 2013 Eric Hodel <drbrain@segment7.net>
-
- * doc/marshal.rdoc: Add description of Marshal format.
-
-Wed Jun 5 01:16:09 2013 Benoit Daloze <eregontp@gmail.com>
-
- * array.c (Array#+): fix documentation example.
- Patch by Logan Serman. [Fixes GH-324]
-
-Wed Jun 5 00:21:54 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
-
- * lib/irb/lc/ja/help-message: update help messages.
- following r41028. [ruby-dev:46707] [Feature #7510]
-
-Wed Jun 5 00:09:32 2013 Tanaka Akira <akr@fsij.org>
-
- * marshal.c (r_object0): Generalize a round up expression.
- Use BDIGIT instead of int.
-
-Tue Jun 4 23:44:02 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
-
- * object.c (rb_Hash): fix docs. patched by Stefan Sch"ussler.
- [ruby-core:55299] [Bug #8487]
-
-Tue Jun 4 23:16:49 2013 Benoit Daloze <eregontp@gmail.com>
-
- * lib/irb/completion.rb: Use %w literal construction for long lists.
- Patch by Dave Goodchild. [Fixes GH-299]
-
-Tue Jun 4 23:08:42 2013 Benoit Daloze <eregontp@gmail.com>
-
- * ext/objspace/objspace.c: improve wording and remove duplicated comment.
- Based on a patch by Dave Goodchild. [Fixes GH-299]
-
-Tue Jun 4 18:41:47 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bitlength_bdigit): Fix an off-by-one error.
-
-Tue Jun 4 15:30:00 2013 Kenta Murata <mrkn@cookpad.com>
-
- * ext/bigdecimal/lib/bigdecimal/util.rb (Float#to_d): fix the number
- of figures. Patch by Vipul A M <vipulnsward@gmail.com>.
- https://github.com/ruby/ruby/pull/323 fix GH-323
-
- * test/bigdecimal/test_bigdecimal_util.rb: fix for the above change.
-
-Tue Jun 4 00:44:27 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-
- * test/fileutils/test_fileutils.rb (TestFileUtils#test_mkdir): add
- EEXIST for Linux. (suggested by nurse)
-
-Mon Jun 3 23:58:19 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-
- * lib/fileutils.rb (FileUtils.rmdir): use remove_tailing_slash.
- * test/fileutils/test_fileutils.rb: test for above.
-
-Mon Jun 3 23:47:55 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (bitlength_bdigit): New function.
- (rb_big_pow): Use bitlength_bdigit instead of ffs.
-
-Mon Jun 3 23:11:19 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
-
- * lib/fileutils.rb: fix behavior when mkdir/mkdir_p accepted "/".
- * test/fileutils/test_fileutils.rb: add test for above change.
- Patched by Mitsunori Komatsu. [GH-319]
-
-Mon Jun 3 19:02:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * dir.c (is_hfs): use the file descriptor instead of a path.
-
-Mon Jun 3 07:15:17 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: removes AC_CHECK_FUNCS(readdir_r). readdir_r()
- is only used from dir.c and it doesn't need readdir_r().
- * configure.in (SIZEOF_STRUCT_DIRENT_TOO_SMALL): removed. It is
- only used for readdir_r.
- * dir.c: removes NAME_MAX_FOR_STRUCT_DIRENT. It is not right way
- to detect maximum length of path len. POSIX require to use
- fpathconf(). IOW, it might have lead to make a vulnerability
- using stack smashing. Moreover, readdir() works enough for our
- usage.
- * dir.c (READDIR): removes an implementation which uses
- readdir_r() and parenthesize in a macro body correctly.
- * dir.c (dir_read): removes IF_HAVE_READDIR_R(DEFINE_STRUCT_DIRENT
- entry), it is used only for readdir_r().
- * dir.c (dir_each): ditto.
- * dir.c (glob_helper): ditto.
-
- * dir.c (READDIR): removes entry and dp argument.
- * dir.c (dir_read): adjust for the above change.
- * dir.c (dir_each): ditto.
- * dir.c (glob_helper): ditto.
-
-Mon Jun 3 03:40:29 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * vm_insnhelper.c (vm_yield_setup_block_args): partially revert r41019.
- The code is not useless.
-
-Mon Jun 3 01:25:25 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
-
- * test/socket/test_sockopt.rb: change test name. follow r41037.
-
-Mon Jun 3 01:08:43 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
-
- * test/rinda/test_rinda.rb: rename functions introduced in r41009.
-
-Sun Jun 2 23:33:42 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * enc/trans/japanese_euc.trans, test/ruby/test_transcode.rb,
- tool/transcode-tblgen.rb: change EUC-JP-2004 to EUC-JIS-2004.
- This is follow up to changes in r41024.
-
-Sun Jun 2 22:44:42 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/socket/option.c: rename functions introduced in r41009
- s/ip/ipv4/g because they are ipv4 functions.
- (there's a policy that the name "ip" is for methods which supports
- both ipv4 and ipv6)
-
-Sun Jun 2 16:15:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * dln_find.c (dln_find_exe, dln_find_file): remove deprecated
- non-reentrant functions.
-
-Sun Jun 2 15:04:35 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/cgi/util.rb, lib/erb.rb: Use String#b [Feature #8394] by znz
-
-Sun Jun 2 14:10:21 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/irb/lc/help-message: Apply english updates for irb --help #7510
-
-Sun Jun 2 12:03:58 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * range.c: Fix rdoc on Range#bsearch [Bug #8242] [ruby-core:54143]
-
-Sun Jun 2 02:08:37 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * enc/euc_jp.c: fix typo: the name of EUC-JIS-2004.
-
-Sat Jun 1 23:17:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * vm_eval.c (rb_mod_module_eval): mention in docs that arguments passed
- to the method are passed to the block
-
-Sat Jun 1 17:58:13 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/set.rb (Set#freeze, taint, untaint): Save a "self" by
- utilizing super returning self, and add tests while at it.
-
-Sat Jun 1 17:24:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * compile.c (iseq_set_arguments): not a simple single argument if any
- keyword arguments exist. [ruby-core:55203] [Bug #8463]
-
- * vm_insnhelper.c (vm_yield_setup_block_args): split single parameter
- if any keyword arguments exist, and then extract keyword arguments.
- [ruby-core:55203] [Bug #8463]
-
-Sat Jun 1 11:16:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * error.c (rb_exc_new_cstr): rename from rb_exc_new2.
-
- * error.c (rb_exc_new_str): rename from rb_exc_new3.
-
-Sat Jun 1 10:13:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (rb_str_new[2-5], rb_{tainted,usascii}_str_new2),
- (rb_str_buf_new2): remove old interfaces.
-
-Sat Jun 1 08:00:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/zlib/zlib.c (gzfile_read, gzfile_read_all, gzfile_getc),
- (gzreader_gets): check EOF. [ruby-core:55220] [Bug #8467]
+ * marshal.c: Ditto.
-Sat Jun 1 07:32:15 2013 Tanaka Akira <akr@fsij.org>
+ * rational.c: Ditto.
- * bignum.c: Use BDIGIT type for hbase.
+Sun Apr 13 10:18:09 2014 Tanaka Akira <akr@fsij.org>
-Sat Jun 1 02:37:35 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * common.mk: Unused target, $(MKMAIN_CMD), removed.
- * ext/socket/option.c (sockopt_s_byte): constructor of the sockopt
- whose value's is byte.
+ * Makefile.in (MKMAIN_CMD): Unused macro removed.
- * ext/socket/option.c (sockopt_byte): getter for above.
+ * win32/Makefile.sub (MKMAIN_CMD): Ditto.
- * ext/socket/option.c (inspect_byte): inspect for above.
+Sat Apr 12 22:11:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/socket/option.c (sockopt_s_ip_multicast_loop): constructor of
- the sockopt whose optname is IP_MULTICAST_LOOP.
+ * string.c (sym_to_proc), proc.c (rb_block_clear_env_self): clear
+ caller's self which is useless, so that it can get collected.
+ [Fixes GH-592]
- * ext/socket/option.c (sockopt_ip_multicast_loop): getter for above.
+Sat Apr 12 09:26:48 2014 Eric Hodel <drbrain@segment7.net>
- * ext/socket/option.c (sockopt_s_ip_multicast_ttl): constructor of
- the sockopt whose optname is IP_MULTICAST_TTL.
+ * ext/openssl/ossl_ocsp.c: [DOC] Document OpenSSL::OCSP.
- * ext/socket/option.c (sockopt_ip_multicast_ttl): getter for above.
+Fri Apr 11 18:52:38 2014 Koichi Sasada <ko1@atdot.net>
- * ext/socket/option.c (sockopt_inspect): use above.
+ * array.c (ARY_SET): added.
-Sat Jun 01 01:50:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ ARY_SET() is same functionality of RARRAY_ASET(), but
+ it has an assertion (`ary' doesn't have shared array).
- * ext/bigdecimal/bigdecimal.c (BigDecimal_power): use rb_dbl2big
- to convert a double value to a Bignum.
+Fri Apr 11 16:54:26 2014 Koichi Sasada <ko1@atdot.net>
-Sat Jun 1 00:19:50 2013 Tanaka Akira <akr@fsij.org>
+ * array.c: make shared arrays WB-protected objects.
- * bignum.c (calc_hbase): Make hbase the maximum power of base
- representable in BDIGIT.
+ Shared arrays were WB-unprotected object because
+ sharing array can modify shared array's buffer
+ if it occupied shared array.
-Fri May 31 23:56:13 2013 Tanaka Akira <akr@fsij.org>
+ [sharing array (ary)] -> [shared array (shared)] -> <buff>
+ | A
+ +---------------------------------------+
+ write `buff' with WB(ary, &buff[i], obj)
+ -> if `ary' and `shared' are old, then only `ary'
+ will be remembered.
+ -> traverse from `ary'. But `shared' is old, so
+ that written `obj' is not marked.
- * bignum.c (calc_hbase): Extracted from rb_big2str0.
+ It cause WB miss so that shared arrays were WB-unprotected.
+ (WB-unprotected objects are marked everytime if it is living)
-Fri May 31 23:22:24 2013 Tanaka Akira <akr@fsij.org>
+ This patch insert WB() for `shared' if it is needed.
- * bignum.c: Don't hard code SIZEOF_BDIGITS for log_base(hbase).
- (big2str_orig): hbase_numdigits argument added.
- (big2str_karatsuba): Ditto.
- (rb_big2str0): Calculate hbase_numdigits.
+Fri Apr 11 15:05:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri May 31 17:57:21 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * process.c: Improve Process::exec documentation
-
-Fri May 31 17:26:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_eval.c (rb_funcallv): add better names of rb_funcall2.
-
- * vm_eval.c (rb_funcallv_public): ditto for rb_funcall3.
-
-Fri May 31 17:04:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * array.c (rb_ary_new_capa): add better names of rb_ary_new2.
-
- * array.c (rb_ary_new_from_args): ditto for rb_ary_new3.
-
- * array.c (rb_ary_new_from_values): ditto for rb_ary_new4.
-
-Fri May 31 16:35:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (HAVE_ATTRIBUTE_FUNCTION_ALIAS): define to tell if
- alias attribute is available.
-
-Fri May 31 16:03:23 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * object.c, proc.c: s/call_seq/call-seq in rdoc. [Fixes GH-322]
-
-Fri May 31 15:56:36 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/openssl/ossl_ssl.c: Add missing paren in rdoc [Fixes GH-321]
-
-Fri May 31 11:58:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_method.c (set_visibility): extract from rb_mod_public(),
- rb_mod_protected() and rb_mod_private().
-
-Thu May 30 19:47:42 2013 Yusuke Endoh <mame@tsg.ne.jp>
-
- * vm_insnhelper.c (vm_callee_setup_keyword_arg,
- vm_callee_setup_arg_complex): consider a hash argument for keyword
- only when the number of arguments is more than the expected
- mandatory parameters. [ruby-core:53199] [ruby-trunk - Bug #8040]
-
- * test/ruby/test_keyword.rb: update a test for above.
-
-Thu May 30 17:55:04 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * process.c: RDoc on Process.spawn
-
-Thu May 30 00:08:14 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_profile_enable): rest_sweep() to finish last GC.
- Profiling record is allocated at first of marking phase.
- Enable at lazy sweeping may cause an error (SEGV).
-
-Wed May 29 10:33:27 2013 Koichi Sasada <ko1@atdot.net>
-
- * hash.c: fix WB bug.
- (1) Hash's key also needs WB.
- (2) callback parameter *key and *value of st_update() is not a
- storage of st_table itself (only local variable). So that
- OBJ_WRITE() is not suitable, especially for `!existing'.
- OBJ_WRITTEN() is used instead of OBJ_WRITE().
-
-Tue May 28 12:31:21 2013 Koichi Sasada <ko1@atdot.net>
-
- * ext/objspace/object_tracing.c: fix a bug reported at
- "[ruby-core:55182] [ruby-trunk - Bug #8456][Open] Sugfault in Ruby Head"
- Care about the case TracePoint#path #=> `nil'.
-
- * ext/objspace/object_tracing.c: add two new methods:
- * ObjectSpace.allocation_class_path(o)
- * ObjectSpace.allocation_method_id(o)
- They are not useful for Object.new because they are always
- "Class" and :new.
- To trace more useful information, we need to maintain call-tree
- using call/return hooks, which is implemented by
- ll-prof <http://sunagae.net/wiki/doku.php?id=software:llprof>
-
- * test/objspace/test_objspace.rb: add a test.
-
-Tue May 28 11:30:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/extmk.rb (extmake): leave makefiles untouched if the content is
- not changed, to get rid of unnecessary re-linking.
-
-Tue May 28 03:11:02 2013 Koichi Sasada <ko1@atdot.net>
-
- * ext/objspace/gc_hook.c, ext/objspace/objspace.c: add new methods to
- hook GC invocation.
- * ObjectSpace.after_gc_start_hook=(proc)
- * ObjectSpace.after_gc_end_hook=(proc)
-
- Note that hooks are not kicked immediately. Procs are kicked
- at postponed_job.
-
- This feature is a sample of new internal event and
- rb_postponed_job API.
-
-Tue May 28 02:56:15 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_stat): remove wrong rest_sweep().
-
-Tue May 28 02:44:23 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (garbage_collect_body): fix GC_ENABLE_LAZY_SWEEP condition.
-
- * gc.c (GC_NOTIFY): move debug print location and use stderr instead
- of stdout.
-
-Tue May 28 02:07:21 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_trace.c (rb_postponed_job_register_one): fix iteration bug.
-
- * ext/-test-/postponed_job/postponed_job.c,
- test/-ext-/postponed_job/test_postponed_job.rb: add a test.
-
-Tue May 28 00:34:23 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h, gc.c: add new internal event
- RUBY_INTERNAL_EVENT_GC_END. This event invokes at the end of
- after_sweep().
- Time chart with lazy sweep is:
- (1) Kick RUBY_INTERNAL_EVENT_GC_START
- (2) [gc_marks()]
- (3) [lazy_sweep()]
- (4) [... run Ruby program (mutator) with lazy_sweep() ...]
- (5) [after_sweep()]
- (6) Kick RUBY_INTERNAL_EVENT_GC_END
- (7) [... run Ruby program (mutator), and go to (1) ...]
- Time chart without lazy sweep (GC.start, etc) is:
- (1) Kick RUBY_INTERNAL_EVENT_GC_START
- (2) [gc_marks()]
- (3) [gc_sweep()]
- (4) [after_sweep()]
- (5) Kick RUBY_INTERNAL_EVENT_GC_END
- (6) [... run Ruby program (mutator), and go to (1) ...]
-
- * ext/-test-/tracepoint/tracepoint.c,
- test/-ext-/tracepoint/test_tracepoint.rb: modify a test.
-
-Tue May 28 00:18:57 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_trace.c (rb_postponed_job_flush): remove a wrong comment.
-
-Mon May 27 22:09:33 2013 Tanaka Akira <akr@fsij.org>
-
- * include/ruby/ruby.h (RHASH_SIZE): Add a cast to suppress a
- warning, comparison between signed and unsigned integer
- expressions [-Wsign-compare], on ILP32.
-
-Mon May 27 19:25:47 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: rename RUBY_INTERNAL_EVENT_FREE to
- RUBY_INTERNAL_EVENT_FREEOBJ.
-
- * ext/-test-/tracepoint/tracepoint.c,
- ext/objspace/object_tracing.c,
- gc.c, vm_trace.c: catch up this change.
-
-Mon May 27 18:57:28 2013 Koichi Sasada <ko1@atdot.net>
-
- * ext/objspace/objspace.c: support ObjectSpace.trace_object_allocations.
- Read the following test to know HOWTO.
- This feature is a sample of RUBY_INTERNAL_EVENT.
-
- * test/objspace/test_objspace.rb: add a test.
-
- * ext/objspace/object_tracing.c: ditto.
-
- * gc.c (rb_gc_count): add. This function returns GC count.
-
- * internal.h: add decl. of rb_gc_count(). Same as `GC.count'.
-
-Mon May 27 17:33:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * tool/rbinstall.rb (install_recursive): add maxdepth option.
-
- * tool/rbinstall.rb (bin-comm): limit depth of bindir and reject empty
- files. [ruby-core:55101] [Bug #8432]
-
-Mon May 27 16:16:18 2013 Koichi Sasada <ko1@atdot.net>
-
- * vm_trace.c (rb_postponed_job_flush, rb_postponed_job_register): use
- ruby_xmalloc/xfree. It is safe during GC.
-
-Mon May 27 09:24:03 2013 Koichi Sasada <ko1@atdot.net>
-
- * test/-ext-/postponed_job/test_postponed_job.rb: fix typo and class name.
-
-Mon May 27 09:05:17 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h, gc.c, vm_trace.c: add internal events.
- * RUBY_INTERNAL_EVENT_NEWOBJ: object created.
- * RUBY_INTERNAL_EVENT_FREE: object freed.
- * RUBY_INTERNAL_EVENT_GC_START: GC started.
- And rename `RUBY_EVENT_SWITCH' to `RUBY_INTERNAL_EVENT_SWITCH'.
-
- Internal events can not invoke any Ruby program because the tracing
- timing may be critical (under huge restriction).
- These events can be hooked only by C-extensions.
- We recommend to use rb_postponed_job_register() API to call Ruby
- program safely.
-
- This change is mostly written by Aman Gupta (tmm1).
- https://bugs.ruby-lang.org/issues/8107#note-12
- [Feature #8107]
-
- * include/ruby/debug.h, vm_trace.c: added two new APIs.
- * rb_tracearg_event_flag() returns rb_event_flag_t of this event.
- * rb_tracearg_object() returns created/freed object.
-
- * ext/-test-/tracepoint/extconf.rb,
- ext/-test-/tracepoint/tracepoint.c,
- test/-ext-/tracepoint/test_tracepoint.rb: add a test.
-
-Mon May 27 08:38:21 2013 Koichi Sasada <ko1@atdot.net>
-
- * ext/-test-/postponed_job/postponed_job.c: fix `init' function name.
-
-Mon May 27 06:22:41 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/debug.h, vm_trace.c: add rb_postponed_job API.
- Postponed jobs are registered with this API. Registered jobs
- are invoked at `ruby-running-safe-point' as soon as possible.
- This timing is completely same as finalizer timing.
-
- There are two APIs:
- * rb_postponed_job_register(flags, func, data): register a
- postponed job with data. flags are reserved.
- * rb_postponed_job_register_one(flags, func, data): same as
- `rb_postponed_job_register', but only one `func' job is
- registered (skip if `func' is already registered).
-
- This change is mostly written by Aman Gupta (tmm1).
- https://bugs.ruby-lang.org/issues/8107#note-15
- [Feature #8107]
-
- * gc.c: use postponed job API for finalizer.
-
- * common.mk: add dependency from vm_trace.c to debug.h.
-
- * ext/-test-/postponed_job/extconf.rb, postponed_job.c,
- test/-ext-/postponed_job/test_postponed_job.rb: add a test.
-
- * thread.c: implement postponed API.
-
- * vm_core.h: ditto.
-
-Mon May 27 02:26:02 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_stat): collect promote_operation_count and
- types (RGENGC_PROFILE >= 2).
-
-Mon May 27 01:40:58 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_stat): collect shade_operation_count,
- remembered_sunny_object_count and remembered_shady_object_count
- for each types when RGENGC_PROFILE >= 2.
- They are informative for optimization.
-
-Mon May 27 01:15:22 2013 Koichi Sasada <ko1@atdot.net>
-
- * hash.c (rb_hash_tbl_raw), internal.h: added.
- Returns st_table without shading hash.
-
- * array.c: use rb_hash_tbl_raw() for read-only purpose.
-
- * compile.c (iseq_compile_each): ditto.
-
- * gc.c (count_objects): ditto.
-
- * insns.def: ditto.
-
- * process.c: ditto.
-
- * thread.c (clear_coverage): ditto.
-
- * vm_insnhelper.c: ditto.
-
-Mon May 27 00:31:09 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * tool/make-snapshot: use ENV["AUTOCONF"] instead of directly using
- literal "autoconf".
-
-Sun May 26 21:31:46 2013 Koichi Sasada <ko1@atdot.net>
-
- * hash.c, include/ruby/ruby.h: support WB protected hash.
- * constify RHash::ifnone and make new macro RHASH_SET_IFNONE().
- * insert write barrier for st_update().
-
- * include/ruby/intern.h: declare rb_hash_set_ifnone(hash, ifnone).
-
- * marshal.c (r_object0): use RHASH_SET_IFNONE().
-
- * ext/openssl/ossl_x509name.c (Init_ossl_x509name): ditto.
-
-Sat May 25 23:22:38 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * test/fiddle/test_c_struct_entry.rb,
- test/fiddle/test_c_union_entity.rb,
- test/fiddle/test_cparser.rb, test/fiddle/test_func.rb,
- test/fiddle/test_handle.rb, test/fiddle/test_import.rb,
- test/fiddle/test_pointer.rb: don't run test if the system
- don't support fiddle.
-
-Sat May 25 21:29:34 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/pty/pty.c (get_device_once): FreeBSD 10-current and 9-stable
- added O_CLOEXEC support to posix_openpt, so assume FreeBSD 9.2 or
- later supports it.
- http://www.freebsd.org/cgi/query-pr.cgi?pr=162374
-
-Sat May 25 18:46:23 2013 Yusuke Endoh <mame@tsg.ne.jp>
-
- * proc.c (rb_method_entry_min_max_arity): fix missing break in switch.
- This was introduced in r38236, which is not intentional apparently.
- This has caused no actual harm because VM_METHOD_TYPE_OPTIMIZED is
- not used except for OPTIMIZED_METHOD_TYPE_SEND, but may do in
- future. Coverity Scan found this inadequacy.
-
-Sat May 25 18:08:06 2013 Yusuke Endoh <mame@tsg.ne.jp>
-
- * dir.c (bracket): fix copy-paste error. When the first and last
- characters of fnmatch range have different length, fnmatch may
- have wrongly matched a path that does not really match.
- Coverity Scan found this bug.
-
-Sat May 25 17:06:25 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (after_gc_sweep): reduce full GC timing.
-
-Sat May 25 11:28:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * variable.c (set_const_visibility): return without clearing method
- cache if no arguments.
-
- * vm_method.c (set_method_visibility): ditto.
-
-Sat May 25 11:27:32 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_method.c (set_method_visibility): quote unprintable method name.
-
-Sat May 25 11:24:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * eval.c (rb_frame_callee): returns the called name of the current
- frame, not the previous frame.
-
- * eval.c (prev_frame_callee, prev_frame_func): rename and make static,
- as these are used by rb_f_method_name() and rb_f_callee_name() only.
-
- * variable.c (set_const_visibility): use the called name.
-
-Sat May 25 08:58:23 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (rb_str_quote_unprintable): check if argument is a string.
-
-Fri May 24 19:32:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * variable.c (set_const_visibility): use rb_frame_this_func() instead
- of rb_frame_callee() for getting the name of the called method
-
- * test/ruby/test_module.rb: add test for private_constant with no args
-
-Fri May 24 18:53:10 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: do major/full GC when:
- * number of oldgen object is bigger than twice of
- number of oldgen object at last full GC.
- * number of remembered shady object is bigger than twice of
- number of remembered shady object at last full GC.
- * number of oldgen object and remembered shady object is bigger
- than half of total object space.
- (please fix my English!)
-
-Fri May 24 17:07:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
-
- * intern.h: remove dangling rb_class_init_copy declaration
- [ruby-core:55120] [Bug #8434]
-
-Fri May 24 16:31:23 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/strscan/strscan.c (strscan_aref): raise error if given
- name reference is not found.
-
-Fri May 24 15:48:18 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (after_gc_sweep, garbage_collect_body): do major GC (full GC)
- before extending heaps.
- TODO: do major GC when there are many old (promoted) objects.
-
- * gc.c (after_gc_sweep): remove TODO comments.
-
-Fri May 24 11:04:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (LIBRUBY_RPATHFLAGS): do not append -L option with
- runtime library directory if cross compiling, but only -R option.
- runtime path makes no sense on the host system. [ruby-dev:47363]
- [Bug #8443]
-
-Fri May 24 02:57:17 2013 Koichi Sasada <ko1@atdot.net>
-
- * object.c (rb_obj_clone): should not propagate OLDGEN status.
- This propagation had caused WB miss for class.
-
-Thu May 23 17:35:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * load.c (loaded_feature_path): fix invalid read by index underflow.
- the beginning of name is also a boundary as well as just after '/'.
-
-Thu May 23 17:21:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (gc_profile_dump_on): revert r40898. ok to show the record
- accumulating while lazy_sweep().
-
-Wed May 22 16:50:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (gc_profile_dump_on): use size_t to get rid of overflow and
- show the header when next_index > 0, instead of next_index != 1.
-
-Wed May 22 15:18:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/win32.c (setup_overlapped): check the error code in addition
- to the result of SetFilePointer() to determine if an error occurred,
- because INVALID_SET_FILE_POINTER is a valid value.
- [ruby-core:55098] [Bug #8431]
-
- * win32/win32.c (setup_overlapped, finish_overlapped): extract from
- rb_w32_read() and rb_w32_write().
-
-Wed May 22 14:19:56 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_prepare_free_objects, rest_sweep, lazy_sweep): fix position
- of `during_gc' setting.
-
-Wed May 22 07:36:08 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (garbage_collect): all GC is start from garbage_collect()
- (or garbage_collect_body()). `garbage_collect()' accept additional
- two parameters `full_mark' and `immediate_sweep'.
- If `full_mark' is TRUE, then force it full gc (major gc), otherwise,
- it depends on status of object space. Now, it will be minor gc.
- If `immediate_sweep' is TRUE, then disable lazy sweep.
- To allocate free memory, `full_mark' and `immediate_sweep' should be
- TRUE. Otherwise, they should be FALSE.
-
- * gc.c (gc_prepare_free_objects): use `garbage_collect_body()'.
-
- * gc.c (slot_sweep, before_gc_sweep, after_gc_sweep): add logging code.
-
-Tue May 21 22:47:06 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/strscan/strscan.c (strscan_aref): support named captures.
- patched by Konstantin Haase [ruby-core:54664] [Feature #8343]
-
-Tue May 21 21:48:44 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * test/ruby/test_dir_m17n.rb (TestDir_M17N#test_entries_compose):
- Use #each instead of #map just for iteration.
-
-Tue May 21 19:57:22 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * ext/digest/lib/digest.rb (Digest::Class.file): Take optional
- arguments that are passed to the constructor of the digest
- class.
-
-Tue May 21 17:21:12 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: remove gc_profile_record::is_marked. always true.
-
-Tue May 21 17:13:40 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: fix to collect additional information for GC::Profiler.
- * major/minor GC
- * trigger reason of GC
-
- * gc.c (gc_profile_dump_on): change reporting format with
- added information.
-
- * gc.c (gc_profile_record_get): return added information by
- :GC_FLAGS => array.
-
-Tue May 21 16:45:31 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: GC::Profiler's sweeping time is accumulated all slot
- sweeping time. At lazy GC, GC::Profiler makes new record entry
- for each lazy_sweep(). In this change, accumulating all
- slot_sweep() time.
- And change indentation.
-
-Tue May 21 16:29:09 2013 Koichi Sasada <ko1@atdot.net>
-
- * common.mk (rdoc-bench): add a benchmark rule
- using RDoc. Generate all rdoc related files
- (same as `make rdoc') in temporary directory
- and remove them. Execution time, GC::Profiler
- and results of GC.stat are printed.
-
- * tool/rdocbench.rb: added for `rdoc-bench'.
-
-Tue May 21 16:25:05 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (gc_profile_dump_on): `count' should be (int) because it
- can be negative number.
- And use pointer for `record' (don't copy).
-
-Tue May 21 03:11:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * dir.c (dir_each): compose HFS file names from
- UTF8-MAC. [ruby-core:48745] [Bug #7267]
-
-Tue May 21 03:08:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * test/ruby/envutil.rb (assert_separately): require envutil in the
- child process too.
-
-Tue May 21 03:07:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * string.c (rb_str_conv_enc_opts): should infect.
-
-Mon May 20 22:24:45 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/set.rb (Set#delete_if, Set#keep_if): Avoid blockless call of
- proc, which is not portable to JRuby. Replace &method() with
- faster and simpler literal blocks while at it.
-
-Mon May 20 22:00:31 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/e2mmap.rb: Format of E2MM documentation
-
-Mon May 20 21:41:15 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/extmk.rb: nodoc this file
-
-Mon May 20 20:43:32 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/cmath.rb: Remove duplicate RDoc heading from overview
-
-Mon May 20 20:36:19 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/securerandom.rb: Update position of overview for RDoc
-
-Mon May 20 19:33:55 2013 Benoit Daloze <eregontp@gmail.com>
-
- * math.c: improve and fix documentation of sin, tan and log
-
-Mon May 20 19:31:49 2013 Benoit Daloze <eregontp@gmail.com>
-
- * lib/logger.rb (Logger::Application): show namespace in documentation
-
-Mon May 20 11:50:12 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/pp.rb: Revert part of r40834 and nodoc PP::ObjectMixin
- [ruby-core:55068]
-
-Mon May 20 10:40:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/webrick/htmlutils.rb (WEBrick::HTMLUtils#escape): replace HTML
- meta chars even in non-ascii string. [Bug #8425] [ruby-core:55052]
-
- * lib/webrick/httputils.rb (WEBrick::HTTPUtils#{_escape,_unescape}):
- fix %-escape encodings. [Bug #8425] [ruby-core:55052]
-
- * lib/webrick/httpservlet/filehandler.rb (set_dir_list): revert r20152
- partially and fix misuse of bytesize and regexp repetition operator.
-
-Mon May 20 08:03:51 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/profiler.rb: Document Profiler__ methods
-
-Mon May 20 08:02:13 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/tempfile.rb: nodoc Tempfile#inspect
-
-Mon May 20 07:48:24 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/stringio/stringio.c: Correct position of method rdoc
-
-Mon May 20 07:27:41 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * math.c: RDoc formatting of Math core docs with domains and codomains
- Patch by @eLobato [Fixes GH-309]
-
-Mon May 20 05:58:12 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/bigdecimal/bigdecimal.c: Formatting for BigMath [Fixes GH-306]
- Based on a patch by @eLobato.
- * ext/bigdecimal/lib/bigdecimal/math.rb: ditto
-
-Mon May 20 04:56:59 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/forwardable.rb: Forwardable examples in overview were broken
- Based on patch by @joem [Fixes GH-303] [Bug #8392]
-
-Mon May 20 03:35:26 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/optparse.rb: nodoc OptionParser::Version and SPLAT_PROC
-
-Mon May 20 03:16:52 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/pp.rb: Document PP::ObjectMixin [Fixes GH-312]
-
-Sun May 19 23:52:22 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
-
- * test/webrick/test_htmlutils.rb: add test for WEBrick::HTMLUtils.
-
-Sun May 19 23:12:07 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
-
- * encoding.c: document fix, change default script encoding.
- patched by @windwiny [Fixes GH-310]
-
-Sun May 19 17:29:07 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/set.rb (Set#delete_if, Set#keep_if): Add comments.
-
-Sun May 19 11:37:36 2013 Kazuki Tsujimoto <kazuki@callcc.net>
-
- * ext/fiddle/extconf.rb: ignore rc version of libffi to fix build failure.
-
-Sun May 19 10:38:50 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * misc/ruby-electric.el (ruby-electric-delete-backward-char): Use
- delete-char instead of delete-backward-char, which is an
- interactive function.
-
-Sun May 19 03:59:29 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * string.c (str_scrub0): added for refactoring.
-
-Sun May 19 03:48:26 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * lib/uri/common.rb (URI.decode_www_form): scrub string if decoded
- bytes are invalid for the encoding.
-
-Sun May 19 02:46:32 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * lib/set.rb (Set#delete_if, Set#keep_if): Make Set#delete_if and
- Set#keep_if more space and time efficient by avoiding to_a.
-
-Sun May 19 02:33:09 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * misc/ruby-electric.el (ruby-electric-setup-keymap): Make
- backquotes electric as well. It was listed in
- ruby-electric-expand-delimiters-list but not activated.
-
- * misc/ruby-electric.el (ruby-electric-delete-backward-char):
- Introduce electric DEL that deletes what the previous electric
- command has input.
-
- * misc/ruby-electric.el (ruby-electric-matching-char): Make
- electric quotes work again at the end of buffer.
-
-Sun May 19 01:39:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (setjmp-type): check if setjmpex() is really available.
- workaround for i686-w64-mingw32 which declares it but lacks its
- definition.
-
- * include/ruby/defines.h: include setjmpex.h only if also setjmpex()
- is available.
-
-Sat May 18 23:57:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (setjmp-type): use setjmpex() on w64-mingw32 to get rid
- of -Wclobbered warnings.
-
- * include/ruby/defines.h: include setjmpex.h here becase setjmp.h is
- included from win32.h via intrin.h, winnt.h, and so on.
-
-Sat May 18 20:28:12 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/mkconstants.rb (INTEGER2NUM): Make less comparisons.
-
-Sat May 18 20:15:28 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * string.c (str_scrub_bang): add String#scrub!. [Feature #8414]
-
-Sat May 18 16:59:52 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/mkconstants.rb (INTEGER2NUM): Renamed from INTEGER2VALUE.
-
-Sat May 18 16:57:58 2013 Tanaka Akira <akr@fsij.org>
+ * proc.c (rb_method_call_with_block, umethod_bind): call with
+ IClass including the module for a module instance method.
+ [ruby-core:61936] [Bug #9721]
- * ext/socket/mkconstants.rb (INTEGER2VALUE): Suppress a warning:
- comparison between signed and unsigned integer expressions
+ * vm_insnhelper.c (vm_search_super_method): allow bound
+ UnboundMethod case.
-Sat May 18 16:38:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Apr 11 12:02:30 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * compile.c (iseq_compile_each): forward anonymous and first keyword
- rest argument one. [ruby-core:55033] [Bug #8416].
+ * addr2line.c (rb_dump_backtrace_with_lines): set base address
+ which is retrieved from dladdr to dladdr_fbases, to skip already
+ parsed objects.
-Sat May 18 15:49:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Apr 11 12:44:50 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * vm_core.h (rb_vm_tag): move jmpbuf between tag and prev so ensure to
- be accessible.
+ * array.c (ary_reject): may be turned into a shared array during
+ the given block. [ruby-dev:48101] [Bug #9727]
-Sat May 18 11:05:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu Apr 10 23:41:21 2014 Akinori MUSHA <knu@iDaemons.org>
- * enumerator.c (inspect_enumerator): use VALUE instead of mere char*
- by using rb_sprintf() and rb_id2str().
+ * lib/net/ftp.rb (Net::FTP#login): [DOC] The default password for
+ anonymous login was changed to "anonymous@" in r25313.
- * enumerator.c (append_method): extract from inspect_enumerator().
+Thu Apr 10 19:22:58 2014 Koichi Sasada <ko1@atdot.net>
-Sat May 18 09:00:32 2013 Tanaka Akira <akr@fsij.org>
+ * test/ruby/test_array.rb: remove useless `assert'.
- * ext/socket/mkconstants.rb (INTEGER2VALUE): Use LONG2FIX if possible.
+Thu Apr 10 19:11:11 2014 Koichi Sasada <ko1@atdot.net>
-Sat May 18 00:38:47 2013 Tanaka Akira <akr@fsij.org>
+ * array.c (rb_ary_modify): remember shared array owner if a shared
+ array owner is promoted and a shared array is not promoted.
- * ext/socket/mkconstants.rb: Convert integer constants bigger than int
+ Now, shared array is WB-unprotected so that shared arrays are not
+ promoted. All objects referred from shared array should be marked
correctly.
-Fri May 17 22:02:15 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/ifaddr.c: Use unsigned LONG_LONG to represent flags
- because SunOS 5.11 (OpenIndiana) defines ifa_flags as uint64_t.
-
-Fri May 17 21:47:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * cont.c: Typo in constant MAX_MACHINE_STACK_CACHE from '..MAHINE..'
- patch by @schmurfy [Fixes GH-307]
-
-Fri May 17 19:18:24 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * misc/ruby-electric.el (ruby-electric-matching-char): Do not put
- a closing quote when the quote typed does not start a string, as
- in $', ?\' or ?\".
-
-Fri May 17 18:06:15 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Consider error messages to find out version option of
- C compiler.
- The C compiler of Sun Studio C emits "Warning: Option -qversion
- passed to ld, if ld is invoked, ignored otherwise" and exit
- successfully.
-
-Fri May 17 17:34:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * gc.c (rb_gc_guarded_ptr): unoptimize on other compilers than gcc and
- msvc.
-
-Fri May 17 11:06:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * eval_intern.h (TH_PUSH_TAG): ensure jmpbuf to be accessible before
- pushing tag to get rid of unaccessible tag by stack overflow.
-
-Thu May 16 17:15:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * vm_eval.c (rb_catch_obj): add volatile to tag to prevent crash
- experimentally.
- http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130515T133500Z.log.html.gz
-
-Thu May 16 16:19:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/Makefile.sub (verconf.in): no longer used.
-
- * win32/Makefile.sub (config.status): fix typo.
-
- * configure.in, template/verconf.h.in (RUBY_EXEC_PREFIX): fix for
- default prefix.
-
-Thu May 16 13:12:27 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * template/verconf.h.in: generate verconf.h from the template and
- rbconfig.rb.
-
-Thu May 16 05:47:18 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/visitors/yaml_tree.rb: fix syntax error.
- Thanks @spastorino! [ruby-core:55011]
-
-Thu May 16 03:05:45 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_node_newnode): use newobj_of() instead of rb_newobj().
-
-Thu May 16 02:03:39 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/depend: Add a dependency for ifaddr.o.
-
-Thu May 16 01:44:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * common.mk (verconf.h): $< cannot be used in explicit rules with
- nmake.
-
- * win32/Makefile.sub (CONFIG_H): create verconf.in instead of
- verconf.h.
-
-Thu May 16 01:25:07 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/visitors/yaml_tree.rb: only emit warnings when
- -w is enabled.
-
-Wed May 15 18:58:17 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (newobj): rename to `newobj_of' and accept additional
- three parameters v1, v2, v3. newobj_of() do OBJSETUP() and
- fill values with v1, v2, v3.
-
- * gc.c (rb_data_object_alloc, rb_data_typed_object_alloc):
- use newobj_of().
-
-Wed May 15 17:55:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (RUBY_PLATFORM): move to config.h as needed by
- version.c.
-
-Wed May 15 17:04:11 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: add an additional RGENGC_PROFILE mode (2).
- Profiling result can be check by GC.stat.
-
- * gc.c (type_name): separate from obj_type_name().
-
-Wed May 15 16:58:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: save configured load path values into verconf.in.
-
- * common.mk (verconf.h): create from verconf.in with shvar_to_cpp.rb.
-
- * tool/shvar_to_cpp.rb: turn shell variables into C macros.
- [Bug #7959]
-
- * loadpath.c: split load path staffs from version.c.
-
- * dmyloadpath.c: miniruby has no builtin load paths, so verconf.h is
- not needed.
-
-Wed May 15 03:56:09 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/visitors/yaml_tree.rb: adding backwards
- compatible YAMLTree.new method
-
-Wed May 15 02:22:16 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych.rb: Adding Psych.safe_load for loading a user
- defined, restricted subset of Ruby object types.
- * ext/psych/lib/psych/class_loader.rb: A class loader for
- encapsulating the logic for which objects are allowed to be
- deserialized.
- * ext/psych/lib/psych/deprecated.rb: Changes to use the class loader
- * ext/psych/lib/psych/exception.rb: ditto
- * ext/psych/lib/psych/json/stream.rb: ditto
- * ext/psych/lib/psych/nodes/node.rb: ditto
- * ext/psych/lib/psych/scalar_scanner.rb: ditto
- * ext/psych/lib/psych/stream.rb: ditto
- * ext/psych/lib/psych/streaming.rb: ditto
- * ext/psych/lib/psych/visitors/json_tree.rb: ditto
- * ext/psych/lib/psych/visitors/to_ruby.rb: ditto
- * ext/psych/lib/psych/visitors/yaml_tree.rb: ditto
- * ext/psych/psych_to_ruby.c: ditto
- * test/psych/helper.rb: ditto
- * test/psych/test_safe_load.rb: tests for restricted subset.
- * test/psych/test_scalar_scanner.rb: ditto
- * test/psych/visitors/test_to_ruby.rb: ditto
- * test/psych/visitors/test_yaml_tree.rb: ditto
-
-Wed May 15 02:06:35 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * test/psych/helper.rb: envutil is not available outside Ruby, so
- port the functions from envutil to the test helper.
-
- * test/psych/test_deprecated.rb: ditto
-
- * test/psych/test_encoding.rb: ditto
-
-Wed May 15 00:42:54 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * signal.c: need to include unistd.h for write(2).
- unistd.h is now included via ruby/defines.h, but should explicitly
- include here. (suggested by kosaki)
-
-Tue May 14 23:43:05 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/.document: Add ifaddr.c.
-
-Tue May 14 23:24:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/socket/extconf.rb: check for if_nametoindex() for
- i686-w64-mingw32, and check for declarations of if_indextoname() and
- if_nametoindex().
-
- * ext/socket/ifaddr.c (ifaddr_ifindex): not-implement unless
- if_nametoindex() is available.
-
- * ext/socket/rubysocket.h: declare if_indextoname() and
- if_nametoindex() if available but not declared.
-
-Tue May 14 19:58:17 2013 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
-
- * ext/dl/lib/dl/func.rb (DL::Function#call): check tainted when
- $SAFE > 0.
- * ext/fiddle/function.c (function_call): check tainted when $SAFE > 0.
- * test/fiddle/test_func.rb (module Fiddle): add test for above.
-
-
-Tue May 14 14:51:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/win32.h (INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX): split
- from intptr_t and uintptr_t, since VC9 defines the latter only in
- crtdefs.h.
-
-Tue May 14 12:21:28 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/win32.c (NET_LUID): mingw may have NET_LUID and not defined
- _IFDEF_.
-
-Tue May 14 03:33:17 2013 Koichi Sasada <ko1@atdot.net>
-
- * string.c (rb_str_new_frozen): remove debug print.
-
-Tue May 14 03:22:51 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: enable to generate write barrier protected
- arrays (T_ARRAY).
-
-Tue May 14 03:21:42 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: enable to generate write barrier protected
- strings (T_STRING).
-
-Tue May 14 03:19:59 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: enable to generate write barrier protected
- objects (T_OBJECT).
-
-Tue May 14 03:17:15 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: enable to generate write barrier protected
- objects for numeric types (Float, Complex, Rational, Bignum).
-
-Tue May 14 03:10:59 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: enable RGENGC (USE_RGENGC)
- but no type creates write protected (sunny) objects
- (RGENGC_WB_PROTECTED_* == 0).
-
-Tue May 14 02:47:30 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: support RGENGC. [ruby-trunk - Feature #8339]
- See this ticket about RGENGC.
-
- * gc.c: Add several flags:
- * RGENGC_DEBUG: if >0, then prints debug information.
- * RGENGC_CHECK_MODE: if >0, add assertions.
- * RGENGC_PROFILE: if >0, add profiling features.
- check GC.stat and GC::Profiler.
-
- * include/ruby/ruby.h: disable RGENGC by default (USE_RGENGC == 0).
-
- * array.c: add write barriers for T_ARRAY and generate sunny objects.
-
- * include/ruby/ruby.h (RARRAY_PTR_USE): added. Use this macro if
- you want to access raw pointers. If you modify the contents which
- pointer pointed, then you need to care write barrier.
-
- * bignum.c, marshal.c, random.c: generate T_BIGNUM sunny objects.
-
- * complex.c, include/ruby/ruby.h: add write barriers for T_COMPLEX
- and generate sunny objects.
-
- * rational.c (nurat_s_new_internal), include/ruby/ruby.h: add write
- barriers for T_RATIONAL and generate sunny objects.
-
- * internal.h: add write barriers for RBasic::klass.
-
- * numeric.c (rb_float_new_in_heap): generate sunny T_FLOAT objects.
-
- * object.c (rb_class_allocate_instance), range.c:
- generate sunny T_OBJECT objects.
-
- * string.c: add write barriers for T_STRING and generate sunny objects.
-
- * variable.c: add write barriers for ivars.
-
- * vm_insnhelper.c (vm_setivar): ditto.
-
- * include/ruby/ruby.h, debug.c: use two flags
- FL_WB_PROTECTED and FL_OLDGEN.
-
- * node.h (NODE_FL_CREF_PUSHED_BY_EVAL, NODE_FL_CREF_OMOD_SHARED):
- move flag bits.
-
-Tue May 14 01:54:48 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: remove rb_objspace_t::marked_num.
- We can use `objspace_live_num()' instead of removed `marked_num'
- if it is after `after_gc_sweep()' function call.
-
- * gc.c (after_gc_sweep): use objspace_live_num() instead of removed
- rb_objspace_t::marked_num.
-
- * gc.c (gc_mark_ptr, gc_marks): remove rb_objspace_t::marked_num code.
-
- * gc.c (gc_prepare_free_objects): do not call set_heaps_increment()
- with checking objspace->heap.marked_num. At this point, we only
- need to check availability of free-cell.
-
- * gc.c (lazy_sweep): call after_gc_sweep() if there are no sweep_able entry.
-
- * gc.c (rest_sweep, gc_prepare_free_objects): remove after_gc_sweep() call.
-
-Tue May 14 01:50:41 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: disable GC_PROFILE_MORE_DETAIL (fix last commit).
-
- * gc.c (gc_prof_set_malloc_info): fix "objspace->heap.live_num" to
- "objspace_live_num(objspace)". There is no such member variable.
-
-Tue May 14 01:25:55 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c: refactoring GC::Profiler.
-
- * gc.c (gc_prof_sweep_timer_start/stop): removed because
- they doesn't support lazy sweep.
-
- * gc.c (gc_prof_sweep_slot_timer_start/stop): added.
- redefine `sweeping time' to accumulated time of all of
- slot_sweep().
-
- * gc.c (rb_objspace_t::profile::count): renamed to
- rb_objspace_t::profile::next_index. `counter' seems ambiguous.
- increment it when next record is acquired.
-
-Tue May 14 00:48:55 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: constify RRational::(num,den) and
- RComplex::(real,imag).
- Add macro to set these values:
- * RRATIONAL_SET_NUM()
- * RRATIONAL_SET_DEN()
- * RCOMPLEX_SET_REAL()
- * RCOMPLEX_SET_IMAG()
- This change is a part of RGENGC branch [ruby-trunk - Feature #8339].
-
- TODO: API design. RRATIONAL_SET(rat,num,den) is enough?
- TODO: Setting constify variable with cast has same issue of r40691.
-
- * complex.c, rational.c: use above macros.
-
-Mon May 13 21:49:17 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/extconf.rb: Check socketpair again.
- It is required on Unix.
-
-Mon May 13 21:20:32 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/win32.c (getipaddrs): use alternative interface name if
- available, because if_nametoindex() requires them.
-
-Mon May 13 20:23:24 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/win32.c, include/ruby/win32.h (getipaddrs): [experimental]
- emulate getipaddrs(3) on Unix.
-
- * win32/Makefile.sub, configure.in (LIBS): need iphlpapi.lib for above
- function.
-
- * include/ruby/win32.h (socketpair): rb_w32_socketpair() doesn't
- substitute for any function, so use non-prefixed name.
-
- * ext/socket/extconf.rb (socketpair); follow above change.
-
-Mon May 13 20:11:06 2013 Koichi Sasada <ko1@atdot.net>
-
- * iseq.c (prepare_iseq_build): remove additional line break.
-
-Mon May 13 19:29:54 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: constify RBasic::klass and add
- RBASIC_CLASS(obj) macro which returns a class of `obj'.
- This change is a part of RGENGC branch [ruby-trunk - Feature #8339].
-
- * object.c: add new function rb_obj_reveal().
- This function reveal internal (hidden) object by rb_obj_hide().
- Note that do not change class before and after hiding.
- Only permitted example is:
- klass = RBASIC_CLASS(obj);
- rb_obj_hide(obj);
- ....
- rb_obj_reveal(obj, klass);
-
- TODO: API design. rb_obj_reveal() should be replaced with others.
-
- TODO: modify constified variables using cast may be harmful for
- compiler's analysis and optimization.
- Any idea to prohibit inserting RBasic::klass directly?
- If rename RBasic::klass and force to use RBASIC_CLASS(obj),
- then all codes such as `RBASIC(obj)->klass' will be
- compilation error. Is it acceptable? (We have similar
- experience at Ruby 1.9,
- for example "RARRAY(ary)->ptr" to "RARRAY_PTR(ary)".
-
- * internal.h: add some macros.
- * RBASIC_CLEAR_CLASS(obj) clear RBasic::klass to make it internal
- object.
- * RBASIC_SET_CLASS(obj, cls) set RBasic::klass.
- * RBASIC_SET_CLASS_RAW(obj, cls) same as RBASIC_SET_CLASS
- without write barrier (planned).
- * RCLASS_SET_SUPER(a, b) set super class of a.
-
- * array.c, class.c, compile.c, encoding.c, enum.c, error.c, eval.c,
- file.c, gc.c, hash.c, io.c, iseq.c, marshal.c, object.c,
- parse.y, proc.c, process.c, random.c, ruby.c, sprintf.c,
- string.c, thread.c, transcode.c, vm.c, vm_eval.c, win32/file.c:
- Use above macros and functions to access RBasic::klass.
-
- * ext/coverage/coverage.c, ext/readline/readline.c,
- ext/socket/ancdata.c, ext/socket/init.c,
- * ext/zlib/zlib.c: ditto.
-
-Mon May 13 18:44:14 2013 Koichi Sasada <ko1@atdot.net>
-
- * *.c, parse.y, insns.def: use RARRAY_AREF/ASET macro
- instead of using RARRAY_PTR().
-
-Mon May 13 16:53:53 2013 Koichi Sasada <ko1@atdot.net>
-
- * include/ruby/ruby.h: add new utility macros to access
- Array's element.
- * RARRAY_AREF(a, i) returns i-th element of an array `a'
- * RARRAY_ASET(a, i, v) set i-th element of `a' to `v'
- This change is a part of RGENGC branch [ruby-trunk - Feature #8339].
-
-Mon May 13 15:31:10 2013 Koichi Sasada <ko1@atdot.net>
-
- * object.c (rb_obj_setup): added.
-
- * include/ruby/ruby.h (OBJSETUP): use rb_obj_setup() instead of
- a macro.
-
-Mon May 13 15:24:16 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_data_object_alloc): check klass only if klass is not 0.
- klass==0 means internal object.
-
-Mon May 13 14:57:28 2013 Koichi Sasada <ko1@atdot.net>
-
- * gc.c (rb_data_object_alloc, rb_data_typed_object_alloc):
- use NEWOBJ_OF() instead of NEWOBJ().
-
-Mon May 13 14:51:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (rb_obj_singleton_method): new method Kernel#singleton_method
- which returns a Method object of the singleton method.
- non-singleton method causes NameError, but not aliased or zsuper
- method, right now.
- [ruby-core:54914] [Feature #8391]
-
- * vm_method.c (rb_method_entry_at): return the method entry for id at
- klass, without ancestors.
-
- * class.c (rb_singleton_class_get): get the singleton class if exists,
- or nil.
-
-Mon May 13 10:20:59 2013 Yuki Yugui Sonoda <yugui@google.com>
-
- * ext/openssl/ossl_ssl.c: Disabled OpenSSL::SSL::SSLSocket if
- defined(OPENSSL_NO_SOCK).
-
- This fixes a linkage error on platforms which do not have socket.
- OpenSSL itself is still useful as a set of cryptographic functions
- even on such platforms.
-
-Mon May 13 10:30:04 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * hash.c: Hash[] and {} are not equivalent by @eam [Fixes GH-301]
-
-Mon May 13 10:04:22 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * random.c: Document Random::DEFAULT by @eLobato [Fixes GH-304]
-
-Sun May 12 21:12:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/ruby.h (OFFT2NUM): RUBY_REPLACE_TYPE also defines macro
- to convert int type to VALUE if found.
-
-Wed May 8 13:46:52 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * include/ruby/intern.h (rb_iv_set, rb_iv_get): removed. Because
- ruby.h has a declaration for that.
-
-Wed May 8 13:49:06 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * include/ruby/intern.h (rb_uint2big, rb_int2big, rb_uint2inum)
- (rb_int2inum, rb_ll2inum, rb_ull2inum): removed because ruby.h
- has a declaration for these.
-
-Sun May 12 17:52:23 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: removes 'ac_cv_func_fseeko=yes' form MinGW
- specific definitions.
-
-Sun May 12 17:25:46 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * file.c (rb_file_s_truncate): use correct type. chsize takes
- a long.
-
-Sun May 12 17:18:46 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * process.c: move '#define HAVE_SPAWNV 1' to win32/Makefile.sub.
- * win32/Makefile.sub: see above.
-
-Sun May 12 17:13:32 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: removes AC_CHECK_FUNCS(setitimer) because it's
- unused.
-
-Sun May 12 17:08:16 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: removes AC_CHECK_FUNCS(pause) because it's unused.
-
-Sun May 12 17:05:18 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * signal.c (rb_f_kill): fixes typo. s/HAS_KILLPG/HAVE_KILLPG/.
-
-Sun May 12 17:03:27 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: abort if gettimeofday doesn't exist.
-
-Sun May 12 16:31:27 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: adds RUBY_REPLACE_TYPE(off_t) for creating
- NUM2OFFT.
- * file.c (rb_file_truncate): use correct type. chsize() take
- a long.
- * include/ruby/ruby.h (NUM2OFFT): use a definition created by
- a configure script by default.
-
-Sun May 12 16:03:41 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: removes AC_CHECK_FUNC(fseeko, fseeko64, ftello,
- ftello64). They are not used from anywhere.
-
- * win32/win32.c (fseeko): removes.
- * win32/win32.c (rb_w32_ftello): removes.
- * include/ruby/win32.h: removes declarations of rb_w32_ftello and
- rb_w32_fseeko.
- * win32/Makefile.sub: removes '#define HAVE_FTELLO 1'.
-
-Sun May 12 15:51:47 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: remove AC_CHECK_FUNC(close). It is not used from
- anywhere.
-
-Sun May 12 15:50:45 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: adds comments for setjmp check.
-
-Sun May 12 15:38:09 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: move clock_gettime() check into regular place.
-
-Wed May 8 13:45:53 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: add getenv() declaration check.
- * dln_find.c: add HAVE_DECL_GETENV test.
-
-Sun May 12 15:33:18 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * configure.in: sorts AC_CHECK_FUNCS()s as alphabetical order.
-
-Wed May 8 13:41:57 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * bignum.c: remove redundant decl for big_lshift() big_rshift().
-
-Sun May 12 16:06:43 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/socket/rubysocket.h (rsock_inspect_sockaddr): as r40646
- check HAVE_TYPE_STRUCT_SOCKADDR_DL.
-
-Sat May 11 23:01:58 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/socket/rubysocket.h (HAVE_TYPE_STRUCT_SOCKADDR_DL):
- MSVC has struct sockaddr_dl, but its content is broken.
- http://ruby-mswin.cloudapp.net/vc10-x64/ruby-trunk/log/20130511T103938Z.log.html.gz
-
-Sat May 11 22:07:42 2013 Tanaka Akira <akr@fsij.org>
-
- * test/rinda/test_rinda.rb: Socket.getifaddrs may returns an interface
- which #addr method returns nil for venet0 in OpenVZ.
-
-Sat May 11 21:56:34 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/raddrinfo.c (rsock_inspect_sockaddr): Add casts to
- suppress warnings.
-
-Sat May 11 17:28:51 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket: New method, Socket.getifaddrs, implemented.
- [ruby-core:54777] [Feature #8368]
-
-Sat May 11 00:47:22 2013 Tanaka Akira <akr@fsij.org>
-
- * gc.h (SET_MACHINE_STACK_END): Add !defined(_ILP32) to a defining
- condition to avoid compilation error on x32.
- https://sites.google.com/site/x32abi/
-
-Fri May 10 23:56:34 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_peek_variable_name): treat invalid global, class,
- and instance variable names as mere strings rather than errors.
- [ruby-core:54885] [Bug #8375]
-
-Fri May 10 20:22:40 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Move library checks into "Checks for libraries." part.
-
-Fri May 10 19:32:01 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Reformat arguments of AC_CHECK_HEADERS and
- AC_CHECK_FUNCS to track modifications easily.
-
-Fri May 10 12:01:36 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Don't link librt if clock_gettime is available in
- the main C library.
- glibc 2.17 moves clock_* from librt to the main C library.
- http://sourceware.org/ml/libc-announce/2012/msg00001.html
-
-Thu May 9 22:00:35 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/ancdata.c (bsock_sendmsg_internal): controls_num should
- not be negative.
-
-Thu May 9 21:09:57 2013 Tanaka Akira <akr@fsij.org>
-
- * file.c, ext/etc/etc.c, ext/socket/unixsocket.c,
- ext/openssl/ossl.h, ext/openssl/openssl_missing.c: Use
- HAVE_AGGREGATE_MEMBER instead of HAVE_ST_MEMBER.
-
-Thu May 9 20:43:41 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/ancdata.c (bsock_sendmsg_internal): Always set
- controls_num to raise NotImplementedError appropriately.
- (bsock_recvmsg_internal): Raise NotImplementedError if
- :scm_rights=>true is given on platforms which don't have
- 4.4BSD style control message.
-
-Thu May 9 12:06:07 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/rubysocket.h, ext/socket/unixsocket.c,
- ext/socket/ancdata.c: Use HAVE_STRUCT_MSGHDR_MSG_CONTROL instead
- of HAVE_ST_MSG_CONTROL.
-
-Thu May 9 11:30:02 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * string.c: Add call-seq alias for String#=== [Bug #8381]
-
-Thu May 9 11:14:18 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * doc/contributing.rdoc: Add guide for contributing to CRuby
-
-Thu May 9 04:55:49 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Check socket library again. shutdown() is used in
- io.c.
-
-Thu May 9 01:52:31 2013 Tanaka Akira <akr@fsij.org>
-
- * configure.in: Don't check socketpair. socketpair is not used in
- ruby command itself.
-
-Thu May 9 01:05:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * class.c (rb_mod_included_modules): should not include non-modules.
- [ruby-core:53158] [Bug #8025]
-
-Wed May 8 22:46:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * class.c (rb_mod_included_modules): should not include the original
- module itself. [ruby-core:53158] [Bug #8025]
-
-Wed May 8 17:43:55 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * io.c (rb_io_ext_int_to_encs): ignore internal encoding if external
- encoding is ASCII-8BIT. [Bug #8342]
-
-Wed May 8 13:49:38 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/json/generator/generator.c (isArrayOrObject): cast char to
- unsigned char. [Bug #8378]
-
-Wed May 8 13:46:10 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/json/generator/depend: fix dependencies [Bug #8379]
-
- * ext/json/parser/depend: ditto.
-
-Wed May 8 13:07:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (parser_yylex): fail if $, @, @@ are not followed by a valid
- name character. [ruby-core:54846] [Bug #8375].
-
-Wed May 8 13:06:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/ruby.h (ISGRAPH): add missing macro.
-
-Wed May 8 06:42:56 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/socket/socket.c (socket_s_ip_address_list): fix wrongly filled
- sin6_scope_id on KAME introduced by r40593 for OpenIndiana.
- KAME uses fe80:<scope_id>::<interface id> for link-local address
- internally.
- Setting sin6_scope_id causes it leaked.
- see also comments of sockaddr_obj().
-
-Tue May 7 22:12:34 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/readline/readline.c (insert_ignore_escape): Add a cast to
- unsigned char * before dereference.
- This suppress a warning on Cygwin.
-
-Tue May 7 12:15:24 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/ancdata.c (bsock_recvmsg_internal): Add a cast to
- suppress warning.
- Bionic defines socklen_t as int.
- Bionic defines msg_controllen as unsigned int (__kernel_size_t)
- instead of socklen_t as POSIX.
-
-Tue May 7 12:12:42 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/ancdata.c (ancillary_inspect): Don't call
- anc_inspect_ipv6_pktinfo if !HAVE_TYPE_STRUCT_IN6_PKTINFO.
- anc_inspect_ipv6_pktinfo is not defined in the case.
-
-Tue May 7 12:10:52 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/socket.c (socket_s_ip_address_list): Cast EXTRA_SPACE as
- int. This suppress a warning.
-
-Tue May 7 12:09:29 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/extconf.rb: Set close_fds false for Cygwin.
- Cygwin doesn't support fd passing.
- This enables socket extension library cross-compilable by default.
+ [ruby-core:61919] [ruby-trunk - Bug #9718]
-Tue May 7 12:07:35 2013 Tanaka Akira <akr@fsij.org>
+ * test/ruby/test_array.rb: add a test for above.
- * pack.c (swap32): Don't redefine it if it is already defined.
- Bionic defines it.
- (swap64): Ditto.
+Thu Apr 10 18:57:12 2014 Koichi Sasada <ko1@atdot.net>
-Mon May 6 20:50:37 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c (gc_verify_internal_consistency): move lines and enable
+ allrefs_dump() on RGENGC_CHECK_MODE >= 4.
- * ext/socket/socket.c (socket_s_ip_address_list): Fill sin6_scope_id
- if getifaddrs() returns an IPv6 link local address which
- sin6_scope_id is zero, such as on OpenIndiana SunOS 5.11.
+Thu Apr 10 15:01:06 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sun May 5 18:56:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * addr2line.c (append_obj): clear allocated memory.
- * insns.def (defined): use vm_search_superclass() like as normal super
- call. based on a patch <https://gist.github.com/wanabe/5520026> by
- wanabe.
+ * addr2line.c (rb_dump_backtrace_with_lines): free `base_addrs'.
- * vm_insnhelper.c (vm_search_superclass): return error but not raise
- exceptions.
+Thu Apr 10 14:40:18 2014 Koichi Sasada <ko1@atdot.net>
- * vm_insnhelper.c (vm_search_super_method): check the result of
- vm_search_superclass and raise exceptions on error.
+ * gc.c (rb_gc_writebarrier_unprotect_promoted): disable to dump debug
+ message when RGENGC_CHECK_MODE == 0.
-Sun May 5 16:29:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu Apr 10 08:13:47 2014 Tanaka Akira <akr@fsij.org>
- * insns.def (defined): get method entry from the method top level
- frame, not block frame. [ruby-core:54769] [Bug #8367]
+ * signal.c (check_stack_overflow): Don't use ucontext_t if ucontext.h
+ is not available.
+ Fixes build on Android (x86).
-Sun May 5 13:28:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Apr 9 23:22:44 2014 Tanaka Akira <akr@fsij.org>
- * template/ruby.pc.in (Cflags): use rubyarchhdrdir for multiarch.
- [Bug #7874]
+ * gc.c (mark_current_machine_context): Call SET_STACK_END.
+ This reverts a hunk of r40703 by ko1.
+ This fixes [ruby-dev:48098] [Bug #9717].
-Sat May 4 07:20:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Wed Apr 9 21:02:04 2014 Tanaka Akira <akr@fsij.org>
- * doc/security.rdoc: Add note about reporting security vulns
+ * process.c (OBJ2UID1): Defined even if getpwnam_r is not usable.
+ (OBJ2GID1): Defined even if getgrnam_r is not usable.
+ This fixes compilation error on Android.
-Sat May 4 04:13:27 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Wed Apr 9 15:16:59 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * include/ruby/defines.h (RUBY_ATTR_ALLOC_SIZE): New for
- attribute((alloc_size(params))).
+ * encoding.c (rb_enc_default_internal): fix rdoc. `__FILE__` is
+ in filesystem encoding but not `default_internal`.
+ [ruby-core:61894] [Bug #9713]
- * include/ruby/defines.h (xmalloc, xmalloc2, xcalloc)
- (xrealloc, xrealloc2): Annotated by RUBY_ATTR_ALLOC_SIZE.
- * include/ruby/ruby.h (rb_alloc_tmp_buffer): ditto.
+Wed Apr 9 14:43:00 2014 Koichi Sasada <ko1@atdot.net>
-Fri May 3 19:32:13 2013 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
+ * test/ruby/test_gc.rb: more long timeout.
+ This test failed under RGENGC_CHECK_MODE >= 2.
- * lib/cgi/util.rb: All class methods modulized.
- We can use these methods like a function when "include CGI::Util".
- [Feature #8354]
+Wed Apr 9 13:07:13 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri May 3 14:09:45 2013 Tanaka Akira <akr@fsij.org>
+ * configure.in: get rid of __builtin_setjmp/__builtin_longjmp on
+ x64-mingw, which causes SEGV with callcc.
+ [ruby-core:61887] [Bug #9710]
- * ext/socket/extconf.rb: Make default_ipv6 true for Cygwin.
- Cygwin supports IPv6 since Cygwin 1.7.1 (2009-12).
- http://cygwin.com/ml/cygwin-announce/2009-12/msg00027.html
+Wed Apr 9 12:44:54 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri May 3 13:35:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * string.c (str_buf_cat): should round up the capacity by 4KiB,
+ but not number of rooms. [ruby-core:61886] [Bug #9709]
- * ext/socket/{getaddrinfo,getnameinfo}.c: define socklen_t if not
- defined, e.g., older VC.
+Tue Apr 8 22:55:32 2014 Akinori MUSHA <knu@iDaemons.org>
-Fri May 3 13:29:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/mkmf.rb (MakeMakefile#dir_config): [DOC] Improve
+ documentation.
- * include/ruby/win32.h (INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX): also
- should be defined when defining intptr_t and uintptr_t.
- bigdecimal.c requires the former two now.
+Tue Apr 8 22:31:44 2014 Koichi Sasada <ko1@atdot.net>
-Fri May 3 13:22:12 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * gc.c: rename `RGENGC_THREEGEN' to `RGENGC_AGE2_PROMOTION'.
- * win32/win32.c (poll_child_status): fix build error on older mingw.
+ * gc.c (rgengc_rememberset_mark): don't promote, but remain in
+ remember set for infant objects.
-Fri May 3 00:15:58 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+ * gc.c (RVALUE_PROMOTE_INFANT, RVALUE_PROMOTE_YOUNG): count numbers
+ in these functions.
- * common.mk: remove timestamps in distclean-ext realclean-ext.
+Mon Apr 7 21:11:49 2014 Tanaka Akira <akr@fsij.org>
-Thu May 2 23:23:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/socket/socket.c (sock_s_getnameinfo): Save errno for EAI_SYSTEM.
+ Reported by Saravana kumar. [ruby-core:61820] [Bug #9697]
+ Fixed by Heesob Park. [ruby-core:61868]
- * object.c (rb_obj_is_kind_of): skip prepending modules.
- [ruby-core:54742] [Bug #8357]
+Mon Apr 7 07:20:23 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * object.c (rb_class_inherited_p): ditto.
- [ruby-core:54736] [Bug #8357]
+ * lib/xmlrpc/client.rb (do_rpc): don't check body length.
+ If HTTP content-encoding is used, the length may be different.
+ [Bug #8182] [ruby-core:53811]
-Thu May 2 22:11:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Apr 7 02:39:48 2014 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
- * bin/irb: remove dead code from sample/irb.rb.
+ * lib/matrix.rb: Add Matrix#cofactor [fix GH-568]
+ Add first_minor [fix GH-568]
+ Handle empty diagonal matrix case [fix GH-576]
+ Patches by gogotanaka
-Thu May 2 17:32:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Apr 6 08:52:50 2014 Bugra Barin <bugrabarin@hotmail.com>
- * marshal.c (copy_ivar_i): get rid of overwriting already copied
- instance variables. c.f. [Bug #8276]
+ * dln.c (dln_load): use wchar version to load a library in
+ non-ascii path on Windows. based on the patch by Bugra Barin
+ <bugrabarin AT hotmail.com> in [ruby-core:61845]. [Bug #9699]
-Thu May 2 16:55:43 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Apr 5 19:36:33 2014 Tadayoshi Funaba <tadf@dotrb.org>
- * thread.c (id_locals): use cached ID.
+ * ext/date/date_core.c (d_lite_cmp): should compare with #<.
- * vm.c (ruby_thread_init): ditto.
+Sat Apr 5 00:31:21 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * defs/id.def: add more predefined IDs used in core.
+ * ext/readline/extconf.rb (rl_hook_func_t): check pointer type.
+ [ruby-dev:48089] [Bug #9702]
-Thu May 2 13:42:42 2013 Ryan Davis <ryand-ruby@zenspider.com>
+Fri Apr 4 07:13:44 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/minitest/*: Imported minitest 4.7.4 (r8483)
- * test/minitest/*: ditto
+ * configure.in (ac_cv_func___builtin_setjmp): should not skip
+ flags restoration in RUBY_WERROR_FLAG by `break`.
+ [ruby-dev:48086] [Bug #9698]
-Thu May 2 11:32:22 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+Wed Apr 2 21:50:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * win32/win32.c (poll_child_status): [experimental] set the cause of
- a child's death to status if its exitcode seems to be an error.
+ * configure.in (ac_cv_func___builtin_setjmp): __builtin_longjmp()
+ in Apple LLVM 5.1 (LLVM 3.4svn) uses `void**`, not `jmp_buf`.
+ [Bug #9692]
- * test/ruby/test_process.rb (TestProcess#test_no_curdir): maybe now
- we can test it.
+Wed Apr 2 20:57:15 2014 Koichi Sasada <ko1@atdot.net>
- * test/ruby/test_thread.rb (TestThread#test_thread_timer_and_interrupt):
- ditto.
+ * gc.c, gc.h (rb_objspace_each_objects_without_setup):
+ Add a new (hidden) C-API to iterate objspace snapshot.
-Thu May 2 11:24:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ This API is not safe to call any C-APIs in a given callback
+ function. Be careful to use this C-API.
- * lib/yaml.rb: nodoc EngineManager, add History doc #8344
+Wed Apr 2 17:43:17 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Wed May 1 21:11:17 2013 Tanaka Akira <akr@fsij.org>
+ * configure.in (ac_cv_func___builtin_setjmp): gcc 4.9 disallows a
+ variable as the second argument of __builtin_longjmp().
+ [ruby-core:61800] [Bug #9692]
- * time.c (localtime_with_gmtoff_zone): musl libc may return NULL for
- tm_zone.
+Wed Apr 2 15:12:18 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Wed May 1 18:59:36 2013 Benoit Daloze <eregontp@gmail.com>
+ * common.mk: Use redmine-2.x url for DeveloperHowto wiki.
+ [ruby-core:60657] [Bug #9511]
- * enum.c (Enumerable#chunk): fix grammar of error message
- for symbols beginning with an underscore [Bug #8351]
+Wed Apr 2 11:46:29 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-Wed May 1 16:47:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/pathname/lib/pathname.rb (Pathname#join): Fix error with
+ empty args. Reported by ko1 via IRC.
- * ext/curses/extconf.rb (curses_version): try once for each tests, a
- function or a variable. fallback to variable for old SVR4.
+ * test/pathname/test_pathname.rb (TestPathname#test_join): Add the
+ test for above case.
-Wed May 1 16:17:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Apr 1 11:39:57 2014 James Edward Gray II <james@graysoftinc.com>
- * ext/extmk.rb (extmake): extensions not to be installed should not
- make static libraries, but make dynamic libraries always.
+ * lib/csv.rb: Symbol HeaderConverter: strip leading/trailing space.
+ Reported by Skye Shaw
+ [Fixes GH-575]
-Wed May 1 12:20:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Tue Apr 1 11:34:04 2014 James Edward Gray II <james@graysoftinc.com>
- * lib/rake/version.rb: Fix RDoc warning with :include: [Bug #8347]
+ * lib/csv.rb: Don't attempt to convert nil headers.
+ Reported by Skye Shaw
-Wed May 1 11:40:25 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Apr 1 17:29:35 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * defs/id.def (predefined): add "idProc".
+ * tool/config_files.rb (ConfigFiles.download): show failed URI.
+ [ruby-core:61792] [Bug #9690]
- * eval.c (frame_func_id): use predefined IDs.
+Tue Apr 1 12:06:49 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * proc.c (mnew, mproc, mlambda): use predefined IDs.
+ * addr2line.c (rb_dump_backtrace_with_lines): don't depend hard coded
+ symbol '_start'.
- * vm.c (rb_vm_control_frame_id_and_class): ditto.
+ * addr2line.c (fill_lines): instead of above, get a dynamic symbol
+ in the main executable and use it to know the base address.
- * vm.c (Init_VM): ditto.
+ * addr2line.c (follow_debuglink0): use obj_info_t instead of
+ line_info_t to handle object related data.
-Tue Apr 30 23:18:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * addr2line.c (main_exe_path): defined for Linux.
- * lib/benchmark.rb: Update Benchmark results on newer CPU
+Tue Apr 1 08:58:39 2014 Kazuki Tsujimoto <kazuki@callcc.net>
-Tue Apr 30 12:31:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * parse.y (rb_str_dynamic_intern): set mark bit if dynamic symbol
+ is before sweeping.
- * proc.c (mproc, mlambda): use frozen core methods instead of plain
- global methods, so that methods cannot be overridden.
- [ruby-core:54687] [Bug #8345]
+Tue Apr 1 07:37:00 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * vm.c (Init_VM): define proc and lambda on the frozen core object.
+ * addr2line.c (fill_lines): use dynsym, which is used for dynamic
+ linking and always exists, if there's no symtab.
- * include/ruby/intern.h (rb_block_lambda): add declaration instead of
- deprecated rb_f_lambda.
+Tue Apr 1 07:27:15 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Mon Apr 29 17:02:30 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * vm_dump.c (rb_print_backtrace): current implementation
+ uses dladdr to get the path of objects.
- * ext/nkf/nkf-utf8/nkf.h: Bionic libc doesn't have locale.
- [Feature #8338]
+Mon Mar 31 23:57:45 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/readline/extconf.rb: fix typo, `$defs` not `$DEFS`.
+ [ruby-core:61756] [Bug #9578]
-Mon Apr 29 06:58:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Mar 31 17:23:50 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * ext/openssl/ossl_bn.c (ossl_bn_initialize): no need of alloca for
- small fixed size array.
+ * test/ruby/memory_status.rb: require envutil before accessing EnvUtil
+ module. reported by ko1 via twitter.
- * ext/openssl/ossl_bn.c (ossl_bn_initialize): check overflow first,
- and use alloca for small size input.
+Mon Mar 31 10:28:01 2014 Eric Wong <e@80x24.org>
-Mon Apr 29 00:40:13 2013 Benoit Daloze <eregontp@gmail.com>
+ * st.c (st_init_table_with_size): update comment
+ [Feature #9425]
- * lib/yaml.rb: Clarify documentation about YAML being always Psych.
- Give a tip about using Syck. See #8344.
+Sun Mar 30 23:39:26 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-Sun Apr 28 23:34:01 2013 Benoit Daloze <eregontp@gmail.com>
+ * win32/win32.c (rb_w32_accept, open_ifs_socket, socketpair_internal):
+ reset inherit flag of socket to avoid unintentional inheritance of
+ socket. note that the return value of SetHandleInformation() is not
+ verified intentionally because old Windows may return an error.
+ [Bug #9688] [ruby-core:61754]
- * lib/yaml.rb: Use another trick to define the YAML module.
- https://twitter.com/n0kada/status/328342207511801856
+Sat Mar 29 13:04:22 2014 Koichi Sasada <ko1@atdot.net>
-Sun Apr 28 23:19:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * gc.c (gc_before_sweep): cap `malloc_limit' to
+ gc_params.malloc_limit_max. It can grow and grow with such case:
+ `loop{"a" * (1024 ** 2)}'
+ [Bug #9687]
- * lib/pp.rb: Update PP module overview by @geopet
+ This issue is pointed by Tim Robertson.
+ http://www.omniref.com/blog/blog/2014/03/27/ruby-garbage-collection-still-not-ready-for-production/
-Sun Apr 28 22:04:37 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+Fri Mar 28 19:32:13 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/openssl/ossl_bn.c (ossl_bn_initialize): fix buffer overflow on
- x64 Windows and memory leak when initializing with integer.
- [ruby-core:54615] [Bug #8337]
+ * struct.c (not_a_member): extract name error and use same error
+ messages. based on the patch by Marcus Stollsteimer <sto.mar AT
+ web.de> at [ruby-core:61721]. [Bug #9684]
-Sun Apr 28 12:38:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Mar 28 09:21:54 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * README.EXT: correct method name to be used. [Bug #7982]
+ * ext/psych/psych.gemspec: update gemspec for psych-2.0.5
- * README.EXT.ja: add notes too.
+Fri Mar 28 09:11:06 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Sun Apr 28 10:35:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * ext/psych/lib/psych.rb: Merge psych-2.0.5. bump version to
+ libyaml-0.1.6 for CVE-2014-2525.
+ * ext/psych/yaml/config.h: ditto.
+ * ext/psych/yaml/scanner.c: ditto.
+ * ext/psych/yaml/yaml_private.h: ditto.
- * object.c: With feedback from Steve Klabnik, reverted a change to
- #untrusted? and #tainted?. Also adjusted grammar for $SAFE levels
+Thu Mar 27 18:58:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sun Apr 28 10:10:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * re.c (match_regexp): set regexp for MatchData from string.
- * lib/yaml.rb: Disable setting YAML const twice [ruby-core:54642]
+ * re.c (rb_backref_set_string): create MatchData from string and
+ set backref.
-Sun Apr 28 09:50:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * string.c (rb_pat_search, rb_str_sub, rb_str_sub_bang, str_gsub),
+ (scan_once, rb_str_scan, rb_str_partition): use rb_str_index
+ instead of rb_reg_search() when pattern is a String. based on
+ the patch by Sam Rawlins <sam.rawlins@gmail.com> [Fixes GH-579]
- * object.c: Documentation for taint and trust [Bug #8162]
+Thu Mar 27 11:58:55 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sun Apr 28 09:40:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * addr2line.c (fill_lines): check shdr[i].sh_type because even if
+ .symtab section exists, the section's type can be SHT_NOBITS and
+ actual data doesn't exist in the file.
+ revert r45441.
- * README.EXT: Copy note from r40505 for rb_sprintf() [Bug #7982]
+Wed Mar 26 14:57:35 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-Sun Apr 28 08:28:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * parse.y: inline must be static (for mswin).
+ fixed build error introduced at r45426.
- * ext/curses/curses.c: Update Curses::Window example for nicer output
- Patch by Michal Suchanek [Bug #8121] [ruby-core:53520]
+Wed Mar 26 14:33:00 2014 Narihiro Nakamura <authornari@gmail.com>
-Sun Apr 28 08:10:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * internal.h (USE_SYMBOL_GC): enable Symbol GC by default (USE_SYMBOL_GC == 1).
- * README.EXT: Update note from r40504, by Jeremy Evans [Bug #7982]
+Tue Mar 25 22:57:11 2014 Narihiro Nakamura <authornari@gmail.com>
-Sun Apr 28 08:02:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * parse.y: support Symbol GC. [ruby-trunk Feature #9634]
+ See this ticket about Symbol GC.
- * README.EXT: Add note to warn use of %i in Exceptions [Bug #7982]
+ * include/ruby/ruby.h:
+ Declare few functions.
+ * rb_sym2id: almost same as old SYM2ID but support dynamic symbols.
+ * rb_id2sym: almost same as old ID2SYM but support dynamic symbols.
+ * rb_sym2str: almost same as `rb_id2str(SYM2ID(sym))` but not
+ pin down a dynamic symbol.
+ Declare a new struct.
+ * struct RSymbol: represents a dynamic symbol as object in
+ Ruby's heaps.
+ Add few macros.
+ * STATIC_SYM_P: check a static symbol.
+ * DYNAMIC_SYM_P: check a dynamic symbol.
+ * RSYMBOL: cast to RSymbol
-Sun Apr 28 02:41:05 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c: declare RSymbol. support T_SYMBOL.
- * configure.in: Fix a typo. Should check endgrent() instead of
- endgrnam().
+ * internal.h: Declare few functions.
+ * rb_gc_free_dsymbol: free up a dynamic symbol. GC call this
+ function at a sweep phase.
+ * rb_str_dynamic_intern: convert a string to a dynamic symbol.
+ * rb_check_id_without_pindown: not pinning function.
+ * rb_sym2id_without_pindown: ditto.
+ * rb_check_id_cstr_without_pindown: ditto.
-Sun Apr 28 00:35:45 2013 Tanaka Akira <akr@fsij.org>
+ * string.c (Init_String): String#intern and String#to_sym use
+ rb_str_dynamic_intern.
- * process.c (obj2gid): Don't call endgrent() if not exist.
- Bionic (Android's libc) don't have endgrent().
+ * template/id.h.tmpl: use LSB of ID as a flag for determining a
+ static symbol, so we shift left other ruby_id_types.
- * configure.in: Check endgrnam function.
+ * string.c: use rb_sym2str instead `rb_id2str(SYM2ID(sym))` to
+ avoid pinning.
-Sat Apr 27 23:53:00 2013 Charlie Somerville <charlie@charliesomerville.com>
+ * load.c: use xx_without_pindown function at creating temporary ID
+ to avoid pinning.
- * lib/yaml.rb: add security warning to YAML documentation
+ * object.c: ditto.
-Sat Apr 27 23:25:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * sprintf.c: ditto.
- * lib/yaml.rb: Documentation for YAML module [Bug #8213]
+ * struct.c: ditto.
-Sat Apr 27 20:19:21 2013 Tanaka Akira <akr@fsij.org>
+ * thread.c: ditto.
- * thread_pthread.c (ruby_init_stack): Add STACK_GROW_DIR_DETECTION.
- This fixes a compilation failure while cross-compiling for Tensilica
- Xtensa Processor.
+ * variable.c: ditto.
-Sat Apr 27 19:32:44 2013 Benoit Daloze <eregontp@gmail.com>
+ * vm_method.c: ditto.
- * thread.c: fix typos and documentation
+Wed Mar 26 13:25:54 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sat Apr 27 19:04:55 2013 Tanaka Akira <akr@fsij.org>
+ * addr2line.c (fill_lines): loop reverse order not to overwrite
+ the basis of base addresses comparison.
- * sparc.c: Use __asm__ instead of asm for gcc.
- gcc doesn't provide asm keyword if -ansi option is given.
- http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html
+ * addr2line.c: use uintptr_t instead of intptr_t for pointers.
-Sat Apr 27 17:22:50 2013 Tanaka Akira <akr@fsij.org>
+ * addr2line.c (rb_dump_backtrace_with_lines): don't use syms.
- * ext/socket/extconf.rb: Redundant test removed.
+ * vm_dump.c (rb_print_backtrace): ditto.
-Sat Apr 27 16:00:10 2013 Tanaka Akira <akr@fsij.org>
+ * addr2line.h: ditto.
- * ext/socket/extconf.rb (test_recvmsg_with_msg_peek_creates_fds):
- Extracted.
+Wed Mar 26 11:20:50 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Apr 27 15:50:40 2013 Tanaka Akira <akr@fsij.org>
+ * marshal.c (w_object): internal objects are not dumpable.
+ [ruby-core:61677] [Bug #9674]
- * internal.h (SIGNED_INTEGER_TYPE_P): New macro.
- (SIGNED_INTEGER_MAX): Ditto.
- (SIGNED_INTEGER_MIN): Ditto.
- (UNSIGNED_INTEGER_MAX): Ditto.
- (TIMET_MAX): Use SIGNED_INTEGER_MAX and UNSIGNED_INTEGER_MAX.
- (TIMET_MIN): Use SIGNED_INTEGER_MIN.
+ * ext/thread/thread.c (undumpable): ConditionVariable and Queue
+ are not dumpable. [ruby-core:61677] [Bug #9674]
- * thread.c (TIMEVAL_SEC_MAX): Use SIGNED_INTEGER_MAX.
- (TIMEVAL_SEC_MIN): Use SIGNED_INTEGER_MIN.
+Wed Mar 26 10:36:39 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sat Apr 27 10:52:52 2013 Tanaka Akira <akr@fsij.org>
+ * addr2line.c (follow_debuglink): show message if it closes opened
+ (and maybe used) elf binary.
- * thread.c (TIMEVAL_SEC_MAX, TIMEVAL_SEC_MIN): Consider environments,
- sizeof(time_t) is smaller than sizeof(tv_sec), such as
- OpenBSD 5.2 (amd64).
+Wed Mar 26 10:34:25 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Fri Apr 26 23:34:59 2013 Kouhei Sutou <kou@cozmixng.org>
+ * addr2line.c (fill_line): pass and use offset instead of
+ curobj_baseaddr.
- * lib/rexml/text.rb (REXML::Text.normalize): Fix a bug that all
- entity filters are ignored. [ruby-dev:47278] [Bug #8302]
- Patch by Ippei Obayashi. Thanks!!!
- * test/rexml/test_entity.rb (EntityTester#test_entity_filter): Add
- a test of the above change.
+Wed Mar 26 09:07:48 2014 Yutaka Kanemoto <kanemoto@ruby-lang.org>
-Fri Apr 26 22:53:55 2013 Kouhei Sutou <kou@cozmixng.org>
+ * configure.in: add --disable-pie. [Feature #9673]
- * lib/rexml/element.rb (REXML::Attributes#to_a): Support
- namespaced attributes. [ruby-dev:47277] [Bug #8301]
- Patch by Ippei Obayashi. Thanks!!!
- * test/rexml/test_attributes.rb
- (AttributesTester#test_to_a_with_namespaces): Add a test of the
- above change.
+Wed Mar 26 08:47:04 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Fri Apr 26 21:48:29 2013 Kouhei Sutou <kou@cozmixng.org>
+ * addr2line.c (fill_lines): don't run fill_lines multiple times.
- * lib/rss/atom.rb (RSS::Atom::Entry): Fix indent of document comment.
+Wed Mar 26 08:45:00 2014 Sam Rawlins <sam.rawlins@gmail.com>
-Fri Apr 26 21:21:17 2013 Kouhei Sutou <kou@cozmixng.org>
+ * internal.h: add prototype for rb_reg_search0
- * lib/rss/maker.rb (RSS::Maker): Fix indent of document comment.
+ * re.c: rename rb_reg_search to rb_reg_search0, add set_backref_str
+ argument to allow callers to indicate that they don't require the
+ backref string to be allocated.
-Fri Apr 26 18:41:04 2013 Tanaka Akira <akr@fsij.org>
+ * string.c: don't allocate backref str if replacement string is provided
- * ext/socket/extconf.rb: Use a block of enable_config() for
- --{enable,disable}-close-fds-by-recvmsg-with-peek configure option
+ [GH-578] [Bug #9676] [ruby-core:61682]
-Fri Apr 26 18:08:08 2013 Tanaka Akira <akr@fsij.org>
+Wed Mar 26 08:29:43 2014 mo khan <mo@mokhan.ca>
- * dir.c (dir_set_pos): Fix a compilation error when seekdir() is not
- exist.
+ * lib/rubygems.rb: fix spelling of Jim Weirich. [Fixes GH-577]
-Fri Apr 26 17:41:17 2013 Tanaka Akira <akr@fsij.org>
+Wed Mar 26 01:55:45 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * thread_pthread.c (ruby_init_stack): Add STACK_GROW_DIR_DETECTION.
- This fixes a compilation failure while cross-compiling for ARM.
+ * addr2line.c (rb_dump_backtrace_with_lines): a function to get must
+ be a function in the main executable, whose absolute path is not
+ available by dladdr, and ruby get it by /proc/self/exe on Linux.
-Fri Apr 26 14:35:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Wed Mar 26 01:34:50 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * lib/rss/atom.rb: Documentation for RSS::Atom based on a patch by
- Michael Denomy
- * lib/rss/maker.rb: Documentation for RSS::Maker also by @mdenomy
+ * addr2line.c (fill_lines): skip if path is NULL.
-Fri Apr 26 12:41:22 2013 Tanaka Akira <akr@fsij.org>
+Tue Mar 25 23:57:17 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/curses/extconf.rb: Test linkability of curses_version at first.
+ * parse.y (parser_yylex): only a newline after label should be
+ significant. [ruby-core:61658] [Bug #9669]
- * ext/socket/extconf.rb: Test the behavior of fd passing with MSG_PEEK
- only if recvmsg(), msg_control member, AF_UNIX and SCM_RIGHTS are
- available.
+Tue Mar 25 23:32:25 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-Fri Apr 26 00:07:52 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+ * ext/pathname/lib/pathname.rb (Pathname#join): remove unnecessary
+ unshift.
- * lib/rinda/ring.rb (Rinda::RingServer#initialize): accept array
- arguments of address to specify multicast interface.
+ * test/pathname/test_pathname.rb (TestPathname#test_join): add tests.
- * lib/rinda/ring.rb (Rinda::RingServer#make_socket): add optional
- arguments for multicast interface.
+Tue Mar 25 16:47:36 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/rinda/test_rinda.rb
- (TestRingFinger#test_ring_server_ipv4_multicast,
- TestRingFinger#test_ring_server_ipv6_multicast): add tests for
- above change.
+ * parse.y (lex_state_e, parser_params, f_arglist, parser_yylex):
+ separate EXPR_LABELARG from EXPR_BEG and let newline significant,
+ so that required keyword argument can place at the end of
+ argument list without parentheses. [ruby-core:61658] [Bug #9669]
- * test/rinda/test_rinda.rb
- (TestRingServer#test_make_socket_ipv4_multicast,
- TestRingServer#test_make_socket_ipv6_multicast): change bound
- interface address because multicast address is not allowed on Linux
- or Windows.
- [ruby-core:53692] [Bug #8159]
+Mon Mar 24 22:19:56 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Apr 25 23:45:02 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+ * parse.y (ripper_initialize): filename can not be modified.
- * lib/rinda/ring.rb (Rinda::RingServer#initialize): add a socket
- to @sockets in make_socket() to close sockets on shutdown even if
- make_socket() is called after initialize.
+Mon Mar 24 15:19:47 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * lib/rinda/ring.rb (Rinda::RingServer#make_socket): ditto.
+ * addr2line.c (rb_dump_backtrace_with_lines): fetch path of the
+ executable from /proc/self/exe on Linux.
-Thu Apr 25 23:39:42 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+Mon Mar 24 14:14:37 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * test/rinda/test_rinda.rb (TupleSpaceProxyTest#test_take_bug_8215):
- use KILL on Windows since TERM doen't work and ruby process remains
- after test-all on Windows.
+ * gc.c: Fix up default GC params by @csfrancis [fix GH-556]
-Thu Apr 25 23:16:28 2013 Tanaka Akira <akr@fsij.org>
+Mon Mar 24 13:13:36 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * ext/curses/extconf.rb: Implement
- --with-curses-version={function,variable} configure option for
- cross-compiling.
+ * addr2line.c (parse_debug_line_cu): explicitly specify signed char
+ because DWARF's line_Base is signed char and char maybe unsigned.
+ patched by Rei Odaira. [ruby-dev:48068] [Bug #9654]
-Thu Apr 25 18:15:46 2013 Tanaka Akira <akr@fsij.org>
+Sun Mar 23 11:03:50 2014 Kohei Suzuki <eagletmt@gmail.com>
- * ext/socket/extconf.rb: Don't use WIDE getaddrinfo by default.
+ * vm_method.c (rb_method_entry_get_without_cache): me->klass is 0
+ for a method aliased in a module. [ruby-core:61636] [Bug #9663]
-Thu Apr 25 17:56:39 2013 Tanaka Akira <akr@fsij.org>
+Sun Mar 23 08:12:27 2014 Eric Wong <e@80x24.org>
- * ext/socket/extconf.rb: Remove obsolete options: ---with-ipv6-lib and
- --with-ipv6-libdir.
+ * st.c (hash_pos): use bitwise AND to avoid slow modulo op
+ (new_size): power-of-two sizes for hash_pos change
+ (st_numhash): adjust for common keys due to lack of prime modulo
+ [Feature #9425]
+ * hash.c (rb_any_hash): right shift for symbols
+ * benchmark/bm_hash_aref_miss.rb: added to show improvement
+ * benchmark/bm_hash_aref_sym_long.rb: ditto
+ * benchmark/bm_hash_aref_str.rb: ditto
+ * benchmark/bm_hash_aref_sym.rb: ditto
+ * benchmark/bm_hash_ident_num.rb: added to prevent regression
+ * benchmark/bm_hash_ident_obj.rb: ditto
+ * benchmark/bm_hash_ident_str.rb: ditto
+ * benchmark/bm_hash_ident_sym.rb: ditto
-Thu Apr 25 17:43:49 2013 Tanaka Akira <akr@fsij.org>
+Sat Mar 22 22:56:45 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * ext/socket/extconf.rb: Implement
- --{enable,disable}-close-fds-by-recvmsg-with-peek configure option
- for cross-compiling.
- Make --{enable,disable}-wide-getaddrinfo configure option
- cross-compiling friendly.
+ * addr2line.c (fill_lines): compare the file names of object in which
+ symbols exist. [Bug #9654] [ruby-dev:48058]
-Thu Apr 25 16:11:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Mar 22 06:46:16 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * io.c (rb_io_ext_int_to_encs, parse_mode_enc): bom-prefixed name is
- not a real encoding name, just a fallback. so the proper conversion
- should take place even if if the internal encoding is equal to the
- bom-prefixed name, unless actual encoding is equal to the internal
- encoding. [ruby-core:54563] [Bug #8323]
+ * lib/cgi/util.rb (escape_html, unescape_html): make synonyms
+ aliases instead of wrapper methods.
- * io.c (io_set_encoding_by_bom): reset extenal encoding if no BOM
- found. [ruby-core:54569]
+ * lib/cgi/util.rb (escape_element, unescape_element): ditto.
+ [Fixes GH-573]
-Thu Apr 25 14:35:01 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Fri Mar 21 21:57:34 2014 Akinori MUSHA <knu@iDaemons.org>
- * ext/openssl/ossl_bn.c (ossl_bn_initialize): allow Fixnum and Bignum.
- [ruby-core:53986] [Feature #8217]
+ * configure.in: Fix a build problem with clang and --with-opt-dir.
+ If ruby is configured with --with-opt-dir=dir when using clang
+ as compiler, a warning `clang: warning: argument unused during
+ compilation: '-I dir'` is emitted almost every time clang
+ compiles a file. Unfortunately, RUBY_CHECK_PRINTF_PREFIX takes
+ any output from the compiler as fatal error, and the check thus
+ fails due to the warning. This is an attempt to fix the problem
+ by adding a flag -Qunused-arguments to CFLAGS locally in the
+ function to suppress the warning. [ruby-dev:48062] [Bug #9658]
+ [Fixes GH-571] https://github.com/ruby/ruby/pull/571
-Thu Apr 25 14:26:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Fri Mar 21 16:31:56 2014 Zachary Scott <e@zzak.io>
- * lib/uri/common.rb (URI.decode_www_form): follow current URL Standard.
- It gets encoding argument to specify the character encoding.
- It now allows loose percent encoded strings, but denies ;-separator.
- [ruby-core:53475] [Bug #8103]
+ * gc.c: [DOC] Fix call-seq for GC.start by @jasonrclark [Fixes GH-572]
+ https://github.com/ruby/ruby/pull/572
- * lib/uri/common.rb (URI.decode_www_form): follow current URL Standard.
- It gets encoding argument to convert before percent encode.
- Now UTF-16 strings aren't converted to UTF-8 before percent encode
- by default.
+Thu Mar 20 11:37:28 2014 James Edward Gray II <james@graysoftinc.com>
-Wed Apr 25 14:26:00 2013 Charlie Somerville <charlie@charliesomerville.com>
+ * lib/csv.rb: Fixed a broken regular expression that was causing
+ CSV to miss escaping some special meaning characters when used
+ in parsing.
+ Reported by David Unric
+ [ruby-core:54986] [Bug #8405]
- * benchmark/bm_hash_shift.rb: add benchmark for Hash#shift
+Thu Mar 20 16:53:07 2014 Koichi Sasada <ko1@atdot.net>
- * hash.c (rb_hash_shift): use st_shift if hash is not being iterated to
- delete element without iterating the whole hash.
+ * gc.c (objspace_malloc_increase): should not invoke
+ garbage_collect_with_gvl() here on non-ruby threads.
- * hash.c (shift_i): remove function
+ Should just ignore the malloc_increase.
- * include/ruby/st.h (st_shift): add st_shift function
+ This issue is pointed by Eric Wong [ruby-core:61519].
- * st.c (st_shift): ditto
+Thu Mar 20 13:05:16 2014 Koichi Sasada <ko1@atdot.net>
- [Bug #8312] [ruby-core:54524] Patch by funny-falcon
+ * struct.c (rb_struct_alloc): use RARRAY_CONST_PTR() instead of
+ RARRAY_PTR().
-Thu Apr 25 12:03:38 2013 Tanaka Akira <akr@fsij.org>
+Thu Mar 20 12:59:39 2014 Koichi Sasada <ko1@atdot.net>
- * ext/socket/extconf.rb: Extract C programs as toplevel constants.
+ * include/ruby/intern.h (rb_obj_call_init, rb_class_new_instance):
+ constify a parameter (VALUE *).
+ I believe this incompatibility doesn't break any code.
+ However, if you have trouble, please tell us.
-Thu Apr 25 02:23:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * eval.c, object.c: ditto.
- * configure.in (RUBY_RM_RECURSIVE): this hack is needed by only
- autoconf 2.69 or earlier on darwin.
+Thu Mar 20 12:31:26 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Apr 25 01:22:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * vm_method.c (rb_method_entry_get_without_cache): get rid of
+ infinite recursion at aliases in a subclass and a superclass.
+ return actually defined class for other than singleton class.
+ [ruby-core:60431] [Bug #9475]
- * lib/tracer.rb (get_line): simply read by File.readlines.
+Wed Mar 19 17:13:06 2014 Eric Wong <e@80x24.org>
- * lib/debug.rb (script_lines): get source lines from SCRIPT_LINES__ or
- read from the file.
+ * time.c (time_mload): freeze and preserve marshal-loaded time zone
+ * test/ruby/test_time.rb: add test for GC on loaded object
+ [Bug #9652]
- * lib/debug.rb (display_list): use script_lines instead of recursion.
- [Bug #8318]
+Tue Mar 18 23:20:12 2014 Shota Fukumori <her@sorah.jp>
- * lib/debug.rb (line_at): use script_lines same as display_list.
+ * vm_eval.c (eval_string_with_cref): Unify to use NIL_P.
- * lib/debug.rb (display_list): Fix debug listing when called from the
- same file it has been required. patch by Dario Bertini <berdario AT
- gmail.com> [Bug #8318] [fix GH-280]
+Tue Mar 18 22:03:41 2014 Shota Fukumori <her@sorah.jp>
-Wed Apr 24 21:51:13 2013 Tanaka Akira <akr@fsij.org>
+ * vm_eval.c (eval_string_with_cref): Use file path even if scope is
+ given. Related to [ruby-core:56099] [Bug #8662] and r42103.
- * configure.in: Check mblen().
- mblen() is optional in uClibc.
+Mon Mar 17 13:17:47 2014 Koichi Sasada <ko1@atdot.net>
- * eval_intern.h (CharNext): Don't use mblen() is not available.
+ * enumerator.c (enumerator_block_call): use RARRAY_CONST_PTR()
+ instead of RARRAY_PTR().
-Wed Apr 24 15:55:06 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * io.c (rb_io_s_popen): ditto.
- * io.c (rb_fd_fix_cloexec): use rb_update_max_fd().
+ * numeric.c (num_step_size): ditto.
-Wed Apr 24 14:08:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * vm_eval.c (rb_apply): ditto.
- * numeric.c: Fix wiki link on Float imprecision in overview, patched
- by Makoto Kishimoto [Bug #8304] [ruby-dev:47280]
+ * vm_eval.c (rb_eval_cmd): ditto.
-Wed Apr 24 14:03:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Mar 17 10:11:59 2014 Eric Wong <e@80x24.org>
- * parse.y (parser_yylex): disallow $- without following identifier
- character. [ruby-talk:406969]
+ * variable.c (rb_const_set): delete existing entry on redefinition
+ [Bug #9645]
+ * test/ruby/test_const.rb (test_redefinition): test for leak
- * parse.y (is_special_global_name): mere $- is not a valid global
- variable name.
+Sun Mar 16 21:33:01 2014 Zachary Scott <e@zzak.io>
-Wed Apr 24 13:54:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * lib/time.rb: [DOC] Fix timezone in example of Time.parse [Bug #9521]
+ Based on patch by @stomar
- * string.c: Document String#setbyte return value by @gjmurakami-10gen
- [Fixes GH-294]
+Sun Mar 16 13:21:40 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Wed Apr 24 13:45:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * configure.in (DLDFLAGS): insert a space between option and its
+ argument for non-GCC compilers. [ruby-core:61429] [Bug #9624]
- * class.c: Example of Object#methods by @windwiny [Fixes GH-293]
- * ruby.c: Document return values of Kernel #sub, #gsub, and #chop
+Sun Mar 16 08:05:06 2014 Eric Wong <e@80x24.org>
-Wed Apr 24 12:54:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * gc.c (objspace_xcalloc): fix GC accounting
- * ext/socket/lib/socket.rb: Doc typos by @vipulnsward [Fixes GH-292]
+Sun Mar 16 06:33:35 2014 NARUSE, Yui <naruse@ruby-lang.org>
+ * addr2line.c (fill_lines): return address is just after calling
+ address. Therefore noreturn function with tail call's return
+ address may be in another function.
-Wed Apr 24 12:54:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Sun Mar 16 05:51:55 2014 Zachary Scott <e@zzak.io>
- * ext/socket/lib/socket.rb: Doc typos by @vipulnsward [Fixes GH-292]
+ * lib/gserver.rb: [DOC] Fixed typo in example by @stomar [Bug #9543]
-Wed Apr 24 12:27:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Sat Mar 15 18:54:03 2014 Kazuki Tsujimoto <kazuki@callcc.net>
- * array.c: Fix documentation for Array#index and #replace aliases
- Based on a patch by @phiggins [Fixes GH-282]
+ * ext/.document: remove refinement from documentable directories.
-Tue Apr 23 21:14:38 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Sat Mar 15 11:02:58 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * string.c (rb_str_inspect): refix r40413, on Ruby 1.9 usual character
- escape uses hex/Unicode escapes, so fix to use Unicode escape on
- Unicode strings and hex on others. [ruby-core:54458] [Bug #8290]
+ * configure.in (DLDFLAGS): check for each options to control
+ symbol resolution. [ruby-core:61429] [Bug #9624]
-Tue Apr 23 20:10:02 2013 Tanaka Akira <akr@fsij.org>
+Sat Mar 15 07:02:35 2014 Eric Wong <e@80x24.org>
- * missing/isnan.c (isnan): Don't define if isnan() macro is defined.
- This fixes a compilation failure on uClibc based Gentoo system.
+ * st.c (st_update): remove unnecessary assignment
-Tue Apr 23 17:40:40 2013 Martin Duerst <duerst@it.aoyama.ac.jp>
+Fri Mar 14 14:58:38 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * lib/rexml/document.rb, lib/rexml/element.rb,
- lib/rexml/formatters/pretty.rb: remove opinionated
- language in documentation. [Bug #8309],
- reported by Charles Beckmann
+ * addr2line.c (fill_lines): fetch symbol names from ELF binary's
+ symbol table if it is built with cc -g and not stripped.
+ Now ruby can show static symbols on Linux though glibc's
+ backtrace_symbols(3) don't show them.
-Tue Apr 23 14:04:44 2013 Shugo Maeda <shugo@ruby-lang.org>
+ * addr2line.c (rb_dump_backtrace_with_lines): use dladdr(3) to
+ detect what object file declares the symbol because
+ dl_iterate_phdr can't detect the main executable file
+ and codes on the stack.
+ NOTE: signal trampolines sometimes on the user stack. (FreeBSD)
- * lib/net/imap.rb (getacl_response): parse the mailbox of an ACL
- response correctly. [ruby-core:54365] [Bug #8281]
+ * addr2line.c (rb_dump_backtrace_with_lines): stop showing
+ backtrace if the function's name is main.
+ NOTE: FreeBSD's backtrace (libexecinfo) shows _start and
+ an additional address. Why it doesn't remove them on dladdr phase
+ is, dladdr may fail to detect the main function but detect
+ as _start function. Therefore it must be after scanning
+ the symbol table and getting correct name.
-Tue Apr 23 11:58:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * string.c (rb_str_scrub): fix for UTF-32. strlen() on strings
- contain NUL returns wrong result, use sizeof operator instead.
- [ruby-dev:45975] [Feature #6752]
+Fri Mar 14 12:07:46 2014 Zachary Scott <e@zzak.io>
-Tue Apr 23 10:26:50 2013 Akinori MUSHA <knu@iDaemons.org>
+ * doc/syntax/literals.rdoc: [DOC] Single quote strings allows escape
+ of backslash as well, patch by @idupree [Fixes GH-553]
+ https://github.com/ruby/ruby/pull/553
- * test/ruby/test_module.rb
- (TestModule#test_const_get_invalid_name)
- (test_const_defined_invalid_name): Fix expected values.
+Fri Mar 14 01:18:24 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Tue Apr 23 09:51:26 2013 Akinori MUSHA <knu@iDaemons.org>
+ * vm.c (invoke_block_from_c): add splattable argument.
- * string.c (rb_str_inspect): NUL should not be represented as "\0"
- when octal digits may follow. [ruby-core:54458] [Bug #8290]
+ * vm.c (vm_invoke_proc): disallow to splat when directly invoked.
-Mon Apr 22 22:54:00 2013 Charlie Somerville <charlie@charliesomerville.com>
+ * vm_insnhelper.c (vm_callee_setup_arg_complex, vm_callee_setup_arg):
+ relax arity check of yielded lambda. [ruby-core:61340] [Bug #9605]
- * insns.def (opt_mod): Use % operator if both operands are positive for
- a significant performance improvement. Thanks to @samsaffron.
+ * test/ruby/test_yield.rb (TestRubyYieldGen#emu_bind_params): no
+ longer raise ArgumentError when splatting to lambda.
-Mon Apr 22 17:09:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Thu Mar 13 23:51:02 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * marshal.c (r_object0): copy all instance variables not only generic
- ivars, before calling post proc. [ruby-core:51163] [Bug #7627]
+ * ext/-test-/win32/dln/libdlntest.c (dlntest_ordinal): no need to
+ specify export in the source file because .def file do it.
+ get rid of warning on linking.
-Mon Apr 22 10:25:21 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Wed Mar 12 11:19:03 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * util.c (ruby_hdtoa): revert r29729.
- If you want ruby to behave as before on x86, specify to use SSE like
- -msse2 -mfpmath=sse for gcc.
+ * vm_insnhelper.c (vm_callee_setup_arg): disable fastpath if splat
+ argument, since argc may differ for each calls.
+ [ruby-core:61422] [Bug #9622]
-Sun Apr 21 23:19:00 2013 Charlie Somerville <charlie@charliesomerville.com>
+ * vm_insnhelper.c (vm_callee_setup_arg): turn a macro into an
+ inline function.
- * configure.in: Revert using sigsetjmp by default due to performance
- problems on some systems (eg. older Linux)
+Wed Mar 12 07:26:05 2014 Eric Wong <e@80x24.org>
-Sun Apr 21 21:35:00 2013 Charlie Somerville <charlie@charliesomerville.com>
+ * insns.def (opt_regexpmatch2): respect redefined match op
+ Thanks to Sam Rawlins for the fix.
+ * test/ruby/test_string.rb: test based on Tsuyoshi Sawada's report
+ [Bug #9581]
- * configure.in: Use sigsetjmp by default so jumping out of signal
- handlers properly restores the signal mask and SS_ONSTACK flag.
- [ruby-core:54175] [Bug #8254]
+Tue Mar 11 22:31:25 2014 Kazuki Tsujimoto <kazuki@callcc.net>
- * configure.in: Manually check for presence of sigsetjmp. It is not a
- function on some systems, so AC_CHECK_FUNCS cannot be used.
+ * ext/.document: add objspace/objspace_dump.c to document file.
-Sun Apr 21 08:00:55 2013 Tanaka Akira <akr@fsij.org>
+Tue Mar 11 22:22:38 2014 Kazuki Tsujimoto <kazuki@callcc.net>
- * test/csv/test_features.rb, test/logger/test_logger.rb
- test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
- test/openssl/test_config.rb, test/psych/test_encoding.rb,
- test/psych/test_exception.rb, test/psych/test_psych.rb,
- test/psych/test_tainted.rb, test/readline/test_readline.rb,
- test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
- test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
- test/ruby/test_file.rb, test/ruby/test_io.rb,
- test/ruby/test_marshal.rb, test/ruby/test_process.rb,
- test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
- test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
- test/zlib/test_zlib.rb: Use Tempfile.create.
+ * test/objspace/test_objspace.rb (TestObjSpace#test_dump_uninitialized_file):
+ remove dependency on json library.
-Sun Apr 21 00:15:36 2013 Tanaka Akira <akr@fsij.org>
+Tue Mar 11 10:55:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/tempfile.rb (Tempfile.create): Close when the block exits.
+ * README.EXT{,.ja} (Appendix B): update contents of `ruby_options`
+ and replace `ruby_run` with `ruby_run_node`. based on the patch
+ by Kaneko Yuichiro at [ruby-dev:48030] [Bug #9619].
-Sat Apr 20 23:38:14 2013 Tanaka Akira <akr@fsij.org>
+Tue Mar 11 06:54:00 2014 Scott Francis <scott.francis@shopify.com>
- * lib/webrick/httpauth/htpasswd.rb: Use Tempfile.create to avoid
- unintentional unlink() by the finalizer.
- lib/webrick/httpauth/htdigest.rb: Ditto.
+ * ext/objspace/objspace_dump.c: Check fptr before trying to dump RFILE
+ object fd. [GH-562]
-Sat Apr 20 22:47:48 2013 Tanaka Akira <akr@fsij.org>
+ * test/objspace/test_objspace.rb: add test
- * lib/tempfile.rb (Tempfile.create): New method.
- The method name is proposed by Shugo Maeda. [ruby-dev:47220]
- [ruby-core:41478] [Feature #5707]
+Tue Mar 11 02:04:36 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sat Apr 20 14:22:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * vm_dump.c (rb_vm_bugreport): show vm maps on FreeBSD.
- * marshal.c (w_object): dump no ivars to the original by marshal_dump.
- [ruby-core:54334] [Bug #8276]
+ * vm_dump.c (procstat_vm): copied from FreeBSD.
+ http://svnweb.freebsd.org/base/head/usr.bin/procstat/procstat_vm.c?revision=261780
- * marshal.c (r_object0): copy all ivars of marshal_dump data to the
- result object instead. [ruby-core:51163] [Bug #7627]
+Mon Mar 10 12:14:26 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Sat Apr 20 02:33:27 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * configure.in: always check dladdr(1).
- * string.c (str_scrub): add ruby method String#scrub which verify and
- fix invalid byte sequence. [ruby-dev:45975] [Feature #6752]
+ * addr2line.c (fill_lines): show the line number in C backtrace if
+ ruby is built without --enable-shared (PIE) on Linux.
+ patch is originally by Shinichiro Hamaji
+ https://twitter.com/shinh/status/441957774264504321
+ NOTE: ld doesn't insert __executable_start for PIE.
+ dladdr(3)'s argument must be a function pointer.
- * string.c (str_compat_and_valid): check given string is compatible
- and valid with given encoding.
+Mon Mar 10 10:51:17 2014 ksss <co000ri@gmail.com>
- * transcode.c (str_transcode0): If invalid: :replace is specified for
- String#encode, replace invalid byte sequence even if the destination
- encoding equals to the source encoding.
+ * test/ruby/test_enumerator.rb (test_iterators): fix test for hash
+ iterators. [Fixes GH-558]
-Fri Apr 19 21:55:40 2013 Kouhei Sutou <kou@cozmixng.org>
+Sun Mar 9 14:14:49 2014 Eric Wong <e@80x24.org>
- * README.EXT.ja (Data_Wrap_Struct): Remove a description about
- orphan argument. Oh, I renamed the argument name without
- changing description at r36180... Sorry....
- Patch by Makoto Kishimoto. Thanks!!! [ruby-dev:47269] [Bug #8292]
- * README.EXT.ja (Data_Make_Struct): Add a sample code that describes
- how it works.
- Patch by Makoto Kishimoto. Thanks!!! [ruby-dev:47269] [Bug #8292]
+ * class.c (rb_class_subclass_add): use xmalloc
+ * class.c (rb_module_add_to_subclasses_list): ditto
+ * class.c (rb_class_remove_from_super_subclasses): use xfree
+ * class.c (rb_class_remove_from_module_subclasses): ditto
+ [Bug #9616]
-Fri Apr 19 17:54:57 2013 Shugo Maeda <shugo@ruby-lang.org>
+Sun Mar 9 13:51:16 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/net/imap.rb (body_type_msg): should accept
- message/delivery-status with extra data.
- [ruby-core:53741] [Bug #8167]
+ * ext/fiddle/function.c (function_call): fix memory leak when an
+ exception occurs at argument conversion or the function call.
- * test/net/imap/test_imap_response_parser.rb: related test.
+Sun Mar 9 06:42:40 2014 Eric Wong <e@80x24.org>
-Fri Apr 19 13:03:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * variable.c (struct global_variable): shrink by 8 bytes on 64-bit
- * marshal.c (w_object): do not dump encoding which is dumped with
- marshal_dump data. [ruby-core:54334] [Bug #8276]
+Sat Mar 8 17:42:51 2014 Eric Wong <e@80x24.org>
-Fri Apr 19 11:36:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * vm.c (add_opt_method): cleanup to use rb_method_entry_at
- * configure.in (stack_protector): control use of -fstack-protector.
+Sat Mar 8 13:46:40 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * configure.in (debugflags): let -fstack-protector precede and disable
- debugflags, because they can't work together on SmartOS. [Bug #8268]
+ * ext/dl/cptr.c (dlptr_free), ext/dl/handle.c (dlhandle_free),
+ ext/fiddle/handle.c (fiddle_handle_free),
+ ext/fiddle/pointer.c (fiddle_ptr_free): fix memory leak.
+ based on the patch Heesob Park at [ruby-dev:48021] [Bug #9599].
-Fri Apr 19 07:43:52 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Sat Mar 8 13:30:39 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/openssl/test_cipher.rb: Correct a typo
- by jgls <joerg@joergleis.com>
- https://github.com/ruby/ruby/pull/291 fix GH-291
+ * process.c (obj2uid, obj2gid): now getpwnam_r() and getgrnam_r()
+ may need larger buffers than sysconf values, so retry with
+ expanding the buffer when ERANGE is returned.
+ [ruby-core:61325] [Bug #9600]
-Thu Apr 18 16:58:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Mar 7 19:29:13 2014 Eric Wong <e@80x24.org>
- * vm_method.c (rb_mod_public_method): fix visibility on anonymous
- module. set visibility of singleton method, not method in base
- class. [ruby-core:54404] [Bug #8284]
+ * vm_eval.c (vm_call0_body): use RARRAY_CONST_PTR
+ (check_funcall_exec): ditto
+ [ruby-core:61360]
-Thu Apr 18 16:20:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Mar 7 19:14:11 2014 Eric Wong <e@80x24.org>
- * dir.c (glob_helper): should skip dot directories only for recursion,
- but should not if matching to the given pattern. [ruby-core:54387]
- [Bug #8283]
+ * vm_eval.c (vm_call0_body): fix RB_GC_GUARD location
+ (check_funcall_exec): ditto
+ [Bug #9609]
-Thu Apr 18 16:20:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Mar 7 14:48:17 2014 Narihiro Nakamura <authornari@gmail.com>
- * pack.c (pack_unpack): increase buffer size to fix buffer overflow,
- and fix garbage just after unpacking without missing paddings.
- [Bug #8286]
+ * parse.y (ENC_SINGLE): Unused macro removed.
-Thu Apr 18 13:35:54 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Fri Mar 7 12:06:19 2014 Martin Bosslet <Martin.Bosslet@gmail.com>
- * pack.c (pack_unpack): output characters even if the input doesn't
- have paddings. [Bug #8286]
+ * test/openssl/test_ssl.rb: Reuse TLS default options from
+ OpenSSL::SSL::SSLContext::DEFAULT_PARAMS.
-Thu Apr 18 08:20:48 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Thu Mar 6 15:15:24 2014 Zachary Scott <e@zzak.io>
- * common.mk (clean-ext): remove timestamps.
+ * doc/syntax/assignment.rdoc: [DOC] Fix assignment directions
+ By @idupree [Fixes GH-555] https://github.com/ruby/ruby/pull/555
-Wed Apr 17 22:07:50 2013 Tanaka Akira <akr@fsij.org>
+Thu Mar 6 15:07:18 2014 Zachary Scott <e@zzak.io>
- * ext/socket/rubysocket.h (SOCKLEN_MAX): Expression simplified.
+ * doc/syntax/methods.rdoc: [DOC] Fix example for block arguments
+ By @idupree [Fixes GH-554] https://github.com/ruby/ruby/pull/554
-Wed Apr 17 20:09:19 2013 Aman Gupta <ruby@tmm1.net>
+Thu Mar 6 10:33:31 2014 Martin Bosslet <Martin.Bosslet@gmail.com>
- * compile.c (iseq_add_mark_object): Use new rb_iseq_add_mark_object().
+ * lib/openssl/ssl.rb: Explicitly whitelist the default
+ SSL/TLS ciphers. Forbid SSLv2 and SSLv3, disable
+ compression by default.
+ Reported by Jeff Hodges.
+ [ruby-core:59829] [Bug #9424]
- * insns.def (setinlinecache): Ditto.
+Wed Mar 5 15:56:18 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * iseq.c (rb_iseq_add_mark_object): New function to allocate
- iseq->mark_ary on demand. [Bug #8142]
+ * parse.y (f_arg_asgn): define optional arguments as argument
+ variables in the rhs default expressions.
+ [ruby-core:61299] [Bug #9593]
- * iseq.h (rb_iseq_add_mark_object): Ditto.
+Wed Mar 5 11:58:30 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * iseq.c (prepare_iseq_build): Avoid allocating mark_ary until needed.
+ * ext/openssl/ossl.c (ossl_make_error): check NULL for unknown
+ error reasons with old OpenSSL, and insert a colon iff formatted
+ message is not empty.
- * iseq.c (rb_iseq_build_for_ruby2cext): Ditto.
+Wed Mar 5 00:42:00 2014 Kazuki Tsujimoto <kazuki@callcc.net>
-Wed Apr 17 20:00:18 2013 Tanaka Akira <akr@fsij.org>
+ * ext/pathname/lib/pathname.rb (Pathname#find): add "ignore_error"
+ keyword argument defaulted to true as well as Find#find.
- * ext/socket/rubysocket.h (SOCKLEN_MAX): Defined.
+Tue Mar 4 23:00:18 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * ext/socket/raddrinfo.c (ext/socket/raddrinfo.c): Reject too long
- Linux abstract socket name.
+ * test/ruby/test_eval.rb (TestEval#make_test_binding): renamed.
+ it's not test method.
-Wed Apr 17 19:45:27 2013 Aman Gupta <tmm1@ruby-lang.org>
+Tue Mar 4 20:50:59 2014 Masaya Tarui <tarui@ruby-lang.org>
- * iseq.c (iseq_location_setup): re-use existing string when iseq has
- the same path and absolute_path. [Bug #8149]
+ * st.c (st_foreach): fix type of hash. not st_data_t but st_index_t.
-Wed Apr 17 11:38:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Mar 4 19:41:40 2014 Tanaka Akira <akr@fsij.org>
- * lib/test/unit/assertions.rb (Test::Unit::Assertions#assert):
- UNASSIGNED is not a valid message.
+ * Makefile.in: ".DEFAULT" target removed because it is not for
+ specifying default target.
-Wed Apr 17 10:58:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Mar 4 00:25:35 2014 Kazuki Tsujimoto <kazuki@callcc.net>
- * thread.c (sleep_timeval): get rid of overflow on Windows where
- timeval.tv_sec is not time_t but mere long.
+ * lib/find.rb (Find#find): should pass ignore_error option to enumerators.
-Tue Apr 16 23:07:12 2013 Tanaka Akira <akr@fsij.org>
+Mon Mar 3 13:27:35 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * ext/socket/unixsocket.c (unix_send_io): Suppress a warning by clang.
- (unix_recv_io): Ditto.
+ * test/test_find.rb (TestFind#test_unsearchable_dir): ruby cannot make
+ directory unreachable by owner on Windows.
-Tue Apr 16 12:27:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Mon Mar 3 08:10:04 2014 Eric Wong <e@80x24.org>
- * ext/sdbm/init.c: Fix comment indentation, by windwiny [Fixes GH-277]
+ * vm_method.c (rb_method_entry_get_without_cache): disable GMC
+ writing if GMC is disabled.
+ [ruby-core:61218]
-Tue Apr 16 12:25:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Mon Mar 3 07:47:17 2014 Eric Wong <e@80x24.org>
- * ext/socket/option.c: Document synonymous methods, by windwiny [GH-277]
- * ext/stringio/stringio.c: ditto
- * ext/io/wait/wait.c: ditto
+ * README.EXT: wrap GetDBM with do/while(0)
+ * README.EXT.ja: ditto
+ * ext/dbm/dbm.c: ditto, likewise for GetDBM2
* ext/gdbm/gdbm.c: ditto
- * ext/dl/cfunc.c: ditto
- * ext/zlib/zlib.c: ditto
- * ext/win32ole/win32ole.c: ditto
- * ext/dbm/dbm.c: ditto
- * ext/json/generator/generator.c: ditto
- * ext/date/date_core.c: ditto
-
-Tue Apr 16 11:23:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/openssl/*: Document synonymous methods, by windwiny [GH-277]
-
-Mon Apr 15 22:21:42 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/fiddle/depend: New file.
-
-Mon Apr 15 22:01:02 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * misc/ruby-electric.el (ruby-electric-insert): Check
- ruby-electric-is-last-command-char-expandable-punct-p here.
-
- * misc/ruby-electric.el (ruby-electric-closing-char): New
- interactive function bound to closing characters. Typing one of
- those closing characters right after the matching counterpart
- cancels the effect of automatic closing. For example, typing
- "{" followed by "}" simply makes "{}" instead of "{ } }".
-
-Mon Apr 15 12:54:42 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
-
- * ext/openssl/ossl_ssl.c: Correct shutdown behavior w.r.t GC.
-
- * test/openssl/test_ssl.rb: Add tests to verify correct behavior.
-
- [Bug #8240] Patch provided by Shugo Maeda. Thanks!
-
-Mon Apr 15 10:23:39 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/coverage/depend: fix id.h place as r40283.
-
- * ext/coverage/extconf.rb: add topdir and topsrcdir to VPATH.
-
-Sun Apr 14 19:46:14 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/-test-/debug/depend: New file.
-
- * ext/-test-/exception/depend: Ditto.
-
- * ext/-test-/printf/depend: Ditto.
-
- * ext/-test-/string/depend: Ditto.
-
- * ext/coverage/depend: Ditto.
-
- * ext/io/console/depend: Ditto.
-
- * ext/io/nonblock/depend: Ditto.
-
- * ext/io/wait/depend: Ditto.
-
- * ext/openssl/depend: Ditto.
-
- * ext/pathname/depend: Ditto.
-
- * ext/psych/depend: Ditto.
-
- * ext/zlib/depend: Ditto.
-
-Sun Apr 14 02:46:50 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * lib/mkmf.rb (MakeMakefile#create_makefile): remove {$(VPATH)} other
- than nmake.
-
- * ext/ripper/depend: use VPATH expecting removed by above.
-
-Sat Apr 13 23:06:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb (timestamp_file): gather timestamp files in one
- directory from each extension directories.
-
-Sat Apr 13 21:09:02 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * lib/mkmf.rb (MakeMakefile#create_makefile): output new macro
- disthdrdir to specify the path of id.h, parse.h and etc.
-
- * ext/ripper/depend: use above macro.
-
-Sat Apr 13 20:28:08 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * Merge Onigmo 5.13.4 f22cf2e566712cace60d17f84d63119d7c5764ee.
- [bug] fix problem with optimization of \z (Issue #16) [Bug #8210]
-
-Sat Apr 13 18:56:15 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * ext/ripper/depend: parse.h and id.h may be created on topdir.
-
-Sat Apr 13 12:08:16 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-
- * lib/matrix.rb: Add Vector#cross_product, patch by Luis Ezcurdia
- [fix GH-276] [rubyspec:81eec89a124]
-
-Sat Apr 13 10:20:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * struct.c (rb_struct_define_without_accessor, rb_struct_define),
- (rb_struct_s_def): hide member names array.
-
- * struct.c (anonymous_struct, new_struct, setup_struct): split
- make_struct() for each purpose.
-
-Sat Apr 13 09:34:31 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/mkmf.rb: Add ruby/ruby.h, ruby/missing.h, ruby/intern.h,
- ruby/st.h and ruby/subst.h for ruby_headers in generated Makefile.
-
- * ext/-test-/old_thread_select/depend: Update dependencies.
-
- * ext/-test-/wait_for_single_fd/depend: Ditto.
-
- * ext/bigdecimal/depend: Ditto.
-
- * ext/curses/depend: Ditto.
-
- * ext/digest/bubblebabble/depend: Ditto.
-
- * ext/digest/depend: Ditto.
-
- * ext/digest/md5/depend: Ditto.
-
- * ext/digest/rmd160/depend: Ditto.
-
- * ext/digest/sha1/depend: Ditto.
-
- * ext/digest/sha2/depend: Ditto.
-
- * ext/dl/callback/depend: Ditto.
-
- * ext/dl/depend: Ditto.
-
- * ext/etc/depend: Ditto.
-
- * ext/nkf/depend: Ditto.
-
- * ext/objspace/depend: Ditto.
-
- * ext/pty/depend: Ditto.
-
- * ext/readline/depend: Ditto.
-
- * ext/ripper/depend: Ditto.
-
- * ext/sdbm/depend: Ditto.
-
- * ext/socket/depend: Ditto.
-
- * ext/stringio/depend: Ditto.
-
- * ext/strscan/depend: Ditto.
-
- * ext/syslog/depend: Ditto.
-
- * ext/-test-/num2int/depend: Removed.
-
- * ext/dbm/depend: Ditto.
-
- * ext/fcntl/depend: Ditto.
-
- * ext/gdbm/depend: Ditto.
-
- * ext/racc/cparse/depend: Ditto.
-
-Sat Apr 13 00:15:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/etc/etc.c (Init_etc): move Passwd and Group under Etc namespace
- as primary names.
-
-Fri Apr 12 21:06:55 2013 Tanaka Akira <akr@fsij.org>
-
- * common.mk: pack.o depends on internal.h.
-
-Fri Apr 12 20:59:24 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (ones): Use __builtin_popcountl if available.
-
- * internal.h (GCC_VERSION_SINCE): Macro moved from pack.c.
-
- * pack.c: Include internal.h for GCC_VERSION_SINCE.
-
-Fri Apr 12 18:29:42 2013 Tanaka Akira <akr@fsij.org>
-
- * common.mk: version.o depends on $(srcdir)/include/ruby/version.h
- instead of {$(VPATH)}version.h to avoid confusion by VPATH between
- top level version.h and include/ruby/version.h for build in-place.
- [ruby-dev:47249] [Bug #8256]
-
-Fri Apr 12 15:21:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * vm_insnhelper.c (vm_callee_setup_keyword_arg): non-symbol key is not
- a keyword argument, keep it as a positional argument.
-
-Fri Apr 12 11:58:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * array.c: Document synonymous methods, by windwiny [GH-277]
- * bignum.c: ditto
- * complex.c: ditto
- * dir.c: ditto
- * encoding.c: ditto
- * enumerator.c: ditto
- * numeric.c: ditto
- * proc.c: ditto
- * re.c: ditto
- * string.c: ditto
-
-Thu Apr 11 23:41:46 2013 Tanaka Akira <akr@fsij.org>
-
- * common.mk: Add dependencies for include/ruby.h
-
- * tool/update-deps: Use "make -p all miniruby ruby golf" to extract
- dependencies in makefiles.
-
-Thu Apr 11 23:21:17 2013 Tanaka Akira <akr@fsij.org>
-
- * tool/update-deps: Use "make -p all golf" to extract dependencies in
- makefiles.
-
-Thu Apr 11 21:02:19 2013 Tanaka Akira <akr@fsij.org>
-
- * common.mk: Dependency updated.
-
- * tool/update-deps: Rewritten.
-
-Thu Apr 11 19:59:48 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * common.mk: partially revert r40183, which breaks building on
- other than source directory. (its commit log also says the same
- thing, but such failure is not reproducible on my environment
- and the commit breaks build on my environment)
-
-Thu Apr 11 16:10:01 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 on
- Mac OS X and Linux [Bug #3371]
-
-Thu Apr 11 13:19:22 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * test/drb/drbtest.rb (Drb{Core,Ary}#teardown): retry Process.kill
- if it fails with Errno::EPERM on Windows (workaround).
- [ruby-dev:47245] [Bug #8251]
-
-Thu Apr 11 11:11:38 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * dir.c: Fix a typo.
-
-Thu Apr 11 10:39:34 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): add missing case:
- RUBY_LIBFFI_MODVERSION is not defined (usually on Windows).
-
-Thu Apr 11 09:27:04 2013 Konstantin Haase <me@rkh.im>
-
- * dir.c (file_s_fnmatch): Document File::FNM_EXTGLOB flag.
-
-Thu Apr 11 09:17:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * README: Fix typo by Benjamin Winkler [Fixes GH-281]
-
-Thu Apr 11 06:15:51 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * regint.h: fix typo: _M_AMD86 -> _M_AMD64.
-
- * siphash.c: ditto.
-
- * st.c: ditto.
-
-Thu Apr 11 06:09:57 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/fiddle/extconf.rb: define RUBY_LIBFFI_MODVERSION macro.
-
- * ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 or 1
- with platform and libffi's version. [Bug #3371]
-
-Thu Apr 11 05:30:43 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * lib/mkmf.rb (pkg_config): Add optional argument "option".
- If it is given, it returns the result of
- `pkg-config --<option> <pkgname>`.
-
-Thu Apr 11 03:33:05 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/fiddle/closure.c (initialize): check mprotect's return value.
- If mprotect is failed because of PaX or something, its function call
- will cause SEGV.
- http://c5664.rubyci.org/~chkbuild/ruby-trunk/log/20130401T210301Z.diff.html.gz
-
-Wed Apr 10 17:39:13 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/bigdecimal/bigdecimal.c (VpCtoV): Initialize a local variable
- even when overflow.
-
-Wed Apr 10 12:32:37 2013 Tanaka Akira <akr@fsij.org>
-
- * bignum.c (rb_ll2big): Don't overflow on signed integer negation.
-
- * ext/bigdecimal/bigdecimal.c (MUL_OVERFLOW_SIGNED_VALUE_P): New
- macro.
- (AddExponent): Don't overflow on signed integer multiplication.
- (VpCtoV): Don't overflow on signed integer arithmetic.
- (VpCtoV): Don't overflow on signed integer arithmetic.
-
-Wed Apr 10 06:32:12 2013 Tanaka Akira <akr@fsij.org>
-
- * internal.h (MUL_OVERFLOW_INT_P): New macro.
-
- * sprintf.c (GETNUM): Don't overflow on signed integer multiplication.
+ * ext/sdbm/init.c: ditto
+ [ruby-core:61217]
-Tue Apr 9 20:38:20 2013 Tanaka Akira <akr@fsij.org>
+Mon Mar 3 07:17:31 2014 Zachary Scott <e@zzak.io>
- * internal.h (MUL_OVERFLOW_SIGNED_INTEGER_P): New macro.
- (MUL_OVERFLOW_FIXNUM_P): Ditto.
- (MUL_OVERFLOW_LONG_P): Ditto.
+ * NEWS: [DOC] Update doc regarding filesystem load when flushing IO
- * array.c (rb_ary_product): Don't overflow on signed integer
- multiplication.
+Mon Mar 3 04:37:50 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * numeric.c (fix_mul): Ditto.
- (int_pow): Ditto.
+ * io.c (rb_io_fsync): need to fsync even if on Windows. fixed mistake
+ of r45254 and r45256.
- * rational.c (f_imul): Ditto.
+Mon Mar 3 04:21:34 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * insns.def (opt_mult): Ditto.
+ * test/win32ole: get rid of warnings (unused variable).
- * thread.c (sleep_timeval): Don't overflow on signed integer addition.
+Mon Mar 3 02:53:53 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * bignum.c (rb_int2big): Don't overflow on signed integer negation.
- (rb_big2ulong): Ditto.
- (rb_big2long): Ditto.
- (rb_big2ull): Ditto.
- (rb_big2ll): Ditto.
-
-Tue Apr 9 19:45:44 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/open-uri.rb: Support multiple fields with same field
- name (like Set-Cookie).
- (OpenURI::Meta#metas): New accessor to obtain fields as a Hash from
- field name (string) to field values (array of strings).
- [ruby-core:37734] [Bug #4964] reported by ren li.
-
-Tue Apr 9 15:26:12 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * compile.c (iseq_compile_each): append keyword hash to argument array
- to splat if needed. [ruby-core:54094] [Bug #8236]
-
-Tue Apr 9 10:02:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb (timestamp_file): gather timestamp files in one
- directory from each extension directories, with considering
- target_prefix.
-
-Tue Apr 9 04:57:59 JST 2013 Charles Oliver Nutter <headius@headius.com>
-
- * error.c: Capture EAGAIN, EWOULDBLOCK, EINPROGRESS exceptions and
- export them for use in WaitReadable/Writable exceptions.
- * io.c: Create versions of EAGAIN, EWOULDBLOCK, EINPROGRESS that
- include WaitReadable and WaitWritable. Add rb_readwrite_sys_fail
- for nonblocking failures using those exceptions. Use that
- function in io_getpartial and io_write_nonblock instead of
- rb_mod_sys_fail
- * ext/openssl/ossl_ssl.c: Add new SSLError subclasses that include
- WaitReadable and WaitWritable. Use those classes for
- write_would_block and read_would_block instead of rb_mod_sys_fail.
- * ext/socket/ancdata.c: Use rb_readwrite_sys_fail instead of
- rb_mod_sys_fail in bsock_sendmsg_internal and
- bsock_recvmsg_internal.
- * ext/socket/init.c: Use rb_readwrite_sys_fail instead of
- rb_mod_sys_fail in rsock_s_recvfrom_nonblock and
- rsock_s_connect_nonblock.
- * ext/socket/socket.c: Use rb_readwrite_sys_fail instead of
- rb_mod_sys_fail in sock_connect_nonblock.
- * include/ruby/ruby.h: Export rb_readwrite_sys_fail for use instead
- of rb_mod_sys_fail. Introduce new constants RB_IO_WAIT_READABLE and
- RB_IO_WAIT_WRITABLE for first arg to rb_readwrite_sys_fail.
-
-Tue Apr 9 02:44:32 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/socket/extconf.rb: $defs needs -D or -U. nothing is added
- otherwize.
-
- * ext/socket/extconf.rb: check struct in_addr6, which is defined in
- VC6 instead of in6_addr.
-
- * ext/socket/option.c (optname_to_sym): fix macro name.
-
- * ext/socket/constants.c (rsock_cmsg_type_arg): fix macro name.
-
-Mon Apr 8 23:57:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * object.c (id_for_setter): extract common code from const, class
- variable, instance variable setters.
-
-Mon Apr 8 23:55:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/depend (ENCOBJS, TRANSOBJS): use explicit path to ruby.h for
- nmake.
-
- * ext/depend (ENCOBJS, TRANSOBJS): fix header dependency, VPATH has
- $(srcdir)/include/ruby but not $(srcdir)/include, so cannot find out
- ruby/ruby.h. use ruby.h instead and ../ruby for include/ruby.h.
-
-Mon Apr 8 20:30:37 2013 Yuki Yugui Sonoda <yugui@google.com>
-
- * ext/depend (ENCOBJS, TRANSOBJS): Add missing dependencies.
-
-Mon Apr 8 17:19:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/win32ole/win32ole.c (fole_missing): should check actual argument
- count before accessing.
-
-Mon Apr 8 16:03:55 2013 Yuki Yugui Sonoda <yugui@google.com>
-
- Fixes a build failure of ext/ripper/ripper.c on building out of place.
- * common.mk (id.h, id.c): Always generated in $(srcdir).
- (ext/ripper/ripper.c): Passes $(PATH_SEPARATOR) too to the sub make.
-
-Mon Apr 8 12:05:02 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * object.c (rb_obj_ivar_set): call to_str for string only once.
- to_str was called from rb_is_const_name and rb_to_id before.
-
- * object.c (rb_mod_const_set): ditto.
-
- * object.c (rb_mod_cvar_set): ditto.
-
-Sun Apr 7 13:56:16 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-
- * test/ruby/test_require.rb (TestRequire#test_require_nonascii_path):
- RUBY_PLATFORM should escape as Regexp,
- because RUBY_PLATFORM may contain '.'.
-
-Sun Apr 7 10:44:01 2013 Tanaka Akira <akr@fsij.org>
-
- * include/ruby/defines.h: Simplify the logic to include sys/select.h.
- This fixes a compilation error on Haiku (gcc2 and gcc4).
-
- * configure.in: Use shared linker as $(CC) for Haiku.
- This fixes a build error on Haiku (gcc2).
-
-Sun Apr 7 10:41:30 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb (MDNSOneShot#sender): Delete an unused variable.
-
-Sun Apr 7 03:24:36 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * addr2line.c: use more generic type:
- * u_char -> unsigned char
- * u_short -> unsigned short
- * u_int -> unsigned int
- * u_long -> unsigned long
- * quad_t -> int64_t
- * u_quad_t -> uint64_t
-
- * addr2line.c (imax): inline is defined by configure.
-
-Sun Apr 7 01:40:39 2013 Akinori MUSHA <knu@iDaemons.org>
-
- * misc/ruby-electric.el (ruby-electric-hash): New electric
- function that expands a hash sign inside a string or regexp to
- "#{}".
-
- * misc/ruby-electric.el (ruby-electric-curlies): Do not insert
- spaces inside when the curly brace is a delimiter of %r, %w,
- etc.
-
- * misc/ruby-electric.el (ruby-electric-curlies): Insert another
- space before a closing curly brace when
- ruby-electric-newline-before-closing-bracket is nil.
-
-Sun Apr 7 01:01:26 2013 Tanaka Akira <akr@fsij.org>
-
- * strftime.c (rb_strftime_with_timespec): Test yday range.
- [ruby-core:44088] [Bug #6247] reported by Ruby Submit.
-
-Sat Apr 6 23:46:54 2013 Naohisa Goto <ngotogenome@gmail.com>
-
- * configure.in (AC_CHECK_HEADERS): atomic.h for Solaris atomic_ops.
-
- * ruby_atomic.h: Skip using Solaris10 atomic_ops on Solaris 9 or
- earlier if atomic.h is not available. [ruby-dev:47229] [Bug #8228]
-
-Sat Apr 6 23:40:40 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb: Support LOC resources.
- [ruby-core:23361] [Feature #1436] by JB Smith.
-
-Sat Apr 6 23:38:09 2013 Naohisa Goto <ngotogenome@gmail.com>
-
- * addr2line.c: quad_t and u_quad_t is not available on Solaris.
- __inline is not available with old compilers on Solaris.
- [ruby-dev:47229] [Bug #8227]
-
-Sat Apr 6 23:31:38 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb: Add one-shot multicast DNS support.
- [ruby-core:53387] [Feature #8089] by Eric Hodel.
-
-Sat Apr 6 22:12:01 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb (Resolv::DNS.fetch_resource): New method to obtain
- full result.
- [ruby-dev:43587] [Feature #4788] proposed by Makoto Kishimoto.
-
-Sat Apr 6 20:17:51 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/socket.c (rsock_sys_fail_raddrinfo): Renamed from
- rsock_sys_fail_addrinfo.
- (rsock_sys_fail_raddrinfo_or_sockaddr): Renamed from
- rsock_sys_fail_addrinfo_or_sockaddr.
-
- * ext/socket/rubysocket.h: Follow the above change.
-
-Sat Apr 6 19:24:59 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/socket.c (rsock_sys_fail_sockaddr): Takes struct sockaddr
- and socklen_t instead of String object.
- (rsock_sys_fail_addrinfo_or_sockaddr): Follow the above change.
-
- * ext/socket/rubysocket.h (rsock_sys_fail_sockaddr): Follow the above
- change.
-
-Sat Apr 6 14:28:23 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/rubysocket.h (SockAddrStringValueWithAddrinfo): New macro.
- (rsock_sockaddr_string_value_with_addrinfo): New declaration.
- (rsock_addrinfo_inspect_sockaddr): Ditto.
- (rsock_sys_fail_addrinfo): Ditto.
- (rsock_sys_fail_sockaddr_or_addrinfo): Ditto.
-
- * ext/socket/raddrinfo.c (rsock_addrinfo_inspect_sockaddr): Renamed
- from addrinfo_inspect_sockaddr and exported.
- (rsock_sockaddr_string_value_with_addrinfo): New function to obtain
- string and possibly addrinfo object.
-
- * ext/socket/socket.c (rsock_sys_fail_sockaddr): Don't use
- rsock_sys_fail_host_port which is IP dependent. Invoke
- rsock_sys_fail_addrinfo.
- (rsock_sys_fail_addrinfo): New function using
- rsock_addrinfo_inspect_sockaddr.
- (rsock_sys_fail_addrinfo_or_sockaddr): New function.
- (sock_connect): Use SockAddrStringValueWithAddrinfo and
- rsock_sys_fail_addrinfo_or_sockaddr.
- (sock_connect_nonblock): Ditto.
- (sock_bind): Ditto.
-
-Sat Apr 6 13:34:20 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/socket.c (rsock_sys_fail_sockaddr): Delete 2nd argument.
-
- * ext/socket/rubysocket.h (rsock_sys_fail_sockaddr): Follow above
- change.
-
-Sat Apr 6 13:13:39 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/socket.c (rsock_sys_fail_path): Use rb_str_inspect only
- for String to avoid SEGV.
-
-Sat Apr 6 12:40:16 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/rubysocket.h (rsock_sys_fail_host_port): Wrap by NORETURN.
- (rsock_sys_fail_path): Ditto.
- (rsock_sys_fail_sockaddr): Ditto.
-
-Sat Apr 6 11:49:35 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/socket.c (rsock_sys_fail_path): Use rb_str_inspect if the
- path contains a NUL.
-
-Sat Apr 6 11:39:19 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket: Improve socket exception message to show socket address.
- [ruby-core:45617] [Feature #6583] proposed Eric Hodel.
-
- * ext/socket/rubysocket.h (rsock_sys_fail_host_port): Declared.
- (rsock_sys_fail_path): Ditto.
- (rsock_sys_fail_sockaddr): Ditto.
-
- * ext/socket/udpsocket.c (udp_connect): Use rsock_sys_fail_host_port.
- (udp_bind): Ditto.
- (udp_send): Ditto.
-
- * ext/socket/init.c (rsock_init_sock): Specify a string for rb_sys_fail
- argument.
- (make_fd_nonblock): Ditto.
- (rsock_s_accept): Ditto.
-
- * ext/socket/ipsocket.c (init_inetsock_internal): Use
- rsock_sys_fail_host_port.
-
- * ext/socket/socket.c (rsock_sys_fail_host_port): Defined.
- (rsock_sys_fail_path): Ditto.
- (rsock_sys_fail_sockaddr): Ditto.
- (setup_domain_and_type): Use rsock_sys_fail_sockaddr.
- (sock_connect_nonblock): Ditto.
- (sock_bind): Ditto.
- (sock_gethostname): Specify a string for rb_sys_fail argument.
- (socket_s_ip_address_list): Ditto.
-
- * ext/socket/basicsocket.c (bsock_shutdown): Specify a string for
- rb_sys_fail argument.
- (bsock_setsockopt): Use rsock_sys_fail_path.
- (bsock_getsockopt): Ditto.
- (bsock_getpeereid): Refine the argument for rb_sys_fail.
-
- * ext/socket/unixsocket.c (rsock_init_unixsock): Use
- rsock_sys_fail_path.
- (unix_path): Ditto.
- (unix_send_io): Ditto.
- (unix_recv_io): Ditto.
- (unix_addr): Ditto.
- (unix_peeraddr): Ditto.
-
-Sat Apr 6 11:23:18 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-
- * test/ruby/test_require.rb (TestRequire#test_require_nonascii_path):
- fix load path for encoding to run the test as stand-alone.
-
-Sat Apr 6 09:54:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * pack.c (NATINT_LEN): fix definition order, must be after
- NATINT_PACK.
-
-Sat Apr 6 03:11:07 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/visitors/yaml_tree.rb: fix symbol keys in coder
- emission. Thanks @tjwallace
- * test/psych/test_coder.rb: test for change
-
-Sat Apr 6 02:54:08 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/exception.rb: there should be only one exception
- base class. Fixes tenderlove/psych #125
- * ext/psych/lib/psych.rb: require the correct exception class
- * ext/psych/lib/psych/syntax_error.rb: ditto
- * ext/psych/lib/psych/visitors/to_ruby.rb: ditto
-
-Sat Apr 6 02:30:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (new_defined): remove all extra parentheses, and return
- "nil" for defined? with empty expression.
- [ruby-core:54024] [Bug #8224]
-
-Sat Apr 6 02:06:04 2013 Aaron Patterson <aaron@tenderlovemaking.com>
-
- * ext/psych/lib/psych/visitors/to_ruby.rb: correctly register
- self-referential strings. Fixes tenderlove/psych #135
-
- * test/psych/test_string.rb: appropriate test.
-
-Sat Apr 6 01:21:56 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/init.c (cloexec_accept): Fix a compile error on
- Debian GNU/kFreeBSD. Consider HAVE_ACCEPT4 is defined
- but SOCK_CLOEXEC is not defined.
-
-Sat Apr 6 00:19:30 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-
- * load.c (features_index_add): use rb_str_subseq() to specify C string
- position properly to fix require non ascii path.
- [ruby-core:53733] [Bug #8165]
-
- * test/ruby/test_require.rb (TestRequire#test_require_nonascii_path):
- a test for the above.
-
-Fri Apr 5 20:41:49 2013 Tanaka Akira <akr@fsij.org>
-
- * include/ruby/defines.h (HAVE_TRUE_LONG_LONG): Defined to distinguish
- availability of long long and availability of 64bit integer type.
-
- * pack.c: Use HAVE_TRUE_LONG_LONG to distinguish q! and Q! support.
-
-Fri Apr 5 20:19:42 2013 Tanaka Akira <akr@fsij.org>
-
- * addr2line.c: Include ruby/missing.h to fix compile error on Debian.
-
-Fri Apr 5 19:39:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * compile.c (iseq_compile_each): fix of defined? with empty
- expression. [ruby-core:53999] [Bug #8220]
-
-Fri Apr 5 13:22:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * ext/curses/curses.c (Init_curses): fix implementation function,
- crmode should be same as cbreak. [ruby-core:54013] [Bug #8222]
-
-Fri Apr 5 12:06:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/curses/hello.rb: Typo in Curses example by Drew Blas
- [Fixes GH-273]
-
-Thu Apr 4 23:45:13 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb (bind_random_port): Rescue EACCES for SunOS.
- bind() on SunOS for port 2049 (nfs) and 4045 (lockd) causes
- EACCES with unprivileged process. cf. PRIV_SYS_NFS in privileges(5)
- [ruby-core:48064] [Bug #7183] reported by Frank Meier.
-
-Thu Apr 4 23:24:45 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/extconf.rb: Remove condition for bcc.
-
-Thu Apr 4 22:53:23 2013 Tanaka Akira <akr@fsij.org>
-
- * include/ruby/ruby.h (FIX2LONG): Parenthesize the macro body.
-
-Thu Apr 4 22:32:32 2013 Tanaka Akira <akr@fsij.org>
-
- * time.c (time_strftime): Describe %L and %N truncates digits under
- the specified length.
- [ruby-core:52130] [Bug #7829]
-
-Thu Apr 4 22:08:46 2013 Tanaka Akira <akr@fsij.org>
-
- * object.c (rb_mod_cvar_set): Reverted "avoid inadvertent
- symbol creation" to avoid SEGV by
- Class.new.class_variable_set(1, 2).
-
-Thu Apr 4 20:07:19 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/pathname/pathname.c (path_write): New method.
- (path_binwrite): Ditto.
- [ruby-core:49468] [Feature #7378]
-
-Thu Apr 4 16:51:29 2013 Yuki Yugui Sonoda <yugui@google.com>
-
- * thread_pthread.c: Fixes wrong scopes of #if USE_SLEEPY_TIMER_THREAD
- .. #endif sections. This fixes a build error on NativeClient.
-
-Wed Apr 3 17:25:31 2013 Yuki Yugui Sonoda <yugui@google.com>
-
- * thread_pthread.c (ruby_init_stack): Avoid using uninitialized value.
- stackaddr and size are not set if get_stack() fails.
-
-Thu Apr 4 16:55:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * struct.c (make_struct): avoid inadvertent symbol creation.
- (rb_struct_aref): ditto.
- (rb_struct_aset): ditto.
-
-Thu Apr 4 16:54:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * object.c (rb_mod_const_set): avoid inadvertent symbol creation.
- (rb_obj_ivar_set): ditto.
- (rb_mod_cvar_set): ditto.
-
-Thu Apr 4 15:46:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * enum.c (enum_inject): avoid inadvertent symbol creation.
-
-Thu Apr 4 14:37:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * thread.c (rb_thread_aref): avoid inadvertent symbol creation.
- (rb_thread_variable_get): ditto.
- (rb_thread_key_p): ditto.
- (rb_thread_variable_p): ditto.
-
-Thu Apr 4 11:33:57 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/openssl/ossl_bn.c (ossl_bn_to_i): Use bn2hex to speed up.
- In general, binary to/from decimal needs extra cost.
-
-Thu Apr 4 07:24:18 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/extconf.rb: Specify arguments to test functions.
-
-Thu Apr 4 03:25:09 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * ext/openssl/ossl_bn.c (ossl_bn_initialize): fix can't create from bn.
-
-Wed Apr 3 22:09:25 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/extconf.rb: Test functions and libraries after headers.
-
-Wed Apr 3 21:23:29 2013 Tanaka Akira <akr@fsij.org>
-
- * io.c (rb_io_seek_m): Accept :CUR, :END, :SET as "whence" argument.
- (interpret_seek_whence): New function.
- [ruby-dev:45818] [Feature #6643]
-
-Wed Apr 3 20:52:49 2013 Tanaka Akira <akr@fsij.org>
-
- * process.c: Describe the behavior which Ruby invokes a commandline
- directly without shell if the commandline is simple enough.
- [ruby-core:50459] [Bug #7489]
-
-Wed Apr 3 20:27:37 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/extmk.rb (extmake): Invoke Logging::log_close in a ensure
- clause.
-
-Wed Apr 3 18:53:58 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/extmk.rb (extmake): Use Logging.open to switch stdout and
- stderr. Delay Logging::log_close until the failure message is
- written. Write the failure message only if log file is opened.
-
- * lib/mkmf.rb (Logging.log_opened?): New method.
-
- [ruby-dev:47215] [Bug #8209]
-
-Wed Apr 3 17:11:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/win32.c (constat_apply): pass through unknown sequence which
- starts with ESC but is not followed by a bracket. [ruby-core:53879]
- [Bug #8201]
-
-Wed Apr 3 16:35:32 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * bignum.c (rb_big_eq): hide intermediate Bignums not just freeing
- memory. [ruby-core:53893] [Bug #8204]
-
- * object.c (rb_obj_hide): hide an object by clearing klass.
-
- * bignum.c (rb_big_eq): test as Fixnum if possible and get rid of zero
- length Bignum. [ruby-core:53893] [Bug #8204]
-
-Tue Apr 2 23:56:03 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/securerandom.rb (SecureRandom.random_bytes): Use
- OpenSSL::Random.random_add instead of OpenSSL::Random.seed and
- specify 0.0 as the entropy.
- [ruby-core:47308] [Bug #6928]
-
-Tue Apr 2 20:24:52 2013 Tanaka Akira <akr@fsij.org>
-
- * pack.c: Support Q! and q! for long long.
- (natstr): Moved to toplevel. Add q and Q if there is long long type.
- (endstr): Moved to toplevel.
- (NATINT_PACK): Consider long long.
- (NATINT_LEN_Q): New macro.
- (pack_pack): Support Q! and q!.
- (pack_unpack): Ditto.
- [ruby-dev:43970] [Feature #3946]
-
-Tue Apr 2 19:24:26 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/-test-/num2int/num2int.c: Define utility methods
- as module methods of Num2int.
-
- * test/-ext-/num2int/test_num2int.rb: Follow the above change.
-
-Tue Apr 2 18:49:01 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/securerandom.rb: Don't use Array#to_s.
- [ruby-core:52058] [Bug #7811] fixed by zzak (Zachary Scott).
-
-Tue Apr 2 17:38:20 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * re.c (rb_reg_to_s): suppress duplicated charclass warning.
- Regexp#to_s suppress extra its whole regexp options by calling
- onig_new with its source, but it doesn't call rb_reg_preprocess.
- Therefore its Unicode escapes (\u{XXXX}) are given as is,
- and it may cause duplicated charclass warning for example
- "[\u{33}]" (3 is duplicated) or "[\u{a}\u{b}]" (u is duplicated).
- [ruby-core:53649] [Bug #8151]
-
-Tue Apr 2 16:00:06 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * vm_dump.c (rb_print_backtrace): separate to ease showing C backtrace.
-
- * internal.h (rb_print_backtrace): ditto.
-
-Tue Apr 2 15:22:09 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * test/ruby/envutil.rb (assert_separately): stop_auto_run of
- Test::Unit::Runner to prevent auto runner use ARGV.
-
- * test/ruby/envutil.rb (assert_separately): add $: to separate process.
-
- * test/ruby/envutil.rb (assert_separately): fail if stderr is not
- empty and ignore_stderr is false.
-
-Tue Apr 2 06:46:59 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/-test-/num2int/num2int.c: Rename utility methods
- to global functions to ease manual experiments.
-
- * test/-ext-/num2int/test_num2int.rb: Follow the above change.
-
-Mon Apr 1 22:26:17 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/zlib/zlib.c (rb_gzfile_set_mtime): Use NUM2UINT.
- The old logic doesn't work well on LP64 platforms as:
- .. -2**63-1 => error,
- -2**63 .. -2**62-1 => success,
- -2**62 .. -2**31-1 => error,
- -2**31 .. 2**31-1 => success,
- 2**31 .. 2**62-1 => error,
- 2**62 .. 2**64-1 => success,
- 2**64 .. => error.
-
-Mon Apr 1 22:08:02 2013 Benoit Daloze <eregontp@gmail.com>
-
- * ext/zlib/zlib.c (Zlib::Inflate.new):
- Fix documentation syntax and naming errors.
- Based on patch by Robin Dupret. Fix GH-271.
-
-Mon Apr 1 21:22:31 2013 Tanaka Akira <akr@fsij.org>
-
- * test/-ext-/num2int/test_num2int.rb: Test small bignums.
-
-Mon Apr 1 21:10:56 2013 Tanaka Akira <akr@fsij.org>
-
- * numeric.c (rb_num2ulong_internal): Don't cast a negative double value
- into unsigned long, which is undefined behavior.
- (rb_num2ull): Don't cast a value bigger than LLONG_MAX into
- long long, which is undefined behavior.
-
-Mon Apr 1 20:57:57 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/-test-/num2int/num2int.c: Return string for result, instead of
- printing.
-
- * test/-ext-/num2int/test_num2int.rb: updated to follow above change.
-
-Mon Apr 1 20:08:07 2013 Tanaka Akira <akr@fsij.org>
-
- * numeric.c (rb_num2long): Don't use SIGNED_VALUE uselessly.
- (check_int): Ditto.
- (check_short): Ditto.
- (rb_num2fix): Ditto.
- (rb_num2ulong_internal): Add a cast.
-
-Mon Apr 1 18:41:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: skip autoconf 2.64 and 2.66, 2.67 seems short-lived
- but stick on it for Debian Squeeze.
-
-Mon Apr 1 14:22:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in: check clang version by predefined macro values.
- [Bug #8192]
-
-Mon Apr 1 12:05:15 2013 Tanaka Akira <akr@fsij.org>
-
- * numeric.c (check_uint): Take the 1st argument as unsigned long,
- instead of VALUE. Refine the validity test conditions.
- (check_ushort): Ditto.
-
-Mon Apr 1 07:15:03 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
-
- * configure.in: use quadrigraph to put '[' or ']'. [Bug #8192]
-
-Mon Apr 1 04:16:41 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * configure.in: kick old clang. [ruby-dev:47204] [Bug #8192]
-
-Mon Apr 1 01:12:46 2013 Tanaka Akira <akr@fsij.org>
-
- * include/ruby/ruby.h (FIX2ULONG): Make it consistent with NUM2ULONG.
-
- * ext/-test-/num2int/num2int.c: Add utility methods for FIX2XXX tests.
-
- * test/-ext-/num2int/test_num2int.rb: Add tests for FIX2XXX.
-
-Sun Mar 31 17:17:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * proc.c (rb_mod_define_method): consider visibility in define_method.
- patch by mashiro <mail AT mashiro.org>. fix GH-268.
-
-Sun Mar 31 15:40:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * win32/configure.bat: try to fix option arguments split by commas and
- equals here. this batch file no longer run with old command.com.
-
- * tool/mkconfig.rb: no hacks for cmd.exe.
-
-Sun Mar 31 13:47:04 2013 Tanaka Akira <akr@fsij.org>
-
- * numeric.c (rb_num2ulong_internal): New function similar to
- rb_num2ulong but integer wrap around flag is also returned.
- (rb_num2ulong): Use rb_num2ulong_internal.
- (rb_num2uint): Use rb_num2ulong_internal and the wrap around flag is
- used instead of negative_int_p(val).
- (rb_num2ushort): ditto.
-
-Sun Mar 31 06:27:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * class.c (HAVE_METACLASS_P): should check FL_SINGLETON flag before get
- instance variable to get rid of wrong warning about __attached__.
- [ruby-core:53839] [Bug #8188]
-
-Sat Mar 30 14:11:28 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-
- * bcc32: removed. agreed at
- http://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20130223Japan
-
-Sat Mar 30 03:58:00 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/file.c (code_page): use cp1252 instead of cp20127 as US-ASCII.
- fix [ruby-core:53079] [Bug #7996]
- reported and patched by mmeltner (Michael Meltner).
-
-Sat Mar 30 03:49:21 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-
- * win32/win32.c (wrename): use MoveFileExW instead of MoveFileW,
- because the latter fails on cross device file move of some
- environments.
- fix [ruby-core:53492] [Bug #8109]
- reported by mitchellh (Mitchell Hashimoto).
-
-Fri Mar 29 22:09:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * thread.c (rb_mutex_synchronize_m): yield no block params. patch by
- splattael (Peter Suschlik) in [ruby-core:53773] [Bug #8097].
- fix GH-266.
-
-Fri Mar 29 16:51:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * io.c (argf_next_argv): set init flag if succeeded to forward, after
- skipping.
-
- * io.c (argf_block_call_i, argf_block_call): no more forwarding if
- forwarded after skipping. [ruby-list:49185]
-
- * io.c (argf_close): deal with init flag.
-
- * io.c (argf_block_call_i, argf_block_call): forward next file if
- skipped while iteration, to get rid of IOError. [ruby-list:49185]
-
-Fri Mar 29 11:09:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb (configuration): not include all CFLAGS in CXXFLAGS, to
- use different set than C for C++. [ruby-core:45273] [Bug #6504]
-
-Fri Mar 29 10:24:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/io.h: undef POSIX compliant names on AIX, which are no
- longer needed. patch suggested by edelsohn (David Edelsohn) in
- [ruby-core:53815]. [Bug #8174]
-
-Fri Mar 29 06:39:42 2013 Tanaka Akira <akr@fsij.org>
-
- * numeric.c (rb_num2ull): Cast double to unsigned LONG_LONG via
- LONG_LONG instead of double to unsigned LONG_LONG directly.
- This is a challenge to fix a test_num2ull(TestNum2int)
- failure (NUM2ULL(-1.0) should be "18446744073709551615" but was "0")
- on Mac OS X with 32bit clang.
- http://a.mrkn.jp/~mrkn/chkbuild/mountain_lion/ruby-trunk-m32-o0/log/20130328T191100Z.diff.html.gz
-
-Fri Mar 29 00:54:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb (MAIN_DOES_NOTHING): ensure symbols for tests to be
- preserved. [ruby-core:53745] [Bug #8169]
-
-Thu Mar 28 23:11:25 2013 Tanaka Akira <akr@fsij.org>
-
- * lib/resolv.rb: Test Windows platform by detecting LoadError when
- require 'win32/resolv' suggested by Nobuyoshi Nakada [ruby-core:53389].
- [ruby-core:53388] [Feature #8090] Reported by Charles Nutter.
-
-Thu Mar 28 23:10:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/io.h: rename SVR3,4 member names as POSIX compliant,
- to get rid of conflict on AIX. [ruby-core:53765] [Bug #8174]
-
-Thu Mar 28 18:22:21 2013 Tanaka Akira <akr@fsij.org>
-
- * test/-ext-/num2int/test_num2int.rb: extract
- assert_num2i_success_internal and assert_num2i_error_internal and
- provide assertion messages as "NUM2XXX(NNN)".
-
-Thu Mar 28 07:05:25 2013 Tanaka Akira <akr@fsij.org>
-
- * include/ruby/intern.h: Delete redundant inclusions caused by
- AC_INCLUDES_DEFAULT in defines.h.
-
- * include/ruby/defines.h: Ditto.
-
- * include/ruby/ruby.h: Ditto.
-
- * include/ruby/st.h: Ditto.
-
-Thu Mar 28 06:51:31 2013 Tanaka Akira <akr@fsij.org>
-
- * include/ruby/defines.h: Fix a compilation error on NetBSD,
- "type of formal parameter 1 is incomplete" for the rb_thread_wait_for
- invocation in rb_file_flock, by including header files as
- AC_INCLUDES_DEFAULT of autoconf.
-
-Wed Mar 27 22:09:14 2013 Tanaka Akira <akr@fsij.org>
-
- * numeric.c (LONG_MIN_MINUS_ONE_IS_LESS_THAN): New macro.
- (LLONG_MIN_MINUS_ONE_IS_LESS_THAN): Ditto.
- (rb_num2long): Use LONG_MIN_MINUS_ONE_IS_LESS_THAN.
- (rb_num2ulong): Ditto.
- (rb_num2ll): Use LLONG_MIN_MINUS_ONE_IS_LESS_THAN.
- (rb_num2ull): Ditto.
-
- * test/-ext-/num2int/test_num2int.rb (assert_num2i_success): Test the
- value converted into a Float if Float can represent the value
- exactly.
- (assert_num2i_error): Ditto.
-
-Wed Mar 27 20:59:47 2013 Tanaka Akira <akr@fsij.org>
-
- * test/-ext-/num2int/test_num2int.rb (assert_num2i_success): New
- utility method.
- (assert_num2i_error): Ditto.
-
-Wed Mar 27 20:37:59 2013 Tanaka Akira <akr@fsij.org>
-
- * time.c (num_exact): Use to_r method only if to_int method is
- available.
- [ruby-core:53764] [Bug #8173] Reported by Hiro Asari.
-
-Wed Mar 27 12:07:40 2013 Tanaka Akira <akr@fsij.org>
-
- * test/-ext-/num2int/test_num2int.rb (test_num2ll): test LLONG_MIN,
- not LONG_MIN.
-
-Wed Mar 27 12:02:45 2013 Tanaka Akira <akr@fsij.org>
-
- * internal.h (TIMET_MAX_PLUS_ONE): definition simplified.
-
-Wed Mar 27 06:39:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * lib/mkmf.rb (MAIN_DOES_NOTHING): force to refer symbols for tests
- to be preserved. [ruby-core:53745] [Bug #8169]
-
-Wed Mar 27 05:15:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (RUBY_REPLACE_TYPE): define SIGNEDNESS_OF_type same as
- check_signedness of mkmf.rb.
-
- * internal.h (TIMET_MAX, TIMET_MIN, TIMET_MAX_PLUS_ONE): use
- SIGNEDNESS_OF_TIME_T.
-
-Wed Mar 27 00:28:45 2013 Tanaka Akira <akr@fsij.org>
-
- * internal.h (TIMET_MAX_PLUS_ONE): Defined.
-
- * thread.c (double2timeval): Saturate out-of-range values.
-
-Tue Mar 26 23:41:18 2013 Tanaka Akira <akr@fsij.org>
-
- * internal.h: Define TIMET_MAX and TIMET_MIN here.
-
- * time.c: Remove TIMET_MAX and TIMET_MIN definitions.
-
- * thread.c: Ditto.
-
- * thread_pthread.c: Remove TIMET_MAX definition.
-
- * thread_win32.c: Ditto.
-
-Tue Mar 26 22:31:10 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/socket.c (sockaddr_len): return the shortest length for
- unknown socket address.
-
-Tue Mar 26 22:14:46 2013 Tanaka Akira <akr@fsij.org>
-
- * thread.c (double2timeval): convert the infinity to TIME_MAX to avoid
- SEGV by Thread.new {}.join(Float::INFINITY) on
- Debian GNU/Linux (amd64).
-
-Mon Mar 25 07:09:20 2013 Eric Hodel <drbrain@segment7.net>
+ * io.c (rb_io_flush_raw): [EXPERIMENTAL] remove force syncing for Win32
+ to speed up IO. this may break some tests, and they'll be fixed
+ later.
+ [ruby-core:58570] [Bug #9153]
- * lib/rinda/tuplespace.rb: Only return tuple entry once on move,
- either through port or regular return, not both. This results in a
- 120% speedup when combined with #8125. Patch by Joel VanderWerf.
- [ruby-trunk - Feature #8119]
+Mon Mar 3 00:17:43 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-Mon Mar 25 06:59:01 2013 Eric Hodel <drbrain@segment7.net>
+ * test/ruby/test_backtrace.rb: get rid of warnings. unused variable,
+ shadowing.
- * test/rinda/test_rinda.rb: Skip IPv6 tests if no IPv6 addresses
- exist. Skip fork-dependent test if fork is not available.
- [ruby-trunk - Bug #8159]
+Sun Mar 2 11:15:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sun Mar 24 10:38:24 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * lib/find.rb (Find#find): add "ignore_error" keyword argument
+ defaulted to true. [ruby-core:51025] [Feature #7596]
- * addr2line.c (putce): suppress unused return value warning.
+Sun Mar 2 11:13:30 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Mon Mar 25 02:01:03 2013 Narihiro Nakamura <authornari@gmail.com>
+ * ext/readline/extconf.rb (rl_hook_func_t): define as Function for
+ very old readline versions. [ruby-core:61209] [Bug #9578]
- * proc.c (bm_free): need to clean up the mark flag of a free and
- unlinked method entry. [Bug #8100] [ruby-core:53439]
+Sun Mar 2 10:47:58 2014 Eric Wong <e@80x24.org>
-Sun Mar 24 22:13:51 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * load.c (ruby_init_ext): make idempotent to suppress warnings
- * string.c (rb_str_rpartition): revert r39903, and convert byte offset
- to char offset; the return value of rb_reg_search is byte offset,
- but other than it of rb_str_rpartition expects char offset.
- [Bug #8138] [ruby-dev:47183]
+Sat Mar 1 19:51:42 2014 Tanaka Akira <akr@fsij.org>
-Sun Mar 24 18:29:46 2013 Akinori MUSHA <knu@iDaemons.org>
+ * lib/open3.rb (Open3.capture3): Ignore Errno::EPIPE for writing
+ stdin_data.
+ (Open3.capture2): Ditto.
+ (Open3.capture2e): Ditto.
- * string.c (rb_str_rpartition): Fix String#rpartition(/re/)
- against a multibyte string. [Bug #8138] [ruby-dev:47183]
+Sat Mar 1 19:06:47 2014 Eric Wong <e@80x24.org>
-Sun Mar 24 13:42:24 2013 Narihiro Nakamura <authornari@gmail.com>
+ * gc.c (ruby_gc_set_params): simplify condition
- * gc.c (GC_ENABLE_LAZY_SWEEP): new macro to switch lazy sweeping
- for debugging. [Feature #8024] [ruby-dev:47135]
+Sat Mar 1 16:18:40 2014 Tanaka Akira <akr@fsij.org>
-Sun Mar 24 12:55:47 2013 Narihiro Nakamura <authornari@gmail.com>
+ * ext/readline/readline.c (Init_readline): Use rl_hook_func_t instead
+ of Function to support readline-6.3. (rl_hook_func_t is available
+ since readline-4.2.)
+ Reported by Dmitry Medvinsky. [ruby-core:61141] [Bug #9578]
- * gc.c: We have no chance to expand the heap when lazy sweeping is
- restricted. So collecting is often invoked if there is not
- enough free space in the heap. Try to expand heap when this is
- the case.
+Sat Mar 1 16:05:58 2014 Eric Wong <e@80x24.org>
-Sun Mar 24 11:03:31 2013 Tanaka Akira <akr@fsij.org>
+ * gc.c (ruby_gc_set_params): fix building without RGenGC
- * test/ruby/test_require.rb: Remove temporally files in the tests.
+Sat Mar 1 11:08:00 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * test/ruby/test_rubyoptions.rb: Ditto.
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: support dumping Encoding
+ objects.
- * test/logger/test_logger.rb: Ditto.
+ * ext/psych/lib/psych/visitors/to_ruby.rb: support loading Encoding
+ objects.
- * test/psych/test_psych.rb: Ditto.
+ * test/psych/test_encoding.rb: add test
- * test/readline/test_readline.rb: Ditto.
+ * ext/psych/lib/psych.rb: add version
- * test/syslog/test_syslog_logger.rb: Ditto.
+Sat Mar 1 10:52:34 2014 Zachary Scott <e@zzak.io>
- * test/webrick/test_httpauth.rb: Ditto.
+ * README.EXT.ja: [DOC] Fix typo "macro macro" @utenmiki [Fixes GH-551]
+ https://github.com/ruby/ruby/pull/551
- * test/zlib/test_zlib.rb: Ditto.
+Fri Feb 28 11:16:55 2014 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-Sun Mar 24 05:36:29 2013 Eric Hodel <drbrain@segment7.net>
+ * numeric.c: Fix Numeric#step with 0 unit [Bug #9575]
- * lib/rinda/ring.rb: Added documentation for multicast support.
+Thu Feb 27 17:59:01 2014 Zachary Scott <e@zzak.io>
- * NEWS: Point to above documentation.
+ * lib/optparse.rb: [DOC] Add example of generating help with optparse.
+ Patch by @joelmccracken documenting-ruby/ruby#19
+ https://github.com/documenting-ruby/ruby/pull/19
-Sun Mar 24 05:32:39 2013 Eric Hodel <drbrain@segment7.net>
+Thu Feb 27 12:10:09 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/rinda/test_rinda.rb: Restore tests commented out while fixing
- test slowdown bug before r39895.
+ * numeric.c (ruby_num_interval_step_size): check signs and get rid
+ of implementation dependent behavior of negative division.
+ [ruby-core:61106] [Bug #9570]
-Sun Mar 24 05:03:36 2013 Eric Hodel <drbrain@segment7.net>
+Thu Feb 27 03:55:45 2014 Zachary Scott <e@zzak.io>
- * lib/rinda/ring.rb: Add multicast support to Rinda::RingFinger and
- Rinda::RingServer. [ruby-trunk - Bug #8073]
- * test/rinda/test_rinda.rb: Test for the above.
+ * thread.c: [DOC] Typo in comment for _FORTIFY_SOURCE [Fixes GH-548]
+ Patch by @qnet-herwin https://github.com/ruby/ruby/pull/548
- * NEWS: Update with Rinda multicast support
+Wed Feb 26 18:43:43 2014 Koichi Sasada <ko1@atdot.net>
-Sun Mar 24 04:13:27 2013 Eric Hodel <drbrain@segment7.net>
+ * gc.c (heap_pages_free_unused_pages): check tomb page availability
+ at first.
+ And return immediately if we don't touch sorted list any more.
- * test/rinda/test_rinda.rb: Fixed test failures in r39890 and r39891
- due to stopping DRb service.
+Wed Feb 26 14:10:44 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sun Mar 24 03:34:02 2013 Eric Hodel <drbrain@segment7.net>
+ * eval.c (setup_exception): preserve exception class name encoding
+ in debug mode messages.
- * lib/rinda/rinda.rb: Fixed loss of tuple when remote is alive but the
- call stack was unwound. Patch by Joel VanderWerf.
- [ruby-trunk - Bug #8125]
- * test/rinda/test_rinda.rb: Test for the above.
+ * eval.c (setup_exception): preserve errinfo across calling #to_s
+ method on the exception. [ruby-core:61091] [Bug #9568]
-Sun Mar 24 02:14:53 2013 Tanaka Akira <akr@fsij.org>
+Wed Feb 26 01:29:27 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * test/mkmf/test_have_macro.rb: remove temporally files in the tests.
+ * string.c (sym_find): Add Symbol.find(str), which returns whether given
+ string is defined as symbol or not. [Feature #7854]
-Sat Mar 23 23:50:04 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Tue Feb 25 22:52:02 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
- * addr2line.c (kprintf): added from FreeBSD libstand's printf.
- this is consided as async signal safe function.
+ * ext/dl/dl.c (rb_dl_realloc): use NUM2SIZET instead of NUM2INT.
- * addr2line.c (rb_dump_backtrace_with_lines): use kfprintf.
- [Bug #8144] [ruby-core:53632]
+ * ext/fiddle/fiddle.c (rb_fiddle_realloc): ditto.
-Sat Mar 23 23:28:00 2013 Kenta Murata <mrkn@mrkn.jp>
+Tue Feb 25 22:49:30 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
- * ext/bigdecimal/bigdecimal.c (BigDecimal_divide): Use Qnil and NIL_P
- instead of (VALUE)0 as a return value.
+ * ext/dl/dl.c (rb_dl_malloc): use NUM2SIZET instead of NUM2INT.
+ Coverity Scan found this bug.
- * ext/bigdecimal/bigdecimal.c (BigDecimal_div): ditto.
+ * ext/fiddle/fiddle.c (rb_fiddle_malloc): ditto.
- * ext/bigdecimal/bigdecimal.c (BigDecimal_divremain): ditto.
+Tue Feb 25 12:06:13 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * ext/bigdecimal/bigdecimal.c (BigDecimal_remainder): ditto.
+ * win32/Makefile.sub: define PACKED_STRUCT.
-Sat Mar 23 17:39:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Feb 24 21:41:56 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * vm_eval.c (check_funcall_respond_to): preserve passed_block, which
- is modified in vm_call0_body() via vm_call0(), and caused a bug of
- rb_check_funcall() by false negative result of rb_block_given_p().
- re-fix [ruby-core:53650] [Bug #8153].
- [ruby-core:53653] [Bug #8154]
+ * README.md, README.ja.md: removed (wrong) mode setting for emacs.
-Fri Mar 22 17:48:34 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Feb 24 20:05:41 2014 Eric Wong <e@80x24.org>
- * lib/forwardable.rb (Forwardable::FILE_REGEXP): create regexp object
- outside sources for eval, to reduce allocations in def_delegators
- wrappers. //o option does not make each regexps shared. patch by
- tmm1 (Aman Gupta) in [ruby-core:53620] [Bug #8143].
+ * configure.in: define PACKED_STRUCT_UNALIGNED for x86*
+ * timev.h (struct vtm): use PACKED_STRUCT_UNALIGNED
+ * time.c (struct time_object): ditto
+ [Bug #9558] non-x86 cannot safely access unaligned addresses
-Fri Mar 22 17:38:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Feb 24 18:10:02 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * load.c (rb_feature_p), vm_core.h (rb_vm_struct): turn
- loaded_features_index into st_table. patches by tmm1 (Aman Gupta)
- in [ruby-core:53251] and [ruby-core:53274] [Bug #8048]
+ * test/fiddle/test_function.rb: remove unused variables.
+ * test/fileutils/test_fileutils.rb: ditto.
+ * test/io/console/test_io_console.rb: ditto.
-Fri Mar 22 10:29:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Mon Feb 24 12:37:51 2014 Eric Wong <e@80x24.org>
- * ext/bigdecimal/bigdecimal.c: Fix style.
+ * configure.in: use -Wno-packed-bitfield-compat for GCC 4.4+
+ use __attribute__((packed)) if available
+ * timev.h: shrink and pack struct vtm
+ * time.c: pack struct time_object and adjust/introduce helpers
+ [ruby-core:60794]
-Fri Mar 22 05:30:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Feb 23 17:55:50 2014 Kouhei Sutou <kou@cozmixng.org>
- * parse.y (ambiguous_operator): refine warning message, since this
- warning is shown after literal too.
+ * lib/rexml/xmltokens.rb: Add missing non ASCII valid characters
+ to element name characters. Now, REXML name tokens exactly
+ match "[5] Name" in the XML spec and "[4] NCName" in the
+ Namespaces in XML spec. See comment about the details.
+ [Bug #9539] [ruby-core:60901]
+ Reported by Mario Barcala. Thanks!!!
-Fri Mar 22 04:51:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/rexml/xpath/test_node.rb: Add tests for the above case.
- * vm_insnhelper.c (vm_callee_setup_keyword_arg): should check required
- keyword arguments even if rest hash is defined. [ruby-core:53608]
- [Bug #8139]
+Sun Feb 23 12:18:54 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Mar 22 01:00:17 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+ * ext/socket/raddrinfo.c (inet_pton): use rb_w32_inet_pton, instead of
+ inet_pton directly, which is unavailable on older version Windows.
- * process.c (rb_execarg_addopt, run_exec_pgroup): use rb_pid_t
- instead of pid_t.
+ * include/ruby/win32.h, win32/win32.c (rb_w32_inet_pton): add a
+ wrapper function for inet_pton minimum supported client is
+ Vista, as well as inet_ntop.
- * ext/pty/pty.c (raise_from_check, pty_check): ditto.
+Sun Feb 23 11:33:25 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Fri Mar 22 00:04:15 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * test/net/imap/test_imap.rb: remove unused variables.
+ * test/net/imap/test_imap_response_parser.rb: ditto.
+ * test/net/pop/test_pop.rb: ditto.
- * addr2line.c (rb_dump_backtrace_with_lines): output line at once.
+Sun Feb 23 02:19:51 2014 Tanaka Akira <akr@fsij.org>
-Thu Mar 21 23:17:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/resolv.rb (bind_random_port): Rescue EPERM for FreeBSD which
+ security.mac.portacl.port_high is changed.
+ See mac_portacl(4) for details.
+ Reported by Jakub Szafranski. [ruby-core:60917] [Bug #9544]
- * thread.c (ruby_kill): get rid of deadlock on signal 0.
- [ruby-dev:47182] [Bug #8137]
+Sat Feb 22 23:17:01 2014 Kouhei Sutou <kou@cozmixng.org>
-Thu Mar 21 22:39:46 2013 Naohisa Goto <ngotogenome@gmail.com>
+ * lib/rexml/xpath_parser.rb: Fix indent.
- * marshal.c (marshal_dump, marshal_load): workaround for segv on
- Intel Solaris compiled with Oracle SolarisStudio 12.3.
- Partly revert r38174. [ruby-core:52042] [Bug #7805]
+Sat Feb 22 23:15:35 2014 Kouhei Sutou <kou@cozmixng.org>
-Thu Mar 21 16:48:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/rexml/xpath/test_attribute.rb: Simplify.
- * parse.y (simple_re_meta): escape all closing characters, not only
- round parenthesis. [ruby-core:53578] [Bug #8133]
+Sat Feb 22 20:28:47 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-Thu Mar 21 13:50:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * tool/redmine-backporter.rb: more friendly.
- * vm_core.h (UNINITIALIZED_VAR): suppress warnings by clang 4.2.
- [ruby-core:51742] [Bug #7756]
+Sat Feb 22 20:24:43 2014 Kouhei Sutou <kou@cozmixng.org>
-Thu Mar 21 07:34:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * test/rexml/test_xpath*.rb: Move to ...
+ * test/rexml/xpath/*.rb: ... here.
- * ext/date/date_core.c: Typo in Date::MONTHNAMES by Matt Gauger
- [GH fixes #261]
+Sat Feb 22 20:04:41 2014 Kouhei Sutou <kou@cozmixng.org>
-Wed Mar 20 22:53:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/rexml/listener.rb: Untabify.
- * lib/mkmf.rb (find_library): fix to format message.
- [ruby-core:53568] [Bug #8130]
+Sat Feb 22 19:07:31 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-Wed Mar 20 22:52:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/io/console/console.c (console_dev): need read access for conout$
+ because some functions need it. [Bug#9554]
- * lib/mkmf.rb (install_dirs, with_destdir): prefix with DESTDIR
- directories to install only unless bundled extension libraries.
- [ruby-core:53502] [Bug #8115]
+Sat Feb 22 18:40:58 2014 Eric Wong <e@80x24.org>
-Wed Mar 20 17:47:53 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * .gitignore: ignore benchmark files
- * test/win32ole/test_err_in_callback.rb (TestErrInCallBack#setup):
- allow using different root for source and build directories.
- this may fixes a minor problem of r39834.
+Sat Feb 22 01:22:24 2014 Yusuke Endoh <mame@tsg.ne.jp>
-Wed Mar 20 16:40:48 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+ * bignum.c (bary_mul_precheck): fix a copy-paste error.
+ Coverity Scan found this bug.
- * test/ruby/test_signal.rb (test_hup_me): skip if HUP isn't supported.
- On Windows this test causes ArgumentError.
+Sat Feb 22 00:58:51 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-Wed Mar 20 16:24:12 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+ * ext/socket/raddrinfo.c (rb_getaddrinfo): second argument of
+ MEMZERO is type. Coverity Scan found this bug.
- * test/rubygems/test_gem_installer.rb (test_install_extension_flat):
- use ruby in build directory in case ruby is not installed.
- [ruby-core:53265] [Bug #8058]
+Fri Feb 21 23:47:24 2014 Shugo Maeda <shugo@ruby-lang.org>
-Wed Mar 20 15:22:07 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * ext/socket/init.c (wait_connectable): break if the socket is
+ writable to avoid infinite loops on FreeBSD and other platforms
+ which conforms to SUSv3. This problem cannot be reproduced with
+ loopback interfaces, so it's hard to write test code.
+ rsock_connect() and wait_connectable() are overly complicated, so
+ they should be refactored, but I commit this fix as a workaround
+ for the release of Ruby 1.9.3 scheduled on Feb 24.
+ [ruby-core:60940] [Bug #9547]
- * test/win32ole/test_err_in_callback.rb (TestErrInCallBack#setup): use
- relative path to get rid of "too long commandline" error.
+Fri Feb 21 23:03:39 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Wed Mar 20 04:27:42 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+ * tool/redmine-backporter.rb: added to handle redmine tickets.
- * test/rinda/test_rinda.rb: remove unused variables.
- patched by Vipul A M <vipulnsward@gmail.com>
+Fri Feb 21 20:42:01 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Wed Mar 20 04:15:32 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+ * class.c (rb_mod_init_copy): do nothing if copying self.
+ [ruby-dev:47989] [Bug #9535]
- * ext/bigdecimal/bigdecimal.c: fixed typo.
- patched by Vipul A M <vipulnsward@gmail.com>
+ * hash.c (rb_hash_initialize_copy): ditto.
-Sat Mar 16 03:40:49 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Fri Feb 21 16:45:54 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/ruby/test_signal.rb (test_hup_me): added a few comments.
+ * lib/logger.rb (next_rotate_time, previous_period_end): consider
+ DST change.
-Sat Mar 16 03:39:38 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * lib/logger.rb (Logger::LogDevice#check_shift_log): compare the
+ current time with the time for the next rotation to fix rotation
+ miss when date changed between the comparison and log writing.
+ based on the patch by megayu <yuhg2310 AT gmail.com>.
+ [Fixes GH-539]
- * thread.c (ruby_kill): added a few comments.
+Fri Feb 21 10:39:33 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Sat Mar 16 03:36:56 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * test/monitor/test_monitor.rb: remove unused variables.
+ * test/resolv/test_dns.rb: ditto.
+ * test/rexml/test_functions.rb: ditto.
+ * test/rss/test_setup_maker_itunes.rb: ditto.
- * thread.c (ruby_kill): release GVL while waiting signal delivered.
+Fri Feb 21 09:48:56 2014 Eric Wong <e@80x24.org>
-Tue Mar 19 19:50:48 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * ext/socket/ancdata.c (bsock_sendmsg_internal): only retry on error
+ (bsock_recvmsg_internal): ditto
+ * test/socket/test_unix.rb: test above for infinite loop
- * ruby_kill (internal.h, thread.c): use rb_pid_t instead of pid_t.
- this fixes the build failure of mswin introduced at r39819.
+Fri Feb 21 08:27:19 2014 Eric Wong <e@80x24.org>
-Tue Mar 19 17:09:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * include/ruby/ruby.h (RB_GC_GUARD):
+ use rb_gc_guarded_ptr_val on non-GCC/MSC
+ * gc.c (rb_gc_guarded_ptr_val): rename and adjust argument.
+ RB_GC_GUARD should be robust enough for any compiler.
+ [ruby-core:60816] [Bug #7805]
- * string.c (rb_str_conv_enc_opts): convert with one converter, instead
- of re-creating converters for each buffer expansion.
+Thu Feb 20 22:21:26 2014 Tanaka Akira <akr@fsij.org>
-Tue Mar 19 17:06:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/socket/raddrinfo.c (numeric_getaddrinfo): Use xcalloc.
+ Suggested by Eric Wong.
+ https://bugs.ruby-lang.org/issues/9525#note-14
- * dir.c (glob_helper): compose HFS file names from UTF8-MAC.
- [ruby-core:48745] [Bug #7267]
+Thu Feb 20 11:21:13 2014 Masaki Matsushita <glass.saga@gmail.com>
-Sat Mar 16 01:44:29 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * hash.c (rb_hash_flatten): fix behavior of flatten(-1).
+ [ruby-dev:47988] [Bug #9533]
- * internal.h: added a declaration of ruby_kill().
- * thread.c (ruby_kill): helper function of kill().
+ * test/ruby/test_array.rb: test for above.
- * signal.c (rb_f_kill): use ruby_kill() instead of kill().
- * signal.c (rb_f_kill): call rb_thread_execute_interrupts()
- to ensure that make SignalException if sent a signal
- to myself. [Bug #7951] [ruby-core:52864]
+Wed Feb 19 18:57:02 2014 Tanaka Akira <akr@fsij.org>
- * vm_core.h (typedef struct rb_thread_struct): added
- th->interrupt_cond.
- * thread.c (rb_threadptr_interrupt_common): added to
- initialization of th->interrupt_cond.
- * thread.c (thread_create_core): ditto.
+ * ext/socket: Bypass getaddrinfo() if node and serv are numeric.
+ Reporeted by Naotoshi Seo. [ruby-core:60801] [Bug #9525]
- * test/ruby/test_signal.rb (TestSignal#test_hup_me): test for
- the above.
+ * ext/socket/extconf.rb: Detect struct sockaddr_in6.sin6_len.
-Sat Mar 16 00:42:39 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * ext/socket/sockport.h (SET_SIN6_LEN): New macro.
+ (INIT_SOCKADDR_IN6): Ditto.
- * io.c (linux_iocparm_len): enable only exist _IOC_SIZE().
- Because musl libc doesn't have it. [Bug #8051] [ruby-core:53229]
+ * ext/socket/rubysocket.h (struct rb_addrinfo): Add
+ allocated_by_malloc field.
-Tue Mar 19 10:05:04 2013 Shota Fukumori <her@sorah.jp>
+ * ext/socket/raddrinfo.c (numeric_getaddrinfo): New function.
+ (rb_getaddrinfo): Call numeric_getaddrinfo at first.
+ (rb_freeaddrinfo): Free struct addrinfo properly when it is
+ allocated by numeric_getaddrinfo.
- * ext/objspace/objspace.c: Fix typo in doc. Patch by Sho Hashimoto.
- [Bug #8116] [ruby-dev:47177]
+Wed Feb 19 18:31:48 2014 Tanaka Akira <akr@fsij.org>
-Tue Mar 19 02:13:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * ext/socket: Wrap struct addrinfo by struct rb_addrinfo.
- * configure.in: set ac_cv_prog_cxx if CXX is supplied.
+Wed Feb 19 17:47:01 2014 Tanaka Akira <akr@fsij.org>
-Tue Mar 19 01:18:00 2013 Kenta Murata <mrkn@mrkn.jp>
+ * ext/socket/ipsocket.c (ip_s_getaddress): Don't access freed memory.
- * configure.in: Fix c++ compiler auto-selection not only for
- Darwin 11.x, but also the other versions of Darwin.
+Wed Feb 19 11:39:41 2014 NARUSE, Yui <naruse@ruby-lang.org>
-Tue Mar 19 00:26:22 2013 Narihiro Nakamura <authornari@gmail.com>
+ * configure.in: it must see rb_cv_broken_memmem not rb_cv_func_memmem.
- * gc.c: Improve accuracy of objspace_live_num() and
- allocated/freed counters. patched by tmm1(Aman Gupta).
- [Bug #8092] [ruby-core:53392]
+Tue Feb 18 23:18:41 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Mon Mar 18 21:42:48 2013 Narihiro Nakamura <authornari@gmail.com>
+ * test/socket/test_socket.rb: unix socket is required by test case.
- * gc.c: Avoid unnecessary heap growth. patched by tmm1(Aman Gupta).
- [Bug #8093] [ruby-core:53393]
+Tue Feb 18 20:48:38 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Mon Mar 18 17:58:36 2013 Narihiro Nakamura <authornari@gmail.com>
+ * test/socket/test_addrinfo.rb: remove unused variables.
+ * test/socket/test_nonblock.rb: ditto.
+ * test/socket/test_socket.rb: ditto.
+ * test/socket/test_unix.rb: ditto.
+ * test/testunit/test_parallel.rb: ditto.
+ * test/webrick/test_filehandler.rb: ditto.
+ * test/xmlrpc/test_features.rb: ditto.
+ * test/zlib/test_zlib.rb: ditto.
- * gc.c: Fix unlimited memory growth with large values of
- RUBY_FREE_MIN. patched by tmm1(Aman Gupta).
- [Bug #8095] [ruby-core:53405]
+Tue Feb 18 14:27:18 2014 Shota Fukumori <her@sorah.jp>
-Mon Mar 18 14:46:19 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * lib/test/unit.rb: Requires minitest < 5.0.0 if Gem is available.
- * test/win32ole/test_err_in_callback.rb
- (TestErrInCallBack#test_err_in_callback): shouldn't create a file in
- the top of build directory.
+Tue Feb 18 14:24:07 2014 Shota Fukumori <her@sorah.jp>
-Mon Mar 18 13:29:52 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * lib/test/unit/test-unit.gemspec: Add minitest < 5.0.0 dependency
- * vm_dump.c (backtrace): on darwin use custom backtrace() to trace
- beyond _sigtramp. darwin's backtrace can't trace beyond signal
- trampoline with sigaltstack.
+ * tool/rbinstall.rb: Add empty implementations for `add_dependency`,
+ `add_runtime_dependency`, `add_development_dependency` for
+ Gem::Specification.
- * configure.in: check execinfo.h on darwin.
+Tue Feb 18 12:06:39 2014 Tanaka Akira <akr@fsij.org>
-Mon Mar 18 11:03:23 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * configure.in (FILE_COUNT): Removed. (win32.c defines it in itself.)
+ (FILE_READPTR): Ditto.
- * vm_exec.h (END_INSN): revert r39517 because the segv seems fixed by
- r39806.
+Tue Feb 18 09:35:44 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
-Mon Mar 18 10:41:06 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * test/test/psych/test_string.rb: remove unused variables.
+ * test/test/psych/test_yaml.rb: ditto.
- * vm_exec.c: Correct predefined macro name. This typo is introduced by
- r36534 and should be backported to ruby_2_0_0.
+Mon Feb 17 21:31:31 2014 Koichi Sasada <ko1@atdot.net>
-Mon Mar 18 03:18:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * test/ruby/test_gc.rb: ignore warning messages for running with -w
+ option such as chkbuild.
- * array.c: Typo in Array#delete by Timo Sand [GH fixes #258]
+Mon Feb 17 20:00:27 2014 Tanaka Akira <akr@fsij.org>
-Mon Mar 18 01:14:56 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * internal.h: Move BDIGIT and related definitions from
+ include/ruby/defines.h.
- * io.c (io_fillbuf): show fd number on failure to debug.
- http://c5632.rubyci.org/~chkbuild/ruby-trunk/log/20130316T050302Z.diff.html.gz
+Mon Feb 17 17:41:55 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sun Mar 17 02:38:21 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * marshal.c (marshal_dump, marshal_load): do not recycle wrapper
+ objects, to prevent from segfault with continuation.
+ [ruby-dev:47970] [Bug #9523]
- * ext/date/date_core.c: include sys/time.h for avoiding implicit
- declaration of gettimeofday().
+Mon Feb 17 15:43:59 2014 Zachary Scott <e@zzak.io>
-Sun Mar 17 00:55:31 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * doc/keywords.rdoc: [DOC] Add keywords doc by documenting-ruby/ruby#29
+ https://github.com/documenting-ruby/ruby/pull/29
- * include/ruby/missing.h: removed __linux__. it's unnecessary.
+Mon Feb 17 12:31:31 2014 Koichi Sasada <ko1@atdot.net>
-Fri Mar 15 14:57:16 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * gc.c (get_envparam_double): fix a warning message.
- * thread.c: disabled _FORTIFY_SOURCE for avoid to hit glibc bug.
- [Bug #8080] [ruby-core:53349]
- * test/ruby/test_io.rb (TestIO#test_io_select_with_many_files):
- test for the above.
+Mon Feb 17 12:09:52 2014 Koichi Sasada <ko1@atdot.net>
-Wed Mar 13 15:16:35 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * gc.c: introduce new environment variable
+ "RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR" to control major/minor GC
+ frequency.
- * include/ruby/missing.h (__syscall): moved to...
- * io.c: here. because __syscall() is only used from io.c.
+ Do full GC when the number of old objects is more than R * N
+ where R is this factor and
+ N is the number of old objects just after last full GC.
- * include/ruby/missing.h: move "#include <sys/type.h>" to ....
- * include/ruby/intern.h: here. because it was introduced for
- fixing NFDBITS issue. [ruby-core:05179].
+ * test/ruby/test_gc.rb: add a test.
-Wed Mar 13 14:38:53 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Mon Feb 17 11:28:40 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * include/ruby/missing.h (struct timespec): include <sys/time.h>
+ * test/test_pty.rb: ignore warnings to unused variables.
-Wed Mar 13 13:54:45 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Mon Feb 17 11:27:36 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * configure.in: check struct timeval exist or not.
- * include/ruby/missing.h (struct timeval): check HAVE_STRUCT_TIMEVAL
- properly. and don't include sys/time.h if struct timeval exist.
+ * test/test_find.rb: remove unused variables.
- * file.c: include sys/time.h explicitly.
- * random.c: ditto.
- * thread_pthread.c: ditto.
- * time.c: ditto.
- * ext/date/date_strftime.c: ditto.
+Sun Feb 17 02:12:00 2014 Kenta Murata <mrkn@mrkn.jp>
-Fri Mar 15 14:45:02 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_initialize): Insert GC guard.
- * configure.in (_FORTIFY_SOURCE): added a few comments.
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_global_new): ditto.
-Fri Mar 15 14:17:55 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sun Feb 16 15:53:36 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * thread_pthread.c (numberof): renamed from ARRAY_SIZE() because
- other all files use numberof().
+ * test/test_securerandom.rb: File.exists? is deprecated. use File.exist?
-Say Mar 15 01:33:00 2013 Charles Oliver Nutter <headius@headius.com>
+Sun Feb 16 15:05:00 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * test/ruby/test_lazy_enumerator.rb (TestLazyEnumerator#test_drop_while):
- Modify while condition to show dropping remains off after first false
- value. This change was made in 39711.
+ * test/pathname/test_pathname.rb: File.exists? is deprecated. use File.exist?
-Fri Mar 15 23:06:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Feb 16 15:00:28 2014 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
- * time.c (GetTimeval): check if already initialized instance.
+ * test/net/ftp/test_ftp.rb: remove unused variables.
+ * test/logger/test_logger.rb: ditto.
- * time.c (GetNewTimeval): check if newly created instance.
+Sun Feb 16 14:52:46 2014 Eric Wong <e@80x24.org>
- * time.c (time_init_0, time_init_1, time_init_copy, time_mload): must
- be newly created instance. [ruby-core:53436] [Bug #8099]
+ * dir.c (dir_s_glob): RB_GC_GUARD instead of volatile
-Fri Mar 15 14:51:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Feb 16 14:33:52 2014 Tanaka Akira <akr@fsij.org>
- * file.c (rb_sys_fail_path_with_func): share same function, and path
- may be nil.
+ * include/ruby/ruby.h (RBIGNUM_SIGN): Defined for compatibility.
+ (RBIGNUM_POSITIVE_P): Ditto.
+ (RBIGNUM_NEGATIVE_P): Ditto.
-Fri Mar 15 08:24:51 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Sun Feb 16 12:46:47 2014 Eric Wong <e@80x24.org>
- * io.c (rb_sys_fail_path): define & use rb_sys_fail_path0 like r39752
+ * io.c (rb_f_backquote): trade volatile for manual recycle
+ rb_gc_force_recycle ensures object is visible until recycle
-Fri Mar 15 04:08:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Sun Feb 16 11:55:14 2014 Eric Wong <e@80x24.org>
- * proc.c: Typo in Proc.arity found by Jack Nagel [Bug #8094]
+ * marshal.c (marshal_dump): use rb_gc_force_recycle for GC-safety
+ (marshal_load): ditto
+ [ruby-core:60730] [Bug #7805]
-Thu Mar 14 16:59:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Feb 16 08:11:23 2014 Zachary Scott <e@zzak.io>
- * configure.in (rb_cv_function_name_string): macro for function name
- string predefined identifier, __func__ in C99, or __FUNCTION__ in
- gcc.
+ * README.EXT.ja: [DOC] Fix typo by @utenmiki [Fixes GH-534]
+ https://github.com/ruby/ruby/pull/534
- * file.c (rb_sys_fail_path): use RUBY_FUNCTION_NAME_STRING.
+Sun Feb 16 07:48:20 2014 Tanaka Akira <akr@fsij.org>
-Thu Mar 14 14:12:34 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * ext/bigdecimal/bigdecimal.c (BIGNUM_ZERO_P): Unused macro removed.
- * file.c (rb_sys_fail_path): use rb_sys_fail_path0 only on GCC.
- __func__ is C99 feature.
+Sun Feb 16 06:12:23 2014 Tanaka Akira <akr@fsij.org>
-Thu Mar 14 12:59:59 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * internal.h: Rename macro names: RBIGNUM_FOO to BIGNUM_FOO.
+ (BIGNUM_EMBED_LEN_NUMBITS): Renamed from RBIGNUM_EMBED_LEN_NUMBITS.
+ (BIGNUM_EMBED_LEN_MAX): Renamed from RBIGNUM_EMBED_LEN_MAX.
+ (BIGNUM_SIGN_BIT): Renamed from RBIGNUM_SIGN_BIT.
+ (BIGNUM_SIGN): Renamed from RBIGNUM_SIGN.
+ (BIGNUM_SET_SIGN): Renamed from RBIGNUM_SET_SIGN.
+ (BIGNUM_POSITIVE_P): Renamed from RBIGNUM_POSITIVE_P.
+ (BIGNUM_NEGATIVE_P): Renamed from RBIGNUM_NEGATIVE_P.
+ (BIGNUM_EMBED_FLAG): Renamed from RBIGNUM_EMBED_FLAG.
+ (BIGNUM_EMBED_LEN_MASK): Renamed from RBIGNUM_EMBED_LEN_MASK.
+ (BIGNUM_EMBED_LEN_SHIFT): Renamed from RBIGNUM_EMBED_LEN_SHIFT.
+ (BIGNUM_LEN): Renamed from RBIGNUM_LEN.
+ (RBIGNUM_DIGITS): Renamed from RBIGNUM_DIGITS.
+ (BIGNUM_LENINT): Renamed from RBIGNUM_LENINT.
- * file.c (rb_sys_fail_path0): add to append the name of called function
- to ease debugging for example blow umask_spec failure.
- http://fbsd.rubyci.org/~chkbuild/ruby-trunk/log/20130309T010202Z.diff.html.gz
+ * bignum.c: Follow the above change.
- * file.c (rb_sys_fail_path): use rb_sys_fail_path0.
+ * gc.c: Ditto.
-Thu Mar 14 12:53:15 2013 Luis Lavena <luislavena@gmail.com>
+ * marshal.c: Ditto.
- * win32/file.c (get_user_from_path): add internal function that retrieves
- username from supplied path (refactored).
- * win32/file.c (rb_file_expand_path_internal): refactor expansion of user
- home to use get_user_from_path and cover dir_string corner cases.
- [ruby-core:53168] [Bug #8034]
+ * math.c: Ditto.
-Thu Mar 14 11:53:01 2013 Narihiro Nakamura <authornari@gmail.com>
+ * numeric.c: Ditto.
- * NEWS: describe RUBY_HEAP_SLOTS_GROWTH_FACTOR.
+ * random.c: Ditto.
-Thu Mar 14 10:01:12 2013 Eric Hodel <drbrain@segment7.net>
+ * rational.c: Ditto.
- * doc/globals.rdoc: $? is thread-local
+ * sprintf.c: Ditto.
-Wed Mar 13 23:25:59 2013 Narihiro Nakamura <authornari@gmail.com>
+ * ext/-test-/bignum/bigzero.c: Ditto.
- * gc.c: allow to tune growth of heap by environment variable
- RUBY_HEAP_SLOTS_GROWTH_FACTOR. patched by tmm1(Aman Gupta).
- [Feature #8015] [ruby-core:53131]
+ * ext/-test-/bignum/intpack.c: Ditto.
-Wed Mar 13 19:43:46 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+ * ext/bigdecimal/bigdecimal.c: Ditto.
- * doc/irb/irb.rd.ja: fix typo
+Sat Feb 15 20:48:49 2014 Tanaka Akira <akr@fsij.org>
- * ext/tk/MANUAL_tcltklib.eng: fix typos
+ * configure.in (FILE_READEND): Don't detect it because it is not used.
- * ext/tk/sample/tktextframe.rb (Tk#component_delegates): fix typo
+Sat Feb 15 13:22:28 2014 Eric Wong <e@80x24.org>
-Wed Mar 13 15:13:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * probes_helper.h (RUBY_DTRACE_HOOK): correct type for _id
- * class.c (rb_obj_singleton_methods): collect methods from the origin
- class. [ruby-core:53207] [Bug #8044]
+Sat Feb 15 11:47:47 2014 Tanaka Akira <akr@fsij.org>
-Wed Mar 13 14:51:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * bignum.c (rb_big_cmp): Avoid bignum allocation for comparison
+ between bignum and fixnum.
- * vm_method.c (rb_export_method): directly override the flag of method
- defined in prepending class too, not adding zsuper entry.
- [ruby-core:53106] [Bug #8005]
+Sat Feb 15 10:55:12 2014 Hiroshi Shirosaki <h.shirosaki@gmail.com>
-Wed Mar 13 13:06:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/-test-/win32/fd_setsize/depend: fix wrong dependencies.
+ [ruby-dev:47253]
- * configure.in (rm, shvar_to_cpp, unexpand_shvar): local is not
- available on old shells.
+Sat Feb 15 00:38:54 2014 Tanaka Akira <akr@fsij.org>
- * configure.in (shvar_to_cpp): escape quotes for old shells.
- [Bug #7959] [Bug #8071]
+ * enum.c: Enumerable#{min,min_by,max,max_by} extended to take an
+ optional argument.
+ (nmin_cmp): New function.
+ (nmin_block_cmp): Ditto
+ (nmin_filter): Ditto.
+ (nmin_i): Ditto.
+ (nmin_run): Ditto.
+ (enum_min): Call nmin_run if the optional argument is given.
+ (nmin_max): Ditto.
+ (nmin_min_by): Ditto.
+ (nmin_max_by): Ditto.
-Wed Mar 13 11:11:07 2013 Shugo Maeda <shugo@ruby-lang.org>
+ * range.c: Range#{min,max} extended to take an optional argument.
+ (range_min): Call range_first if the optional argument is given.
+ (range_max): Call rb_call_super if the optional argument is given.
- * object.c (Init_Object): remove Module#used, which has been
- introduced in Ruby 2.0 by mistake. [Bug #7916] [ruby-core:52719]
+ [ruby-core:57111] [Feature #8887]
-Wed Mar 13 05:49:29 2013 Eric Hodel <drbrain@segment7.net>
+Sat Feb 15 00:27:46 2014 Tanaka Akira <akr@fsij.org>
- * lib/irb.rb: Fix typo
+ * include/ruby/ruby.h,
+ internal.h,
+ ext/-test-/bignum/bigzero.c: Hide a Bignum definition.
+ [ruby-core:42891] [Feature #6083]
-Tue Mar 12 22:20:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Feb 15 00:13:14 2014 Tanaka Akira <akr@fsij.org>
- * compile.c (iseq_set_arguments, iseq_compile_each): support required
- keyword arguments. [ruby-core:51454] [Feature #7701]
+ * include/ruby/intern.h,
+ include/ruby/io.h,
+ include/ruby/ruby.h,
+ include/ruby/win32.h,
+ include/ruby/backward/rubysig.h,
+ bignum.c,
+ gc.c,
+ io.c,
+ process.c,
+ safe.c,
+ struct.c,
+ thread.c,
+ ext/socket/rubysocket.h,
+ ext/-test-/old_thread_select: Remove deprecated definitions
+ [ruby-core:60581] [Feature #9502]
- * iseq.c (rb_iseq_parameters): ditto.
+Fri Feb 14 18:38:46 2014 Eric Wong <e@80x24.org>
- * parse.y (f_kw, f_block_kw): ditto. this syntax is still
- experimental, the notation may change.
+ * string.c (rb_str_format_m): trade volatile for RB_GC_GUARD
+ RB_GC_GUARD meaning is clear and has better code generation.
+ [ruby-core:60688]
- * vm_core.h (rb_iseq_struct): ditto.
+Thu Feb 13 23:30:30 2014 Shugo Maeda <shugo@ruby-lang.org>
- * vm_insnhelper.c (vm_callee_setup_keyword_arg): ditto.
+ * vm_insnhelper.c (vm_call_method): should check ci->me->flag of
+ a refining method in case the method is private.
+ [ruby-core:60111] [Bug #9452]
-Tue Mar 12 17:02:53 2013 TAKANO Mitsuhiro <tak@no32.tk>
+ * vm_method.c (make_method_entry_refined): set me->flag of a refined
+ method entry to NOEX_PUBLIC in case the original method is private
+ and it is refined as a public method. The original flag is stored
+ in me->def->body.orig_me, so it's OK to make a refined method
+ entry public. [ruby-core:60111] [Bug #9452]
- * date_core.c: clearly specify operator precedence.
+ * test/ruby/test_refinement.rb: related tests.
-Tue Mar 12 17:00:45 2013 TAKANO Mitsuhiro <tak@no32.tk>
+Thu Feb 13 18:38:15 2014 Eric Wong <e@80x24.org>
- * insns.def: fix condition.
+ * re.c (rb_reg_raise): remove volatile
+ Unnecessary since r41597
-Tue Mar 12 16:48:19 2013 TAKANO Mitsuhiro <tak@no32.tk>
+Thu Feb 13 18:28:51 2014 Eric Wong <e@80x24.org>
- * rational.c: fix dangling if, else-if and else.
+ * re.c (rb_reg_regcomp): remove volatile
+ Unnecessary since r13261
-Tue Mar 12 06:27:59 2013 Eric Hodel <drbrain@segment7.net>
+Thu Feb 13 16:54:32 2014 Zachary Scott <e@zzak.io>
- * lib/rubygems/commands/setup_command.rb: Don't delete non-rubygems
- files when installing RubyGems.
- * test/rubygems/test_gem_commands_setup_command.rb: Test for the
- above.
+ * test/ruby/test_array.rb: Ensure flatten! is used for test_flatten
+ Patch by @ksss [Fixes GH-530] https://github.com/ruby/ruby/pull/530
- * lib/rubygems/ext/ext_conf_builder.rb: Use full path to siteconf.rb
- in case the extconf.rb changes directories (like memcached does).
+Thu Feb 13 15:43:16 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/rubygems/package.rb: Remove double slash from path.
- * test/rubygems/test_gem_package.rb: Test for the above.
- * test/rubygems/test_gem_package_old.rb: ditto.
+ * parse.y (IDSET_ATTRSET_FOR_INTERN): fix off-by-one bug.
- * lib/rubygems/source.rb: Revert automatic HTTPS upgrade
- * lib/rubygems/spec_fetcher.rb: ditto.
- * test/rubygems/test_gem_remote_fetcher.rb: ditto.
- * test/rubygems/test_gem_source.rb: ditto.
- * test/rubygems/test_gem_spec_fetcher.rb: ditto.
+ * parse.y (rb_enc_symname_type): junk ID succeeded by '=' is also
+ attrset ID. [ruby-core:60668] [Bug #8756]
-Tue Mar 12 02:25:19 2013 Eric Hodel <drbrain@segment7.net>
+Thu Feb 13 11:06:32 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/net/smtp.rb: Added Net::SMTP#rset method to implement the SMTP
- RSET command. [ruby-trunk - Feature #5373]
- * NEWS: ditto.
- * test/net/smtp/test_smtp.rb: Test for the above.
+ * configure.in: check if pthread_setname_np is available.
-Mon Mar 11 22:44:57 2013 Tanaka Akira <akr@fsij.org>
+ * thread_pthread.c: pthread_setname_np is not available on old
+ Darwins. [ruby-core:60524] [Bug #9492]
- * lib/resolv-replace.rb (TCPSocket#initialize): resolve the 3rd
- argument only if non-nil value is given.
- [ruby-dev:47150] [ruby-trunk - Bug #8054] reported and analyzed by
- mrkn.
+Thu Feb 13 00:56:59 2014 Masaki Matsushita <glass.saga@gmail.com>
-Mon Mar 11 19:22:54 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * configure.in: revert r44922. I should have used AC_CHECK_FUNCS()
+ to just define a symbol if the function is available.
- * test/mkmf/base.rb: class name conflict.
+Thu Feb 13 00:20:58 2014 Masaki Matsushita <glass.saga@gmail.com>
-Mon Mar 11 18:45:09 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * configure.in: use AC_CHECK_FUNC instead of AC_CHECK_FUNCS
+ if available.
- * enumerator.c (enumerator_with_index): try to convert given offset to
- integer. fix bug introduced in r39594.
+Thu Feb 13 00:15:10 2014 Masaki Matsushita <glass.saga@gmail.com>
-Mon Mar 11 17:27:57 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * configure.in: fix to undefine HAVE_MEMMEM correctly if it is broken.
- * test/ruby/envutil.rb (EnvUtil.with_default_external): add for
- changing Encoding.default_external without warnings.
+Tue Feb 11 23:54:40 2014 Tanaka Akira <akr@fsij.org>
- * test/ruby/envutil.rb (EnvUtil.with_default_internal): ditto.
+ * bignum.c (rb_big_cmp): Specialize a comparison to zero.
- * test/ruby/test_io_m17n.rb: use above with_default_external.
+ * ext/bigdecimal/bigdecimal.c (is_negative): Use rb_big_cmp instead of
+ RBIGNUM_NEGATIVE_P.
+ (BigMath_s_log): Ditto.
-Mon Mar 11 16:57:00 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Tue Feb 11 22:59:10 2014 Tanaka Akira <akr@fsij.org>
- * io.c (extract_binmode): raise error even if binmode and textmode
- don't conflict. [Bug #5918] [ruby-core:42199]
+ * ext/openssl/ossl_bn.c (ossl_bn_initialize): Use rb_integer_pack.
+ Fix SEGV by OpenSSL::BN.new(1 << (2**34)).
-Mon Mar 11 12:25:12 2013 NARUSE, Yui <naruse@ruby-lang.org>
+Tue Feb 11 17:00:38 2014 Zachary Scott <e@zzak.io>
- * Merge Onigmo d4bad41e16e3eccd97ccce6f1f96712e557c4518.
- fix lookbehind assertion fails with /m mode enabled. [Bug #8023]
- fix \Z matches where it shouldn't. [Bug #8001]
+ * ext/tk/README.tcltklib: [DOC] Fix typo by @xta [Fixes GH-532]
-Mon Mar 11 11:53:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sun Feb 9 13:59:29 2014 Tanaka Akira <akr@fsij.org>
- * lib/mkmf.rb (MakeMakefile#dir_config, MakeMakefile#_libdir_basename):
- defer use of instance variable until needed. [Bug #8074]
+ * configure.in: Fix compilation error.
+ https://bugs.ruby-lang.org/issues/8358#note-16
-Thu Mar 7 10:42:28 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sun Feb 9 05:20:24 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * lib/thread.rb (Queue#clear): return self.
- Patch by Cubing Cube. Thank you! [Bug #7947] [ruby-dev:47098]
- * lib/thread.rb (Queue#push): ditto.
- * lib/thread.rb (SizedQueue#push): ditto.
- * test/thread/test_queue.rb: add tests for the above.
+ * configure.in (rb_cv_gnu_qsort_r): use compile error "conflicting
+ types for 'qsort_r'" instead of AC_RUN_IFELSE.
-Thu Mar 7 10:40:49 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sun Feb 9 04:07:34 2014 Zachary Scott <e@zzak.io>
- * tool/change_maker.rb (#diff2index): check Encoding::BINARY.
- BASERUBY may still be 1.8.x.
+ * lib/yaml.rb: [DOC] Add links to syck and psych on github [Bug #9501]
+ Based on a patch by Giorgos Tsiftsis
-Thu Mar 7 08:47:42 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sun Feb 9 02:13:53 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * NEWS (Mutex#owned?): no longer experimental.
+ * include/ruby/ruby.h (OBJ_TAINTABLE, OBJ_TAINT, OBJ_INFECT),
+ marshal.c (r_entry0): all Numerics never be tainted now.
+ [ruby-core:57346] [Bug #8945]
-Sun Mar 10 23:38:15 2013 Luis Lavena <luislavena@gmail.com>
+Sat Feb 8 23:40:35 2014 Vit Ondruch <vondruch@redhat.com>
- * win32/file.c (rb_file_expand_path_internal): Expand home directory when
- used as second parameter (dir_string). [ruby-core:53168] [Bug #8034]
- * test/ruby/test_file_exhaustive.rb: add test to verify.
+ * configure.in: add quoting brackets and append wildcard for the
+ rest after target_cpu, to properly detect platform for SSE2
+ instructions. [ruby-core:60576] [Bug #8358]
-Sun Mar 10 23:27:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Feb 8 21:44:07 2014 Masaki Matsushita <glass.saga@gmail.com>
- * lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
- it is impossible to predict which file will be installed to where,
- by the arguments, so use intermediate destination directory always.
- [Bug #7698]
+ * configure.in: check qsort_r(3) and whether it is GNU version.
+ BSD version has different prototype.
-Sun Mar 10 17:00:22 2013 Tadayoshi Funaba <tadf@dotrb.org>
+ * util.h: use qsort_r() as ruby_qsort() if it is GNU version.
- * complex.c: edited rdoc.
- * rational.c: ditto.
+ * util.c: define ruby_qsort() if needed.
-Sun Mar 10 15:02:39 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sat Feb 8 16:34:36 2014 Tanaka Akira <akr@fsij.org>
- * process.c (setup_communication_pipe): remove unused function.
- it was unintentionally added r39683.
+ * lib/resolv.rb (Resolv::DNS::Message::MessageDecoder#get_labels):
+ Make it iterative.
-Wed Mar 6 00:30:40 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sat Feb 8 15:54:12 2014 Koichi Sasada <ko1@atdot.net>
- * tool/gen_ruby_tapset.rb: add tapset generator.
+ * gc.c, gc.h (rb_objspace_marked_object_p): added.
+ This function *ONLY* works just after marking phase,
+ before any sweeping.
+ This function is highly depending current GC implementation
+ and can be removed future version.
-Wed Mar 6 03:27:43 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sat Feb 8 15:41:37 2014 Tanaka Akira <akr@fsij.org>
- * probes.d (symbol-create): change argument name `string' to
- `str'. `string' is a keyword for systemtap.
+ * lib/resolv.rb: Don't set CLOEXEC flag explicitly. (Ruby set it by
+ default.)
-Tue Mar 5 22:23:01 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sat Feb 8 15:27:02 2014 Tanaka Akira <akr@fsij.org>
- * probes.d: added argument name
+ * lib/resolv.rb (Resolv::DNS::Message::MessageDecoder): Raise
+ DecodeError if no data before the limit.
+ Reported by Will Bryant. [ruby-core:60557] [Bug #9498]
-Thu Mar 7 01:17:00 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sat Feb 8 15:11:21 2014 Tanaka Akira <akr@fsij.org>
- * test/thread/test_queue.rb (TestQueue#test_thr_kill): reduce
- iterations from 2000 to 250. When running on uniprocessor
- systems, every th.kill needs TIME_QUANTUM_USEC time (i.e.
- 100msec on posix systems). Because, "r.read 1" is 3 steps
- operations that 1) release GVL 2) read 3) acquire gvl and
- (1) invoke context switch to main thread. and then, main
- thread's th.kill resume (1), but not (2). Thus read interrupt
- need TIME_QUANTUM_USEC. Then maximum iteration is 30sec/100msec
- = 300.
+ * io.c (SMALLBUF): Unused macro removed.
-Thu Mar 7 00:14:51 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Fri Feb 7 23:37:49 2014 Tanaka Akira <akr@fsij.org>
- * io.c (rb_update_max_fd): use ATOMIC_CAS because this function
- is used from timer thread too.
+ * lib/resolv.rb: Ignore name servers which cause EAFNOSUPPORT on
+ socket creation.
+ Reported by Bjoern Rennhak. [ruby-core:60442] [Bug #9477]
-Wed Mar 6 23:30:21 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Fri Feb 7 21:58:48 2014 Zachary Scott <e@zzak.io>
- * thread_pthread.c (ARRAY_SIZE): new.
- * thread_pthread.c (gvl_acquire_common): use low priority
- notification for avoiding timer thread interval confusion.
- If we use timer_thread_pipe[1], every gvl_yield() request
- one more gvl_yield(). It lead to thread starvation.
- [Bug #7999] [ruby-core:53095]
- * thread_pthread.c (rb_reserved_fd_p): adds timer_thread_pipe_low
- to reserved fds.
+ * lib/open-uri.rb: [DOC] use lower case version of core classes, same
+ as commit r44878, based on patch by Jonathan Jackson [Bug #9483]
-Wed Mar 6 22:36:19 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Fri Feb 7 21:54:53 2014 Zachary Scott <e@zzak.io>
- * thread_pthread.c (rb_thread_wakeup_timer_thread_fd): add fd
- argument and remove hardcoded dependency of timer_thread_pipe[1].
- * thread_pthread.c (consume_communication_pipe): add fd argument.
- * thread_pthread.c (close_communication_pipe): ditto.
+ * ext/ripper/lib/ripper/lexer.rb: [DOC] use lower case version of core
+ classes when referring to return value, since we aren't directly
+ talking about the class. Patch by Jonathan Jackson [Bug #9483]
- * thread_pthread.c (timer_thread_sleep): adjust the above changes.
+Fri Feb 7 05:28:38 2014 Eric Wong <e@80x24.org>
- * thread_pthread.c (setup_communication_pipe_internal): factor
- out pipe initialize logic.
+ * constant.h: reduce rb_const_entry_t size on 64-bit
+ Patch by Adam Avilla [ruby-core:60542] [Feature #9496]
-Wed Mar 6 22:56:14 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Thu Feb 6 15:27:46 2014 Koichi Sasada <ko1@atdot.net>
- * thread_pthread.c (ubf_select): add to small comments why we
- need to call rb_thread_wakeup_timer_thread().
+ * gc.c (get_envparam_int): correct warning messages.
-Wed Mar 6 21:42:24 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * gc.c (get_envparam_double): ditto.
- * thread_pthread.c (rb_thread_create_timer_thread): factor out
- creating communication pipe logic into separate function.
- * thread_pthread.c (setup_communication_pipe): new helper function.
- * thread_pthread.c (set_nonblock): moves a definition before
- setup_communication_pipe.
+Thu Feb 6 15:17:30 2014 Koichi Sasada <ko1@atdot.net>
-Sun Mar 3 02:42:29 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * gc.c (get_envparam_int): don't accept a value equals to lowerbound
+ (changed by last commit) because "" or "foo" (not a number) strings
+ are parsed as 0. They should be rejected.
- * thread_pthread.c (consume_communication_pipe): retry when
- read returned CCP_READ_BUFF_SIZE.
+ * gc.c (get_envparam_double): ditto.
-Wed Mar 6 21:31:35 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Thu Feb 6 09:00:35 2014 Koichi Sasada <ko1@atdot.net>
- * thread_pthread.c (timer_thread_sleep): use poll() instead of
- select(). select doesn't work if timer_thread_pipe[0] is
- greater than FD_SETSIZE.
- * thread_pthread.c (USE_SLEEPY_TIMER_THREAD): add a dependency
- against poll.
+ * gc.c (ruby_gc_set_params): if RUBY_GC_OLDMALLOC_LIMIT is provided,
+ then set objspace->rgengc.oldmalloc_increase_limit.
+ Without this fix, the env variable RUBY_GC_OLDMALLOC_LIMIT
+ does not work.
-Wed Mar 6 21:00:23 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * gc.c (get_envparam_int): accept a value equals to lowerbound.
- * thread_pthread.c (USE_SLEEPY_TIMER_THREAD): use more accurate
- ifdef conditions.
+ * gc.c (get_envparam_double): ditto.
-Sun Mar 3 02:30:36 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Thu Feb 6 08:23:28 2014 Eric Wong <e@80x24.org>
- * thread_pthread.c (set_nonblock): new helper function for set
- O_NONBLOCK.
- * thread_pthread.c (rb_thread_create_timer_thread): set O_NONBLOCK
- to timer_thread_pipe[0] too.
+ * ext/thread/thread.c (rb_szqueue_max_set): use correct queue and
+ limit wakeups. [Bug #9343][ruby-core:60517]
+ * test/thread/test_queue.rb (test_sized_queue_assign_max):
+ test for bug
-Sun Mar 10 09:12:51 2013 Tadayoshi Funaba <tadf@dotrb.org>
+Thu Feb 6 07:18:01 2014 Eric Hodel <drbrain@segment7.net>
- * complex.c: described syntax of string form.
- * rational.c: ditto.
+ * lib/rubygems: Update to RubyGems 2.2.2. Complete history at:
-Sat Mar 9 11:58:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ http://rubygems.rubyforge.org/rubygems-update/History_txt.html#label-2.2.2+%2F+2014-02-05
- * marshal.c (w_extended): check for prepended object.
- [ruby-core:53206] [Bug #8043]
+ * test/rubygems: ditto.
-Sat Mar 9 08:36:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Feb 5 20:56:32 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * load.c (features_index_add_single, rb_feature_p): store single index
- as Fixnum to reduce the number of arrays for the indexes. based on
- the patch by tmm1 (Aman Gupta) in [ruby-core:53216] [Bug #8048].
+ * marshal.c (to_be_skipped_id): ignore anonymous attributes.
-Sat Mar 9 00:25:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * pack.c (Init_pack): use anonymous ID so that associated objects
+ do not appear in the packed result.
- * marshal.c (r_object0): load prepended objects. treat the class of
- extended object in the included modules as prepended singleton
- class. [ruby-core:53202] [Bug #8041]
+ * parse.y (rb_make_internal_id): return an anonymous ID for
+ internal use.
-Fri Mar 8 19:44:00 2013 Akinori MUSHA <knu@iDaemons.org>
+Wed Feb 5 14:41:56 2014 Koichi Sasada <ko1@atdot.net>
- * man/rake.1, man/ruby.1: Use the Pa macro to make URLs stand out.
+ * vsnprintf.c: remove duplicated def of `UNINITIALIZED_VAR()'.
-Fri Mar 8 13:20:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Wed Feb 5 14:40:16 2014 Koichi Sasada <ko1@atdot.net>
- * ext/pathname/pathname.c (path_f_pathname): rdoc for Pathname()
+ * ext/objspace/objspace_dump.c (dump_object): use STR_SHARED_P()
+ instead of removed STR_NOCAPA_P() macro.
-Fri Mar 8 12:00:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Wed Feb 5 13:51:33 2014 Koichi Sasada <ko1@atdot.net>
- * man/rake.1: Document ENVIRONMENT variables on RAKE(1) manpage
+ * internal.h, vm_core.h: move LIKELY/UNLIKELY/UNINITIALIZED_VAR()
+ macros from vm_core.h to internal.h.
-Fri Mar 8 10:44:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * string.c: remove dependency to "vm_core.h".
- * lib/webrick/httpproxy.rb: Fix typos in HTTPProxyServer [Bug #8013]
- Patch by Nobuhiro IMAI [ruby-core:53127]
+ * common.mk: ditto.
-Fri Mar 8 03:16:15 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+Wed Feb 5 13:29:01 2014 Koichi Sasada <ko1@atdot.net>
- * class.c (rb_mod_ancestors): Include singleton_class in ancestors
- list [Feature #8035]
+ * string.c (rb_str_free): use FL_TEST(str, STR_SHARED) directly
+ because str is not embed.
- * test/ruby/test_module.rb (class): test for above
+ * string.c (str_replace): remove `FL_SET(str, STR_SHARED)' line
+ because STR_SET_SHARED() set STR_SHARED.
- * test/ruby/marshaltestlib.rb (module): adapt test
+Wed Feb 5 13:18:08 2014 Koichi Sasada <ko1@atdot.net>
- * NEWS: list change
+ * internal.h: remove macros STR_NOCAPA and STR_NOCAPA_P().
-Thu Mar 7 14:21:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * string.c (rb_str_resize): remove `STR_SET_NOEMBED(str)' because
+ str_make_independent_expand() set NOEMBED flag.
- * compile.c (iseq_compile_each): pass keyword arguments to zsuper,
- with current values. [ruby-core:53114] [Bug #8008]
+ * string.c (rb_str_resize): remove `STR_NOCAPA_P(str)' check because
+ `str' is independent (not shared).
-Thu Mar 7 12:53:47 2013 Eric Hodel <drbrain@segment7.net>
+Wed Feb 5 12:54:25 2014 Koichi Sasada <ko1@atdot.net>
- * lib/rubygems/commands/setup_command.rb: Install .pem files.
- * test/rubygems/test_gem_commands_setup_command.rb: Test for the
- above.
+ * string.c: refactoring, especially about string flags.
- * lib/rubygems/spec_fetcher.rb: Test HTTPS upgrade with URI::HTTPS,
- not URI::HTTP. Fixes bug in automatic HTTPS upgrade.
- * test/rubygems/test_gem_spec_fetcher.rb: Test for the above.
+ * string.c (STR_UNSET_NOCAPA): removed.
+ Use FL_UNSET() with STR_SHARED.
- * lib/rubygems.rb: Version 2.0.2
+ * string.c (rb_str_capacity): check STR_SHARED directly
+ because it is not a embed string.
- * lib/rubygems/test_utilities.rb: Ensure scheme and uri class match.
+ * string.c (rb_str_modify_expand): ditto.
-Thu Mar 7 10:39:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * string.c (rb_str_shared_replace): use STR_SET_SHARED().
- * tool/rbinstall.rb (gem): Gem.ensure_gem_subdirectories now has mode
- option since r39607. refix of r38870.
+ * string.c (str_make_independent_expand): remove STR_UNSET_NOCAPA()
+ because `str' is not shared string.
-Wed Mar 6 13:14:28 2013 Eric Hodel <drbrain@segment7.net>
+Wed Feb 5 12:11:04 2014 Koichi Sasada <ko1@atdot.net>
- * test/rubygems/test_gem_spec_fetcher.rb: Removed unused variable.
+ * string.c (RESIZE_CAPA): should not resize shared string.
-Wed Mar 6 08:10:15 2013 Eric Hodel <drbrain@segment7.net>
+Wed Feb 5 11:46:42 2014 Koichi Sasada <ko1@atdot.net>
- * test/rubygems/test_require.rb: Fix tests when 'a.rb' exists.
- [ruby-trunk - Bug #7749]
+ * gc.c (gc_mark_children): STR_ASSOC is no longer available.
+ Reported by @nagachika.
+ http://d.hatena.ne.jp/nagachika/20140204
-Wed Mar 6 08:00:59 2013 Eric Hodel <drbrain@segment7.net>
+Wed Feb 5 11:27:22 2014 Koichi Sasada <ko1@atdot.net>
- * lib/rubygems.rb: Allow specification of directory permissions.
- [ruby-trunk - Bug #7713]
- * test/rubygems/test_gem.rb: Test for the above.
+ * string.c (rb_str_new_frozen): refactoring code.
+ * Move code from str_new_frozen_with_klass() (and remove it)
+ * `aux.shared' should not be 0 for STR_SHARED strings.
-Wed Mar 6 07:40:21 2013 Eric Hodel <drbrain@segment7.net>
+Wed Feb 5 04:23:41 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * lib/rubygems/commands/query_command.rb: Only fetch remote specs when
- showing details. [ruby-trunk - Bug #8019] RubyGems bug #487
- * lib/rubygems/remote_fetcher.rb: ditto.
- * lib/rubygems/security/policy.rb: ditto.
- * test/rubygems/test_gem_commands_query_command.rb: Test for the
- above.
+ * ext/psych/lib/psych.rb: New release of psych.
+ * ext/psych/psych.gemspec: ditto
- * lib/rubygems/security.rb: Make OpenSSL optional for RubyGems.
- * lib/rubygems/commands/cert_command.rb: ditto.
+Wed Feb 5 04:16:41 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * lib/rubygems/config_file.rb: Display file with YAML error, not
- ~/.gemrc
+ * ext/psych/yaml/emitter.c: merge libyaml 0.1.5
+ * ext/psych/yaml/loader.c: ditto
+ * ext/psych/yaml/parser.c: ditto
+ * ext/psych/yaml/reader.c: ditto
+ * ext/psych/yaml/scanner.c: ditto
+ * ext/psych/yaml/writer.c: ditto
+ * ext/psych/yaml/yaml_private.h: ditto
- * lib/rubygems/remote_fetcher.rb: Only create gem subdirectories when
- installing gems.
- * lib/rubygems/dependency_resolver.rb: ditto.
- * lib/rubygems/test_utilities.rb: ditto.
- * test/rubygems/test_gem_commands_fetch_command.rb: Test for the
- above.
+Tue Feb 4 19:10:29 2014 Koichi Sasada <ko1@atdot.net>
- * lib/rubygems/spec_fetcher.rb: Only try to upgrade
- http://rubygems.org to HTTPS
- * test/rubygems/test_gem_spec_fetcher.rb: Test for the above.
+ * string.c: use long allocator names instead of numbered
+ allocator names.
+ * rb_str_new2 -> rb_str_new_cstr
+ * rb_str_new4 -> rb_str_new_frozen
+ * rb_str_new5 -> rb_str_new_with_class
+ * str_new3 -> str_new_shared
+ * str_new4 -> str_new_frozen_with_klass
- * lib/rubygems.rb: Update win_platform? check for JRuby compatibility.
+Tue Feb 4 17:20:03 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/rubygems/test_gem_installer.rb: Update for Ruby 1.9.2
- compatibility
+ * dir.c (glob_helper): return the filename with actual cases on
+ the filesystem if it is case-insensitive. [ruby-core:42469]
+ [Feature #5994]
-Wed Mar 6 01:19:28 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+Tue Feb 4 16:16:58 2014 Koichi Sasada <ko1@atdot.net>
- * enumerator.c (enumerator_with_index, lazy_take): use INT2FIX(0)
- instead of INT2NUM(0).
+ * string.c: use STR_SHARED instead of ELTS_SHARED.
+ (same value, but more clear meaning)
- * ext/bigdecimal/bigdecimal.c (BigMath_s_exp): ditto.
+Tue Feb 4 16:09:14 2014 Koichi Sasada <ko1@atdot.net>
- * ext/fiddle/function.c (function_call): ditto.
+ * string.c: remove STR_ASSOC related code.
+ By r44804, string objects can not have STR_ASSOC flag.
- * ext/openssl/ossl_x509store.c (ossl_x509store_initialize): ditto.
+ * internal.h: ditto.
- * process.c (proc_getsid): ditto.
+ * ext/objspace/objspace_dump.c (dump_object): ditto.
- * transcode.c (econv_finish): ditto.
+Tue Feb 4 14:07:20 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Tue Mar 5 21:36:43 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * pack.c (str_associate, str_associated): keep associated objects
+ in an instance variables, instead of in the internal structure.
- * class.c (rb_prepend_module): check redefinition of built-in optimized
- methods. [ruby-dev:47124] [Bug #7983]
+ * string.c (rb_str_associate, rb_str_associated): deprecate.
- * vm.c (rb_vm_check_redefinition_by_prepend): ditto.
+Tue Feb 4 12:55:31 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Tue Mar 5 20:29:25 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * string.c (rb_str_modify_expand): enable capacity and disable
+ association with packed objects when setting capa, so that
+ pack("p") string fails to unpack properly after modified.
- * proc.c (mnew): revert r39224. [ruby-core:53038] [Bug #7988]
+Tue Feb 4 12:45:15 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Tue Mar 5 20:23:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * dir.c (glob_make_pattern): all alphabets are magic characters on
+ case-insensitive filesystems. [ruby-core:42469] [Feature #5994]
- * include/ruby/intern.h (rb_check_arity): make a static inline
- function so it can be used as an expression and argc would be
- evaluated only once.
+Tue Feb 4 09:47:57 2014 Eric Hodel <drbrain@segment7.net>
-Tue Mar 5 12:30:55 2013 Eric Hodel <drbrain@segment7.net>
+ * lib/rubygems: Update to RubyGems 2.2.2 prerelease to check fixes to
+ CI.
+ * test/rubygems: ditto.
- * lib/rubygems.rb: Bump version to 2.0.1 for upcoming bugfix release
+Mon Feb 3 12:04:47 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
- * lib/rubygems/ext/ext_conf_builder.rb: Restore ruby 1.8 compatibility
- for [Bug #7698]
- * test/rubygems/test_gem_installer.rb: Ditto.
+ * error.c: [DOC] Exception#cause may return nil. [ci skip]
- * lib/rubygems/package.rb: Restore ruby 1.8 compatibility.
+Sun Feb 2 05:48:42 2014 Eric Wong <e@80x24.org>
- * test/rubygems/test_gem_dependency_installer.rb: Fix warnings
+ * io.c (rb_io_syswrite): add RB_GC_GUARD
+ [Bug #9472][ruby-core:60407]
-Tue Mar 5 12:24:23 2013 Eric Hodel <drbrain@segment7.net>
+Sat Feb 1 15:09:16 2014 Masaki Suketa <masaki.suketa@nifty.ne.jp>
- * enumerator.c (enumerator_with_index): Restore handling of a nil memo
- from r39594.
+ * ext/win32ole/win32ole.c (ole_typedesc2val): add VT_RECORD case.
-Tue Mar 5 10:40:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Feb 1 06:38:51 2014 Zachary Scott <e@zzak.io>
- * ext/objspace/objspace.c (count_nodes): count also newly added nodes,
- and fix key for unknown node. patch by tmm1 (Aman Gupta) in
- [ruby-core:53130] [Bug #8014]
+ * lib/drb/drb.rb: [DOC] Add note about start_service for each process
+ Based on a patch by @rosenfeld [Fixes GH-514] [ci skip]
+ https://github.com/ruby/ruby/pull/514
-Tue Mar 5 10:20:16 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Feb 1 06:30:20 2014 Zachary Scott <e@zzak.io>
- * enumerator.c (enumerator_with_index_i): allow Bignum as offset, to
- get rid of conversion exception and integer overflow.
- [ruby-dev:47131] [Bug #8010]
+ * error.c: [DOC] Document Exception#cause by @jasonrclark [ci skip]
+ [Fixes GH-519] https://github.com/ruby/ruby/pull/519
- * numeric.c (rb_int_succ, rb_int_pred): shortcut optimization for
- Bignum.
+Sat Feb 1 06:10:49 2014 Zachary Scott <e@zzak.io>
-Tue Mar 5 10:02:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/securerandom.rb: [DOC] Add note on require for examples
+ Based on a patch by @schneems [Fixes GH-518] [ci skip]
+ https://github.com/ruby/ruby/pull/518
- * lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
- clear DESTDIR so RUBYARCHDIR and RUBYLIBDIR are not be overridden.
- [Bug #7698]
+Sat Feb 1 06:04:56 2014 Zachary Scott <e@zzak.io>
-Mon Mar 4 15:33:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * numeric.c: [DOC] Fix typo in example for #step [ci skip]
+ Patch by @ksss [Fixes GH-522] https://github.com/ruby/ruby/pull/522
- * lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
- fix for unusual cases again. install to a temporary directory once
- and move installed files to the destination directory, if it is same
- as the current directory. [Bug #7698]
+Fri Jan 31 17:01:47 2014 Eric Wong <e@80x24.org>
-Mon Mar 4 14:13:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/socket/init.c (rsock_socket0): split out SOCK_CLOEXEC version
+ * ext/socket/socket.c (rsock_socketpair0): ditto
+ [ruby-core:60377]
- * Makefile.in (miniruby, ruby): move MAINLIBC because linker arguments
- must appear after object files with newer versions of gcc. patch by
- tmm1 (Aman Gupta) in [ruby-core:53121] [Bug #8009]
+Fri Jan 31 03:48:40 2014 Eric Wong <e@80x24.org>
-Mon Mar 4 10:23:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * benchmark/driver: avoid large alloc in driver process
+ [ruby-core:59869] [Bug #9430]
- * encoding.c: Typo in Encoding overview by Tom Wardrop [GH fixes #255]
+Thu Jan 30 14:45:49 2014 Shugo Maeda <shugo@ruby-lang.org>
-Sun Mar 3 12:35:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * configure.in: use $@ instead of $(.TARGET) because .TARGET is not
+ supported by GNU make.
- * lib/mkmf.rb (MakeMakefile#libpath_env): set runtime library path for
- the case rpath is disabled.
+Thu Jan 30 08:26:21 2014 Yusuke Endoh <mame@tsg.ne.jp>
-Sun Mar 3 12:17:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/fiddle/closure.c: use sizeof(*pcl) for correct sizeof value.
+ [ruby-core:57599] [Bug #8978].
- * lib/rubygems/ext/ext_conf_builder.rb
- (Gem::Ext::ExtConfBuilder.hack_for_obsolete_style_gems): remove
- circular dependencies in install-so too. [ruby-core:52882]
- [Bug #7698]
+Wed Jan 29 20:08:15 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sun Mar 3 07:33:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * io.c (nogvl_copy_stream_sendfile): check socket on other than
+ linux, as sendfile(2) on non-socket fd works only on linux.
+ [Feature #9427]
- * ext/socket/tcpserver.c: Grammar for TCPServer.new from r39554
+Wed Jan 29 18:09:48 2014 Eric Wong <e@80x24.org>
-Sun Mar 3 01:17:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * io.c (nogvl_copy_stream_sendfile): remove socket check
+ [ruby-core:59856][Feature #9427]
- * lib/rubygems/ext/ext_conf_builder.rb
- (Gem::Ext::ExtConfBuilder.hack_for_obsolete_style_gems): remove
- circular dependencies for old style gems which locate extconf.rb on
- the toplevel. [ruby-core:53059] [ruby-trunk - Bug #7698]
+Wed Jan 29 04:29:54 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
- use RUBYOPT instead of -r option, and revert some tests. [Bug #7698]
+ * ext/openssl/ossl_ssl.c: pass read_nonblock options to underlying IO
+ when SSL session has not been started.
- * lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
- revert use of temporary directory for build, to work some buggy
- extconf.rb which cannot build outside the source directory.
- [ruby-core:53056] [Bug #7698]
+ * test/openssl/test_ssl.rb: test for change.
-Sun Mar 3 00:04:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Jan 29 03:49:36 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * enc/depend (CPPFLAGS), lib/mkmf.rb (MakeMakefile#create_makefile):
- define RUBY_EXPORT for static-linked-ext mswin. [Bug #7960]
+ * ext/fiddle/closure.c: use sizeof(*pcl) for correct sizeof value.
+ [ruby-core:57599] [Bug #8978]. Thanks mame!
-Sat Mar 2 22:49:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Jan 29 03:36:42 2014 Eric Wong <e@80x24.org>
- * win32/Makefile.sub (ENCOBJS, EXTOBJS, config.h): definitions for
- static-linked-ext. [Bug #7960]
+ * doc/contributing.rdoc: allow/encourage other git hosts
+ [ruby-core:59807][misc #9421]
-Sat Mar 2 17:34:19 2013 Tanaka Akira <akr@fsij.org>
+Tue Jan 28 23:36:01 2014 Tanaka Akira <akr@fsij.org>
- * lib/webrick/utils.rb: use Socket.tcp_server_sockets to create server
+ * ext/socket: Avoid redundant fcntl/fstat syscalls for cloexec
sockets.
- fix [Bug #7100] https://bugs.ruby-lang.org/issues/7100
- reported by sho-h (Sho Hashimoto).
-
-Sat Mar 2 02:45:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * array.c: typo in comment patch by Nami-Doc [Github fixes #253]
-
-Sat Mar 2 01:33:17 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * Merge Onigmo 0fe387da2fee089254f6b04990541c731a26757f
- v5.13.3 [Bug#7972] [Bug#7974]
-
-Fri Mar 1 11:09:06 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/fileutils.rb: Revert r34669 which altered the way
- metaprogramming in FileUtils occurred. [ruby-trunk - Bug #7958]
-
- * test/fileutils/visibility_tests.rb: Refactored tests of FileUtils
- options modules to expose bug found in #7958
- * test/fileutils/test_dryrun.rb: ditto.
- * test/fileutils/test_nowrite.rb: ditto.
- * test/fileutils/test_verbose.rb: ditto.
-
-Fri Mar 1 09:18:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/psych.rb: specify in rdoc what object is returned in parser
- By Adam Stankiewicz [Github tenderlove/psych#133]
-
-Fri Mar 1 07:21:41 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems/ext/builder.rb: Fix incompatibilities when installing
- extensions. Patch by Nobu.
- [ruby-trunk - Bug #7698] [ruby-trunk - Bug #7971]
- * lib/rubygems/ext/ext_conf_builder.rb: ditto.
- * lib/rubygems/installer.rb: ditto.
- * test/rubygems/test_gem_ext_ext_conf_builder.rb: Test for the above.
- * test/rubygems/test_gem_installer.rb: ditto.
-
- * lib/rubygems/commands/sources_command.rb: Prefer HTTPS over HTTP.
- * lib/rubygems/defaults.rb: ditto
- * lib/rubygems/dependency_resolver.rb: Ditto.
- * lib/rubygems/source.rb: ditto.
- * lib/rubygems/spec_fetcher.rb: ditto.
- * lib/rubygems/specification.rb: ditto.
- * lib/rubygems/test_utilities.rb: ditto.
- * test/rubygems/test_gem.rb: Test for the above.
- * test/rubygems/test_gem_commands_sources_command.rb: ditto.
- * test/rubygems/test_gem_dependency_resolver_api_set.rb: ditto.
- * test/rubygems/test_gem_remote_fetcher.rb: ditto.
- * test/rubygems/test_gem_source.rb: ditto.
- * test/rubygems/test_gem_spec_fetcher.rb: ditto.
-
-Fri Mar 1 03:25:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * ext/psych/lib/psych.rb: rdoc for Psych overview by Adam Stankiewicz
- [Github tenderlove/psych#134]
-
-Thu Feb 28 22:57:48 2013 Koichi Sasada <ko1@atdot.net>
-
- * compile.c (iseq_compile_each): remove redundant trace(line)
- instruction. for example, at the following script
- def m()
- p:xyzzy
- 1
- 2
- end
- compiler ignores `1' because there is no effect. However,
- `trace(line)' instruction remains in bytecode.
- This modification removes such redundant trace(line) instruction.
-
- * test/ruby/test_iseq.rb: add a test.
-
-Thu Feb 28 22:23:27 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/raddrinfo.c (inspect_sockaddr): don't show that Unix
- domain socket filename is bigger than sizeof(sun_path).
- This limit is not rigid on some platforms such as Darwin and SunOS.
-
-Thu Feb 28 21:33:01 2013 WATANABE Hirofumi <eban@ruby-lang.org>
-
- * configure.in(AC_DISABLE_OPTION_CHECKING): avoid warning "WARNING:
- Unrecognized options: --with-PACKAGE".
-
-Thu Feb 28 20:22:04 2013 Koichi Sasada <ko1@atdot.net>
-
- * iseq.c (iseq_data_to_ary): fix condition.
- r34303 introduces a bug to avoid all line information from
- a result of ISeq#to_a. This is a regression problem from 2.0.0p0.
-
- * test/ruby/test_iseq.rb: add a test of lines after ISeq#to_a.
-
-Thu Feb 28 08:20:33 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems/available_set.rb: Undent for style
-
- * lib/rubygems/dependency_installer.rb: Pick latest prerelease gem to
- install. Fixes RubyGems bug #468.
- * test/rubygems/test_gem_dependency_installer.rb: Test for the above.
-
- * lib/rubygems/dependency_installer.rb: Don't display "Done installing
- documentation" if documentation will not be installed.
- * lib/rubygems/rdoc.rb: ditto
-
- * lib/rubygems/dependency_list.rb: Use Array#concat for Ruby 1.x
- performance.
-
- * lib/rubygems/installer.rb: Use formatted program name when comparing
- executables. RubyGems pull request #471
- * test/rubygems/test_gem_installer.rb: Test for the above.
-
- * lib/rubygems/package.rb: Use more explicit feature check to work
- around JRuby bug #552
-
- * lib/rubygems/ssl_certs/GeoTrust_Global_CA.pem: Added GeoTrust root
- certificate.
-
- * test/rubygems/test_gem_source_list.rb: Use "example" instead of real
- hostname
-
-Thu Feb 28 05:57:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * thread.c: rdoc formatting for Thread, ThreadGroup, and ThreadError
-
-Thu Feb 28 02:42:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * vm.c: Typo in overview for example of Thread#status returning false
- Reported by Lee Jarvis
-
-Wed Feb 27 22:54:27 2013 Tanaka Akira <akr@fsij.org>
-
- * ext/socket/rubysocket.h (union_sockaddr): make it longer for SunOS
- and Darwin.
-
-Wed Feb 27 21:14:34 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/security.rb (REXML::Security): create.
- * lib/rexml/rexml.rb: move entity_expansion_limit and
- entity_expansion_text_limit accessors to ...
- * lib/rexml/security.rb: ... here.
- * lib/rexml/document.rb: use REXML::Security.
- * lib/rexml/text.rb: use REXML::Security.
- * test/rexml/test_document.rb: use REXML::Security.
-
-Wed Feb 27 19:53:32 2013 Benoit Daloze <eregontp@gmail.com>
-
- * vm.c (Thread): fix typos in overview
-
-Wed Feb 27 13:21:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * vm.c (Thread): Typo in overview, swap setting and getting
-
-Wed Feb 27 13:02:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * vm.c (Thread): Documentation overview of Thread class
-
-Wed Feb 27 12:57:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * thread.c (rb_thread_wakeup): rdoc formatting
+ Patch by Eric Wong. [ruby-core:59429] [Feature #9330]
-Wed Feb 27 12:53:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Tue Jan 28 20:51:07 2014 Tanaka Akira <akr@fsij.org>
- * thread.c (rb_thread_group): rdoc formatting
-
-Wed Feb 27 12:33:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * lib/ostruct.rb: Typo in OpenStruct overview [Github Fixes #251]
- Patch by Chun-wei Kuo
-
-Wed Feb 27 12:13:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * vm_exec.h (END_INSN): llvm-gcc may optimize out reg_cfp and cause
- Stack/cfp consistency error when the instruction doesn't use reg_cfp.
- Usually instructions use PUSH() but for example trace doesn't.
- This hack cause speed down but you shouldn't use llvm-gcc, use clang.
- [Bug #7938]
-
-Wed Feb 27 10:23:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * thread.c (thread_raise_m): rdoc formatting
-
-Tue Feb 26 23:32:44 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/document.rb: move entity_expansion_limit accessor to ...
- * lib/rexml/rexml.rb: ... here for consistency.
- * lib/rexml/document.rb (REXML::Document.entity_expansion_limit):
- deprecated.
- * lib/rexml/document.rb (REXML::Document.entity_expansion_limit=):
- deprecated.
-
-Tue Feb 26 23:26:13 2013 Kouhei Sutou <kou@cozmixng.org>
-
- * lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...
- * lib/rexml/rexml.rb: ... here to make rexml/text independent from
- REXML::Document. It causes circular require.
- * lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
- deprecated.
- * lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit=):
- deprecated.
- * lib/rexml/text.rb: add missing require "rexml/rexml" for
- REXML.entity_expansion_text_limit.
- Reported by Robert Ulejczyk. Thanks!!! [ruby-core:52895] [Bug #7961]
-
-Tue Feb 26 15:12:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * tool/mkconfig.rb: reconstruct comma separated list values. a
- command line to Windows batch file is split not only by spaces
- and equal signs but also by commas and semicolons.
-
-Tue Feb 26 15:04:19 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * configure.in (unexpand_shvar): get rid of non-portable shell
- behavior on OpenBSD, so no extra quotes. [Bug #7959]
-
-Tue Feb 26 10:24:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * parse.y (IS_LABEL_POSSIBLE): allow labels for keyword arguments just
- after method definition without a parenthesis. [ruby-core:52820]
- [Bug #7942]
-
-Tue Feb 26 04:50:00 2013 Zachary Scott <zachary@zacharyscott.net>
-
- * error.c: clarify reason for sleep in SignalException example
-
-Tue Feb 26 03:47:00 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
-
- * error.c: clarify a document of SignalException. Process.kill()
- doesn't have any guarantee when signal will be delivered.
- [Bug #7951] [ruby-core:52864]
-
-Mon Feb 25 23:51:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * include/ruby/version.h: bump RUBY_API_VERSION same as RUBY_VERSION.
-
-Mon Feb 25 21:03:34 2013 NARUSE, Yui <naruse@ruby-lang.org>
-
- * string.c (str_byte_substr): don't set coderange if it's not known.
- [Bug #7954] [ruby-dev:47108]
-
-Mon Feb 25 16:47:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * common.mk (realclean-local): miniprelude.c is made by srcs, so it
- should not removed by distclean but by realclean. [Bug #6807]
-
-Mon Feb 25 16:30:30 2013 Eric Hodel <drbrain@segment7.net>
-
- * lib/rubygems/config_file.rb: Lazily load .gem/credentials to only
- check permissions when necessary. RubyGems bug #465
- * test/rubygems/test_gem_config_file.rb: Test for the above.
-
- * test/rubygems/test_gem_commands_push_command.rb: Remove duplicated
- test.
-
-Mon Feb 25 15:47:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-
- * enc/depend (ARFLAGS): VisualC++ linker does not allow spaces between
- output option and the output file name. [Bug #7950]
-
- * enc/depend (RANLIB): set default command to do nothing, or make the
- entire line a label on Windows.
-
-Mon Feb 25 14:41:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * process.c (READ_FROM_CHILD): Apply the last hunk of
+ 0001-process.c-avoid-EINTR-from-Process.spawn.patch written by
+ Eric Wong in [Bug #8770].
- * lib/mkmf.rb (MakeMakefile#init_mkmf): default libdirname to libdir.
+Tue Jan 28 16:31:13 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * tool/rbinstall.rb: ditto.
+ * thread_pthread.c (ruby_init_stack, ruby_stack_overflowed_p):
+ place get_stack above others to get stack boundary information.
+ [ruby-core:60113] [Bug #9454]
-Mon Feb 25 13:12:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Jan 28 15:27:36 2014 NARUSE, Yui <naruse@ruby-lang.org>
- * configure.in (setup): find Setup file from target_os 1. by
- suffix (e.g. Setup.nacl, Setup.atheos), 2. by "platform"
- option (e.g. Setup.nt, Setup.emx), and 3. default Setup. And
- Setup.dj had been removed.
+ * thread_pthread.c: rlimit is only available on Linux.
+ At least r44712 breaks FreeBSD.
+ [ruby-core:60113] [Bug #9454]
-Mon Feb 25 12:48:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Tue Jan 28 15:17:59 2014 Zachary Scott <e@zzak.io>
- * thread.c: Document Thread::new, clean up ::fork and mention calling
- super if subclassing Thread
+ * lib/set.rb: [DOC] Add examples for Set#intersect? and Set#disjoint?
+ Patch by xavier nayrac [Bug #9331] [ci skip]
-Mon Feb 25 12:38:50 2013 Tanaka Akira <akr@fsij.org>
+Tue Jan 28 15:12:22 2014 Zachary Scott <e@zzak.io>
- * ext/socket/extconf.rb: don't test ss_family and ss_len member of
- struct sockaddr_storage. They are not used now except SunOS
- specific code.
+ * ext/zlib/zlib.c (rb_zlib_adler32): [DOC] Add example for adler32
+ Patch by Vajrasky Kok [Bug #9307] [ci skip]
-Mon Feb 25 11:03:38 2013 Akinori MUSHA <knu@iDaemons.org>
+Tue Jan 28 08:56:00 2014 Charlie Somerville <charliesome@ruby-lang.org>
- * configure.in (unexpand_shvar): Use the numeric comparison
- operator instead of '==' which is a ksh extension. [Bug #7941]
+ * compile.c (iseq_build_from_ary_body): Use :blockptr instead of :block
+ as hash key when loading serialized instruction sequences from arrays.
+ [Bug #9455] [ruby-core:60146]
-Mon Feb 25 02:37:56 2013 Tanaka Akira <akr@fsij.org>
+Mon Jan 27 21:52:55 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/socket: define and use union_sockaddr instead of struct
- sockaddr_storage for less casts.
+ * thread_pthread.c: get current main thread stack size, which may
+ be expanded than allocated size at initialization, by rlimit().
+ [ruby-core:60113] [Bug #9454]
- * ext/socket/rubysocket.h (union_sockaddr): defined.
+Sat Jan 25 22:17:02 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
- * ext/socket/socket.c (sock_accept): use union_sockaddr.
- (sock_accept_nonblock): ditto.
- (sock_sysaccept): ditto.
- (sock_s_getnameinfo): ditto.
+ * README.ja.md, README.md: update the controller address of
+ mailing lists.
- * ext/socket/basicsocket.c (bsock_getsockname): ditto.
- (bsock_getpeername): ditto.
- (bsock_local_address): ditto.
- (bsock_remote_address): ditto.
+Sat Jan 25 14:50:42 2014 Eric Wong <normalperson@yhbt.net>
- * ext/socket/ancdata.c (bsock_recvmsg_internal): ditto.
+ * process.c (send_child_error): retry write on EINTR to fix
+ occasional Errno::EINTR from Process.spawn.
- * ext/socket/init.c (recvfrom_arg): ditto.
- (recvfrom_blocking): ditto.
- (rsock_s_recvfrom): ditto.
- (rsock_s_recvfrom_nonblock): ditto.
- (rsock_getfamily): ditto.
+ * process.c (recv_child_error): retry read on EINTR to fix
+ occasional Errno::EINTR from Process.spawn.
- * ext/socket/raddrinfo.c (rb_addrinfo_t): ditto.
- (ai_get_afamily): ditto.
- (inspect_sockaddr): ditto.
- (addrinfo_mdump): ditto.
- (addrinfo_mload): ditto.
- (addrinfo_getnameinfo): ditto.
- (addrinfo_ip_port): ditto.
- (extract_in_addr): ditto.
- (addrinfo_ipv6_to_ipv4): ditto.
- (addrinfo_unix_path): ditto.
+Sat Jan 25 14:21:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/socket/tcpserver.c (tcp_accept): ditto.
- (tcp_accept_nonblock): ditto.
- (tcp_sysaccept): ditto.
+ * compile.c (iseq_compile_each): result of assignment should be
+ its rhs instead of returned value from a method.
+ [ruby-core:60071] [Bug #9448]
- * ext/socket/ipsocket.c (ip_addr): ditto.
- (ip_peeraddr): ditto.
- (ip_s_getaddress): ditto.
+Sat Jan 25 11:16:19 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sun Feb 24 21:15:05 2013 Tadayoshi Funaba <tadf@dotrb.org>
+ * class.c (rb_extract_keywords): treat nil keyword_hash same as 0,
+ for the case rb_scan_args returns nil if no keyword hash.
- * ext/date/date_core.c: [ruby-core:52303]
+Fri Jan 24 15:13:20 2014 Zachary Scott <e@zzak.io>
-Sun Feb 24 15:33:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/racc/rdoc/grammar.en.rdoc: [DOC] Correct grammar and typos
+ Patch by Giorgos Tsiftsis [Bug #9429] [ci skip]
- * random.c (rb_random_ulong_limited): limit is inclusive, but generic
- rand method should return a number less than it, so increase for the
- difference. [ruby-core:52779] [Bug #7935]
+Thu Jan 23 20:20:17 2014 Koichi Sasada <ko1@atdot.net>
-Sun Feb 24 15:32:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/ruby/envutil.rb: try to wait a bit (0.1sec) when ruby process
+ exits by signals because some SEGV tests fail because of not enough
+ error output.
- * random.c (rb_random_ulong_limited): limit is inclusive, but generic
- rand method should return a number less than it, so increase for the
- difference. [ruby-core:52779] [Bug #7935]
+Thu Jan 23 20:06:27 2014 Koichi Sasada <ko1@atdot.net>
-Sun Feb 24 15:14:43 2013 Eric Hodel <drbrain@segment7.net>
+ * test/ruby/test_settracefunc.rb: check the target thread.
- * lib/net/http.rb: Removed duplicate Accept-Encoding in Net::HTTP#get.
- [ruby-trunk - Bug #7924]
- * test/net/http/test_http.rb: Test for the above.
+Thu Jan 23 19:59:16 2014 Koichi Sasada <ko1@atdot.net>
-Wed Feb 20 14:28:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * test/ruby/test_settracefunc.rb: check the target thread.
- * thread.c: Document ThreadGroup::Default
+Thu Jan 23 14:26:44 2014 Zachary Scott <e@zzak.io>
-Wed Feb 20 14:23:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * lib/fileutils.rb: [DOC] Fix typo in options_of() example [Bug #9392]
+ Patch by Giorgos Tsiftsis
- * thread.c: Grammar for #backtrace_locations and ::handle_interrupt
+Thu Jan 23 13:56:16 2014 Zachary Scott <e@zzak.io>
-Sun Feb 24 13:35:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * README -> README.md: [DOC] Format README with Markdown [Bug #9255]
+ * README.ja -> README.ja.md: ditto
- * vm_insnhelper.c (vm_call_method): block level control frame does not
- have method entry, so obtain the method entry from method top-level
- control frame to be compared with refined method entry.
- [ruby-core:52750] [Bug #7925]
+Wed Jan 22 15:59:39 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Wed Feb 20 13:23:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * ext/thread/thread.c (Init_thread): ConditionVariable and Queue
+ are not able to copy. [ruby-core:59961] [Bug #9440]
- * object.c: Document methods receiving string and convert to symbol
- Patch by Stefan Rusterholz
- * vm_eval.c: ditto
- * vm_method.c: ditto
+Tue Jan 21 20:14:55 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Wed Feb 20 07:20:56 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * thread_pthread.c (rb_thread_create_timer_thread): fix for platforms
+ where PTHREAD_STACK_MIN is a dynamic value and not a compile-time
+ constant. [ruby-dev:47911] [Bug #9436]
- * signal.c (sigsegv): suppress unused result warning. Because
- write(2) is marked __warn_unused_result__ on Linux glibc.
+Tue Jan 21 17:55:09 2014 Zachary Scott <e@zzak.io>
-Sun Feb 24 07:50:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/uri/common.rb: [DOC] Use static w3.org uri [ci skip]
+ Patch by @ykzts [Fix GH-484] https://github.com/ruby/ruby/pull/484
- * compile.c (iseq_set_arguments): no keyword check if any keyword rest
- argument exists, even unnamed. [ruby-core:52744] [Bug #7922]
+Tue Jan 21 16:43:22 2014 Zachary Scott <e@zzak.io>
-Sat Feb 23 16:51:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * enum.c: [DOC] Add simple example of Enumerable#zip [ci skip]
+ Patch by @nruth on documenting-ruby/ruby#22
+ https://github.com/documenting-ruby/ruby/pull/22
- * thread.c: Documentation for Thread#backtrace_locations
+Tue Jan 21 16:26:44 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Feb 23 16:05:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * thread_pthread.c (rb_thread_create_timer_thread): expand timer
+ thread stack size to get rid of segfault on FreeBSD/powerpc64.
+ based on the patch by Steve Wills at [ruby-core:59923].
+ [ruby-core:56590] [Bug #8783]
- * vm.c: Typo in ObjectSpace::WeakMap overview
+Tue Jan 21 04:31:23 2014 Tanaka Akira <akr@fsij.org>
-Sat Feb 23 16:00:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * ext/socket/option.c: Use "int" for IP_MULTICAST_LOOP and
+ IP_MULTICAST_TTL on Mac OS X and Windows.
- * thread.c: Improved rdoc for ::handle_interrupt, ::pending_interrupt?
- and #pending_interrupt?
+Tue Jan 21 00:39:15 2014 Tanaka Akira <akr@fsij.org>
-Sat Feb 23 12:26:43 2013 Akinori MUSHA <knu@iDaemons.org>
+ * ext/socket/option.c: Use "byte" as default argument for
+ IP_MULTICAST_LOOP and IP_MULTICAST_TTL socket option to follow
+ the original multicast implementation.
- * misc/ruby-electric.el (ruby-electric-curlies)
- (ruby-electric-matching-char, ruby-electric-bar): Avoid electric
- insertion when there is a prefix argument.
+Mon Jan 20 20:20:27 2014 Tanaka Akira <akr@fsij.org>
- * misc/ruby-electric.el (ruby-electric-insert)
- (ruby-electric-cua-replace-region-p)
- (ruby-electric-cua-replace-region): Avoid electric insertion and
- fall back when cua-mode is enabled and a region is active.
+ * ext/socket/option.c: Use preprocessor macros to avoid repeated
+ conditionals.
-Sat Feb 23 12:35:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Mon Jan 20 13:55:03 2014 Zachary Scott <e@zzak.io>
- * array.c: Document #<=> return values and formatting
- * bignum.c: ditto
- * file.c: ditto
- * object.c: ditto
- * numeric.c: ditto
- * rational.c: ditto
- * string.c: ditto
- * time.c: ditto
+ * lib/rubygems/version.rb: [DOC] Use gender-neutral pronouns [ci skip]
+ * lib/rubygems/security.rb: ditto
-Sat Feb 23 10:50:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Sun Jan 19 06:38:48 2014 Benoit Daloze <eregontp@gmail.com>
- * array.c (rb_ary_diff, rb_ary_and, rb_ary_or): Document return order
- [RubySpec #7803]
+ * compar.c (cmp_equal): warn for this release and still rescue
+ standard exceptions for a nicer transition. See #7688.
+ Partly reverts r44502.
-Sat Feb 23 10:17:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * test/ruby/test_comparable.rb: adapt assertion to match new behavior.
- * object.c (rb_obj_comp): Documenting Object#<=> return values
- Patch by Stefan Rusterholz
+Sun Jan 19 06:27:18 2014 Benoit Daloze <eregontp@gmail.com>
-Sat Feb 23 09:48:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/ruby/test_comparable.rb: specify behavior for the different
+ kind of exceptions rescued (or not) by Comparable#==.
- * dir.c (file_s_fnmatch, fnmatch_brace): encoding-incompatible pattern
- and string do not match, instead of exception. [ruby-dev:47069]
- [Bug #7911]
+Sat Jan 18 23:12:19 2014 Tanaka Akira <akr@fsij.org>
-Sat Feb 23 08:57:46 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+ * ext/socket: Avoid unnecessary ppoll/select on Linux.
+ Patch by Eric Wong. [ruby-core:57950] [Bug #9039]
- * doc/NEWS-*: Update NEWS from their respective branches
+Sat Jan 18 22:57:44 2014 Tanaka Akira <akr@fsij.org>
-Sat Feb 23 08:14:43 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+ * lib/resolv.rb (Resolv::DNS::Resource::TXT#data): Return concatenated
+ string.
+ Patch by Ryan Brunner. [ruby-core:58220] [Bug #9093]
- * NEWS: many additions for Ruby 2.0.0
+Sat Jan 18 22:35:15 2014 Tanaka Akira <akr@fsij.org>
- * object.c: Add doc for Module.prepended
+ * io.c (rb_update_max_fd): Return immediately if the given fd is small
+ enough.
-Sat Feb 23 07:52:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Jan 18 22:25:53 2014 Tanaka Akira <akr@fsij.org>
- * template/ruby.pc.in: reorder library flags which may refer library
- names. [Bug #7913]
+ * io.c: Test O_CLOEXEC only once.
+ Patch by Eric Wong. [ruby-core:59419] [Feature #9328]
-Fri Feb 22 23:46:20 2013 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+Sat Jan 18 21:24:49 2014 Tanaka Akira <akr@fsij.org>
- * lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
- fix a typo in comment in r39384.
+ * ext/socket/option.c: IP_MULTICAST_LOOP and IP_MULTICAST_TTL socket
+ option takes a byte on OpenBSD.
+ Fixed by Jeremy Evans. [ruby-core:59496] [Bug #9350]
-Fri Feb 22 18:31:46 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+Sat Jan 18 21:19:04 2014 Tanaka Akira <akr@fsij.org>
- * lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
- new attribute to read/write entity expansion text limit. the default
- limit is 10Kb.
+ * lib/open-uri.rb: Make proxy disabling working again.
+ Fixed by Christophe Philemotte. [ruby-core:59650] [Bug #9385]
- * lib/rexml/text.rb (REXML::Text.unnormalize): check above attribute.
+Fri Jan 17 20:05:02 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Feb 22 17:36:23 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * lib/delegate.rb (Delegator): keep source information methods
+ which start and end with '__'. [ruby-core:59718] [Bug #9403]
- * test/test_rbconfig.rb (TestRbConfig): fix r39372.
- It must see RbConfig::CONFIG instead of CONFIG.
+Fri Jan 17 17:58:04 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Feb 22 14:55:41 2013 Naohisa Goto <ngotogenome@gmail.com>
+ * eval.c (rb_mod_s_constants): return its own constants for other
+ than Module itself. [ruby-core:59763] [Bug #9413]
- * signal.c (ruby_abort): fix typo in r39354 [Bug #5014]
+Tue Jan 16 00:17:00 2014 Kenta Murata <mrkn@mrkn.jp>
-Fri Feb 22 12:46:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/bigdecimal/bigdecimal.gemspec: bigdecimal version 1.2.5.
- * random.c (rb_random_ulong_limited): fix error message for negative
- value. [ruby-dev:47061] [Bug #7903]
+Wed Jan 15 20:30:31 2014 Masaki Matsushita <glass.saga@gmail.com>
-Fri Feb 22 11:36:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * io.c (io_binwrite): use writev(2) to avoid double write if available.
- * test/test_rbconfig.rb (TestRbConfig): skip user defined values by
- configuration options. [Bug #7902]
+ * configure.in: check writev(2)
-Fri Feb 22 11:33:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Jan 15 14:04:33 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/mkmf.rb (MakeMakefile#init_mkmf): adjust default library path
- for multiarch. [Bug #7874]
+ * string.c (get_encoding): respect BOM on pseudo encodings.
+ [ruby-dev:47895] [Bug #9415]
-Fri Feb 22 11:10:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Wed Jan 15 14:03:47 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * enum.c (Enumerable#chunk: Improved examples, grammar, and formatting
- Patch by Dan Bernier and Rich Bruchal of newhaven.rb
- [Github documenting-ruby/ruby#8]
+ * string.c (get_actual_encoding): get actual encoding according to
+ the BOM if exists.
-Fri Feb 22 11:00:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * string.c (rb_str_inspect): use according encoding, instead of
+ pseudo encodings, UTF-{16,32}. [ruby-core:59757] [Bug #8940]
- * numeric.c: Examples and formatting for Numeric and Float
- Based on a patch by Zach Morek and Oren K of newhaven.rb
- [Github documenting-ruby/ruby#5]
+Tue Jan 14 21:07:22 2014 Masaki Matsushita <glass.saga@gmail.com>
-Fri Feb 22 07:04:41 2013 Eric Hodel <drbrain@segment7.net>
+ * ext/thread/thread.c (rb_szqueue_clear): notify SZQUEUE_WAITERS
+ on SizedQueue#clear. [ruby-core:59462] [Bug #9342]
- * lib/rubygems/installer.rb (build_extensions): Create extension
- install destination before building extension. Patch by Kenta Murata.
- [ruby-trunk - Bug #7897]
- * test/rubygems/test_gem_installer.rb: Test for the above.
+ * test/thread/test_queue.rb: add test. the patch is from
+ Justin Collins.
-Fri Feb 22 06:30:57 2013 Eric Hodel <drbrain@segment7.net>
+Tue Jan 14 15:58:43 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * doc/globals.rdoc: Document what setting $DEBUG does.
+ * ext/bigdecimal/bigdecimal.c (CLASS_NAME): macro to wrap
+ depending on PRIsVALUE for 1.9. [Backport #9406]
- * doc/globals.rdoc: Added pointer to $-d for full documentation.
+ * ext/bigdecimal/bigdecimal.c (DECIMAL_SIZE_OF_BITS): fallback
+ definition for 2.1 or older. [ruby-core:59750] [Backport #9406]
-Fri Feb 22 06:27:07 2013 Eric Hodel <drbrain@segment7.net>
+Tue Jan 14 11:28:44 2014 Yuki Yugui Sonoda <yugui@google.com>
- * doc/globals.rdoc: Document what setting $VERBOSE does. [Bug #7899]
+ * vm_exec.c (cfp): Fixes a SEGV issue in r44554.
+ r11 can be broken by subroutine and sometimes causes SEGV at
+ runtime. Use r13 instead.
- * doc/globals.rdoc: Added pointer to $-w and $-v for full
- documentation.
+Tue Jan 14 02:20:00 2014 Kenta Murata <mrkn@mrkn.jp>
-Fri Feb 22 02:33:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_divide): Add an additional
+ digit for the quotient to be compatible with bigdecimal 1.2.1 and
+ the former. [ruby-core:59365] [#9316] [#9305]
- * lib/abbrev.rb: Add words parameter to Abbrev::abbrev
- Patch by Devin Weaver [Github documenting-ruby/ruby#7]
+ * test/bigdecimal/test_bigdecimal.rb: tests for the above change.
-Thu Feb 21 17:28:14 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * ext/bigdecimal/bigdecimal.gemspec: bigdecimal version 1.2.4.
- * tool/merger.rb: add interaction when only ChangeLog is modified.
+Mon Jan 13 14:55:31 2014 Zachary Scott <e@zzak.io>
-Thu Feb 21 16:34:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/xmlrpc/client.rb: [DOC] Remove note about SSL package on RAA
+ Since RAA has been deprecated, and the SSL package has been replaced
+ with net/https this statement is entirely false and should be
+ deleted. [Bug #9152]
- * signal.c (check_stack_overflow): extract duplicated code and get rid
- of declaration-after-statement. [Bug #5014]
+Mon Jan 13 14:47:07 2014 Zachary Scott <e@zzak.io>
-Thu Feb 21 14:14:13 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * lib/net/smtp.rb: [DOC] Remove dead link to RAA by Giorgos Tsiftsis
+ Fixes the following bugs: [Bug #9152] [Bug #9268] [Bug #9394]
+ * lib/open-uri.rb: ditto
- * signal.c (sigsegv): avoid to use async signal unsafe functions
- when nested sigsegv is happen.
- [Bug #5014] [ruby-dev:44082]
+Mon Jan 13 14:25:55 2014 Zachary Scott <e@zzak.io>
-Thu Feb 21 13:47:59 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * ext/openssl/ossl_pkey_dh.c: Fixed typo by Sandor Szuecs [Bug #9243]
- * file.c (rb_group_member): added an error check. SUS says,
- getgroups(small_value) may return EINVAL.
+Mon Jan 13 12:03:00 2014 Charlie Somerville <charliesome@ruby-lang.org>
-Thu Feb 21 13:37:07 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * ext/thread/thread.c (rb_szqueue_push): check GET_SZQUEUE_WAITERS
+ instead of GET_QUEUE_WAITERS to prevent deadlock. Patch by Eric Wong.
+ [Bug #9302] [ruby-core:59324]
- * process.c (RB_MAX_GROUPS): moved to
- * internal.h (RB_MAX_GROUPS): here.
+ * test/thread/test_queue.rb: add test
- * file.c (rb_group_member): use RB_MAX_GROUPS instead of
- RUBY_GROUP_MAX. They are the same.
+Sun Jan 12 16:41:10 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Feb 21 13:15:40 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * iseq.c (iseq_load): keep type_map to get rid of memory leak.
+ based on a patch by Eric Wong at [ruby-core:59699]. [Bug #9399]
- * file.c (access_internal): removed.
- * file.c (rb_file_readable_real): use access() instead of
- access_internal().
- * file.c (rb_file_writable_real): ditto.
- * file.c (rb_file_executable_real): ditto.
+Sun Jan 12 09:21:35 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Feb 21 13:04:59 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * include/ruby/util.h (DECIMAL_SIZE_OF_BITS): a preprocessor
+ constant macro to approximate decimal representation size of n-bits
+ integer.
- * file.c (eaccess): use access() when not using setuid nor setgid.
- This is minor optimization.
+ * iseq.c (register_label): use DECIMAL_SIZE_OF_BITS for better
+ approximation.
-Thu Feb 21 12:56:19 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+ * ext/bigdecimal/bigdecimal.c (BigMath_s_log): ditto.
- * file.c (rb_group_member): get rid of NGROUPS dependency.
- [Bug #7886] [ruby-core:52537]
+ * common.mk (iseq.o), ext/bigdecimal/depend (bigdecimal.o): add
+ dependency to ruby/util.h for DECIMAL_SIZE_OF_BITS.
-Thu Feb 21 12:45:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Jan 10 16:27:20 2014 Yuki Yugui Sonoda <yugui@google.com>
- * ruby.c (ruby_init_loadpath_safe): try two levels upper for stripping
- libdir name. [Bug #7874]
+ * vm_exec.c (cfp): Avoid generating invalid binary for
+ NativeClient.
+ r15 on x86_64 is reserved by NativeClient. So r15 to cfp used to
+ generate invalid binary under some combinations of compiler
+ optimization flags.
- * configure.in (libdir_basename): expand with multiarch in configure,
- not to defer the expansion till ruby.pc.in and mkmf.rb. [Bug #7874]
+Fri Jan 10 18:01:41 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * configure.in (libdir_basename): also -rpath and -install_name flags
- are affected when libruby directory changes. [Bug #7874]
+ * vm_insnhelper.c (vm_search_super_method): allow bound method from a
+ module, yet another method transplanting.
-Wed Feb 20 19:27:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Jan 10 13:34:04 2014 Aman Gupta <ruby@tmm1.net>
- * include/ruby/ruby.h (HAVE_RB_SCAN_ARGS_OPTIONAL_HASH): for
- rb_scan_args() optional hash feature. [Bug #7861]
+ * insns.def (opt_aref_with): new instruction to optimize Hash#[],
+ removing any allocation overhead when used with a string literal
+ key. Patch by normalperson (Eric Wong). [ruby-core:59640] [Bug #9382]
+ * insns.def (opt_aset_with): new instruction to optimize Hash#[]=
+ * compile.c (iseq_compile_each): compiler shortcuts for new
+ instructions
+ * hash.c (static VALUE rb_hash_compare_by_id_p): fix documentation for
+ Hash#compare_by_identity to reflect frozen string sharing
+ * test/ruby/test_hash.rb (class TestHash): test for new behavior
-Wed Feb 20 18:02:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Fri Jan 10 06:23:21 2014 Benoit Daloze <eregontp@gmail.com>
- * configure.in (target_os): do not strip -gnu suffix on Linux if
- --target is given explicitly. [Bug #7874]
+ * range.c (Range#size): [DOC] improve description and add examples.
+ Patch by @skade. [Fixes GH-501]
- * configure.in (libdirname): adjust library path name which libruby
- files will be installed. [Bug #7874]
+Fri Jan 10 00:47:52 2014 Josef Stribny <strzibny@gmail.com>
- * tool/rbinstall.rb (libdir): ditto.
+ * ext/tk/extconf.rb: fix to pass arrays instead of strings to
+ libpathflag. patch at [ruby-core:59665]. [Bug #9386]
-Wed Feb 20 13:37:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Thu Jan 9 20:49:22 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/pty/pty.c: Documentation for the PTY module
+ * configure.in: -mstackrealign is necessary for -msse2 working.
+ [ruby-core:54716] [Bug #8349]
-Wed Feb 20 12:18:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * configure.in: use SSE2 instructions to drop unexpected precisions on
+ other than mingw. [ruby-core:59472] [Bug #8358]
- * object.c: Document Data class [Bug #7890] [ruby-core:52549]
- Patch by Matthew Mongeau
+Thu Jan 9 20:31:10 2014 NAKAMURA Usaku <usa@ruby-lang.org>
-Wed Feb 20 11:50:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * hash.c (rb_objid_hash): should return `long'. brushup r44534.
- * lib/mutex_m.rb: Add rdoc for Mutex_m module
+ * object.c (rb_obj_hash): follow above change.
-Wed Feb 20 09:34:43 2013 Eric Hodel <drbrain@segment7.net>
+Thu Jan 9 19:12:37 2014 Koichi Sasada <ko1@atdot.net>
- * lib/rubygems/commands/update_command.rb: Create the installer after
- options are processed. [ruby-trunk - Bug #7779]
- * test/rubygems/test_gem_commands_update_command.rb: Test for the
- above.
+ * vm.c (rb_vm_pop_cfunc_frame): added. It cares c_return event.
+ The patch base by drkaes (Stefan Kaes).
+ [Bug #9321]
-Wed Feb 20 07:51:19 2013 Eric Hodel <drbrain@segment7.net>
+ * variable.c (rb_mod_const_missing): use rb_vm_pop_cfunc_frame()
+ instead of rb_frame_pop().
- * lib/rubygems/installer.rb: Use gsub instead of gsub! to avoid
- altering @bin_dir. Fixes tests on windows. [ruby-trunk - Bug #7885]
+ * vm_eval.c (raise_method_missing): ditto.
-Tue Feb 19 20:50:00 2013 Kenta MURATA <mrkn@mrkn.jp>
+ * vm_eval.c (rb_iterate): ditto.
- * ext/bigdecimal/bigdecimal.gemspec: bump to 1.2.0.
- [ruby-core:51777] [Bug #7761]
+ * internal.h (rb_vm_pop_cfunc_frame): add decl.
-Tue Feb 19 13:07:25 2013 Akinori MUSHA <knu@iDaemons.org>
+ * test/ruby/test_settracefunc.rb: add tests.
+ provided by drkaes (Stefan Kaes).
- * ext/syslog/syslog.c (Init_syslog): Define inspect as a singleton
- method and remove it as an instance method. [Bug #6502]
+ * vm.c, eval.c, include/ruby/intern.h (rb_frame_pop):
+ move definition of rb_frame_pop() and deprecate it.
+ It doesn't care about `return' events.
-Tue Feb 19 12:30:00 2013 Zachary Scott <zachary@zacharyscott.net>
+Thu Jan 9 17:40:28 2014 NAKAMURA Usaku <usa@ruby-lang.org>
- * object.c: rdoc formatting for Kernel#Array()
- * array.c: Add rdoc for Array() method to Creating Arrays section
+ * hash.c (rb_any_hash): should treat the return value of rb_objid_hash()
+ as `long', because ruby assumes the hash value of the object id of
+ an object is `long'.
+ this fixes test failures on mswin64 introduced at r44525.
-Tue Feb 19 10:35:52 2013 Eric Hodel <drbrain@segment7.net>
+Thu Jan 9 09:55:20 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * ext/openssl/ossl.c (class OpenSSL): Use only inner parenthesis in
- create_extension examples.
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: dumping strings with
+ quotes should not have changed. [ruby-core:59316] [Bug #9300]
-Tue Feb 19 10:27:12 2013 Eric Hodel <drbrain@segment7.net>
+ * ext/psych/lib/psych.rb: fixed missing require.
- * ext/openssl/ossl.c (class OpenSSL): Fixed ExtensionFactory example.
- Patch by Richard Bradley. [ruby-trunk - Bug #7551]
+ * test/psych/test_string.rb: test
-Tue Feb 19 08:32:11 2013 Koichi Sasada <ko1@atdot.net>
+Thu Jan 9 09:51:00 2014 Aaron Patterson <aaron@tenderlovemaking.com>
- * vm_eval.c (vm_call0_body): check interrupts after method dispatch
- from C methods. [Bug #7878]
+ * ext/psych/lib/psych/visitors/to_ruby.rb: anonymous structs
+ should be able to roundtrip. Thanks @splattael!
-Tue Feb 19 08:14:40 2013 Eric Hodel <drbrain@segment7.net>
+ * test/psych/test_object_references.rb: test for change
- * lib/rubygems/installer.rb: Fixed placement of executables with
- --user-install. [ruby-trunk - Bug #7779]
- * test/rubygems/test_gem_installer.rb: Test for above.
+Wed Jan 8 22:53:16 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Tue Feb 19 06:04:06 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * vm_insnhelper.c (vm_search_super_method): when super called in a
+ bound UnboundMethod generated from a module, no superclass is
+ found since the current defined class is the module, then call
+ method_missing in that case. [ruby-core:59619] [Bug #9377]
- * vm_dump: FreeBSD ports' libexecinfo's backtrace(3) can't trace
- beyond signal trampoline, and as described in r38342 it can't
- trace on -O because it see stack frame pointers.
- libunwind unw_backtrace see dwarf information in the binary
- and it works with -O (without frame pointers).
+Wed Jan 8 15:55:21 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * configure.in: remove r38342's hack and check libunwind.
+ * hash.c (rb_objid_hash): return hash value from object ID with a
+ salt, extract from rb_any_hash().
-Tue Feb 19 04:26:29 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * object.c (rb_obj_hash): return same value as rb_any_hash().
+ fix r44125. [ruby-core:59638] [Bug #9381]
- * configure.in: check whether backtrace(3) works well or not.
+Wed Jan 8 13:12:41 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * vm_dump.c: set HAVE_BACKTRACE 0 if BROKEN_BACKTRACE.
+ * lib/timeout.rb (Timeout::ExitException.catch): pass arguments
+ for new instance.
-Mon Feb 18 16:30:18 2013 Akinori MUSHA <knu@iDaemons.org>
+ * lib/timeout.rb (Timeout::ExitException#exception): fallback to
+ Timeout::Error if couldn't throw. [ruby-dev:47872] [Bug #9380]
- * lib/ipaddr.rb (IPAddr#in6_addr): Fix a typo with the closing
- parenthesis.
+ * lib/timeout.rb (Timeout#timeout): initialize ExitException with
+ message for the fallback case.
-Mon Feb 18 12:32:24 2013 Akinori MUSHA <knu@iDaemons.org>
+Tue Jan 7 12:43:06 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/ipaddr.rb (IPAddr#in6_addr): Fix the parser so that it can
- recognize IPv6 addresses with only one edge 16-bit piece
- compressed, like [::2:3:4:5:6:7:8] or [1:2:3:4:5:6:7::].
- [Bug #7477]
+ * lib/timeout.rb (Timeout#timeout): should not rescue ordinarily
+ raised ExitException, which should not be thrown.
-Mon Feb 18 10:09:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/timeout.rb (Timeout::ExitException.catch): set @thread only if
+ it ought to be caught.
- * configure.in (unexpand_shvar): regularize a shell variable by
- unexpanding shell variables in it.
+ * lib/timeout.rb (Timeout#timeout): when a custom exception is given,
+ no instance is needed to be caught, so defer creating new instance
+ until it is raised. [ruby-core:59511] [Bug #9354]
-Sun Feb 17 20:55:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Jan 7 10:16:02 2014 Eric Hodel <drbrain@segment7.net>
- * compar.c (rb_invcmp): compare by inversed comparison, with preventing
- from infinite recursion. [ruby-core:52305] [Bug #7870]
+ * lib/rubygems: Update to RubyGems master 21e409d / RubyGems 2.2.1.
- * string.c (rb_str_cmp_m), time.c (time_cmp): get rid of infinite
- recursion.
+ See http://rubygems.rubyforge.org/rubygems-update/History_txt.html
+ for a list of bug fixes.
-Sun Feb 17 17:23:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * test/rubygems: ditto.
- * lib/mkmf.rb: remove extra topdir in VPATH, which was in
- win32/Makefile.sub for some reason and moved from there.
- [ruby-dev:46998] [Bug #7864]
+Tue Jan 7 10:10:46 2014 Eric Wong <e@80x24.org>
-Sun Feb 17 01:19:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * ext/json/generator/depend: add build dependencies for json extension
+ [Bug #9374] [ruby-core:59609]
+ * ext/json/parser/depend: ditto
- * ext/psych/lib/psych/y.rb: Document Kernel#y by Adam Stankiewicz
- [Github tenderlove/psych#127]
+Tue Jan 7 04:35:46 2014 Aman Gupta <ruby@tmm1.net>
-Sun Feb 17 00:52:14 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * array.c (ary_add_hash): Fix consistency issue between Array#uniq and
+ Array#uniq! [Bug #9340] [ruby-core:59457]
+ * test/ruby/test_array.rb (class TestArray): regression test for above.
- * tool/mkconfig.rb: remove prefix from rubyarchdir.
- r39267 expands variables, it changes expansion timing,
- breaks RbConfig::CONFIG["includedir"] and building
- extension libraries with installed ruby.
+Mon Jan 6 21:28:48 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
-Sat Feb 16 20:51:17 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+ * .gitignore: ignore *-fake.rb generated even when CROSS_COMPILING = no
+ since r42862.
- * vm.c (ENV_IN_HEAP_P): fix off-by-one error.
+Sun Jan 5 20:14:14 2014 Benoit Daloze <eregontp@gmail.com>
-Sat Feb 16 20:47:16 2013 Akinori MUSHA <knu@iDaemons.org>
+ * compar.c (cmp_equal): remove error hiding in Comparable#==.
+ Comparable#== no longer rescues exceptions silently.
+ This was the cause of quite a couple bugs. See #7688. [EXPERIMENTAL]
- * configure.in (LIBRUBY_DLDFLAGS): Fix a bug where --with-opt-dir
- options given were not reflected to LIBRUBY_DLDFLAGS on many
- platforms including Linux and other GNU-based systems, NetBSD,
- AIX and BeOS.
+ * test/ruby/test_comparable.rb: adapt assertion to match new behavior.
-Sat Feb 16 20:43:20 2013 Tanaka Akira <akr@fsij.org>
+ * lib/rdoc/method_attr.rb: fix bugs discovered by this change.
- * ext/socket/ancdata.c (rsock_recvmsg): ignore truncated part of
- socket address returned from recvmsg().
+ * test/rdoc/test_rdoc_normal_class.rb: fix bugs in tests.
- * ext/socket/init.c (recvfrom_blocking): ignore truncated part of
- socket address returned from recvfrom().
- (rsock_s_recvfrom_nonblock): ditto.
+Sat Jan 4 22:44:00 2014 Charlie Somerville <charliesome@ruby-lang.org>
-Sat Feb 16 20:05:26 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+ * struct.c (rb_struct_set): return assigned value from setter method
+ rather than struct object. [Bug #9353] [ruby-core:59509]
- * test/ruby/test_thread.rb: fixed typo
- patched by Hiroki Matsue via https://github.com/ruby/ruby/pull/248
+ * test/ruby/test_struct.rb (test_setter_method_returns_value): add test
-Sat Feb 16 16:08:35 2013 Koichi Sasada <ko1@atdot.net>
+Sat Jan 4 21:44:31 2014 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
- * vm.c (rb_thread_mark): mark a working Proc of bmethod
- (a method defined by define_method) even if the method was removed.
- We could not trace working Proc object which represents the body
- of bmethod if the method was removed (alias/undef/overridden).
- Simply, it was mark miss.
- This patch by Kazuki Tsujimoto. [Bug #7825]
+ * test/ruby/test_gc.rb (TestGc#test_latest_gc_info): use
+ GC.stat(:key) instead of GC.stat.
- NOTE: We can brush up this marking because we do not need to mark
- `me' on each living control frame. We need to mark `me's
- only if `me' was free'ed. This is future work after Ruby 2.0.0.
+Sat Jan 4 19:15:29 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/ruby/test_method.rb: add a test.
+ * ext/socket/socket.c (rsock_syserr_fail_host_port): use format flags,
+ '+' to inspect, ' ' to quote unprintables.
-Sat Feb 16 15:45:56 2013 Koichi Sasada <ko1@atdot.net>
+ * ext/socket/socket.c (rsock_syserr_fail_path): ditto.
- * proc.c (rb_binding_new_with_cfp): create binding object even if
- the frame is IFUNC. But return a ruby-level binding to keep
- compatibility.
- This patch fix degradation introduced from r39067.
- [Bug #7774] [ruby-dev:46960]
+ * ext/socket/socket.c (rsock_syserr_fail_raddrinfo): ditto.
- * test/ruby/test_settracefunc.rb: add a test.
+ * ext/socket/socket.c (rsock_syserr_fail_host_port): add errno
+ argument version and use rb_syserr_fail_str() instead of
+ rb_sys_fail_str() with restoring errno.
-Sat Feb 16 13:40:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/socket/socket.c (rsock_syserr_fail_path): ditto, and
+ rb_syserr_fail().
- * configure.in (shvar_to_cpp): do not substitute exec_prefix itself
- with RUBY_EXEC_PREFIX, which cause recursive definition.
- [ruby-core:52296] [Bug #7860]
+ * ext/socket/socket.c (rsock_sys_fail_sockaddr): ditto, use
+ rsock_syserr_fail_raddrinfo().
-Sat Feb 16 13:13:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * ext/socket/socket.c (rsock_sys_fail_raddrinfo): ditto.
- * ext/io/console/io-console.gemspec: bump to 0.4.2. now explicitly
- requires ruby 1.9.3 or later. [Bug #7847]
+ * ext/socket/socket.c (setup_domain_and_type): ditto.
- * ext/io/console/console.c (console_dev): compatibility with ruby 1.8.
+Sat Jan 4 17:18:58 2014 Kazuki Tsujimoto <kazuki@callcc.net>
- * ext/io/console/console.c (rawmode_opt, console_dev): compatibility
- with ruby 1.9. [ruby-core:52220] [Bug #7847]
+ * vm.c (RubyVM::OPTS): get rid of a garbage character.
-Sat Feb 16 12:45:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Sat Jan 4 10:17:54 2014 Eric Hodel <drbrain@segment7.net>
- * configure.in: unexpand arch sitearch and exec_prefix values, so
- directly specified bindir, libdir, rubyprefix, etc can be properly
- substituted. [ruby-core:52296] [Bug #7860]
+ * lib/rinda/ring.rb (Rinda::RingFinger#make_socket): Use
+ ipv4_multicast_ttl option for portability.
-Sat Feb 16 12:15:20 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+Sat Jan 4 10:15:47 2014 Eric Hodel <drbrain@segment7.net>
- * parse.y: add dtrace probe for symbol create.
+ * lib/rinda/ring.rb (Rinda::RingFinger#make_socket): Use
+ ipv4_multicast_loop option for portability. Patch by Jeremy Evans.
+ [ruby-trunk - Bug #9351]
- * probes.d: ditto
+Fri Jan 3 19:09:00 2014 Eric Wong <normalperson@yhbt.net>
-Sat Feb 16 09:27:37 2013 Tanaka Akira <akr@fsij.org>
+ * ext/socket/socket.c (rsock_sys_fail_host_port): save and restore errno
+ before calling rb_sys_fail_str to prevent [BUG] errno == 0.
+ Patch by Eric Wong. [ruby-core:59498] [Bug #9352]
- * ext/socket/extconf.rb: don't test sys/feature_tests.h which is not
- used now.
- It was included in r7901 as "bug of gcc 3.0 on Solaris 8 ?".
+ * ext/socket/socket.c (rsock_sys_fail_path): ditto
+ * ext/socket/socket.c (rsock_sys_fail_sockaddr): ditto
+ * ext/socket/socket.c (rsock_sys_fail_raddrinfo): ditto
+ * ext/socket/socket.c (rsock_sys_fail_raddrinfo_or_sockaddr): ditto
-Sat Feb 16 09:24:37 2013 Tanaka Akira <akr@fsij.org>
+Fri Jan 3 10:43:57 2014 Aman Gupta <ruby@tmm1.net>
- * ext/socket/extconf.rb: reorder header tests to consider inclusion
- order in rubysocket.h.
+ * test/net/imap/cacert.pem: generate new CA cert, since the last one
+ expired. [Bug #9341] [ruby-core:59459]
+ * test/net/imap/server.crt: new server cert signed with updated CA.
+ * test/net/imap/Makefile: add `make regen_certs` to automate this
+ process.
-Sat Feb 16 08:42:58 2013 Tanaka Akira <akr@fsij.org>
+Fri Jan 3 00:09:54 2014 Benoit Daloze <eregontp@gmail.com>
- * configure.in, ext/socket/extconf.rb: test netinet/in_systm.h in
- ext/socket/extconf.rb instead of configure.in.
+ * ext/bigdecimal: update class method call style from :: to .
+ in documentation and usage.
- Originally, netinet/in_systm.h is included for NextStep, OpenStep,
- and Rhapsody. [ruby-core:1596]
+ * ext/bigdecimal/lib/bigdecimal/math.rb: [DOC] fix examples values.
+ Computations were made using ruby 2.0.0p247 to ensure
+ no effect of the recent BigDecimal bug.
-Sat Feb 16 07:55:40 2013 Tanaka Akira <akr@fsij.org>
+ * ext/bigdecimal/sample/nlsolve.rb: fix indent.
- * configure.in: don't test xti.h here.
+Thu Jan 2 16:07:21 2014 Masaki Matsushita <glass.saga@gmail.com>
- * ext/socket/extconf.rb: test xti.h here.
+ * io.c (io_fwrite): freeze converted str.
- Originally, xti.h is included for IRIX [ruby-core:14447].
+Thu Jan 2 04:15:13 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Feb 16 07:16:49 2013 Tanaka Akira <akr@fsij.org>
+ * eval.c (rb_longjmp): remove an extra modifier from the forward
+ declaration to match the actual definition. [ruby-core:59451]
+ [Bug #9338]
- * ext/socket/extconf.rb: test struct sockaddr_un and its member,
- sun_len.
+Thu Jan 2 01:23:30 2014 Masaki Matsushita <glass.saga@gmail.com>
- * ext/socket/sockport.h (INIT_SOCKADDR_UN): new macro defined.
+ * vm_eval.c (method_missing): use ALLOCV_N() instead of
+ ALLOCA_N() and rb_ary_tmp_new().
- * ext/socket/socket.c (sock_s_pack_sockaddr_un): use INIT_SOCKADDR_UN.
+Thu Jan 2 00:53:16 2014 Masaki Matsushita <glass.saga@gmail.com>
- * ext/socket/unixsocket.c (rsock_init_unixsock): ditto.
+ * array.c (rb_ary_zip): use ALLOCV_N() instead of ALLOCA_N().
- * ext/socket/raddrinfo.c (init_unix_addrinfo): ditto.
- (addrinfo_mload): ditto.
+Thu Jan 2 00:04:29 2014 Masaki Matsushita <glass.saga@gmail.com>
-Sat Feb 16 07:05:59 2013 Tanaka Akira <akr@fsij.org>
+ * hash.c (rb_hash_keys): make rb_hash_keys() static.
+ it is no longer used from array.c since r43969.
+ the patch is from normalperson (Eric Wong).
+ [ruby-core:59449] [Feature #9336]
- * ext/socket/sockport.h (INIT_SOCKADDR_IN): don't need family
- argument. it is always AF_INET.
+ * internal.h: remove definition of rb_hash_keys().
- * ext/socket/raddrinfo.c (make_inetaddr): follow INIT_SOCKADDR_IN
- change.
- (addrinfo_ipv6_to_ipv4): ditto.
+Wed Jan 1 18:19:35 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Feb 16 04:21:07 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+ * configure.in: reset LDFLAGS and DLDFLAGS for opt-dir again after
+ LIBPATHFLAG and RPATHFLAG are set. [ruby-dev:47868] [Bug #9317]
- * ext/socket/extconf.rb: workaround for mswin/mingw build problem.
- sendmsg emulation in win32/win32.c is not enough.
+Wed Jan 1 11:12:29 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sat Feb 16 00:19:20 2013 Tanaka Akira <akr@fsij.org>
+ * configure.in: use SSE2 instructions for drop unexpected
+ precisions. [ruby-core:54738] [Bug #8358]
- * ext/socket/extconf.rb: use all all tested available headers for
- have_func.
+Tue Dec 31 23:49:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Feb 15 22:21:37 2013 Akinori MUSHA <knu@iDaemons.org>
+ * eval.c (rb_f_raise): add cause: optional keyword argument.
+ [ruby-core:58610] [Feature #8257] [EXPERIMENTAL]
- * configure.in: Fix a bug introduced in r38342 that the cflagspat
- substitution is messed up by the way CFLAGS and optflags are
- modified, which affected FreeBSD and NetBSD/amd64 when
- configured to use libexecinfo. This bug resulted in CFLAGS and
- CXXFLAGS in RbConfig::CONFIG having warnflags expanded in them,
- forcing third-party C/C++ extensions to follow what warnflags
- demands, like ANSI/ISO-C90 conformance. ref [Bug #7101]
+Tue Dec 31 21:44:17 2013 Akio Tajima <artonx@yahoo.co.jp>
-Fri Feb 15 20:29:11 2013 Tanaka Akira <akr@fsij.org>
+ * win32/Makefile.sub: remove HAVE_FSEEKO because fseeko removed from win32/win32.c
+ Fixed [Bug #9333].
- * ext/socket/sockport.h (SET_SIN_LEN): defined for strict-aliasing
- rule.
- (INIT_SOCKADDR_IN): ditto.
+Tue Dec 31 21:02:27 2013 Masaki Matsushita <glass.saga@gmail.com>
- * ext/socket/raddrinfo.c (make_inetaddr): use INIT_SOCKADDR_IN.
- (addrinfo_ipv6_to_ipv4): ditto.
+ * io.c (io_fwrite): allocate frozen str only when str is not converted.
-Fri Feb 15 18:24:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Dec 31 15:44:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/mkmf.rb (MakeMakefile#try_run): bail out explicitly if cross
- compiling, because it cannot work of course.
+ * lib/mkmf.rb (RbConfig): expand RUBY_SO_NAME for extensions
+ backward compatibility. [ruby-core:59426] [Bug #9329]
-Fri Feb 15 12:34:58 2013 Tanaka Akira <akr@fsij.org>
+Mon Dec 30 23:33:07 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
- * ext/socket/extconf.rb: test struct sockaddr_storage directly.
+ * variable.c: [DOC] adding extra example in docs.
+ patched by Steve Klabnik. [Bug #9210]
- * ext/socket/rubysocket.h: use HAVE_TYPE_STRUCT_SOCKADDR_STORAGE.
+Mon Dec 30 18:34:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Fri Feb 15 12:26:13 2013 Tanaka Akira <akr@fsij.org>
+ * encoding.c (must_encindex, rb_enc_from_index, rb_obj_encoding): mask
+ encoding index and ignore dummy flags. [ruby-core:59354] [Bug #9314]
- * ext/socket/getaddrinfo.c (GET_AI): don't cast 1st argument for
- INIT_SOCKADDR.
+Mon Dec 30 16:11:52 2013 WATANABE Hirofumi <eban@ruby-lang.org>
-Fri Feb 15 08:12:11 2013 Tanaka Akira <akr@fsij.org>
+ * tool/make-snapshot: needs CXXFLAGS. [ruby-core:59393][Bug #9320]
- * ext/socket/sockport.h (SET_SS_LEN): removed.
- (SET_SIN_LEN): removed.
- (INIT_SOCKADDR): new macro.
+Sun Dec 29 18:36:54 2013 Shota Fukumori <her@sorah.jp>
- * ext/socket/ancdata.c (extract_ipv6_pktinfo): use INIT_SOCKADDR.
+ * lib/mkmf.rb (configuration): Make CXXFLAGS customizable.
+ Patch by Kohei Suzuki (eagletmt). [Fixes GH-492]
- * ext/socket/raddrinfo.c (make_inetaddr): use INIT_SOCKADDR.
- (addrinfo_ipv6_to_ipv4): ditto.
+Sun Dec 29 12:11:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/socket/getaddrinfo.c (GET_AI): use INIT_SOCKADDR.
+ * proc.c (mnew_from_me): keep iclass as-is, to make inheritance
+ chain consistent. [ruby-core:59358] [Bug #9315]
-Fri Feb 15 07:49:27 2013 Eric Hodel <drbrain@segment7.net>
+ * proc.c (method_owner): return the original defined_class from
+ prepended iclass, instead.
- * lib/rdoc.rb: Update to release version of 4.0.0
+Sun Dec 29 08:47:24 2013 Lucas Allan Amorim <lucas.allan@gmail.com>
- * lib/rubygems.rb: Update to release version of 2.0.0
+ * test/ruby/test_sprintf.rb (test_hash): Added tests for sprintf
+ with a hash as parameter. [Fixes GH-491]
-Fri Feb 15 07:07:27 2013 Tanaka Akira <akr@fsij.org>
+Sun Dec 29 07:27:51 2013 Benoit Daloze <eregontp@gmail.com>
- * ext/socket/sockport.h (SA_LEN): removed because unused now.
- (SS_LEN): ditto.
- (SIN_LEN): ditto.
+ * compar.c (cmp_eq_recursive): Fix the return value, the value for
+ failed #<=> should be nil. It was raising a NoMethodError for
+ the test case TestComparable#test_no_cmp (undefined method `>'
+ for false:FalseClass). Yet one more reason for #7688.
-Thu Feb 14 10:45:31 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Sat Dec 28 22:21:59 2013 Benoit Daloze <eregontp@gmail.com>
- * test/ruby/test_process.rb (test_setsid): Added a workaround for
- MacOS X. Patch by nagachika. [Bug #7826] [ruby-core:52126]
+ * object.c (Kernel#<=>) surround Comparable operators with <code> tags.
+ The #== method was hidden in ri/rdoc's output and was highlighting
+ the line instead.
-Fri Feb 15 00:15:31 2013 Tanaka Akira <akr@fsij.org>
+Sat Dec 28 17:24:00 2013 DV Suresh <e@dvsuresh.me>
- * ext/socket/sockport.h (VALIDATE_SOCKLEN): new macro to validate
- sa_len member of 4.4BSD socket address.
+ * benchmark/bm_so_meteor_contest.rb: [DOC] Fix a few typos
+ * ext/fiddle/lib/fiddle/import.rb: ditto
+ * ext/psych/lib/psych.rb: ditto
+ * ext/psych/lib/psych/nodes/sequence.rb: ditto
+ * ext/tk/lib/multi-tk.rb: ditto
+ * ext/tk/lib/tcltk.rb: ditto
- * ext/socket/getnameinfo.c (getnameinfo): use VALIDATE_SOCKLEN,
- instead of SA_LEN.
+Sat Dec 28 00:42:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/socket/socket.c (sock_s_getnameinfo): use VALIDATE_SOCKLEN
- instead of SS_LEN.
+ * parse.y (local_push_gen, local_pop_gen): save cmdarg_stack to
+ isolate command argument state from outer scope.
+ [ruby-core:59342] [Bug #9308]
-Thu Feb 14 22:25:54 2013 Tanaka Akira <akr@fsij.org>
+Fri Dec 27 13:25:03 2013 NAKAMURA Usaku <usa@ruby-lang.org>
- * ext/socket/socket.c (sockaddr_len): extracted from sockaddr_obj.
- (sockaddr_obj): add an argument to length of socket address.
- (socket_s_ip_address_list): call sockaddr_obj with actual socket
- address length if given, use sockaddr_len otherwise.
+ * win32/{setup.mak,Makefile.sub}: update fake.rb like
+ template/fake.rb.in.
-Thu Feb 14 20:11:23 2013 Tanaka Akira <akr@fsij.org>
+Thu Dec 26 16:10:41 2013 NAKAMURA Usaku <usa@ruby-lang.org>
- * ext/socket: always operate length of socket address companion with
- socket address.
+ * win32/Makefile.sub (fake.rb): should depend on version.h because
+ if RUBY_VERSION is updated, fake.rb need to say the new version
+ to avoid install error in rbconfig.rb.
- * ext/socket/rubysocket.h (rsock_make_ipaddr): add an argument for
- socket address length.
- (rsock_ipaddr): ditto.
+Thu Dec 26 14:25:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * ext/socket/ipsocket.c (ip_addr): pass length to rsock_ipaddr.
- (ip_peeraddr): ditto.
- (ip_s_getaddress): pass length to rsock_make_ipaddr.
+ * hash.c (HASH_REJECT_COPY_EXTRA_STATES): turn off the old
+ behavior, copying extra states by accident.
- * ext/socket/socket.c (make_addrinfo): pass length to rsock_ipaddr.
- (sock_s_getnameinfo): pass actual address length to rb_getnameinfo.
- (sock_s_unpack_sockaddr_in): pass length to rsock_make_ipaddr.
+Thu Dec 26 10:49:14 2013 Yukihiro Matsumoto <matz@ruby-lang.org>
- * ext/socket/init.c (rsock_s_recvfrom): pass length to rsock_ipaddr.
- (rsock_s_recvfrom_nonblock): ditto.
+ * version.h (RUBY_VERSION): 2.2.0 development has started.
- * ext/socket/tcpsocket.c (tcp_sockaddr): pass length to
- rsock_make_ipaddr.
+Thu Dec 26 10:27:53 2013 NAKAMURA Usaku <usa@ruby-lang.org>
- * ext/socket/raddrinfo.c (make_ipaddr0): add an argument for socket
- address length. pass the length to rb_getnameinfo.
- (rsock_ipaddr): ditto.
- (rsock_make_ipaddr): add an argument for socket address length.
- pass the length to make_ipaddr0.
- (make_inetaddr): pass length to make_ipaddr0.
- a local variable renamed.
- (host_str): a local variable renamed.
- (port_str): ditto.
+ * tool/merger.rb (tag): support 2.1.1 semi-automatic tagging and 2.2.0
+ explicit tagging.
-Thu Feb 14 14:31:43 2013 Eric Hodel <drbrain@segment7.net>
+Thu Dec 26 06:35:25 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
- * lib/net/http.rb: Removed OpenSSL dependency from Net::HTTP.
+ * proc.c: Having any mandatory keyword argument increases min arity
+ [#9299]
- * test/net/http/test_http.rb: Remove Zlib dependency from tests.
- * test/net/http/test_http_request.rb: ditto.
+Thu Dec 26 06:27:08 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
-Thu Feb 14 11:08:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * proc.c: Having optional keyword arguments makes maximum arity +1,
+ not unlimited [#8072]
- * class.c (include_modules_at): detect cyclic prepend with original
- method table. [ruby-core:52205] [Bug #7841]
+Thu Dec 26 01:09:57 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-Thu Feb 14 10:30:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * tool/release.sh: make symbolic links.
- * vm_method.c: call method_removed hook on called class, not on
- prepending iclass. [ruby-core:52207] [Bug #7843]
+Thu Dec 26 00:45:33 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-Thu Feb 14 10:05:57 2013 Eric Hodel <drbrain@segment7.net>
+ * tool/make-snapshot: support new version scheme.
- * lib/net/http: Do not handle Content-Encoding when the user sets
- Accept-Encoding. This allows users to handle Content-Encoding for
- themselves. This restores backwards-compatibility with Ruby 1.x.
- [ruby-trunk - Bug #7831]
- * lib/net/http/generic_request.rb: ditto.
- * lib/net/http/response.rb: ditto
- * test/net/http/test_http.rb: Test for the above.
- * test/net/http/test_http_request.rb: ditto.
- * test/net/http/test_httpresponse.rb: ditto.
+Wed Dec 25 22:44:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Thu Feb 14 08:18:47 2013 Tanaka Akira <akr@fsij.org>
+ * compile.c (iseq_set_arguments): set arg_keyword_check from
+ nd_cflag, which is set by parser. internal ID is used for
+ unnamed keyword rest argument, which should be separated from no
+ keyword check.
- * ext/socket/extconf.rb: don't define HAVE_SA_LEN and HAVE_SA_LEN.
- use HAVE_STRUCT_SOCKADDR_SA_LEN and HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
- instead.
+ * iseq.c (rb_iseq_parameters): if no keyword check, keyword rest is
+ present.
-Wed Feb 13 20:59:48 2013 Tanaka Akira <akr@fsij.org>
+ * parse.y (new_args_tail_gen): set keywords check to nd_cflag, which
+ equals to that keyword rest is not present.
- * ext/socket/extconf.rb: don't define socklen_t here, just test.
+Wed Dec 25 22:32:19 2013 Zachary Scott <e@zzak.io>
- * ext/socket/rubysocket.h: define socklen_t if not available.
+ * lib/abbrev.rb: [DOC] rdoc format patch by Giorgos Tsiftsis [Bug #9146]
-Wed Feb 13 18:37:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Dec 25 20:30:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * proc.c (mnew): skip prepending modules and return the method bound
- on the given class. [ruby-core:52160] [Bug #7836]
+ * iseq.c (rb_iseq_parameters): push argument type symbol only for
+ unnamed rest keywords argument.
-Wed Feb 13 18:11:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Wed Dec 25 20:28:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * proc.c (method_original_name): new methods Method#original_name and
- UnboundMethod#original_name. [ruby-core:52048] [Bug #7806]
- [EXPERIMENTAL]
+ * proc.c (rb_iseq_min_max_arity): maximum argument is unlimited if
+ having rest keywords argument. [ruby-core:53298] [Bug #8072]
- * proc.c (method_inspect): show the given name primarily, and
- original_id if aliased. [ruby-core:52048] [Bug #7806]
+Wed Dec 25 18:29:22 2013 Koichi Sasada <ko1@atdot.net>
-Wed Feb 13 17:56:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * vm_insnhelper.c (argument_error): insert dummy frame to make
+ a backtrace object intead of modify backtrace string array.
+ [Bug #9295]
- * configure.in (warnflags): disable -Werror by default unless
- development. [ruby-core:52131] [Bug #7830]
+ * test/ruby/test_backtrace.rb: add a test for this patch.
+ fix test to compare a result of Exception#backtrace with
+ a result of Exception#backtrace_locations.
-Wed Feb 13 06:05:52 2013 Eric Hodel <drbrain@segment7.net>
+Wed Dec 25 13:00:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/rubygems.rb: Return BINARY strings from Gem.gzip and Gem.gunzip.
- Fixes intermittent test failures. RubyGems issue #450 by Jeremey
- Kemper.
- * test/rubygems/test_gem.rb: Test for the above.
+ * configure.in: let mingw do something black-magic, and check if
+ _gmtime64_s() is available actually.
-Wed Feb 13 05:49:21 2013 Tanaka Akira <akr@fsij.org>
+ * win32/win32.c (gmtime_s, localtime_s): use _gmtime64_s() and
+ _localtime64_s() if available, not depending on very confusing
+ mingw variants macros. based on the patch by phasis68 (Heesob
+ Park) at [ruby-core:58764]. [ruby-core:58391] [Bug #9119]
- * ext/socket/extconf.rb: test functions just after struct members.
+Wed Dec 25 12:33:41 2013 Yusuke Endoh <mame@tsg.ne.jp>
-Tue Feb 12 12:02:35 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * sample/trick2013/: added the award-winning entries of TRICK 2013.
+ See https://github.com/tric/trick2013 for the contest outline.
+ (Matz has approved the attachment.)
- * ext/json: merge JSON 1.7.7.
- This includes security fix. [CVE-2013-0269]
- https://github.com/flori/json/commit/d0a62f3ced7560daba2ad546d83f0479a5ae2cf2
- https://groups.google.com/d/topic/rubyonrails-security/4_YvCpLzL58/discussion
+Wed Dec 25 10:42:02 2013 Yamashita Yuu <yamashita@geishatokyo.com>
-Mon Feb 11 23:08:48 2013 Tanaka Akira <akr@fsij.org>
+ * ext/openssl/ossl_ssl.c (Init_ossl_ssl): Declare a constant
+ `OP_MSIE_SSLV2_RSA_PADDING` only if the macro is defined. The
+ `SSL_OP_MSIE_SSLV2_RSA_PADDING` has been removed from latest
+ snapshot of OpenSSL 1.0.1. [Fixes GH-488]
- * configure.in: enable rb_cv_page_size_log test for MirOS BSD.
+Wed Dec 25 01:03:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Mon Feb 11 20:06:38 2013 Tanaka Akira <akr@fsij.org>
+ * proc.c (bind_local_variables): allowing binding to list its
+ local variables. patch by Jack Danger Canty <jackdanger AT
+ squareup.com> at [ruby-core:56543]. [Feature #8773]
- * configure.in: use -pthread on mirbsd*.
+Tue Dec 24 23:20:38 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Mon Feb 11 16:07:09 2013 Tanaka Akira <akr@fsij.org>
+ * test/fileutils/fileasserts.rb (assert_ownership_user): new
+ assertion for user ownership.
- * configure.in: add SOLIBS and LIBRUBY_SO definition for mirbsd*.
+ * test/fileutils/test_fileutils.rb (test_chown_error),
+ (test_chown_without_permission, test_chown_with_root):
+ based on the patch by vajrasky (Vajrasky Kok) at
+ [ruby-core:59298]. [Feature #9292]
-Mon Feb 11 13:17:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+Tue Dec 24 16:28:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * configure.in (rubysitearchprefix): sitearchdir and vendorarchdir
- should use sitearch, not arch. [ruby-dev:46964] [Bug #7823]
+ * proc.c (rb_mod_define_method): consider visibility only if self
+ in the caller is same as the receiver, otherwise make public as
+ well as old behavior. [ruby-core:57747] [Bug #9005]
+ [ruby-core:58497] [Bug #9141]
- * win32/Makefile.sub (config.status): site and vendor directories
- should use sitearch, not arch. [ruby-dev:46964] [Bug #7823]
+ * vm.c (rb_vm_cref_in_context): return ruby level cref if self is
+ same.
-Mon Feb 11 12:31:25 2013 Tanaka Akira <akr@fsij.org>
+Tue Dec 24 14:13:14 2013 Koichi Sasada <ko1@atdot.net>
- * configure.in: move OS specific header/function knowledge before
- automatic header tests.
+ * README.EXT: add a refer to URL.
-Mon Feb 11 11:04:29 2013 Tanaka Akira <akr@fsij.org>
+Tue Dec 24 13:48:45 2013 Koichi Sasada <ko1@atdot.net>
- * configure.in: move the test for -march=i486 just after
- RUBY_UNIVERSAL_ARCH/RUBY_DEFAULT_ARCH.
+ * README.EXT: add a document about RGenGC.
+ Reviewed by havenwood.
+ [misc #8962]
-Sun Feb 10 23:42:26 2013 Tanaka Akira <akr@fsij.org>
+ * README.EXT.ja: ditto.
- * ext/socket/extconf.rb: test structure members just after types test.
+Tue Dec 24 12:11:43 2013 Koichi Sasada <ko1@atdot.net>
-Sun Feb 10 20:58:17 2013 Tanaka Akira <akr@fsij.org>
+ * include/ruby/ruby.h (RARRAY_ASET): try to avoid compiler warning.
+ [Bug #9287]
- * ext/socket/extconf.rb: test types just after headers test.
+Tue Dec 24 05:04:56 2013 NAKAMURA Usaku <usa@ruby-lang.org>
-Sun Feb 10 16:00:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * test/fileutils/test_fileutils.rb (setup): should not call
+ Process.groups for Windows. get rid of many errors introduced by
+ r44364.
- * lib/rake/doc/MIT-LICENSE: Add license file from upstream
- * lib/rake/doc/README.rdoc: Link to license file from Rake README
- * lib/rake/version.rb: Include README rdoc for Rake module overview
+Mon Dec 23 18:37:16 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
-Sun Feb 10 15:26:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * test/fileutils/fileasserts.rb (assert_ownership_group): new
+ assertion for group ownership.
- * lib/rake/doc/*: Sync Rake rdoc files from upstream
+ * test/fileutils/test_fileutils.rb (test_chown{,_verbose,_noop}):
+ based on the patch by vajrasky (Vajrasky Kok) at
+ [ruby-core:59281]. [Feature #9286]
-Sun Feb 10 15:50:02 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Mon Dec 23 15:53:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * vm_exec.h (DISPATCH_ARCH_DEPEND_WAY): use __asm__ __volatile__
- instead of asm volatile.
+ * hash.c (HAS_EXTRA_STATES): warn extra states only when something
+ differ. [ruby-core:59254] [Bug #9275]
-Sun Feb 10 15:50:02 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+Mon Dec 23 12:42:13 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
- * gc.h (SET_MACHINE_STACK_END): use __volatile__ instead of volatile.
+ * array.c: Have to_h raise on elements that are not key-value pairs
+ [#9239]
-Sun Feb 10 14:25:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * enum.c: ditto
- * doc/rake/, lib/rake/doc/: Move Rake rdoc files to lib/rake
+Mon Dec 23 05:01:55 2013 Zachary Scott <e@zzak.io>
-Sun Feb 10 12:10:25 2013 Tanaka Akira <akr@fsij.org>
+ * doc/syntax/methods.rdoc: [DOC] Added example for underscore
+ conventions in method names. Also added doc to clarify encoding
+ character set support for Ruby programs and elaborated on defining
+ predicate and bang methods. Based on a patch by @gaurish
+ [Fixes GH-477] https://github.com/ruby/ruby/pull/477
- * ext/socket/extconf.rb: test headers at first.
+Mon Dec 23 03:18:09 2013 Zachary Scott <e@zzak.io>
-Sun Feb 10 12:00:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * doc/ChangeLog-1.9.3: [DOC] Fix typos by @dvsuresh
+ [Fixes GH-485] https://github.com/ruby/ruby/pull/485
+ * ext/openssl/ossl_config.c: ditto
+ * lib/rss/utils.rb, lib/time.rb: ditto
+ * test/ruby/envutil.rb: ditto
- * doc/rake/*: Removed stale Rake static files
+Sun Dec 22 23:56:56 2013 Zachary Scott <e@zzak.io>
-Sun Feb 10 09:10:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * lib/{rake,rdoc,rss}/*, test/rexml/test_listener.rb: [DOC] Fix typos
+ by @dvsuresh [Fixes GH-486] https://github.com/ruby/ruby/pull/486
- * lib/pp.rb, lib/prettyprint.rb: Documentation for PP and PrettyPrint
- Based on a patch by Vincent Batts [ruby-core:51253] [Bug #7656]
+Sun Dec 22 11:08:47 2013 Eric Hodel <drbrain@segment7.net>
-Sat Feb 9 21:11:21 2013 Tanaka Akira <akr@fsij.org>
+ * test/rubygems/test_gem_ext_builder.rb: Fix warning due to ambiguous
+ expression.
- * configure.in: move header files check to the beginning of
- "header and library section".
- test rlim_t with sys/types.h and sys/time.h for MirOS BSD.
- sys/types.h and sys/time.h is guarded by #ifdef and the above
- move is required for this change.
+Sun Dec 22 11:05:53 2013 Eric Hodel <drbrain@segment7.net>
-Sat Feb 9 17:45:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/rubygems/commands/install_command.rb: Restore gem install
+ --ignore-dependencies for remote gems
+ * test/rubygems/test_gem_commands_install_command.rb: Test for the
+ above.
- * configure.in, version.c: prevent duplicated load paths by empty
- version string, it does not work right now.
+Sun Dec 22 10:23:40 2013 Eric Hodel <drbrain@segment7.net>
-Sat Feb 9 17:38:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+ * lib/rdoc.rb: Set RDoc to release version.
- * configure.in: fix arch parameters in help message. [Bug #7804]
+Sun Dec 22 10:19:07 2013 Eric Hodel <drbrain@segment7.net>
-Sat Feb 9 13:13:00 2013 Zachary Scott <zachary@zacharyscott.net>
+ * lib/rubygems.rb: Set RubyGems to release version.
- * vm_trace.c: Note about TracePoint events set, and comment on
- Kernel#set_trace_func to prefer new TracePoint API
+Sun Dec 22 10:16:08 2013 Eric Hodel <drbrain@segment7.net>
-Sat Feb 9 10:07:47 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+ * lib/rubygems.rb (module Gem): Fix comment for
+ Gem::load_path_insert_index.
- * BSDL: update copyright notice for 2013.
+Sun Dec 22 04:07:55 2013 Koichi Sasada <ko1@atdot.net>
-Sat Feb 9 09:24:38 2013 Eric Hodel <drbrain@segment7.net>
+ * gc.c (ruby_gc_set_params): don't show obsolete warnings for
+ RUBY_FREE_MIN/RUBY_HEAP_MIN_SLOTS if
+ RUBY_GC_HEAP_FREE_SLOTS/RUBY_GC_HEAP_INIT_SLOTS are given.
+ [Bug #9276]
- * lib/rubygems/package/old.rb: Fix behavior only on ruby 1.8.
+Sat Dec 21 13:00:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * lib/rubygems/package.rb: Include checksums.yaml.gz signatures for
- verification.
- * test/rubygems/test_gem_package.rb: Test for the above.
+ * file.c: remove unnecessary the source path from EEXIST error
+ messages and show the destination path only. [ruby-core:59202]
+ [Feature #9263]
-Sat Feb 9 01:23:24 2013 Tanaka Akira <akr@fsij.org>
+Sat Dec 21 12:37:19 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
- * test/fiddle/helper.rb: specify libc and libm locations for MirOS BSD.
+ * lib/resolv.rb (Resolv::Hosts#lazy_initialize): should not
+ consider encodings in hosts file. [ruby-core:59239] [Bug #9273]
- * test/dl/test_base.rb: ditto.
+ * lib/resolv.rb (Resolv::Config.parse_resolv_conf): ditto.
-Fri Feb 8 23:25:33 2013 Tanaka Akira <akr@fsij.org>
+Sat Dec 21 05:43:27 2013 NAKAMURA Usaku <usa@ruby-lang.org>
- * configure.in: change CFLAGS temporally to test
- ARCH_FLAG="-march=i486".
+ * tool/make-snapshot: replace RUBY_PATCHLEVEL_STR in version.h to
+ show users that this ruby is a preview/rc version.
-Fri Feb 8 21:19:41 2013 Tanaka Akira <akr@fsij.org>
+Sat Dec 21 05:03:49 2013 NAKAMURA Usaku <usa@ruby-lang.org>
- * configure.in: don't define ARCH_FLAG="-march=i486" if it causes
- compilation problem.
+ * win32/Makefile.sub (fake.rb): fixed wrong RUBY_PLATFORM, to correctly
+ install win32.h.
+ [ruby-core:58801][Bug #9199] reported by arton.
+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
diff --git a/LEGAL b/LEGAL
index 65706459cd..24e36e6231 100644
--- a/LEGAL
+++ b/LEGAL
@@ -5,6 +5,37 @@ 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
+
+ These files are licensed under the CC0.
+
+ http://creativecommons.org/choose/zero/
+
+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
+ 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.
+
include/ruby/oniguruma.h:
regcomp.c:
regenc.[ch]:
@@ -56,7 +87,7 @@ 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,
+ When this software is partly used or it is distributed with Ruby,
this of Ruby follows the license of Ruby.
configure:
@@ -98,7 +129,7 @@ tool/config.sub:
parse.c:
- This file is licensed under the GPL, but is incorporated into Ruby and
+ 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.
@@ -193,11 +224,11 @@ random.c
This is a faster version by taking Shawn Cokus's optimization,
Matthe Bellew's simplification, Isaku Wada's real version.
- Before using, initialize the state by using init_genrand(seed)
+ Before using, initialize the state by using init_genrand(seed)
or init_by_array(init_key, key_length).
Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,
- All rights reserved.
+ All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
@@ -210,8 +241,8 @@ random.c
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
+ 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
@@ -231,6 +262,34 @@ random.c
http://www.math.keio.ac.jp/matumoto/emt.html
email: matumoto@math.keio.ac.jp
+vm_dump.c:procstat_vm
+
+ * Copyright (c) 2007 Robert N. M. Watson
+ * 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.
+ *
+ * $FreeBSD: head/usr.bin/procstat/procstat_vm.c 261780 2014-02-11 21:57:37Z jhb $
+
vsnprintf.c:
This file is under the old-style BSD license. Note that the
@@ -476,7 +535,7 @@ ext/nkf/nkf-utf8/utf8tbl.c:
copyrighted semi-public-domain software.
Copyright (C) 1987, Fujitsu LTD. (Itaru ICHIKAWA)
- Everyone is permitted to do anything on this program
+ 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.
@@ -527,7 +586,7 @@ ext/win32ole/win32ole.c:
Other modifications Copyright (c) 1997, 1998 by Gurusamy Sarathy
<gsar@umich.edu> and Jan Dubois <jan.dubois@ibm.net>
-
+
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.
diff --git a/Makefile.in b/Makefile.in
index d3313bea2e..39fe0bb37f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -57,7 +57,8 @@ CC_VERSION = @CC_VERSION@
OUTFLAG = @OUTFLAG@$(empty)
COUTFLAG = @COUTFLAG@$(empty)
ARCH_FLAG = @ARCH_FLAG@
-CFLAGS = @CFLAGS@ $(ARCH_FLAG)
+CFLAGS_NO_ARCH = @CFLAGS@
+CFLAGS = $(CFLAGS_NO_ARCH) $(ARCH_FLAG)
cflags = @cflags@
optflags = @optflags@
debugflags = @debugflags@
@@ -89,7 +90,6 @@ RUBY_BASE_NAME=@RUBY_BASE_NAME@
RUBY_PROGRAM_VERSION=@RUBY_PROGRAM_VERSION@
RUBY_INSTALL_NAME=@RUBY_INSTALL_NAME@
RUBY_SO_NAME=@RUBY_SO_NAME@
-RUBY_RELEASE_DATE=@RUBY_RELEASE_DATE@
EXEEXT = @EXEEXT@
LIBEXT = @LIBEXT@
PROGRAM=$(RUBY_INSTALL_NAME)$(EXEEXT)
@@ -113,8 +113,6 @@ XRUBY_LIBDIR = @XRUBY_LIBDIR@
XRUBY_RUBYLIBDIR = @XRUBY_RUBYLIBDIR@
XRUBY_RUBYHDRDIR = @XRUBY_RUBYHDRDIR@
-DEFAULT_PRELUDES = $(GEM_PRELUDE)
-
#### End of system configuration section. ####
MAJOR= @MAJOR@
@@ -137,6 +135,7 @@ PREP = @PREP@
ARCHFILE = @ARCHFILE@
SETUP =
EXTSTATIC = @EXTSTATIC@
+ENCSTATIC = @ENCSTATIC@
SET_LC_MESSAGES = env LC_MESSAGES=C
MAKEDIRS = @MKDIR_P@
@@ -171,8 +170,6 @@ SYMBOL_PREFIX = @SYMBOL_PREFIX@
INSTALLED_LIST= .installed.list
-MKMAIN_CMD = mkmain.sh
-
NEWLINE_C = newline.c
MINIPRELUDE_C = miniprelude.c
RBCONFIG = .rbconfig.time
@@ -187,6 +184,8 @@ MESSAGE_END = ; do echo "$$line"; done
ECHO_BEGIN = @sep=''; for word in
ECHO_END = ; do echo @ECHO_N@ "$$sep'$$word'@ECHO_C@"; sep=' '; done; echo
+DESTDIR = @DESTDIR@
+
configure_args = @configure_args@
#### End of variables
@@ -194,8 +193,6 @@ configure_args = @configure_args@
all:
-.DEFAULT: all
-
# Prevent GNU make v3 from overflowing arg limit on SysV.
.NOEXPORT:
@@ -258,7 +255,7 @@ install-cross: $(arch)-fake.rb $(RBCONFIG) rbconfig.rb $(arch_hdrdir)/ruby/confi
Makefile: $(srcdir)/Makefile.in $(srcdir)/enc/Makefile.in
-$(MKFILES): config.status
+$(MKFILES): config.status $(srcdir)/version.h
@[ -f $@ ] && mv $@ $@.old
MAKE=$(MAKE) $(SHELL) ./config.status $@
@cmp $@ $@.old > /dev/null 2>&1 && echo $@ unchanged && exit 0; \
@@ -329,6 +326,22 @@ enc/unicode/name2ctype.h: enc/unicode/name2ctype.kwd
$(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
+
+enc/jis/props.h: enc/jis/props.kwd
+ $(MAKEDIRS) $(@D)
+ @set +e; \
+ if cmp -s $(?:.kwd=.src) $?; then \
+ set -x; \
+ $(CP) $(?:.kwd=.h.blt) $@; \
+ else \
+ set -x; \
+ gperf $(JIS_PROPS_OPTIONS) $? | \
+ 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
+
.c.@OBJEXT@:
@$(ECHO) compiling $<
$(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c $<
@@ -408,24 +421,12 @@ distclean-ext realclean-ext::
-$(Q)$(RMDIR) ext 2> /dev/null || true
clean-extout:
- -$(Q)$(RMDIRS) $(EXTOUT) 2> /dev/null || true
clean-enc distclean-enc realclean-enc:
@test -f "$(ENC_MK)" || exit 0; \
echo $(@:-enc=ing) encodings; \
exec $(MAKE) -f $(ENC_MK) $(MFLAGS) $(@:-enc=)
-clean-rdoc distclean-rdoc realclean-rdoc:
- @echo $(@:-rdoc=ing) rdoc
- $(Q)$(RMALL) $(RDOCOUT)
-clean-capi distclean-capi realclean-capi:
- @echo $(@:-capi=ing) capi
- $(Q)$(RMALL) $(CAPIOUT)
-
-clean-platform:
- @$(RM) $(PLATFORM_D)
- -$(Q) $(RMDIR) $(PLATFORM_DIR) 2> /dev/null || true
-
ext/extinit.$(OBJEXT): ext/extinit.c $(SETUP)
$(ECHO) compiling $@
$(Q) $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(COUTFLAG)$@ -c ext/extinit.c
@@ -465,6 +466,17 @@ update-rubyspec: update-mspec
test-rubyspec-precheck:
@if [ ! -d $(srcdir)/spec/rubyspec ]; then echo No rubyspec here. make update-rubyspec first.; exit 1; fi
+update-coverage:
+ @$(CHDIR) $(srcdir); \
+ if [ -d coverage/simplecov ]; then \
+ cd coverage/simplecov; \
+ echo updating simplecov ...; \
+ exec git pull; \
+ else \
+ echo retrieving simplecov ...; \
+ exec git clone $(SIMPLECOV_GIT_URL) coverage/simplecov; \
+ fi
+
INSNS = opt_sc.inc optinsn.inc optunifs.inc insns.inc insns_info.inc \
vmtc.inc vm.inc
diff --git a/NEWS b/NEWS
index afd15faf3b..6abfa3fc50 100644
--- a/NEWS
+++ b/NEWS
@@ -1,6 +1,6 @@
# -*- rdoc -*-
-= NEWS for Ruby 2.1.0
+= NEWS for Ruby 2.2.0
This document is a list of user visible feature changes made between
releases except for bug fixes.
@@ -9,372 +9,247 @@ 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.
-== Changes since the 2.0.0 release
+== Changes since the 2.1.0 release
=== Language changes
-* Now the default values of keyword arguments can be omitted. Those
- "required keyword arguments" need giving explicitly at the call time.
-
-* Added suffixes for integer and float literals: 'r', 'i', and 'ri'.
- * "42r" and "3.14r" are evaluated as Rational(42, 1) and 3.14.rationalize,
- respectively. But exponential form with 'r' suffix like "6.022e+23r" is
- not accepted because it is misleading.
- * "42i" and "3.14i" are evaluated as Complex(0, 42) and Complex(0, 3.14),
- respectively.
- * "42ri" and "3.14ri" are evaluated as Complex(0, 42r) and Complex(0, 3.14r),
- respectively.
-
-* def-expr now returns the symbol of its name instead of nil.
+* nil/true/false
+ * nil/true/false objects are frozen. [Feature #8923]
=== Core classes updates (outstanding ones only)
-* Array
- * New methods
- * Array#to_h converts an array of key-value pairs into a Hash.
-
* Binding
- * New methods
- * Binding#local_variable_get(symbol)
- * Binding#local_variable_set(symbol, obj)
- * Binding#local_variable_defined?(symbol)
+ * New methods:
+ * Binding#local_variables
+ * Binding#receiver
-* Enumerable
- * New methods
- * Enumerable#to_h converts a list of key-value pairs into a Hash.
+* Dir
+ * New methods:
+ * Dir#fileno
-* Exception
- * New methods
- * Exception#cause provides the previous exception which has been caught
- at where raising the new exception.
+* Enumerable
+ * New methods:
+ * Enumerable#slice_after
+ * Extended methods:
+ * min, min_by, max and max_by supports optional argument to return
+ multiple elements.
-* GC
- * improvements:
- * introduced the generational GC a.k.a RGenGC.
- * added environment variables:
- * RUBY_GC_HEAP_INIT_SLOTS
- * RUBY_GC_HEAP_FREE_SLOTS
- * RUBY_GC_HEAP_GROWTH_FACTOR
- * RUBY_GC_HEAP_GROWTH_MAX_SLOTS
- * RUBY_GC_MALLOC_LIMIT_MAX
- * RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR
- * RUBY_GC_OLDMALLOC_LIMIT
- * RUBY_GC_OLDMALLOC_LIMIT_MAX
- * RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR
- * obsoleted environment variables:
- * RUBY_FREE_MIN (Use RUBY_GC_HEAP_FREE_SLOTS instead)
- * RUBY_HEAP_MIN_SLOTS (Use RUBY_GC_HEAP_INIT_SLOTS instead)
-
-* Integer
- * New methods
- * Fixnum#bit_length
- * Bignum#bit_length
- * Bignum performance improvement
- * Use GMP if available.
- GMP is used only for several operations:
- multiplication, division, radix conversion, GCD
+* Float
+ * New methods:
+ * Float#next_float
+ * Float#prev_float
-* IO
- * extended methods:
- * IO#seek supports SEEK_DATA and SEEK_HOLE as whence.
- * IO#seek accepts symbols (:CUR, :END, :SET, :DATA, :HOLE) for 2nd argument.
- * IO#read_nonblock accepts optional `exception: false` to return symbols
- * IO#write_nonblock accepts optional `exception: false` to return symbols
+* File
+ * New methods:
+ * File.birthtime
+ * File#birthtime
-* Kernel
+* File::Stat
* New methods:
- * Kernel#singleton_method
+ * File::Stat#birthtime
+
+* GC
+ * Improvements
+ * Introduce incremental marking for major GC. [Feature #10137]
-* Module
+* Kernel
* New methods:
- * Module#using, which activates refinements of the specified module only
- in the current class or module definition.
- * Module#singleton_class? returns true if the receiver is a singleton class
- or false if it is an ordinary class or module.
- * extended methods:
- * Module#refine is no longer experimental.
- * Module#include and Module#prepend are now public methods.
-
-* Mutex
- * misc
- * Mutex#owned? is no longer experimental.
-
-* Numeric
- * extended methods:
- * Numeric#step allows the limit argument to be omitted, in which
- case an infinite sequence of numbers is generated. Keyword
- arguments `to` and `by` are introduced for ease of use.
+ * Kernel#itself
* Process
- * New methods:
- * alternative methods to $0/$0=:
- * Process.argv0() returns the original value of $0.
- * Process.setproctitle() sets the process title without affecting $0.
- * Process.clock_gettime
- * Process.clock_getres
-
-* String
- * "literal".freeze is now optimized to return the same object
- * New methods:
- * String#scrub and String#scrub! verify and fix invalid byte sequence.
- If you want to use this function with older Ruby,
- consider to use string-scrub.gem.
+ * Extended method:
+ * Process execution methods such as Process.spawn opens the file in write
+ mode for redirect from [:out, :err].
+ * Process creation methods, such as spawn(), uses vfork() system call.
+ vfork() is faster than fork() when the parent process uses huge memory.
* Symbol
- * All symbols are now frozen.
+ * Improvements
+ * Most symbols which are returned by String#to_sym and
+ String#intern are GC-able.
-* pack/unpack (Array/String)
- * Q! and q! directives for long long type if platform has the type.
+* Matrix
+ * New methods:
+ * Matrix#first_minor(row, column) returns the submatrix obtained
+ by deleting the specified row and column.
+ * Matrix#cofactor(row, column) returns the (row, column) cofactor
+ which is obtained by multiplying the first minor by (-1)**(row + column).
-* toplevel
- * extended methods:
- * main.using is no longer experimental. The method activates refinements
- in the ancestors of the argument module to support refinement
- inheritance by Module#include.
+* Method
+ * New methods:
+ * Method#curry([arity]) returns a curried Proc.
+ * Method#super_method returns a Method of superclass, which would be called
+ when super is used.
=== Core classes compatibility issues (excluding feature bug fixes)
-* Dir
- * incompatible changes:
- * Dir#glob returns composed characters (previously Apple Modofied UTF-8).
-
-* Hash
+* GC
* incompatible changes:
- * Hash#reject will return plain Hash object in the future versions, that
- is the original object's subclass, instance variables, default value,
- and taintedness will be no longer copied, so now warnings are emitted
- when called with such Hash.
+ * Rename GC.stat entries. [Feature #9924]
+ See https://docs.google.com/spreadsheets/d/11Ua4uBr6o0k-nORrZLEIIUkHJ9JRzRR0NyZfrhEEnc8/edit?usp=sharing
* IO
* incompatible changes:
- * open ignore internal encoding if external encoding is ASCII-8BIT.
-
-* Kernel#eval, Kernel#instance_eval, and Module#module_eval.
- * Copies the scope information of the original environment, which means
- that private, protected, public, and module_function without arguments
- do not affect the environment outside the eval string.
- For example, `class Foo; eval "private"; def foo; end; end' doesn't make
- Foo#foo private.
-
-* Kernel#untrusted?, untrust, and trust
- * These methods are deprecated and their behavior is same as tainted?,
- taint, and untaint, respectively. If $VERBOSE is true, they show warnings.
+ * When flushing file IO, you cannot assume that the metadata of the file
+ is updated immediately. On some platforms (especially Windows), it is
+ delayed until the filesystem load is decreased.
-* Module#ancestors
- * The ancestors of a singleton class now include singleton classes,
- in particular itself.
-
-* Module#define_method and Object#define_singleton_method
- * Now they return the symbols of the defined methods, not the methods/procs
- themselves.
-
-* Numeric#quo
- * Raises TypeError instead of ArgumentError if the receiver doesn't have
- to_r method.
+* Math
+ * incompatible changes:
+ * Math.log now raises Math::DomainError instead of returning NaN if the
+ base is less than 0, and returns NaN instead of -infinity if both of
+ two arguments are 0.
+ * Math.atan2 now returns values like as expected by C99 if both two
+ arguments are infinity.
* Proc
- * Returning from lambda proc now always exits from the Proc, not from the
- method where the lambda is created. Returning from non-lambda proc exits
- from the method, same as the former behavior.
+ * incompatible changes:
+ * ArgumentError is no longer raised when lambda Proc is passed as a
+ block, and the number of yielded arguments does not match the formal
+ arguments of the lambda, if just an array is yielded and its length
+ matches.
-String
- * If invalid: :replace is specified for String#encode, replace
- invalid byte sequence even if the destination encoding equals to
- the source encoding.
+* Process
+ * Process execution methods such as Process.spawn opens the file in write
+ mode for redirect from [:out, :err].
+ Before Ruby 2.2, it was opened in read mode.
=== Stdlib updates (outstanding ones only)
-* CGI::Util
- * All class methods modulized.
-
* Digest
- * extended methods:
- * Digest::Class.file takes optional arguments for its constructor
-
-* Matrix
- * Added Vector#cross_product.
-
-* Net::SMTP
- * Added Net::SMTP#rset to implement the RSET command
-
-* objspace
- * new method:
- * ObjectSpace.trace_object_allocations
- * ObjectSpace.trace_object_allocations_start
- * ObjectSpace.trace_object_allocations_stop
- * ObjectSpace.trace_object_allocations_clear
- * ObjectSpace.allocation_sourcefile
- * ObjectSpace.allocation_sourceline
- * ObjectSpace.allocation_class_path
- * ObjectSpace.allocation_method_id
- * ObjectSpace.allocation_generation
- * ObjectSpace.reachable_objects_from_root
- * ObjectSpace.dump
- * ObjectSpace.dump_all
-
-* OpenSSL::BN
- * extended methods:
- * OpenSSL::BN.new allows Fixnum/Bignum argument.
-
-* open-uri
- * Support multiple fields with same field name (like Set-Cookie).
+ * Digest::HMAC has been removed just as previously noticed.
-* Pathname
+* Etc
* New methods:
- * Pathname#write
- * Pathname#binwrite
-
-* rake
- * Updated to 10.1.0. Major changes include removal of the class namespace,
- Rake::DSL to hold the rake DSL methods and removal of support for legacy
- rake features.
-
- For a complete list of changes since rake 0.9.6 see:
-
- http://rake.rubyforge.org/doc/release_notes/rake-10_1_0_rdoc.html
+ * Etc.uname
+ * Etc.sysconf
+ * Etc.confstr
+ * IO#pathconf
- http://rake.rubyforge.org/doc/release_notes/rake-10_0_3_rdoc.html
+* Find, Pathname
+ * Extended methods:
+ * find method accepts "ignore_error" keyword argument.
-* RbConfig
- * New constants:
- * RbConfig::SIZEOF is added to provide the size of C types.
-
-* RDoc
- * Updated to 4.1.0. Major enhancements include a modified default template
- * and accessibility enhancements.
-
- For a list of minor enhancements and bug fixes see:
- https://github.com/rdoc/rdoc/blob/v4.1.0.preview.1/History.rdoc
-
-* Resolv
+* Pathname
+ * Pathname#/ is aliased to Pathname#+.
* New methods:
- * Resolv::DNS.fetch_resource
- * One-shot multicast DNS support
- * Support LOC resources
-
-* REXML::Parsers::SAX2Parser
- * Fixes wrong number of arguments of entitydecl event. Document of the event
- says "an array of the entity declaration" but implementation passes two
- or more arguments. It is an implementation bug but it breaks backward
- compatibility.
-
-* REXML::Parsers::StreamParser
- * Supports "entity" event.
-
-* REXML::Text
- * REXML::Text#<< supports method chain like 'text << "XXX" << "YYY"'.
- * REXML::Text#<< supports not "raw" mode.
-
-* Rinda::RingServer, Rinda::RingFinger
- * Rinda now supports multicast sockets. See Rinda::RingServer and
- Rinda::RingFinger for details.
+ * Pathname#birthtime
-* RubyGems
- * Updated to 2.2.0. Notable new features include:
-
- * Gemfile or gem.deps.rb support including Gem.file.lock (experimental)
- * Improved, iterative resolver (compared to RubyGems 2.1 and earlier)
- * Support for a sharing a GEM_HOME across ruby platforms and versions
+=== Stdlib compatibility issues (excluding feature bug fixes)
- * Updated to 2.2.2. Fixes some minor bugs and performance regressions.
+* lib/mathn.rb
+ * Show deprecated warning [Feature #10169]
- For a complete list of enhancements and bug fixes see:
- https://github.com/rubygems/rubygems/tree/master/History.txt
+* ext/date/lib/date/format.rb
+ * Removed because it's empty file.
-* Set
- * New methods:
- * Set#intersect?
- * Set#disjoint?
+* Digest
+ * Digest::HMAC has finally ceased to exist. Use OpenSSL::HMAC or an external gem instead.
-* Socket
- * New methods:
- * Socket.getifaddrs
+* time.rb
+ * Time.parse, Time.strptime, Time.rfc2822, Time.xmlschema may produce
+ fixed-offset Time objects.
+ It is happen when usual localtime doesn't preserve the offset from UTC.
+ * Time.httpdate produces always UTC Time object.
+ * Time.strptime raises ArgumentError when no date information.
-* StringScanner
- * extended methods:
- * StringScanner#[] supports named captures.
+* lib/rational.rb
+ * Removed because it is deprecated from 2009.
-* Syslog::Logger
- * Added facility.
+* lib/complex.rb
+ * Removed because it is deprecated from 2009.
-* Tempfile
- * New methods:
- * Tempfile.create
+* lib/prettyprint.rb
+ * Removed PrettyPrint#first?
-* Timeout
- * The exception to terminate the given block can no longer be rescued
- inside the block, by default, unless the exception class is given
- explicitly.
+* lib/minitest/*.rb
+ * Removed because it conflicts to minitest 5. [Feature #9711]
-* TSort
- * New methods:
- * TSort.tsort
- * TSort.tsort_each
- * TSort.strongly_connected_components
- * TSort.each_strongly_connected_component
- * TSort.each_strongly_connected_component_from
+* lib/test/**/*.rb
+ * Removed because it conflicts to minitest 5, and it was just an wrapper
+ of minitest 4. [Feature #9711]
-* WEBrick
- * The body of a response may now be a StringIO or other IO-like that responds
- to #readpartial and #read.
+* lib/uri
+ * support RFC 3986. [Feature #2542]
-* XMLRPC::Client
- * New methods:
- * XMLRPC::Client#http. It returns Net::HTTP for the client. Normally,
- it is not needed. It is useful when you want to change minor HTTP client
- options. You can change major HTTP client options by XMLRPC::Client
- methods. You should use XMLRPC::Client methods for changing major
- HTTP client options instead of XMLRPC::Client#http.
+* GServer
+ * GServer is extracted to gserver gem. It's unmaintain code.
-=== Stdlib compatibility issues (excluding feature bug fixes)
+* Logger
+ * Logger::Application is extracted to logger-application gem. It's unmaintain code.
-* Set
+* Prime
* incompatible changes:
- * Set#to_set now returns self instead of generating a copy.
+ * Prime.prime? now returns false for negative numbers. This method
+ should not be used to know the number is composite or not. [Bug #7395]
-* URI
- * incompatible changes:
- * URI.decode_www_form follows current WHATWG URL Standard.
- It gets encoding argument to specify the character encoding.
- It now allows loose percent encoded strings, but denies ;-separator.
- * URI.encode_www_form follows current WHATWG URL Standard.
- It gets encoding argument to convert before percent encode.
- UTF-16 strings aren't converted to UTF-8 before percent encode by default.
-
-* curses
- * Removed.
- curses is now available as a gem.
- See https://rubygems.org/gems/curses for details.
+* Psych
+ * Removed Psych::EngineManager [Bug #8344]
=== Built-in global variables compatibility issues
-* $SAFE
- * $SAFE=4 is obsolete. If $SAFE is set to 4 or larger, an ArgumentError
- is raised.
-
=== C API updates
-* rb_gc_set_params() is deprecated. This is only used in Ruby internal.
-
-* rb_gc_count() added. This returns the number of times GC occurred.
-
-* rb_gc_stat() added. This allows access to specific GC.stat() values from C
- without any allocation overhead.
-
-* rb_gc_latest_gc_info() added. This allows access to GC.latest_gc_info().
-
-* rb_postponed_job_register() added. Takes a function callback which is invoked
- when the VM is in a consistent state, i.e. to perform work from a C signal
- handler.
-
-* rb_profile_frames() added. Provides low-cost access to the current ruby stack
- for callstack profiling.
+* Deprecated APIs removed. [Feature #9502]
+
+ Check_SafeStr -> SafeStringValue
+ rb_check_safe_str -> SafeStringValue
+ rb_quad_pack -> rb_integer_pack
+ rb_quad_unpack -> rb_integer_unpack
+ rb_read_check : access struct FILE internal. no replacement.
+ rb_struct_iv_get : internal function. no replacement.
+ struct rb_blocking_region_buffer : internal type. no replacement.
+ rb_thread_blocking_region_begin -> rb_thread_call_without_gvl family
+ rb_thread_blocking_region_end -> rb_thread_call_without_gvl family
+ TRAP_BEG -> rb_thread_call_without_gvl family
+ TRAP_END -> rb_thread_call_without_gvl family
+ rb_thread_select -> rb_thread_fd_select
+ struct rb_exec_arg : internal type. no replacement.
+ rb_exec : internal function. no replacement.
+ rb_exec_arg_addopt : internal function. no replacement.
+ rb_exec_arg_fixup : internal function. no replacement.
+ rb_exec_arg_init : internal function. no replacement.
+ rb_exec_err : internal function. no replacement.
+ rb_fork : internal function. no replacement.
+ rb_fork_err : internal function. no replacement.
+ rb_proc_exec_n : internal function. no replacement.
+ rb_run_exec_options : internal function. no replacement.
+ rb_run_exec_options_err : internal function. no replacement.
+ rb_thread_blocking_region -> rb_thread_call_without_gvl family
+ rb_thread_polling -> rb_thread_wait_for
+ rb_big2str0 : internal function. no replacement.
+ rb_big2ulong_pack -> rb_integer_pack
+ rb_gc_set_params : internal function. no replacement.
+
+* struct RBignum is hidden. [Feature #6083]
+ Use rb_integer_pack and rb_integer_unpack instead.
+
+* struct RRational is hidden. [Feature #9513]
+ Use rb_rational_num and rb_rational_den instead.
+
+* rb_big_new and rb_big_resize takes a size_t instead of long.
+
+* rb_num2long returns a long instead of SIGNED_VALUE.
+
+* rb_num2ulong returns an unsigned long instead of VALUE.
+
+* st hash table uses power-of-two sizes for speed [Feature #9425].
+ Lookups are 10-25% faster if using appropriate hash functions.
+ However, weaknesses in hash distribution can no longer be masked
+ by prime number-sized tables, so extensions may need to tweak
+ hash functions to ensure good distribution.
+
+* rb_sym2str() added. This is almost same as `rb_id2str(SYM2ID(sym))`
+ but not pinning a dynamic symbol.
+
+* rb_str_cat_cstr() added. This is same as `rb_str_cat2()`.
+
+* `rb_str_substr()` and `rb_str_subseq()` now share middle of a string,
+ but not only the end of a string. Therefore, result strings may not
+ be NUL-terminated, `StringValueCStr()` is needed calling to obtain a
+ NUL-terminated C string.
* rb_tracepoint_new() supports new internal events accessible only from C:
- * RUBY_INTERNAL_EVENT_NEWOBJ
- * RUBY_INTERNAL_EVENT_FREEOBJ
- * RUBY_INTERNAL_EVENT_GC_START
- * RUBY_INTERNAL_EVENT_GC_END_MARK
- * RUBY_INTERNAL_EVENT_GC_END_SWEEP
- * Note that you *can not* specify "internal events" with normal events
- (such as RUBY_EVENT_CALL, RUBY_EVENT_RETURN) simultaneously.
+ * RUBY_INTERNAL_EVENT_GC_ENTER
+ * RUBY_INTERNAL_EVENT_GC_EXIT
+ r47528
diff --git a/README b/README
deleted file mode 100644
index 3ffe3553a8..0000000000
--- a/README
+++ /dev/null
@@ -1,166 +0,0 @@
-= 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 extensible.
-
-
-== Features of Ruby
-
-* Simple Syntax
-* *Normal* Object-Oriented features(ex. class, method calls)
-* *Advanced* Object-Oriented features(ex. Mix-in, Singleton-method)
-* Operator Overloading
-* Exception Handling
-* Iterators and Closures
-* Garbage Collection
-* Dynamic Loading of Object files(on some architecture)
-* Highly Portable (works on many Unix-like/POSIX compatible platforms
- as well as Windows, Mac OS X, BeOS etc.)
- cf. http://bugs.ruby-lang.org/projects/ruby-trunk/wiki/SupportedPlatforms
-
-
-== How to get Ruby
-
-For a complete list of ways to install Ruby, including using third party
-tools like rvm, see:
-
-http://www.ruby-lang.org/en/downloads/
-
-The Ruby distribution files can be found in 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 http://svn.ruby-lang.org/repos/ruby/trunk/ ruby
-
-Or if you are using git then use the following command:
-
- $ git clone git://github.com/ruby/ruby.git
-
-There are some other branches under development. Try the following
-command and see the list of 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 git://github.com/ruby/ruby.git
-
-== Ruby home-page
-
-The URL of the Ruby home-page is:
-
-http://www.ruby-lang.org/
-
-
-== Mailing list
-
-There is a mailing list to talk about Ruby.
-To subscribe this list, please send the following phrase
-
- subscribe YourFirstName YourFamilyName
-e.g.
- subscribe Joseph Smith
-
-in the mail body (not subject) to the address <mailto:ruby-talk-ctl@ruby-lang.org>.
-
-
-== How to compile and install
-
-This is what you need to do to compile and install Ruby:
-
-0. If you want to use Microsoft Visual C++ to compile ruby,
- read win32/README.win32 instead of this document.
-
-1. If +./configure+ does not exist or is older than configure.in,
- run autoconf to (re)generate configure.
-
-2. Run +./configure+, which will generate config.h and Makefile.
-
- Some C compiler flags may be added by default depending on your
- environment. Specify <tt>optflags=..</tt> and <tt>warnflags=..</tt> as
- necessary to override them.
-
-3. Edit +defines.h+ if you need. Usually this step will not be needed.
-
-4. Remove comment mark(<tt>#</tt>) before the module names from +ext/Setup+
- (or add module names if not present), if you want to link modules
- statically.
-
- If you don't want to compile non static extension modules
- (probably on architectures which does not allow dynamic loading),
- remove comment mark from the line "<tt>#option nodynamic</tt>" in
- +ext/Setup+.
-
- Usually this step will not be needed.
-
-5. Run +make+.
-
-6. Optionally, run '<tt>make check</tt>' to check whether the compiled Ruby
- interpreter works well. If you see the message "<tt>check succeeded</tt>",
- your ruby works as it should (hopefully).
-
-7. Run '<tt>make install</tt>'
-
- This command will create following directories and install files
- onto them.
-
- * <tt>${DESTDIR}${prefix}/bin</tt>
- * <tt>${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}</tt>
- * <tt>${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
- * <tt>${DESTDIR}${prefix}/lib</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/site_ruby</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/vendor_ruby</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/gems/${MAJOR}.${MINOR}.${TEENY}</tt>
- * <tt>${DESTDIR}${prefix}/share/man/man1</tt>
- * <tt>${DESTDIR}${prefix}/share/ri/${MAJOR}.${MINOR}.${TEENY}/system</tt>
-
- If Ruby's API version is '_x.y.z_', the <tt>${MAJOR}</tt> is '_x_', the
- <tt>${MINOR}</tt> is '_y_', and the <tt>${TEENY}</tt> is '_z_'.
-
- *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.
-
-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 external libraries and/or headers, then you will need to run
-'<tt>make distclean-ext</tt>' to remove old configuration after
-installing them in such case.
-
-== Copying
-
-See the file +COPYING+.
-
-== Feedback
-
-Questions about the Ruby language can be asked on the Ruby-Talk mailing list
-(http://www.ruby-lang.org/en/community/mailing-lists) or on websites like
-(http://stackoverflow.com).
-
-Bug reports should be filed at http://bugs.ruby-lang.org
-
-== The Author
-
-Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in 1995.
-
-<mailto:matz@ruby-lang.org>
-
---
-Local variables:
-mode: rdoc
-end:
diff --git a/README.EXT b/README.EXT
index 6f7340ceda..f7ee0022df 100644
--- a/README.EXT
+++ b/README.EXT
@@ -208,6 +208,7 @@ rb_str_cat(VALUE str, const char *ptr, long len) ::
Appends len bytes of data from ptr to the Ruby string.
rb_str_cat2(VALUE str, const char* ptr) ::
+rb_str_cat_cstr(VALUE str, const char* ptr) ::
Appends C string ptr to Ruby string str. This function is
equivalent to rb_str_cat(str, ptr, strlen(ptr)).
@@ -411,6 +412,11 @@ func has to take the klass as the argument and return a newly
allocated instance. This instance should be as empty as possible,
without any expensive (including external) resources.
+If you are overriding an existing method of any ancestor of your class,
+you may rely on:
+
+ VALUE rb_call_super(int argc, const VALUE *argv)
+
=== Constant Definition
We have 2 functions to define constants:
@@ -476,6 +482,16 @@ After this function returned a non-zero value, *name is always a
Symbol or a String, otherwise it is a String if the result is 0.
The third function takes NUL-terminated C string, not Ruby VALUE.
+You can retrieve Symbol from Ruby object (Symbol or String) given as
+an argument by using
+
+ rb_to_symbol(VALUE name)
+ rb_check_symbol(volatile VALUE *namep)
+ rb_check_symbol_cstr(const char *ptr, long len, rb_encoding *enc)
+
+These functions are similar to above functions except that these
+return a Symbol instead of an ID.
+
You can convert C ID to Ruby Symbol by using
VALUE ID2SYM(ID id)
@@ -683,10 +699,10 @@ wrapping DBM* directly, because we want to cache size information.
To retrieve the dbmdata structure from a Ruby object, we define the
following macro:
- #define GetDBM(obj, dbmp) {\
+ #define GetDBM(obj, dbmp) do {\
Data_Get_Struct(obj, struct dbmdata, dbmp);\
if (dbmp->di_dbm == 0) closed_dbm();\
- }
+ } while (0)
This sort of complicated macro does the retrieving and close checking for
the DBM.
@@ -1080,6 +1096,15 @@ rb_float_new(f) ::
double -> Float
+RSTRING_LEN(str) ::
+
+ String -> length of String data in bytes
+
+RSTRING_PTR(str) ::
+
+ String -> pointer to String data
+ Note that the result pointer may not be NUL-terminated
+
StringValue(value) ::
Object with #to_str -> String
@@ -1090,7 +1115,8 @@ StringValuePtr(value) ::
StringValueCStr(value) ::
- Object with #to_str -> pointer to String data without NULL bytes
+ Object with #to_str -> pointer to String data without NUL bytes
+ It is guaranteed that the result data is NUL-terminated
rb_str_new2(s) ::
@@ -1405,13 +1431,18 @@ void ruby_init() ::
Initializes the interpreter.
-void ruby_options(int argc, char **argv) ::
+void *ruby_options(int argc, char **argv) ::
Process command line arguments for the interpreter.
+ And compiles the Ruby source to execute.
+ It returns an opaque pointer to the compiled source
+ or an internal special value.
-void ruby_run() ::
+int ruby_run_node(void *n) ::
- Starts execution of the interpreter.
+ Runs the given compiled source and exits this process.
+ It returns EXIT_SUCCESS if successfully runs the source.
+ Otherwise, it returns other value.
void ruby_script(char *name) ::
@@ -1591,6 +1622,56 @@ available in in include/ruby/ruby.h. An example is available in iseq.c.
For a complete guide for RGenGC and write barriers, please refer to
<https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/RGenGC>.
+= Appendix E. RB_GC_GUARD to protect from premature GC
+
+C Ruby currently uses conservative garbage collection, thus VALUE
+variables must remain visible on the stack or registers to ensure any
+associated data remains usable. Optimizing C compilers are not designed
+with conservative garbage collection in mind, so they may optimize away
+the original VALUE even if the code depends on data associated with that
+VALUE.
+
+The following example illustrates the use of RB_GC_GUARD to ensure
+the contents of sptr remain valid while the second invocation of
+rb_str_new_cstr is running.
+
+ VALUE s, w;
+ const char *sptr;
+
+ s = rb_str_new_cstr("hello world!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+ sptr = RSTRING_PTR(s);
+ w = rb_str_new_cstr(sptr + 6); /* Possible GC invocation */
+
+ RB_GC_GUARD(s); /* ensure s (and thus sptr) do not get GC-ed */
+
+In the above example, RB_GC_GUARD must be placed _after_ the last use of
+sptr. Placing RB_GC_GUARD before dereferencing sptr would be of no use.
+RB_GC_GUARD is only effective on the VALUE data type, not converted C
+data types.
+
+RB_GC_GUARD would not be necessary at all in the above example if
+non-inlined function calls are made on the `s' VALUE after sptr is
+dereferenced. Thus, in the above example, calling any un-inlined
+function on `s' such as:
+
+ rb_str_modify(s);
+
+Will ensure `s' stays on the stack or register to prevent a
+GC invocation from prematurely freeing it.
+
+Using the RB_GC_GUARD macro is preferable to using the "volatile"
+keyword in C. RB_GC_GUARD has the following advantages:
+
+1) the intent of the macro use is clear
+
+2) RB_GC_GUARD only affects its call site, "volatile" generates some
+ extra code every time the variable is used, hurting optimization.
+
+3) "volatile" implementations may be buggy/inconsistent in some
+ compilers and architectures. RB_GC_GUARD is customizable for broken
+ systems/compilers without those without negatively affecting other
+ systems.
+
/*
* Local variables:
* fill-column: 70
diff --git a/README.EXT.ja b/README.EXT.ja
index 5ccc9306d1..0ab61abcbe 100644
--- a/README.EXT.ja
+++ b/README.EXT.ja
@@ -111,8 +111,8 @@ FIXNUMã¨NILã«é–¢ã—ã¦ã¯ã‚ˆã‚Šé«˜é€Ÿãªåˆ¤åˆ¥ãƒžã‚¯ãƒ­ãŒç”¨æ„ã•れã¦ã„ã
æ›çµæžœãŒintã®ã‚µã‚¤ã‚ºã«åŽã¾ã‚‰ãªã„å ´åˆã«ã¯ä¾‹å¤–を発生ã—ã¾ã™ï¼Ž
ãれã‹ã‚‰ï¼ŒFIXNUMã«é™ã‚‰ãšRubyã®ãƒ‡ãƒ¼ã‚¿ã‚’æ•´æ•°ã«å¤‰æ›ã™ã‚‹
「NUM2INT()ã€ãŠã‚ˆã³ã€ŒNUM2LONG()ã€ã¨ã„ã†ãƒžã‚¯ãƒ­ãŒã‚りã¾ã™ï¼Žã“
-れらã®ãƒžã‚¯ãƒ­ã¯ãƒžã‚¯ãƒ­ã¯ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—ã®ãƒã‚§ãƒƒã‚¯ç„¡ã—ã§ä½¿ãˆã¾ã™
-(æ•´æ•°ã«å¤‰æ›ã§ããªã„å ´åˆã«ã¯ä¾‹å¤–ãŒç™ºç”Ÿã™ã‚‹)ï¼ŽåŒæ§˜ã«ãƒã‚§ãƒƒã‚¯ç„¡
+れらã®ãƒžã‚¯ãƒ­ã¯ãƒ‡ãƒ¼ã‚¿ã‚¿ã‚¤ãƒ—ã®ãƒã‚§ãƒƒã‚¯ç„¡ã—ã§ä½¿ãˆã¾ã™
+(æ•´æ•°ã«å¤‰æ›ã§ããªã„å ´åˆã«ã¯ä¾‹å¤–ãŒç™ºç”Ÿã™ã‚‹)ï¼ŽåŒæ§˜ã«ãƒã‚§ãƒƒã‚¯ç„¡ã—
ã§ä½¿ãˆã‚‹å¤‰æ›ãƒžã‚¯ãƒ­ã¯doubleã‚’å–り出ã™ã€ŒNUM2DBL()ã€ãŒã‚りã¾ã™ï¼Ž
char* ã‚’å–り出ã™å ´åˆï¼Œ StringValue() 㨠StringValuePtr()
@@ -234,6 +234,7 @@ rb_str_cat(VALUE str, const char *ptr, long len)
Rubyã®æ–‡å­—列strã«lenãƒã‚¤ãƒˆã®æ–‡å­—列ptrを追加ã™ã‚‹ï¼Ž
rb_str_cat2(VALUE str, const char* ptr)
+rb_str_cat_cstr(VALUE str, const char* ptr)
Rubyã®æ–‡å­—列strã«Cã®æ–‡å­—列ptrを追加ã™ã‚‹ï¼Žã“ã®é–¢æ•°ã®æ©Ÿèƒ½ã¯
rb_str_cat(str, ptr, strlen(ptr))ã¨åŒç­‰ã§ã‚る.
@@ -516,13 +517,23 @@ IDã¨ã¯å¤‰æ•°å,メソッドåã‚’è¡¨ã™æ•´æ•°ã§ã™ï¼ŽRubyã®ä¸­ã§ã¯
rb_check_id(volatile VALUE *name)
rb_check_id_cstr(const char *name, long len, rb_encoding *enc)
-ã‚‚ã—引数ãŒã‚·ãƒ³ãƒœãƒ«ã§ã‚‚文字列ã§ã‚‚ãªã‘れã°ã€to_strãƒ¡ã‚½ãƒƒãƒ‰ã§æ–‡
+ã‚‚ã—引数ãŒã‚·ãƒ³ãƒœãƒ«ã§ã‚‚文字列ã§ã‚‚ãªã‘れã°ï¼Œto_strãƒ¡ã‚½ãƒƒãƒ‰ã§æ–‡
字列ã«å¤‰æ›ã—よã†ã¨ã—ã¾ã™ï¼Žç¬¬äºŒã®é–¢æ•°ã¯ãã®å¤‰æ›çµæžœã‚’*nameã«ä¿
å­˜ã—,ãã®åå‰ãŒæ—¢çŸ¥ã®ã‚·ãƒ³ãƒœãƒ«ã§ãªã„å ´åˆã¯0ã‚’è¿”ã—ã¾ã™ï¼Žã“ã®é–¢
-æ•°ãŒ0以外を返ã—ãŸå ´åˆã¯*nameã¯å¸¸ã«ã‚·ãƒ³ãƒœãƒ«ã‹æ–‡å­—列ã§ã‚りã€0ã‚’
+æ•°ãŒ0以外を返ã—ãŸå ´åˆã¯*nameã¯å¸¸ã«ã‚·ãƒ³ãƒœãƒ«ã‹æ–‡å­—列ã§ã‚り,0ã‚’
è¿”ã—ãŸå ´åˆã¯å¸¸ã«æ–‡å­—列ã§ã™ï¼Žç¬¬ä¸‰ã®é–¢æ•°ã¯Rubyã®æ–‡å­—列ã§ã¯ãªã
NUL終端ã•れãŸCã®æ–‡å­—列を使ã„ã¾ã™ï¼Ž
+Rubyã‹ã‚‰å¼•æ•°ã¨ã—ã¦ä¸Žãˆã‚‰ã‚ŒãŸã‚·ãƒ³ãƒœãƒ«(ã¾ãŸã¯æ–‡å­—列)をシンボル
+ã«å¤‰æ›ã™ã‚‹ã«ã¯ä»¥ä¸‹ã®é–¢æ•°ã‚’使ã„ã¾ã™ï¼Ž
+
+ rb_to_symbol(VALUE name)
+ rb_check_symbol(volatile VALUE *namep)
+ rb_check_symbol_cstr(const char *ptr, long len, rb_encoding *enc)
+
+ã“れらã®é–¢æ•°ã¯ï¼ŒIDã®ä»£ã‚りã«ã‚·ãƒ³ãƒœãƒ«ã‚’è¿”ã™ã“ã¨ã‚’除ã‘ã°ä¸Šè¨˜ã®
+関数ã¨åŒã˜ã§ã™ï¼Ž
+
=== Cã‹ã‚‰Rubyã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™
Cã‹ã‚‰æ–‡å­—列を経由ã›ãšã«Rubyã®ãƒ¡ã‚½ãƒƒãƒ‰ã‚’呼ã³å‡ºã™ãŸã‚ã«ã¯ä»¥ä¸‹
@@ -763,10 +774,10 @@ dbm.cã§ã¯Data_Make_Structを以下ã®ã‚ˆã†ã«ä½¿ã£ã¦ã„ã¾ã™ï¼Ž
Dataオブジェクトã‹ã‚‰dbmstruct構造体ã®ãƒã‚¤ãƒ³ã‚¿ã‚’å–り出ã™ãŸã‚
ã«ä»¥ä¸‹ã®ãƒžã‚¯ãƒ­ã‚’使ã£ã¦ã„ã¾ã™ï¼Ž
- #define GetDBM(obj, dbmp) {\
+ #define GetDBM(obj, dbmp) do {\
Data_Get_Struct(obj, struct dbmdata, dbmp);\
if (dbmp->di_dbm == 0) closed_dbm();\
- }
+ } while (0)
ã¡ã‚‡ã£ã¨è¤‡é›‘ãªãƒžã‚¯ãƒ­ã§ã™ãŒï¼Œè¦ã™ã‚‹ã«dbmdata構造体ã®ãƒã‚¤ãƒ³ã‚¿
ã®å–り出ã—ã¨ï¼Œcloseã•れã¦ã„ã‚‹ã‹ã©ã†ã‹ã®ãƒã‚§ãƒƒã‚¯ã‚’ã¾ã¨ã‚ã¦ã„
@@ -1118,6 +1129,8 @@ Data_Get_Struct(data, type, sval) ::
rb_integer_pack(value, words, numwords, wordsize, nails, flags), rb_integer_unpack(words, numwords, wordsize, nails, flags)
NUM2DBL(value)
rb_float_new(f)
+ RSTRING_LEN(str)
+ RSTRING_PTR(str)
StringValue(value)
StringValuePtr(value)
StringValueCStr(value)
@@ -1416,13 +1429,16 @@ void ruby_init() ::
Rubyインタプリタã®åˆæœŸåŒ–を行ãªã†ï¼Ž
-void ruby_options(int argc, char **argv) ::
+void *ruby_options(int argc, char **argv) ::
- Rubyインタプリタã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å¼•æ•°ã®å‡¦ç†ã‚’行ãªã†ï¼Ž
+ Rubyインタプリタã®ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³å¼•æ•°ã®å‡¦ç†ã‚’行ãªã„,
+ Rubyã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’コンパイルã™ã‚‹ï¼Ž
+ コンパイルã•れãŸã‚½ãƒ¼ã‚¹ã¸ã®ãƒã‚¤ãƒ³ã‚¿ï¼Œã‚‚ã—ãã¯ç‰¹æ®Šå€¤ã‚’è¿”ã™.
-void ruby_run() ::
+int ruby_run_node(void *n) ::
- Rubyインタプリタを実行ã™ã‚‹ï¼Ž
+ コンパイルã•れãŸã‚³ãƒ¼ãƒ‰ã‚’実行ã™ã‚‹ï¼Ž
+ å®Ÿè¡Œã«æˆåŠŸã—ãŸå ´åˆã¯EXIT_SUCCESSを,エラーãŒèµ·ã“ã£ãŸã¨ãã¯ãれ以外を返ã™ï¼Ž
void ruby_script(char *name) ::
@@ -1624,24 +1640,24 @@ pkg_config(pkg, option=nil) ::
2. {pkg}-config {option}
3. pkg-config {option} {pkg}
- optionãŒæŒ‡å®šã•れãŸå ´åˆã¯ã€ä¸Šè¨˜ã®é…列ã®ä»£ã‚りã«ãã®ã‚ªãƒ—ションを
+ optionãŒæŒ‡å®šã•れãŸå ´åˆã¯ï¼Œä¸Šè¨˜ã®é…列ã®ä»£ã‚りã«ãã®ã‚ªãƒ—ションを
指定ã—ã¦å¾—られãŸå‡ºåŠ›ã‚’stripã—ãŸã‚‚ã®ã‚’è¿”ã™ï¼Ž
= Appendix D. 世代別GC
-Ruby 2.1ã‹ã‚‰ä¸–代別GCã«å¯¾å¿œã—ã¾ã—ãŸã€‚我々ã¯ã“れをRGenGCã¨å‘¼ã‚“ã§ã„ã¾ã™ã€‚
-RGenGCã¯ã€éŽåŽ»ã®æ‹¡å¼µãƒ©ã‚¤ãƒ–ラリã«ï¼ˆã»ã¼ï¼‰äº’æ›æ€§ã‚’ä¿ã¤ã‚ˆã†ã«é–‹ç™ºã•れã¦ã„ã‚‹
-ãŸã‚ã€æ‹¡å¼µãƒ©ã‚¤ãƒ–ラリå´ã®å¯¾å¿œã¯ã»ã¼ä¸è¦ã§ã™ã€‚
+Ruby 2.1ã‹ã‚‰ä¸–代別GCã«å¯¾å¿œã—ã¾ã—ãŸï¼Žæˆ‘々ã¯ã“れをRGenGCã¨å‘¼ã‚“ã§ã„ã¾ã™ï¼Ž
+RGenGCã¯ï¼ŒéŽåŽ»ã®æ‹¡å¼µãƒ©ã‚¤ãƒ–ラリã«ï¼ˆã»ã¼ï¼‰äº’æ›æ€§ã‚’ä¿ã¤ã‚ˆã†ã«é–‹ç™ºã•れã¦ã„ã‚‹
+ãŸã‚,拡張ライブラリå´ã®å¯¾å¿œã¯ã»ã¼ä¸è¦ã§ã™ï¼Ž
-ãŸã ã—ã€å¯¾å¿œã‚’ã™ã‚‹ã“ã¨ã§æ€§èƒ½ã‚’å‘上ã™ã‚‹ã“ã¨ãŒã§ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ã‚‚ã—
-拡張ライブラリã«é«˜ã„性能ãŒå¿…è¦ã§ã‚ã‚‹å ´åˆã¯å¯¾å¿œã‚’検討ã—ã¦ä¸‹ã•ã„。
+ãŸã ã—,対応をã™ã‚‹ã“ã¨ã§æ€§èƒ½ã‚’å‘上ã™ã‚‹ã“ã¨ãŒã§ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ï¼Žã‚‚ã—
+拡張ライブラリã«é«˜ã„性能ãŒå¿…è¦ã§ã‚ã‚‹å ´åˆã¯å¯¾å¿œã‚’検討ã—ã¦ä¸‹ã•ã„.
ã¨ãã«RARRAY_PTR()/RHASH_TBL()ã®ã‚ˆã†ãªãƒžã‚¯ãƒ­ã‚’用ã„ã¦ãƒã‚¤ãƒ³ã‚¿ã«ç›´æŽ¥ã‚¢ã‚¯ã‚»
-スã™ã‚‹ã‚ˆã†ãªã‚³ãƒ¼ãƒ‰ã¯æ›¸ã‹ãªã„よã†ã«ã—ã¦ä¸‹ã•ã„。代ã‚りã«ã€rb_ary_aref(),
-rb_ary_store() ãªã©ã®ã€é©åˆ‡ãª API 関数を利用ã™ã‚‹ã‚ˆã†ã«ã—ã¦ä¸‹ã•ã„。
+スã™ã‚‹ã‚ˆã†ãªã‚³ãƒ¼ãƒ‰ã¯æ›¸ã‹ãªã„よã†ã«ã—ã¦ä¸‹ã•ã„.代ã‚りã«ï¼Œrb_ary_aref(),
+rb_ary_store() ãªã©ã®ï¼Œé©åˆ‡ãª API 関数を利用ã™ã‚‹ã‚ˆã†ã«ã—ã¦ä¸‹ã•ã„.
-ãã®ã»ã‹ã€å¯¾å¿œã«ã¤ã„ã¦ã®è©³ç´°ã¯ README.ext ã®ã€ŒAppendix D. Generational
-GCã€ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。
+ãã®ã»ã‹ï¼Œå¯¾å¿œã«ã¤ã„ã¦ã®è©³ç´°ã¯ README.EXT ã®ã€ŒAppendix D. Generational
+GCã€ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„.
/*
* Local variables:
diff --git a/README.ja b/README.ja
deleted file mode 100644
index 9ab2f3ca0e..0000000000
--- a/README.ja
+++ /dev/null
@@ -1,192 +0,0 @@
-= Rubyã¨ã¯
-
-Rubyã¯ã‚·ãƒ³ãƒ—ルã‹ã¤å¼·åŠ›ãªã‚ªãƒ–ジェクト指å‘スクリプト言語ã§ã™ï¼Ž
-Rubyã¯æœ€åˆã‹ã‚‰ç´”粋ãªã‚ªãƒ–ジェクト指å‘言語ã¨ã—ã¦è¨­è¨ˆã•れã¦ã„ã¾
-ã™ã‹ã‚‰ï¼Œã‚ªãƒ–ジェクト指å‘プログラミングを手軽ã«è¡Œã†äº‹ãŒå‡ºæ¥ã¾
-ã™ï¼Žã‚‚ã¡ã‚ã‚“é€šå¸¸ã®æ‰‹ç¶šãåž‹ã®ãƒ—ログラミングもå¯èƒ½ã§ã™ï¼Ž
-
-Rubyã¯ãƒ†ã‚­ã‚¹ãƒˆå‡¦ç†é–¢ä¿‚ã®èƒ½åŠ›ãªã©ã«å„ªã‚Œï¼ŒPerlã¨åŒã˜ãらã„強力
-ã§ã™ï¼Žã•らã«ã‚·ãƒ³ãƒ—ãƒ«ãªæ–‡æ³•ã¨ï¼Œä¾‹å¤–処ç†ã‚„イテレータãªã©ã®æ©Ÿæ§‹
-ã«ã‚ˆã£ã¦ï¼Œã‚ˆã‚Šåˆ†ã‹ã‚Šã‚„ã™ã„プログラミングãŒå‡ºæ¥ã¾ã™ï¼Ž
-
-
-== Rubyã®ç‰¹é•·
-
-* ã‚·ãƒ³ãƒ—ãƒ«ãªæ–‡æ³•
-* 普通ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆæŒ‡å‘æ©Ÿèƒ½(クラス,メソッドコールãªã©)
-* 特殊ãªã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆæŒ‡å‘æ©Ÿèƒ½(Mixin, 特異メソッドãªã©)
-* 演算å­ã‚ªãƒ¼ãƒãƒ¼ãƒ­ãƒ¼ãƒ‰
-* ä¾‹å¤–å‡¦ç†æ©Ÿèƒ½
-* イテレータã¨ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£
-* ガーベージコレクタ
-* ダイナミックローディング (アーキテクãƒãƒ£ã«ã‚ˆã‚‹)
-* ç§»æ¤æ€§ãŒé«˜ã„.多ãã®Unix-like/POSIX互æ›ãƒ—ラットフォーム上ã§
- å‹•ãã ã‘ã§ãªã,Windows, Mac OS X,BeOSãªã©ã®ä¸Šã§ã‚‚å‹•ã
- cf. http://bugs.ruby-lang.org/projects/ruby-trunk/wiki/SupportedPlatformsJa
-
-== 入手法
-
-=== FTPã§
-
-以下ã®å ´æ‰€ã«ãŠã„ã¦ã‚りã¾ã™ï¼Ž
-
-ftp://ftp.ruby-lang.org/pub/ruby/
-
-=== Subversionã§
-
-開発先端ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯æ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ã§å–å¾—ã§ãã¾ã™ï¼Ž
-
- $ svn co http://svn.ruby-lang.org/repos/ruby/trunk/ ruby
-
-ä»–ã«é–‹ç™ºä¸­ã®ãƒ–ランãƒã®ä¸€è¦§ã¯æ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ã§è¦‹ã‚‰ã‚Œã¾ã™ï¼Ž
-
- $ svn ls http://svn.ruby-lang.org/repos/ruby/branches/
-
-=== Gitã§
-
-Subversionã®ãƒŸãƒ©ãƒ¼ã‚’GitHubã«å…¬é–‹ã—ã¦ã„ã¾ã™ï¼Ž
-以下ã®ã‚³ãƒžãƒ³ãƒ‰ã§ãƒªãƒã‚¸ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã™ï¼Ž
-
- $ git clone git://github.com/ruby/ruby.git
-
-== ホームページ
-
-Rubyã®ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã®URLã¯
-
-http://www.ruby-lang.org/
-
-ã§ã™ï¼Ž
-
-
-== メーリングリスト
-
-Rubyã®ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆãŒã‚りã¾ã™ã€‚å‚åŠ å¸Œæœ›ã®æ–¹ã¯
-
-mailto:ruby-list-ctl@ruby-lang.org
-
-ã¾ã§æœ¬æ–‡ã«
-
- subscribe YourFirstName YourFamilyName
-
-ã¨æ›¸ã„ã¦é€ã£ã¦ä¸‹ã•ã„。
-
-Ruby開発者å‘ã‘メーリングリストもã‚りã¾ã™ã€‚ã“ã¡ã‚‰ã§ã¯rubyã®ãƒ
-ã‚°ã€å°†æ¥ã®ä»•様拡張ãªã©å®Ÿè£…上ã®å•題ã«ã¤ã„ã¦è­°è«–ã•れã¦ã„ã¾ã™ã€‚
-å‚åŠ å¸Œæœ›ã®æ–¹ã¯
-
-mailto:ruby-dev-ctl@ruby-lang.org
-
-ã¾ã§ruby-listã¨åŒæ§˜ã®æ–¹æ³•ã§ãƒ¡ãƒ¼ãƒ«ã—ã¦ãã ã•ã„。
-
-Ruby拡張モジュールã«ã¤ã„ã¦è©±ã—åˆã†ruby-extメーリングリストã¨
-数学関係ã®è©±é¡Œã«ã¤ã„ã¦è©±ã—åˆã†ruby-mathメーリングリストã¨
-英語ã§è©±ã—åˆã†ruby-talkメーリングリストもã‚りã¾ã™ã€‚å‚加方法
-ã¯ã©ã‚Œã‚‚åŒã˜ã§ã™ã€‚
-
-
-== コンパイル・インストール
-
-ä»¥ä¸‹ã®æ‰‹é †ã§è¡Œã£ã¦ãã ã•ã„.
-
-1. ã‚‚ã— +configure+ ファイルãŒè¦‹ã¤ã‹ã‚‰ãªã„ã€ã‚‚ã—ãã¯
- +configure.in+ よりå¤ã„よã†ãªã‚‰ã€ +autoconf+ を実行ã—ã¦
- æ–°ã—ã +configure+ を生æˆã™ã‚‹
-
-2. +configure+ を実行ã—㦠+Makefile+ ãªã©ã‚’生æˆã™ã‚‹
-
- 環境ã«ã‚ˆã£ã¦ã¯ãƒ‡ãƒ•ォルトã®Cコンパイラ用オプションãŒä»˜ã
- ã¾ã™ï¼Ž +configure+ オプション㧠<tt>optflags=..</tt> <tt>warnflags=..</tt> ç­‰
- ã§ä¸Šæ›¸ãã§ãã¾ã™ï¼Ž
-
-3. (å¿…è¦ãªã‚‰ã°)+defines.h+ を編集ã™ã‚‹
-
- 多分,必è¦ç„¡ã„ã¨æ€ã„ã¾ã™ï¼Ž
-
-4. (å¿…è¦ãªã‚‰ã°)+ext/Setup+ ã«é™çš„ã«ãƒªãƒ³ã‚¯ã™ã‚‹æ‹¡å¼µãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’
- 指定ã™ã‚‹
-
- +ext/Setup+ ã«è¨˜è¿°ã—ãŸãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯é™çš„ã«ãƒªãƒ³ã‚¯ã•れã¾ã™ï¼Ž
-
- ダイナミックローディングをサãƒãƒ¼ãƒˆã—ã¦ã„ãªã„アーキテク
- ãƒãƒ£ã§ã¯ +Setup+ ã®1行目ã®ã€Œ<tt>option nodynamic</tt>ã€ã¨ã„ã†è¡Œã®ã‚³
- メントを外ã™å¿…è¦ãŒã‚りã¾ã™ï¼Žã¾ãŸï¼Œã“ã®ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ã§
- 拡張モジュールを利用ã™ã‚‹ãŸã‚ã«ã¯ï¼Œã‚らã‹ã˜ã‚é™çš„ã«ãƒªãƒ³
- クã—ã¦ãŠãå¿…è¦ãŒã‚りã¾ã™ï¼Ž
-
-5. +make+ を実行ã—ã¦ã‚³ãƒ³ãƒ‘イルã™ã‚‹
-
-6. <tt>make check</tt>ã§ãƒ†ã‚¹ãƒˆã‚’行ã†ï¼Ž
-
- 「<tt>check succeeded</tt>ã€ã¨è¡¨ç¤ºã•ã‚Œã‚Œã°æˆåŠŸã§ã™ï¼ŽãŸã ã—テスト
- ã«æˆåŠŸã—ã¦ã‚‚完璧ã ã¨ä¿è¨¼ã•れã¦ã„る訳ã§ã¯ã‚りã¾ã›ã‚“.
-
-7. <tt>make install</tt>
-
- 以下ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作ã£ã¦ï¼Œãã“ã«ãƒ•ァイルをインストー
- ルã—ã¾ã™ï¼Ž
-
- * <tt>${DESTDIR}${prefix}/bin</tt>
- * <tt>${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}</tt>
- * <tt>${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
- * <tt>${DESTDIR}${prefix}/lib</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/site_ruby</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/vendor_ruby</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}</tt>
- * <tt>${DESTDIR}${prefix}/lib/ruby/gems/${MAJOR}.${MINOR}.${TEENY}</tt>
- * <tt>${DESTDIR}${prefix}/share/man/man1</tt>
- * <tt>${DESTDIR}${prefix}/share/ri/${MAJOR}.${MINOR}.${TEENY}/system</tt>
-
- Rubyã®APIãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒ'_x.y.z_'ã§ã‚れã°ï¼Œ<tt>${MAJOR}</tt>ã¯
- '_x_'ã§ï¼Œ<tt>${MINOR}</tt>ã¯'_y_',<tt>${TEENY}</tt>ã¯'_z_'ã§ã™ï¼Ž
-
- <b>注æ„</b>: APIãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® +teeny+ ã¯ï¼ŒRubyプログラムã®ãƒãƒ¼ã‚¸ãƒ§
- ンã¨ã¯ç•°ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ï¼Ž
-
- +root+ ã§ä½œæ¥­ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“.
-
-ã‚‚ã—,コンパイル時ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«ã¯ã‚¨ãƒ©ãƒ¼ã®ãƒ­ã‚°ã¨ãƒž
-シン,OSã®ç¨®é¡žã‚’å«ã‚€ã§ãã‚‹ã ã‘詳ã—ã„レãƒãƒ¼ãƒˆã‚’作者ã«é€ã£ã¦ã
-ã ã•ã‚‹ã¨ä»–ã®æ–¹ã®ãŸã‚ã«ã‚‚ãªã‚Šã¾ã™ï¼Ž
-
-
-== ç§»æ¤
-
-UNIXã§ã‚れ㰠+configure+ ãŒã»ã¨ã‚“ã©ã®å·®ç•°ã‚’å¸åŽã—ã¦ãれるã¯ãšã§
-ã™ãŒï¼Œæ€ã‚ã¬è¦‹è½ã¨ã—ãŒã‚ã£ãŸå ´åˆ(ã‚ã‚‹ã«é•ã„ãªã„),作者ã«ãã®
-ã“ã¨ã‚’レãƒãƒ¼ãƒˆã™ã‚Œã°ï¼Œè§£æ±ºã§ãã‚‹ã‹ã‚‚知れã¾ã›ã‚“.
-
-アーキテクãƒãƒ£ã«ã‚‚ã£ã¨ã‚‚ä¾å­˜ã™ã‚‹ã®ã¯GC部ã§ã™ï¼ŽRubyã®GCã¯å¯¾è±¡
-ã®ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ãŒ<tt>setjmp()</tt>ã¾ãŸã¯<tt>getcontext()</tt>ã«ã‚ˆã£ã¦å…¨ã¦ã®ãƒ¬
-ジスタを +jmp_buf+ ã‚„ +ucontext_t+ ã«æ ¼ç´ã™ã‚‹ã“ã¨ã¨ï¼Œ +jmp_buf+ ã‚„
-+ucontext_t+ ã¨ã‚¹ã‚¿ãƒƒã‚¯ãŒ32bitアラインメントã•れã¦ã„ã‚‹ã“ã¨ã‚’仮定
-ã—ã¦ã„ã¾ã™ï¼Žç‰¹ã«å‰è€…ãŒæˆç«‹ã—ãªã„å ´åˆã®å¯¾å¿œã¯éžå¸¸ã«å›°é›£ã§ã—ょã†ï¼Ž
-後者ã®è§£æ±ºã¯æ¯”較的簡å˜ã§ï¼Œ +gc.c+ ã§ã‚¹ã‚¿ãƒƒã‚¯ã‚’マークã—ã¦ã„ã‚‹
-部分ã«ã‚¢ãƒ©ã‚¤ãƒ³ãƒ¡ãƒ³ãƒˆã®ãƒã‚¤ãƒˆæ•°ã ã‘ãšã‚‰ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’
-追加ã™ã‚‹ã ã‘ã§æ¸ˆã¿ã¾ã™ï¼Ž<tt>defined(\_\_mc68000\_\_)</tt>ã§æ‹¬ã‚‰ã‚Œã¦ã„
-る部分をå‚考ã«ã—ã¦ãã ã•ã„.
-
-レジスタウィンドウをæŒã¤CPUã§ã¯ï¼Œãƒ¬ã‚¸ã‚¹ã‚¿ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’スタッ
-クã«ãƒ•ラッシュã™ã‚‹ã‚¢ã‚»ãƒ³ãƒ–ラコードを追加ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚知
-れã¾ã›ã‚“.
-
-
-== é…布æ¡ä»¶
-
-+COPYING.ja+ ファイルをå‚ç…§ã—ã¦ãã ã•ã„。
-
-
-== 著者
-
-コメント,ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆãã®ä»–㯠mailto:matz@ruby-lang.org ã¾ã§ï¼Ž
--------------------------------------------------------
-created at: Thu Aug 3 11:57:36 JST 1995
---
-Local variables:
-mode: rdoc
-end:
diff --git a/README.ja.md b/README.ja.md
new file mode 100644
index 0000000000..1e9bae7e0c
--- /dev/null
+++ b/README.ja.md
@@ -0,0 +1,163 @@
+# Rubyã¨ã¯
+
+Rubyã¯ã‚·ãƒ³ãƒ—ルã‹ã¤å¼·åŠ›ãªã‚ªãƒ–ジェクト指å‘スクリプト言語ã§ã™ï¼Ž Rubyã¯ç´”粋ãªã‚ªãƒ–ジェクト指å‘言語ã¨ã—ã¦è¨­è¨ˆã•れã¦ã„ã‚‹ã®ã§ï¼Œ
+オブジェクト指å‘プログラミングを手軽ã«è¡Œã†äº‹ãŒå‡ºæ¥ã¾ã™ï¼Žã‚‚ã¡ã‚ã‚“æ™®é€šã®æ‰‹ç¶šãåž‹ã®ãƒ—ログラミングもå¯èƒ½ã§ã™ï¼Ž
+
+Rubyã¯ãƒ†ã‚­ã‚¹ãƒˆå‡¦ç†é–¢ä¿‚ã®èƒ½åŠ›ãªã©ã«å„ªã‚Œï¼ŒPerlã¨åŒã˜ãらã„強力ã§ã™ï¼Žã•らã«ã‚·ãƒ³ãƒ—ãƒ«ãªæ–‡æ³•ã¨ï¼Œ
+例外処ç†ã‚„イテレータãªã©ã®æ©Ÿæ§‹ã«ã‚ˆã£ã¦ï¼Œã‚ˆã‚Šåˆ†ã‹ã‚Šã‚„ã™ã„プログラミングãŒå‡ºæ¥ã¾ã™ï¼Ž
+
+## Rubyã®ç‰¹é•·
+
+* ã‚·ãƒ³ãƒ—ãƒ«ãªæ–‡æ³•
+* 普通ã®ã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆæŒ‡å‘æ©Ÿèƒ½(クラス,メソッドコールãªã©)
+* 特殊ãªã‚ªãƒ–ã‚¸ã‚§ã‚¯ãƒˆæŒ‡å‘æ©Ÿèƒ½(Mixin, 特異メソッドãªã©)
+* 演算å­ã‚ªãƒ¼ãƒãƒ¼ãƒ­ãƒ¼ãƒ‰
+* ä¾‹å¤–å‡¦ç†æ©Ÿèƒ½
+* イテレータã¨ã‚¯ãƒ­ãƒ¼ã‚¸ãƒ£
+* ガーベージコレクタ
+* ダイナミックローディング (アーキテクãƒãƒ£ã«ã‚ˆã‚‹)
+* ç§»æ¤æ€§ãŒé«˜ã„.多ãã®Unix-like/POSIX互æ›ãƒ—ラットフォーム上ã§å‹•ãã ã‘ã§ãªã,Windows, Mac OS
+ X,BeOSãªã©ã®ä¸Šã§ã‚‚å‹•ã cf.
+ http://bugs.ruby-lang.org/projects/ruby-trunk/wiki/SupportedPlatformsJa
+
+
+## 入手法
+
+### FTPã§
+
+以下ã®å ´æ‰€ã«ãŠã„ã¦ã‚りã¾ã™ï¼Ž
+
+ftp://ftp.ruby-lang.org/pub/ruby/
+
+### Subversionã§
+
+開発先端ã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã¯æ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ã§å–å¾—ã§ãã¾ã™ï¼Ž
+
+ $ svn co http://svn.ruby-lang.org/repos/ruby/trunk/ ruby
+
+ä»–ã«é–‹ç™ºä¸­ã®ãƒ–ランãƒã®ä¸€è¦§ã¯æ¬¡ã®ã‚³ãƒžãƒ³ãƒ‰ã§è¦‹ã‚‰ã‚Œã¾ã™ï¼Ž
+
+ $ svn ls http://svn.ruby-lang.org/repos/ruby/branches/
+
+### Gitã§
+
+Subversionã®ãƒŸãƒ©ãƒ¼ã‚’GitHubã«å…¬é–‹ã—ã¦ã„ã¾ã™ï¼Ž 以下ã®ã‚³ãƒžãƒ³ãƒ‰ã§ãƒªãƒã‚¸ãƒˆãƒªã‚’å–å¾—ã§ãã¾ã™ï¼Ž
+
+ $ git clone git://github.com/ruby/ruby.git
+
+## ホームページ
+
+Rubyã®ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ã®URLã¯
+
+http://www.ruby-lang.org/
+
+ã§ã™ï¼Ž
+
+## メーリングリスト
+
+Rubyã®ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆãŒã‚りã¾ã™ã€‚å‚åŠ å¸Œæœ›ã®æ–¹ã¯
+
+mailto:ruby-list-request@ruby-lang.org
+
+ã¾ã§æœ¬æ–‡ã«
+
+ subscribe
+
+ã¨æ›¸ã„ã¦é€ã£ã¦ä¸‹ã•ã„。
+
+Ruby開発者å‘ã‘メーリングリストもã‚りã¾ã™ã€‚ã“ã¡ã‚‰ã§ã¯rubyã®ãƒã‚°ã€å°†æ¥ã®ä»•様拡張ãªã©å®Ÿè£…上ã®å•題ã«ã¤ã„ã¦è­°è«–ã•れã¦ã„ã¾ã™ã€‚ å‚åŠ å¸Œæœ›ã®æ–¹ã¯
+
+mailto:ruby-dev-request@ruby-lang.org
+
+ã¾ã§ruby-listã¨åŒæ§˜ã®æ–¹æ³•ã§ãƒ¡ãƒ¼ãƒ«ã—ã¦ãã ã•ã„。
+
+Ruby拡張モジュールã«ã¤ã„ã¦è©±ã—åˆã†ruby-extãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã¨æ•°å­¦é–¢ä¿‚ã®è©±é¡Œã«ã¤ã„ã¦è©±ã—åˆã†ruby-mathメーリングリストã¨
+英語ã§rubyã«ã¤ã„ã¦è©±ã—åˆã†ruby-talkメーリングリストもã‚りã¾ã™ã€‚å‚加方法ã¯ã©ã‚Œã‚‚åŒã˜ã§ã™ã€‚
+
+## コンパイル・インストール
+
+ä»¥ä¸‹ã®æ‰‹é †ã§è¡Œã£ã¦ãã ã•ã„.
+
+1. ã‚‚ã— `configure` ファイルãŒè¦‹ã¤ã‹ã‚‰ãªã„ã€ã‚‚ã—ã㯠`configure.in` よりå¤ã„よã†ãªã‚‰ã€ `autoconf` を実行ã—ã¦
+ æ–°ã—ã `configure` を生æˆã™ã‚‹
+
+2. `configure` を実行ã—㦠`Makefile` ãªã©ã‚’生æˆã™ã‚‹
+
+ 環境ã«ã‚ˆã£ã¦ã¯ãƒ‡ãƒ•ォルトã®Cコンパイラ用オプションãŒä»˜ãã¾ã™ï¼Ž `configure` オプション㧠`optflags=..`
+ `warnflags=..` ç­‰ã§ä¸Šæ›¸ãã§ãã¾ã™ï¼Ž
+
+3. (å¿…è¦ãªã‚‰ã°)`defines.h` を編集ã™ã‚‹
+
+ 多分,必è¦ç„¡ã„ã¨æ€ã„ã¾ã™ï¼Ž
+
+4. (å¿…è¦ãªã‚‰ã°)`ext/Setup` ã«é™çš„ã«ãƒªãƒ³ã‚¯ã™ã‚‹æ‹¡å¼µãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’指定ã™ã‚‹
+
+ `ext/Setup` ã«è¨˜è¿°ã—ãŸãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã¯é™çš„ã«ãƒªãƒ³ã‚¯ã•れã¾ã™ï¼Ž
+
+ ダイナミックローディングをサãƒãƒ¼ãƒˆã—ã¦ã„ãªã„アーキテクãƒãƒ£ã§ã¯ `Setup` ã®1行目ã®ã€Œ`option nodynamic`ã€ã¨ã„ã†è¡Œã®ã‚³
+ メントを外ã™å¿…è¦ãŒã‚りã¾ã™ï¼Žã¾ãŸï¼Œã“ã®ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ã§æ‹¡å¼µãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’利用ã™ã‚‹ãŸã‚ã«ã¯ï¼Œã‚らã‹ã˜ã‚é™çš„ã«ãƒªãƒ³ã‚¯ã‚’ã—ã¦ãŠãå¿…è¦ãŒã‚りã¾ã™ï¼Ž
+
+5. `make` を実行ã—ã¦ã‚³ãƒ³ãƒ‘イルã™ã‚‹
+
+6. `make check`ã§ãƒ†ã‚¹ãƒˆã‚’行ã†ï¼Ž
+
+ 「`check succeeded`ã€ã¨è¡¨ç¤ºã•ã‚Œã‚Œã°æˆåŠŸã§ã™ï¼ŽãŸã ã—ãƒ†ã‚¹ãƒˆã«æˆåŠŸã—ã¦ã‚‚完璧ã ã¨ä¿è¨¼ã•れã¦ã„る訳ã§ã¯ã‚りã¾ã›ã‚“.
+
+7. `make install`
+
+ 以下ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’作ã£ã¦ï¼Œãã“ã«ãƒ•ァイルをインストー ルã—ã¾ã™ï¼Ž
+
+ * `${DESTDIR}${prefix}/bin`
+ * `${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}`
+ * `${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}/${PLATFOR
+ M}`
+ * `${DESTDIR}${prefix}/lib`
+ * `${DESTDIR}${prefix}/lib/ruby`
+ * `${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}`
+ * `${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}`
+ * `${DESTDIR}${prefix}/lib/ruby/site_ruby`
+ * `${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}`
+ * `${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}/${P
+ LATFORM}`
+ * `${DESTDIR}${prefix}/lib/ruby/vendor_ruby`
+ * `${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}`
+ * `${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}/$
+ {PLATFORM}`
+ * `${DESTDIR}${prefix}/lib/ruby/gems/${MAJOR}.${MINOR}.${TEENY}`
+ * `${DESTDIR}${prefix}/share/man/man1`
+ * `${DESTDIR}${prefix}/share/ri/${MAJOR}.${MINOR}.${TEENY}/system`
+
+
+ Rubyã®APIãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒ'*x.y.z*'ã§ã‚れã°ï¼Œ`${MAJOR}`ã¯
+ '*x*'ã§ï¼Œ`${MINOR}`ã¯'*y*',`${TEENY}`ã¯'*z*'ã§ã™ï¼Ž
+
+ **注æ„**: APIãƒãƒ¼ã‚¸ãƒ§ãƒ³ã® `teeny` ã¯ï¼ŒRubyプログラムã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨ã¯ç•°ãªã‚‹ã“ã¨ãŒã‚りã¾ã™ï¼Ž
+
+ `root` ã§ä½œæ¥­ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“.
+
+
+ã‚‚ã—,コンパイル時ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ãŸå ´åˆã«ã¯ã‚¨ãƒ©ãƒ¼ã®ãƒ­ã‚°ã¨ãƒžã‚·ãƒ³ï¼ŒOSã®ç¨®é¡žã‚’å«ã‚€ã§ãã‚‹ã ã‘詳ã—ã„レãƒãƒ¼ãƒˆã‚’作者ã«é€ã£ã¦ä¸‹ã•ã‚‹ã¨ä»–ã®æ–¹ã®ãŸã‚ã«ã‚‚ãªã‚Šã¾ã™ï¼Ž
+
+## ç§»æ¤
+
+UNIXã§ã‚れ㰠`configure` ãŒã»ã¨ã‚“ã©ã®å·®ç•°ã‚’å¸åŽã—ã¦ãれるã¯ãšã§ã™ãŒï¼Œæ€ã‚ã¬è¦‹è½ã¨ã—ãŒã‚ã£ãŸå ´åˆ(ã‚る事ãŒå¤šã„),作者ã«ãã®
+ã“ã¨ã‚’報告ã™ã‚Œã°ï¼Œè§£æ±ºã§ãã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ï¼Ž
+
+アーキテクãƒãƒ£ã«ã‚‚ã£ã¨ã‚‚ä¾å­˜ã™ã‚‹ã®ã¯GC部ã§ã™ï¼ŽRubyã®GCã¯å¯¾è±¡
+ã®ã‚¢ãƒ¼ã‚­ãƒ†ã‚¯ãƒãƒ£ãŒ`setjmp()`ã¾ãŸã¯`getcontext()`ã«ã‚ˆã£ã¦å…¨ã¦ã®ãƒ¬ã‚¸ã‚¹ã‚¿ã‚’ `jmp_buf` ã‚„ `ucontext_t`
+ã«æ ¼ç´ã™ã‚‹ã“ã¨ã¨ï¼Œ `jmp_buf` ã‚„ `ucontext_t` ã¨ã‚¹ã‚¿ãƒƒã‚¯ãŒ32bitアラインメントã•れã¦ã„ã‚‹ã“ã¨ã‚’仮定
+ã—ã¦ã„ã¾ã™ï¼Žç‰¹ã«å‰è€…ãŒæˆç«‹ã—ãªã„å ´åˆã®å¯¾å¿œã¯éžå¸¸ã«å›°é›£ã§ã—ょã†ï¼Ž 後者ã®è§£æ±ºã¯æ¯”較的簡å˜ã§ï¼Œ `gc.c` ã§ã‚¹ã‚¿ãƒƒã‚¯ã‚’マークã—ã¦ã„ã‚‹
+部分ã«ã‚¢ãƒ©ã‚¤ãƒ³ãƒ¡ãƒ³ãƒˆã®ãƒã‚¤ãƒˆæ•°ã ã‘ãšã‚‰ã—ã¦ãƒžãƒ¼ã‚¯ã™ã‚‹ã‚³ãƒ¼ãƒ‰ã‚’追加ã™ã‚‹ã ã‘ã§æ¸ˆã¿ã¾ã™ï¼Ž`defined(_\*mc68000*\_)`ã§æ‹¬ã‚‰ã‚Œã¦ã„
+る部分をå‚考ã«ã—ã¦ãã ã•ã„.
+
+レジスタウィンドウをæŒã¤CPUã§ã¯ï¼Œãƒ¬ã‚¸ã‚¹ã‚¿ã‚¦ã‚£ãƒ³ãƒ‰ã‚¦ã‚’スタックã«ãƒ•ラッシュã™ã‚‹ã‚¢ã‚»ãƒ³ãƒ–ラコードを追加ã™ã‚‹å¿…è¦ãŒã‚ã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“.
+
+## é…布æ¡ä»¶
+
+`COPYING.ja` ファイルをå‚ç…§ã—ã¦ãã ã•ã„。
+
+## 著者
+
+コメント,ãƒã‚°ãƒ¬ãƒãƒ¼ãƒˆãã®ä»–㯠mailto:matz@ruby-lang.org ã¾ã§ï¼Ž
+---
+created at: Thu Aug 3 11:57:36 JST 1995
diff --git a/README.md b/README.md
new file mode 100644
index 0000000000..c6498a8cca
--- /dev/null
+++ b/README.md
@@ -0,0 +1,161 @@
+# 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
+extensible.
+
+## Features of Ruby
+
+* Simple Syntax
+* **Normal** Object-Oriented features(ex. class, method calls)
+* **Advanced** Object-Oriented features(ex. Mix-in, Singleton-method)
+* Operator Overloading
+* Exception Handling
+* Iterators and Closures
+* Garbage Collection
+* Dynamic Loading of Object files(on some architecture)
+* Highly Portable (works on many Unix-like/POSIX compatible platforms as
+ well as Windows, Mac OS X, BeOS etc.) cf.
+ http://bugs.ruby-lang.org/projects/ruby-trunk/wiki/SupportedPlatforms
+
+
+## How to get Ruby
+
+For a complete list of ways to install Ruby, including using third party tools
+like rvm, see:
+
+http://www.ruby-lang.org/en/downloads/
+
+The Ruby distribution files can be found in 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 http://svn.ruby-lang.org/repos/ruby/trunk/ ruby
+
+Or if you are using git then use the following command:
+
+ $ git clone git://github.com/ruby/ruby.git
+
+There are some other branches under development. Try the following command
+and see the list of 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 git://github.com/ruby/ruby.git
+
+## Ruby home-page
+
+The URL of the Ruby home-page is:
+
+http://www.ruby-lang.org/
+
+## Mailing list
+
+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
+<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 instead of this document.
+
+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
+ override them.
+
+4. Edit `defines.h` if you need. Usually this step will not be needed.
+
+5. Remove comment mark(`#`) before the module names from `ext/Setup` (or add
+ module names if not present), if you want to link modules statically.
+
+ If you don't want to compile non static extension modules (probably on
+ architectures which do not allow dynamic loading), remove comment mark
+ from the line "`#option nodynamic`" in `ext/Setup`.
+
+ Usually this step will not be needed.
+
+6. Run `make`.
+
+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. Run '`make install`'
+
+ This command will create following directories and install files onto
+ them.
+
+ * `${DESTDIR}${prefix}/bin`
+ * `${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}`
+ * `${DESTDIR}${prefix}/include/ruby-${MAJOR}.${MINOR}.${TEENY}/${PLATFOR
+ M}`
+ * `${DESTDIR}${prefix}/lib`
+ * `${DESTDIR}${prefix}/lib/ruby`
+ * `${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}`
+ * `${DESTDIR}${prefix}/lib/ruby/${MAJOR}.${MINOR}.${TEENY}/${PLATFORM}`
+ * `${DESTDIR}${prefix}/lib/ruby/site_ruby`
+ * `${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}`
+ * `${DESTDIR}${prefix}/lib/ruby/site_ruby/${MAJOR}.${MINOR}.${TEENY}/${P
+ LATFORM}`
+ * `${DESTDIR}${prefix}/lib/ruby/vendor_ruby`
+ * `${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}`
+ * `${DESTDIR}${prefix}/lib/ruby/vendor_ruby/${MAJOR}.${MINOR}.${TEENY}/$
+ {PLATFORM}`
+ * `${DESTDIR}${prefix}/lib/ruby/gems/${MAJOR}.${MINOR}.${TEENY}`
+ * `${DESTDIR}${prefix}/share/man/man1`
+ * `${DESTDIR}${prefix}/share/ri/${MAJOR}.${MINOR}.${TEENY}/system`
+
+
+ If Ruby's API version is '*x.y.z*', the `${MAJOR}` is '*x*', the
+ `${MINOR}` is '*y*', and the `${TEENY}` is '*z*'.
+
+ **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.
+
+
+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
+external libraries and/or headers, then you will need to run '`make
+distclean-ext`' to remove old configuration after installing them in such
+case.
+
+## Copying
+
+See the file `COPYING`.
+
+## Feedback
+
+Questions about the Ruby language can be asked on the Ruby-Talk mailing list
+(http://www.ruby-lang.org/en/community/mailing-lists) or on websites like
+(http://stackoverflow.com).
+
+Bug reports should be filed at http://bugs.ruby-lang.org
+
+## The Author
+
+Ruby was originally designed and developed by Yukihiro Matsumoto (Matz) in
+1995.
+
+<mailto:matz@ruby-lang.org>
diff --git a/addr2line.c b/addr2line.c
index f936694724..c8faf48d62 100644
--- a/addr2line.c
+++ b/addr2line.c
@@ -55,11 +55,8 @@ void *alloca();
# endif /* HAVE_ALLOCA_H */
#endif /* __GNUC__ */
-#ifdef HAVE_DL_ITERATE_PHDR
-# ifndef _GNU_SOURCE
-# define _GNU_SOURCE
-# endif
-# include <link.h>
+#ifdef HAVE_DLADDR
+# include <dlfcn.h>
#endif
#define DW_LNS_copy 0x01
@@ -88,6 +85,13 @@ void *alloca();
# define ElfW(x) Elf32##_##x
# endif
#endif
+#ifndef ELF_ST_TYPE
+# if SIZEOF_VOIDP == 8
+# define ELF_ST_TYPE ELF64_ST_TYPE
+# else
+# define ELF_ST_TYPE ELF32_ST_TYPE
+# endif
+#endif
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
@@ -97,13 +101,22 @@ int kprintf(const char *fmt, ...);
typedef struct {
const char *dirname;
const char *filename;
+ const char *path; /* object path */
int line;
+ uintptr_t base_addr;
+ uintptr_t saddr;
+ const char *sname; /* function name */
+} line_info_t;
+typedef struct obj_info obj_info_t;
+struct obj_info {
+ const char *path; /* object path */
int fd;
void *mapped;
size_t mapped_size;
- unsigned long base_addr;
-} line_info_t;
+ uintptr_t base_addr;
+ obj_info_t *next;
+};
/* Avoid consuming stack as this module may be used from signal handler */
static char binary_filename[PATH_MAX];
@@ -196,34 +209,15 @@ fill_filename(int file, char *include_directories, char *filenames,
}
}
-static int
-get_path_from_symbol(const char *symbol, const char **p, size_t *len)
-{
- if (symbol[0] == '0') {
- /* libexecinfo */
- *p = strchr(symbol, '/');
- if (*p == NULL) return 0;
- *len = strlen(*p);
- }
- else {
- /* glibc */
- const char *q;
- *p = symbol;
- q = strchr(symbol, '(');
- if (q == NULL) return 0;
- *len = q - symbol;
- }
- return 1;
-}
-
static void
-fill_line(int num_traces, void **traces,
- unsigned long addr, int file, int line,
- char *include_directories, char *filenames, line_info_t *lines)
+fill_line(int num_traces, void **traces, uintptr_t addr, int file, int line,
+ char *include_directories, char *filenames,
+ obj_info_t *obj, line_info_t *lines, int offset)
{
int i;
- for (i = 0; i < num_traces; i++) {
- unsigned long a = (unsigned long)traces[i] - lines[i].base_addr;
+ 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) {
@@ -234,8 +228,8 @@ fill_line(int num_traces, void **traces,
}
static void
-parse_debug_line_cu(int num_traces, void **traces,
- char **debug_line, line_info_t *lines)
+parse_debug_line_cu(int num_traces, void **traces, char **debug_line,
+ obj_info_t *obj, line_info_t *lines, int offset)
{
char *p, *cu_end, *cu_start, *include_directories, *filenames;
unsigned long unit_length;
@@ -281,7 +275,7 @@ parse_debug_line_cu(int num_traces, void **traces,
is_stmt = default_is_stmt = *(unsigned char *)p;
p++;
- line_base = *(char *)p;
+ line_base = *(signed char *)p;
p++;
line_range = *(unsigned char *)p;
@@ -309,7 +303,8 @@ parse_debug_line_cu(int num_traces, void **traces,
#define FILL_LINE() \
do { \
fill_line(num_traces, traces, addr, file, line, \
- include_directories, filenames, lines); \
+ include_directories, filenames, \
+ obj, lines, offset); \
/*basic_block = prologue_end = epilogue_begin = 0;*/ \
} while (0)
@@ -408,11 +403,12 @@ parse_debug_line_cu(int num_traces, void **traces,
static void
parse_debug_line(int num_traces, void **traces,
- char *debug_line, unsigned long size, line_info_t *lines)
+ 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) {
- parse_debug_line_cu(num_traces, traces, &debug_line, lines);
+ 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",
@@ -421,19 +417,27 @@ parse_debug_line(int num_traces, void **traces,
}
/* 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);
+
static void
-fill_lines(int num_traces, void **traces, char **syms, int check_debuglink,
- line_info_t *current_line, line_info_t *lines);
+append_obj(obj_info_t **objp) {
+ obj_info_t *newobj = calloc(1, sizeof(obj_info_t));
+ if (*objp) (*objp)->next = newobj;
+ *objp = newobj;
+}
static void
-follow_debuglink(char *debuglink, int num_traces, void **traces, char **syms,
- line_info_t *current_line, line_info_t *lines)
+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";
char *p, *subdir;
+ obj_info_t *o1 = *objp, *o2;
p = strrchr(binary_filename, '/');
if (!p) {
@@ -444,22 +448,22 @@ follow_debuglink(char *debuglink, int num_traces, void **traces, char **syms,
subdir = (char *)alloca(strlen(binary_filename) + 1);
strcpy(subdir, binary_filename);
strcpy(binary_filename, global_debug_dir);
- strncat(binary_filename, subdir,
- PATH_MAX - strlen(binary_filename) - 1);
- strncat(binary_filename, debuglink,
- PATH_MAX - strlen(binary_filename) - 1);
-
- munmap(current_line->mapped, current_line->mapped_size);
- close(current_line->fd);
- fill_lines(num_traces, traces, syms, 0, current_line, lines);
+ strlcat(binary_filename, subdir, PATH_MAX);
+ strlcat(binary_filename, debuglink, PATH_MAX);
+
+ append_obj(objp);
+ o2 = *objp;
+ o2->base_addr = o1->base_addr;
+ o2->path = o1->path;
+ fill_lines(num_traces, traces, 0, objp, lines, offset);
}
/* read file and fill lines */
-static void
-fill_lines(int num_traces, void **traces, char **syms, int check_debuglink,
- line_info_t *current_line, line_info_t *lines)
+static uintptr_t
+fill_lines(int num_traces, void **traces, int check_debuglink,
+ obj_info_t **objp, line_info_t *lines, int offset)
{
- int i;
+ int i, j;
char *shstr;
char *section_name;
ElfW(Ehdr) *ehdr;
@@ -468,23 +472,27 @@ fill_lines(int num_traces, void **traces, char **syms, int check_debuglink,
int fd;
off_t filesize;
char *file;
+ ElfW(Shdr) *symtab_shdr = NULL, *strtab_shdr = NULL;
+ ElfW(Shdr) *dynsym_shdr = NULL, *dynstr_shdr = NULL;
+ obj_info_t *obj = *objp;
+ uintptr_t dladdr_fbase = 0;
fd = open(binary_filename, O_RDONLY);
if (fd < 0) {
- return;
+ goto fail;
}
filesize = lseek(fd, 0, SEEK_END);
if (filesize < 0) {
int e = errno;
close(fd);
kprintf("lseek: %s\n", strerror(e));
- return;
+ 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);
- return;
+ goto fail;
}
#endif
lseek(fd, 0, SEEK_SET);
@@ -494,7 +502,7 @@ fill_lines(int num_traces, void **traces, char **syms, int check_debuglink,
int e = errno;
close(fd);
kprintf("mmap: %s\n", strerror(e));
- return;
+ goto fail;
}
ehdr = (ElfW(Ehdr) *)file;
@@ -504,21 +512,12 @@ fill_lines(int num_traces, void **traces, char **syms, int check_debuglink,
* it match non-elf file.
*/
close(fd);
- return;
+ goto fail;
}
- current_line->fd = fd;
- current_line->mapped = file;
- current_line->mapped_size = (size_t)filesize;
-
- for (i = 0; i < num_traces; i++) {
- const char *path;
- size_t len;
- if (get_path_from_symbol(syms[i], &path, &len) &&
- !strncmp(path, binary_filename, len)) {
- lines[i].line = -1;
- }
- }
+ obj->fd = fd;
+ obj->mapped = file;
+ obj->mapped_size = (size_t)filesize;
shdr = (ElfW(Shdr) *)(file + ehdr->e_shoff);
@@ -527,11 +526,88 @@ fill_lines(int num_traces, void **traces, char **syms, int check_debuglink,
for (i = 0; i < ehdr->e_shnum; i++) {
section_name = shstr + shdr[i].sh_name;
- if (!strcmp(section_name, ".debug_line")) {
- debug_line_shdr = shdr + i;
+ switch (shdr[i].sh_type) {
+ case SHT_STRTAB:
+ if (!strcmp(section_name, ".strtab")) {
+ strtab_shdr = shdr + i;
+ }
+ else if (!strcmp(section_name, ".dynstr")) {
+ dynstr_shdr = shdr + i;
+ }
+ break;
+ case SHT_SYMTAB:
+ /* if (!strcmp(section_name, ".symtab")) */
+ symtab_shdr = shdr + i;
+ break;
+ case SHT_DYNSYM:
+ /* if (!strcmp(section_name, ".dynsym")) */
+ dynsym_shdr = shdr + i;
break;
- } else if (!strcmp(section_name, ".gnu_debuglink")) {
- gnu_debuglink_shdr = shdr + i;
+ case SHT_PROGBITS:
+ if (!strcmp(section_name, ".debug_line")) {
+ debug_line_shdr = shdr + i;
+ }
+ else if (!strcmp(section_name, ".gnu_debuglink")) {
+ gnu_debuglink_shdr = shdr + i;
+ }
+ break;
+ }
+ }
+
+ if (offset == -1) {
+ /* main executable */
+ offset = 0;
+ if (dynsym_shdr && dynstr_shdr) {
+ 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)));
+ 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;
+ }
+ else {
+ /* PIE (position-independent executable) */
+ obj->base_addr = dladdr_fbase;
+ }
+ }
+ }
+
+ 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;
+ }
}
}
@@ -540,111 +616,161 @@ fill_lines(int num_traces, void **traces, char **syms, int check_debuglink,
let's check .gnu_debuglink section instead. */
if (gnu_debuglink_shdr && check_debuglink) {
follow_debuglink(file + gnu_debuglink_shdr->sh_offset,
- num_traces, traces, syms,
- current_line, lines);
+ num_traces, traces,
+ objp, lines, offset);
}
- return;
+ goto finish;
}
parse_debug_line(num_traces, traces,
file + debug_line_shdr->sh_offset,
debug_line_shdr->sh_size,
- lines);
+ obj, lines, offset);
+finish:
+ return dladdr_fbase;
+fail:
+ return (uintptr_t)-1;
}
-#ifdef HAVE_DL_ITERATE_PHDR
-
-typedef struct {
- int num_traces;
- char **syms;
- line_info_t *lines;
-} fill_base_addr_state_t;
-
-static int
-fill_base_addr(struct dl_phdr_info *info, size_t size, void *data)
+#define HAVE_MAIN_EXE_PATH
+#if defined(__FreeBSD__)
+# include <sys/sysctl.h>
+#endif
+/* ssize_t main_exe_path(void)
+ *
+ * store the path of the main executable to `binary_filename`,
+ * and returns strlen(binary_filename).
+ * it is NUL terminated.
+ */
+#if defined(__linux__)
+ssize_t
+main_exe_path(void)
{
- int i;
- fill_base_addr_state_t *st = (fill_base_addr_state_t *)data;
- for (i = 0; i < st->num_traces; i++) {
- const char *path;
- size_t len;
- size_t name_len = strlen(info->dlpi_name);
-
- if (get_path_from_symbol(st->syms[i], &path, &len) &&
- (len == name_len || (len > name_len && path[len-name_len-1] == '/')) &&
- !strncmp(path+len-name_len, info->dlpi_name, name_len)) {
- st->lines[i].base_addr = info->dlpi_addr;
- }
+# define PROC_SELF_EXE "/proc/self/exe"
+ ssize_t len = readlink(PROC_SELF_EXE, binary_filename, PATH_MAX);
+ binary_filename[len] = 0;
+ return len;
+}
+#elif defined(__FreeBSD__)
+ssize_t
+main_exe_path(void)
+{
+ int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
+ size_t len = PATH_MAX;
+ int err = sysctl(mib, 4, binary_filename, &len, NULL, 0);
+ if (err) {
+ kprintf("Can't get the path of ruby");
+ return -1;
}
- return 0;
+ len--; /* sysctl sets strlen+1 */
+ return len;
}
-
-#endif /* HAVE_DL_ITERATE_PHDR */
+#else
+#undef HAVE_MAIN_EXE_PATH
+#endif
void
-rb_dump_backtrace_with_lines(int num_traces, void **trace, char **syms)
+rb_dump_backtrace_with_lines(int num_traces, void **traces)
{
int i;
/* async-signal unsafe */
- line_info_t *lines = (line_info_t *)calloc(num_traces,
- sizeof(line_info_t));
-
- /* Note that line info of shared objects might not be shown
- if we don't have dl_iterate_phdr */
-#ifdef HAVE_DL_ITERATE_PHDR
- fill_base_addr_state_t fill_base_addr_state;
-
- fill_base_addr_state.num_traces = num_traces;
- fill_base_addr_state.syms = syms;
- fill_base_addr_state.lines = lines;
- /* maybe async-signal unsafe */
- dl_iterate_phdr(fill_base_addr, &fill_base_addr_state);
-#endif /* HAVE_DL_ITERATE_PHDR */
-
- for (i = 0; i < num_traces; i++) {
- const char *path;
- size_t len;
- if (lines[i].line) {
- continue;
- }
-
- if (!get_path_from_symbol(syms[i], &path, &len)) {
- continue;
+ line_info_t *lines = (line_info_t *)calloc(num_traces, sizeof(line_info_t));
+ obj_info_t *obj = NULL;
+ /* 2 is NULL + main executable */
+ void **dladdr_fbases = (void **)calloc(num_traces+2, sizeof(void *));
+#ifdef HAVE_MAIN_EXE_PATH
+ char *main_path = NULL; /* used on printing backtrace */
+ ssize_t len;
+ if ((len = main_exe_path()) > 0) {
+ main_path = (char *)alloca(len + 1);
+ if (main_path) {
+ uintptr_t addr;
+ memcpy(main_path, binary_filename, len+1);
+ append_obj(&obj);
+ obj->path = main_path;
+ addr = fill_lines(num_traces, traces, 1, &obj, lines, -1);
+ if (addr != (uintptr_t)-1) {
+ dladdr_fbases[0] = (void *)addr;
+ }
}
-
- strncpy(binary_filename, path, len);
- binary_filename[len] = '\0';
-
- fill_lines(num_traces, trace, syms, 1, &lines[i], lines);
}
+#endif
+ /* fill source lines by reading dwarf */
for (i = 0; i < num_traces; i++) {
- line_info_t *line = &lines[i];
-
- if (line->line > 0) {
- if (line->filename) {
- if (line->dirname && line->dirname[0]) {
- kprintf("%s %s/%s:%d\n", syms[i], line->dirname, line->filename, line->line);
+ Dl_info info;
+ if (lines[i].line) continue;
+ if (dladdr(traces[i], &info)) {
+ const char *path;
+ void **p;
+
+ /* skip symbols which is in already checked objects */
+ /* if the binary is strip-ed, this may effect */
+ for (p=dladdr_fbases; *p; p++) {
+ if (*p == info.dli_fbase) {
+ lines[i].path = info.dli_fname;
+ lines[i].sname = info.dli_sname;
+ goto next_line;
}
- else {
- kprintf("%s %s:%d\n", syms[i], line->filename, line->line);
- }
- } else {
- kprintf("%s ???:%d\n", syms[i], line->line);
}
- } else {
- kprintf("%s\n", syms[i]);
+ *p = info.dli_fbase;
+
+ append_obj(&obj);
+ obj->base_addr = (uintptr_t)info.dli_fbase;
+ path = info.dli_fname;
+ obj->path = path;
+ lines[i].path = path;
+ strcpy(binary_filename, path);
+ fill_lines(num_traces, traces, 1, &obj, lines, i);
}
+next_line:
+ continue;
}
+ /* output */
for (i = 0; i < num_traces; i++) {
line_info_t *line = &lines[i];
- if (line->fd) {
- munmap(line->mapped, line->mapped_size);
- close(line->fd);
+ 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 (line->sname && strcmp("main", line->sname) == 0)
+ break;
+ }
+
+ /* free */
+ while (obj) {
+ obj_info_t *o = obj;
+ obj = o->next;
+ if (o->fd) {
+ munmap(o->mapped, o->mapped_size);
+ close(o->fd);
}
+ free(o);
}
free(lines);
+ free(dladdr_fbases);
}
/* From FreeBSD's lib/libstand/printf.c */
diff --git a/addr2line.h b/addr2line.h
index 3782d89e07..d99f010934 100644
--- a/addr2line.h
+++ b/addr2line.h
@@ -14,7 +14,7 @@
#ifdef USE_ELF
void
-rb_dump_backtrace_with_lines(int num_traces, void **traces, char **syms);
+rb_dump_backtrace_with_lines(int num_traces, void **traces);
#endif /* USE_ELF */
diff --git a/array.c b/array.c
index 7760e3313e..6b551dbe24 100644
--- a/array.c
+++ b/array.c
@@ -31,70 +31,6 @@ static ID id_cmp, id_div, id_power;
#define ARY_DEFAULT_SIZE 16
#define ARY_MAX_SIZE (LONG_MAX / (int)sizeof(VALUE))
-void
-rb_mem_clear(register VALUE *mem, register long size)
-{
- while (size--) {
- *mem++ = Qnil;
- }
-}
-
-static void
-ary_mem_clear(VALUE ary, long beg, long size)
-{
- RARRAY_PTR_USE(ary, ptr, {
- rb_mem_clear(ptr + beg, size);
- });
-}
-
-static inline void
-memfill(register VALUE *mem, register long size, register VALUE val)
-{
- while (size--) {
- *mem++ = val;
- }
-}
-
-static void
-ary_memfill(VALUE ary, long beg, long size, VALUE val)
-{
- RARRAY_PTR_USE(ary, ptr, {
- memfill(ptr + beg, size, val);
- RB_OBJ_WRITTEN(ary, Qundef, val);
- });
-}
-
-static void
-ary_memcpy(VALUE ary, long beg, long argc, const VALUE *argv)
-{
-#if 1
- if (OBJ_PROMOTED(ary)) {
- if (argc > (int)(128/sizeof(VALUE)) /* is magic number (cache line size) */) {
- rb_gc_writebarrier_remember_promoted(ary);
- RARRAY_PTR_USE(ary, ptr, {
- MEMCPY(ptr+beg, argv, VALUE, argc);
- });
- }
- else {
- int i;
- RARRAY_PTR_USE(ary, ptr, {
- for (i=0; i<argc; i++) {
- RB_OBJ_WRITE(ary, &ptr[i+beg], argv[i]);
- }
- });
- }
- }
- else {
- RARRAY_PTR_USE(ary, ptr, {
- MEMCPY(ptr+beg, argv, VALUE, argc);
- });
- }
-#else
- /* giveup write barrier (traditional way) */
- MEMCPY(RARRAY_PTR(ary)+beg, argv, VALUE, argc);
-#endif
-}
-
# define ARY_SHARED_P(ary) \
(assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
FL_TEST((ary),ELTS_SHARED)!=0)
@@ -195,6 +131,74 @@ ary_memcpy(VALUE ary, long beg, long argc, const VALUE *argv)
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))
+
+void
+rb_mem_clear(register VALUE *mem, register long size)
+{
+ while (size--) {
+ *mem++ = Qnil;
+ }
+}
+
+static void
+ary_mem_clear(VALUE ary, long beg, long size)
+{
+ RARRAY_PTR_USE(ary, ptr, {
+ rb_mem_clear(ptr + beg, size);
+ });
+}
+
+static inline void
+memfill(register VALUE *mem, register long size, register VALUE val)
+{
+ while (size--) {
+ *mem++ = val;
+ }
+}
+
+static void
+ary_memfill(VALUE ary, long beg, long size, VALUE val)
+{
+ RARRAY_PTR_USE(ary, ptr, {
+ memfill(ptr + beg, size, val);
+ RB_OBJ_WRITTEN(ary, Qundef, 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(ary, ptr, {
+ MEMCPY(ptr+beg, argv, VALUE, argc);
+ });
+ }
+ else {
+ 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
+ary_memcpy(VALUE ary, long beg, long argc, const VALUE *argv)
+{
+ ary_memcpy0(ary, beg, argc, argv, ary);
+}
+
static void
ary_resize_capa(VALUE ary, long capacity)
{
@@ -344,14 +348,11 @@ rb_ary_modify(VALUE ary)
ARY_SET_PTR(ary, ptr);
}
- /* TODO: age2 promotion, OBJ_PROMOTED() checks not infant. */
- if (OBJ_PROMOTED(ary) && !OBJ_PROMOTED(shared)) {
- rb_gc_writebarrier_remember_promoted(ary);
- }
+ rb_gc_writebarrier_remember(ary);
}
}
-static void
+static VALUE
ary_ensure_room_for_push(VALUE ary, long add_len)
{
long new_len = RARRAY_LEN(ary) + add_len;
@@ -363,6 +364,7 @@ ary_ensure_room_for_push(VALUE ary, long add_len)
if (ARY_SHARED_OCCUPIED(shared)) {
if (RARRAY_CONST_PTR(ary) - RARRAY_CONST_PTR(shared) + new_len <= RARRAY_LEN(shared)) {
rb_ary_modify_check(ary);
+ return shared;
}
else {
/* if array is shared, then it is likely it participate in push/shift pattern */
@@ -371,8 +373,8 @@ ary_ensure_room_for_push(VALUE ary, long add_len)
if (new_len > capa - (capa >> 6)) {
ary_double_capa(ary, new_len);
}
+ return ary;
}
- return;
}
}
}
@@ -381,6 +383,8 @@ ary_ensure_room_for_push(VALUE ary, long add_len)
if (new_len > capa) {
ary_double_capa(ary, new_len);
}
+
+ return ary;
}
/*
@@ -508,7 +512,7 @@ rb_ary_new_from_args(long n, ...)
va_start(ar, n);
for (i=0; i<n; i++) {
- RARRAY_ASET(ary, i, va_arg(ar, VALUE));
+ ARY_SET(ary, i, va_arg(ar, VALUE));
}
va_end(ar);
@@ -536,6 +540,15 @@ rb_ary_tmp_new(long capa)
return ary_new(0, capa);
}
+VALUE
+rb_ary_tmp_new_fill(long capa)
+{
+ VALUE ary = ary_new(0, capa);
+ ary_memfill(ary, 0, capa, Qnil);
+ ARY_SET_LEN(ary, capa);
+ return ary;
+}
+
void
rb_ary_free(VALUE ary)
{
@@ -581,7 +594,7 @@ ary_make_shared(VALUE ary)
}
else {
long capa = ARY_CAPA(ary), len = RARRAY_LEN(ary);
- NEWOBJ_OF(shared, struct RArray, 0, T_ARRAY); /* keep shared ary as non-WB-protected */
+ NEWOBJ_OF(shared, struct RArray, 0, T_ARRAY | (RGENGC_WB_PROTECTED_ARRAY ? FL_WB_PROTECTED : 0));
FL_UNSET_EMBED(shared);
ARY_SET_LEN((VALUE)shared, capa);
@@ -657,16 +670,16 @@ rb_ary_s_try_convert(VALUE dummy, VALUE ary)
/*
* call-seq:
- * Array.new(size=0, obj=nil)
+ * Array.new(size=0, default=nil)
* Array.new(array)
* Array.new(size) {|index| block }
*
* Returns a new array.
*
* In the first form, if no arguments are sent, the new array will be empty.
- * When a +size+ and an optional +obj+ are sent, an array is created with
- * +size+ copies of +obj+. Take notice that all elements will reference the
- * same object +obj+.
+ * When a +size+ and an optional +default+ are sent, an array is created with
+ * +size+ copies of +default+. Take notice that all elements will reference the
+ * same object +default+.
*
* The second form creates a copy of the array passed as a parameter (the
* array is generated by calling to_ary on the parameter).
@@ -740,12 +753,14 @@ rb_ary_initialize(int argc, VALUE *argv, VALUE ary)
}
len = NUM2LONG(size);
+ /* NUM2LONG() may call size.to_int, ary can be frozen, modified, etc */
if (len < 0) {
rb_raise(rb_eArgError, "negative array size");
}
if (len > ARY_MAX_SIZE) {
rb_raise(rb_eArgError, "array size too big");
}
+ /* recheck after argument conversion */
rb_ary_modify(ary);
ary_resize_capa(ary, len);
if (rb_block_given_p()) {
@@ -813,7 +828,7 @@ rb_ary_store(VALUE ary, long idx, VALUE val)
if (idx >= len) {
ARY_SET_LEN(ary, idx + 1);
}
- RARRAY_ASET(ary, idx, val);
+ ARY_SET(ary, idx, val);
}
static VALUE
@@ -857,7 +872,7 @@ enum ary_take_pos_flags
};
static VALUE
-ary_take_first_or_last(int argc, VALUE *argv, VALUE ary, enum ary_take_pos_flags last)
+ary_take_first_or_last(int argc, const VALUE *argv, VALUE ary, enum ary_take_pos_flags last)
{
VALUE nv;
long n;
@@ -896,20 +911,20 @@ VALUE
rb_ary_push(VALUE ary, VALUE item)
{
long idx = RARRAY_LEN(ary);
-
- ary_ensure_room_for_push(ary, 1);
- RARRAY_ASET(ary, idx, item);
+ VALUE target_ary = ary_ensure_room_for_push(ary, 1);
+ RARRAY_PTR_USE(ary, ptr, {
+ RB_OBJ_WRITE(target_ary, &ptr[idx], item);
+ });
ARY_SET_LEN(ary, idx + 1);
return ary;
}
VALUE
-rb_ary_cat(VALUE ary, const VALUE *ptr, long len)
+rb_ary_cat(VALUE ary, const VALUE *argv, long len)
{
long oldlen = RARRAY_LEN(ary);
-
- ary_ensure_room_for_push(ary, len);
- ary_memcpy(ary, oldlen, len, ptr);
+ VALUE target_ary = ary_ensure_room_for_push(ary, len);
+ ary_memcpy0(ary, oldlen, len, argv, target_ary);
ARY_SET_LEN(ary, oldlen + len);
return ary;
}
@@ -1006,11 +1021,11 @@ rb_ary_shift(VALUE ary)
}
assert(!ARY_EMBED_P(ary)); /* ARY_EMBED_LEN_MAX < ARY_DEFAULT_SIZE */
- RARRAY_ASET(ary, 0, Qnil);
+ ARY_SET(ary, 0, Qnil);
ary_make_shared(ary);
}
else if (ARY_SHARED_OCCUPIED(ARY_SHARED(ary))) {
- RARRAY_ASET(ary, 0, Qnil);
+ RARRAY_PTR_USE(ary, ptr, ptr[0] = Qnil);
}
ARY_INCREASE_PTR(ary, 1); /* shift ptr */
ARY_INCREASE_LEN(ary, -1);
@@ -1070,7 +1085,7 @@ rb_ary_shift_m(int argc, VALUE *argv, VALUE ary)
return result;
}
-static void
+static VALUE
ary_ensure_room_for_unshift(VALUE ary, int argc)
{
long len = RARRAY_LEN(ary);
@@ -1112,12 +1127,16 @@ ary_ensure_room_for_unshift(VALUE ary, int argc)
head = sharedp + argc + room;
}
ARY_SET_PTR(ary, head - argc);
+ assert(ARY_SHARED_OCCUPIED(ARY_SHARED(ary)));
+ return ARY_SHARED(ary);
}
else {
/* sliding items */
RARRAY_PTR_USE(ary, ptr, {
MEMMOVE(ptr + argc, ptr, VALUE, len);
});
+
+ return ary;
}
}
@@ -1137,14 +1156,15 @@ static VALUE
rb_ary_unshift_m(int argc, VALUE *argv, VALUE ary)
{
long len = RARRAY_LEN(ary);
+ VALUE target_ary;
if (argc == 0) {
rb_ary_modify_check(ary);
return ary;
}
- ary_ensure_room_for_unshift(ary, argc);
- ary_memcpy(ary, 0, argc, argv);
+ target_ary = ary_ensure_room_for_unshift(ary, argc);
+ ary_memcpy0(ary, 0, argc, argv, target_ary);
ARY_SET_LEN(ary, len + argc);
return ary;
}
@@ -1231,7 +1251,7 @@ rb_ary_subseq(VALUE ary, long beg, long len)
*/
VALUE
-rb_ary_aref(int argc, VALUE *argv, VALUE ary)
+rb_ary_aref(int argc, const VALUE *argv, VALUE ary)
{
VALUE arg;
long beg, len;
@@ -1326,7 +1346,7 @@ rb_ary_first(int argc, VALUE *argv, VALUE ary)
*/
VALUE
-rb_ary_last(int argc, VALUE *argv, VALUE ary)
+rb_ary_last(int argc, const VALUE *argv, VALUE ary)
{
if (argc == 0) {
long len = RARRAY_LEN(ary);
@@ -1555,14 +1575,15 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE 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) {
rb_raise(rb_eIndexError, "index %ld too big", beg);
}
- ary_ensure_room_for_push(ary, rlen-len); /* len is 0 or negative */
+ target_ary = ary_ensure_room_for_push(ary, rlen-len); /* len is 0 or negative */
len = beg + rlen;
ary_mem_clear(ary, olen, beg - olen);
if (rlen > 0) {
- ary_memcpy(ary, beg, rlen, RARRAY_CONST_PTR(rpl));
+ ary_memcpy0(ary, beg, rlen, RARRAY_CONST_PTR(rpl), target_ary);
}
ARY_SET_LEN(ary, len);
}
@@ -1585,7 +1606,6 @@ rb_ary_splice(VALUE ary, long beg, long len, VALUE rpl)
MEMMOVE(RARRAY_PTR(ary) + beg, RARRAY_CONST_PTR(rpl), VALUE, rlen);
}
}
- RB_GC_GUARD(rpl);
}
void
@@ -1721,7 +1741,9 @@ fixnum:
* Inserts the given values before the element with the given +index+.
*
* Negative indices count backwards from the end of the array, where +-1+ is
- * the last element.
+ * the last element. If a negative index is used, the given values will be
+ * inserted after that element, so using an index of +-1+ will insert the
+ * values at the end of the array.
*
* a = %w{ a b c d }
* a.insert(2, 99) #=> ["a", "b", 99, "c", "d"]
@@ -2715,7 +2737,7 @@ rb_ary_collect_bang(VALUE ary)
}
VALUE
-rb_get_values_at(VALUE obj, long olen, int argc, VALUE *argv, VALUE (*func) (VALUE, long))
+rb_get_values_at(VALUE obj, long olen, int argc, const VALUE *argv, VALUE (*func) (VALUE, long))
{
VALUE result = rb_ary_new2(argc);
long beg, len, i, j;
@@ -3233,8 +3255,10 @@ rb_ary_zip(int argc, VALUE *argv, VALUE ary)
if (rb_block_given_p()) {
int arity = rb_block_arity();
- if (arity > 1 && argc+1 < 0x100) {
- VALUE *tmp = ALLOCA_N(VALUE, argc+1);
+ if (arity > 1) {
+ VALUE work, *tmp;
+
+ tmp = ALLOCV_N(VALUE, work, argc+1);
for (i=0; i<RARRAY_LEN(ary); i++) {
tmp[0] = RARRAY_AREF(ary, i);
@@ -3243,6 +3267,8 @@ rb_ary_zip(int argc, VALUE *argv, VALUE ary)
}
rb_yield_values2(argc+1, tmp);
}
+
+ if (work) ALLOCV_END(work);
}
else {
for (i=0; i<RARRAY_LEN(ary); i++) {
@@ -3481,7 +3507,7 @@ rb_ary_fill(int argc, VALUE *argv, VALUE ary)
for (i=beg; i<end; i++) {
v = rb_yield(LONG2NUM(i));
if (i>=RARRAY_LEN(ary)) break;
- RARRAY_ASET(ary, i, v);
+ ARY_SET(ary, i, v);
}
}
else {
@@ -3734,7 +3760,7 @@ rb_ary_equal(VALUE ary1, VALUE ary2)
{
if (ary1 == ary2) return Qtrue;
if (!RB_TYPE_P(ary2, T_ARRAY)) {
- if (!rb_respond_to(ary2, rb_intern("to_ary"))) {
+ if (!rb_respond_to(ary2, idTo_ary)) {
return Qfalse;
}
return rb_equal(ary2, ary1);
@@ -3783,6 +3809,8 @@ rb_ary_eql(VALUE ary1, VALUE ary2)
*
* Two arrays with the same content will have the same hash code (and will
* compare using #eql?).
+ *
+ * See also Object#hash.
*/
static VALUE
@@ -3855,21 +3883,26 @@ recursive_cmp(VALUE ary1, VALUE ary2, int recur)
* Comparison --- Returns an integer (+-1+, +0+, or <code>+1</code>) if this
* array is less than, equal to, or greater than +other_ary+.
*
- * +nil+ is returned if the two values are incomparable.
- *
* Each object in each array is compared (using the <=> operator).
*
- * Arrays are compared in an "element-wise" manner; the first two elements
- * that are not equal will determine the return value for the whole
- * comparison.
+ * Arrays are compared in an "element-wise" manner; the first element of +ary+
+ * is compared with the first one of +other_ary+ using the <=> operator, then
+ * each of the second elements, etc...
+ * As soon as the result of any such comparison is non zero (i.e. the two
+ * corresponding elements are not equal), that result is returned for the
+ * whole array comparison.
*
- * If all the values are equal, then the return is based on a comparison of
+ * If all the elements are equal, then the result is based on a comparison of
* the array lengths. Thus, two arrays are "equal" according to Array#<=> if,
* and only if, they have the same length and the value of each element is
* equal to the value of the corresponding element in the other array.
*
+ * +nil+ is returned if the +other_ary+ is not an array or if the comparison
+ * of two elements returned +nil+.
+ *
* [ "a", "a", "c" ] <=> [ "a", "b", "c" ] #=> -1
* [ 1, 2, 3, 4, 5, 6 ] <=> [ 1, 2 ] #=> +1
+ * [ 1, 2 ] <=> [ 1, :two ] #=> nil
*
*/
@@ -3949,7 +3982,6 @@ ary_recycle_hash(VALUE hash)
RHASH(hash)->ntbl = 0;
st_free_table(tbl);
}
- RB_GC_GUARD(hash);
}
/*
@@ -3973,7 +4005,7 @@ static VALUE
rb_ary_diff(VALUE ary1, VALUE ary2)
{
VALUE ary3;
- VALUE hash;
+ volatile VALUE hash;
long i;
hash = ary_make_hash(to_ary(ary2));
@@ -4428,7 +4460,13 @@ static ID id_random;
*
* Shuffles elements in +self+ in place.
*
+ * a = [ 1, 2, 3 ] #=> [1, 2, 3]
+ * a.shuffle! #=> [2, 3, 1]
+ * a #=> [2, 3, 1]
+ *
* The optional +rng+ argument will be used as the random number generator.
+ *
+ * a.shuffle!(random: Random.new(1)) #=> [1, 3, 2]
*/
static VALUE
@@ -4475,6 +4513,7 @@ rb_ary_shuffle_bang(int argc, VALUE *argv, VALUE ary)
*
* a = [ 1, 2, 3 ] #=> [1, 2, 3]
* a.shuffle #=> [2, 3, 1]
+ * a #=> [1, 2, 3]
*
* The optional +rng+ argument will be used as the random number generator.
*
@@ -4704,8 +4743,7 @@ yield_indexed_values(const VALUE values, const long r, const long *const p)
}
/*
- * Recursively compute permutations of +r+ elements of the set
- * <code>[0..n-1]</code>.
+ * Compute permutations of +r+ elements of the set <code>[0..n-1]</code>.
*
* When we have a complete permutation of array indexes, copy the values
* at those indexes into a new array and yield that array.
@@ -4713,28 +4751,40 @@ yield_indexed_values(const VALUE values, const long r, const long *const p)
* n: the size of the set
* r: the number of elements in each permutation
* p: the array (of size r) that we're filling in
- * index: what index we're filling in now
* used: an array of booleans: whether a given index is already used
* values: the Ruby array that holds the actual values to permute
*/
static void
-permute0(long n, long r, long *p, long index, char *used, VALUE values)
+permute0(const long n, const long r, long *const p, char *const used, const VALUE values)
{
- long i;
- for (i = 0; i < n; i++) {
- if (used[i] == 0) {
+ long i = 0, index = 0;
+
+ for (;;) {
+ const char *const unused = memchr(&used[i], 0, n-i);
+ if (!unused) {
+ if (!index) break;
+ i = p[--index]; /* pop index */
+ used[i++] = 0; /* index unused */
+ }
+ else {
+ i = unused - used;
p[index] = i;
+ used[i] = 1; /* mark index used */
+ ++index;
if (index < r-1) { /* if not done yet */
- used[i] = 1; /* mark index used */
- permute0(n, r, p, index+1, /* recurse */
- used, values);
- used[i] = 0; /* index unused */
+ p[index] = i = 0;
+ continue;
}
- else {
+ for (i = 0; i < n; ++i) {
+ if (used[i]) continue;
+ p[index] = i;
if (!yield_indexed_values(values, r, p)) {
rb_raise(rb_eRuntimeError, "permute reentered");
}
}
+ i = p[--index]; /* pop index */
+ used[i] = 0; /* index unused */
+ p[index] = ++i;
}
}
}
@@ -4829,23 +4879,42 @@ rb_ary_permutation(int argc, VALUE *argv, VALUE ary)
}
}
else { /* this is the general case */
- volatile VALUE t0 = tmpbuf(r,sizeof(long));
- long *p = (long*)RSTRING_PTR(t0);
- volatile VALUE t1 = tmpbuf(n,sizeof(char));
- char *used = (char*)RSTRING_PTR(t1);
+ volatile VALUE t0;
+ long *p = (long*)ALLOCV(t0, r*sizeof(long)+n*sizeof(char));
+ char *used = (char*)(p + r);
VALUE ary0 = ary_make_shared_copy(ary); /* private defensive copy of ary */
RBASIC_CLEAR_CLASS(ary0);
MEMZERO(used, char, n); /* initialize array */
- permute0(n, r, p, 0, used, ary0); /* compute and yield permutations */
- tmpbuf_discard(t0);
- tmpbuf_discard(t1);
+ permute0(n, r, p, used, ary0); /* compute and yield permutations */
+ ALLOCV_END(t0);
RBASIC_SET_CLASS_RAW(ary0, rb_cArray);
}
return ary;
}
+static void
+combinate0(const long len, const long n, long *const stack, const VALUE values)
+{
+ long lev = 0;
+
+ MEMZERO(stack+1, long, n);
+ stack[0] = -1;
+ for (;;) {
+ for (lev++; lev < n; lev++) {
+ stack[lev+1] = stack[lev]+1;
+ }
+ if (!yield_indexed_values(values, n, stack+1)) {
+ rb_raise(rb_eRuntimeError, "combination reentered");
+ }
+ do {
+ if (lev == 0) return;
+ stack[lev--]++;
+ } while (stack[lev+1]+n == len+lev+1);
+ }
+}
+
static VALUE
rb_ary_combination_size(VALUE ary, VALUE args, VALUE eobj)
{
@@ -4883,7 +4952,7 @@ rb_ary_combination_size(VALUE ary, VALUE args, VALUE eobj)
static VALUE
rb_ary_combination(VALUE ary, VALUE num)
{
- long n, i, len;
+ long i, n, len;
n = NUM2LONG(num);
RETURN_SIZED_ENUMERATOR(ary, 1, &num, rb_ary_combination_size);
@@ -4903,24 +4972,9 @@ rb_ary_combination(VALUE ary, VALUE num)
VALUE ary0 = ary_make_shared_copy(ary); /* private defensive copy of ary */
volatile VALUE t0;
long *stack = ALLOCV_N(long, t0, n+1);
- long lev = 0;
RBASIC_CLEAR_CLASS(ary0);
- MEMZERO(stack+1, long, n);
- stack[0] = -1;
- for (;;) {
- for (lev++; lev < n; lev++) {
- stack[lev+1] = stack[lev]+1;
- }
- if (!yield_indexed_values(ary0, n, stack+1)) {
- rb_raise(rb_eRuntimeError, "combination reentered");
- }
- do {
- if (lev == 0) goto done;
- stack[lev--]++;
- } while (stack[lev+1]+n == len+lev+1);
- }
- done:
+ combinate0(len, n, stack, ary0);
ALLOCV_END(t0);
RBASIC_SET_CLASS_RAW(ary0, rb_cArray);
}
@@ -4928,7 +4982,7 @@ rb_ary_combination(VALUE ary, VALUE num)
}
/*
- * Recursively compute repeated permutations of +r+ elements of the set
+ * Compute repeated permutations of +r+ elements of the set
* <code>[0..n-1]</code>.
*
* When we have a complete repeated permutation of array indexes, copy the
@@ -4937,23 +4991,28 @@ rb_ary_combination(VALUE ary, VALUE num)
* n: the size of the set
* r: the number of elements in each permutation
* p: the array (of size r) that we're filling in
- * index: what index we're filling in now
* values: the Ruby array that holds the actual values to permute
*/
static void
-rpermute0(long n, long r, long *p, long index, VALUE values)
+rpermute0(const long n, const long r, long *const p, const VALUE values)
{
- long i;
- for (i = 0; i < n; i++) {
- p[index] = i;
- if (index < r-1) { /* if not done yet */
- rpermute0(n, r, p, index+1, values); /* recurse */
+ long i = 0, index = 0;
+
+ p[index] = i;
+ for (;;) {
+ if (++index < r-1) {
+ p[index] = i = 0;
+ continue;
}
- else {
+ for (i = 0; i < n; ++i) {
+ p[index] = i;
if (!yield_indexed_values(values, r, p)) {
rb_raise(rb_eRuntimeError, "repeated permute reentered");
}
}
+ do {
+ if (index <= 0) return;
+ } while ((i = ++p[--index]) >= n);
}
}
@@ -5016,31 +5075,38 @@ rb_ary_repeated_permutation(VALUE ary, VALUE num)
}
}
else { /* this is the general case */
- volatile VALUE t0 = tmpbuf(r, sizeof(long));
- long *p = (long*)RSTRING_PTR(t0);
+ volatile VALUE t0;
+ long *p = ALLOCV_N(long, t0, r * sizeof(long));
VALUE ary0 = ary_make_shared_copy(ary); /* private defensive copy of ary */
RBASIC_CLEAR_CLASS(ary0);
- rpermute0(n, r, p, 0, ary0); /* compute and yield repeated permutations */
- tmpbuf_discard(t0);
+ rpermute0(n, r, p, ary0); /* compute and yield repeated permutations */
+ ALLOCV_END(t0);
RBASIC_SET_CLASS_RAW(ary0, rb_cArray);
}
return ary;
}
static void
-rcombinate0(long n, long r, long *p, long index, long rest, VALUE values)
+rcombinate0(const long n, const long r, long *const p, const long rest, const VALUE values)
{
- if (rest > 0) {
- for (; index < n; ++index) {
- p[r-rest] = index;
- rcombinate0(n, r, p, index, rest-1, values);
+ long i = 0, index = 0;
+
+ p[index] = i;
+ for (;;) {
+ if (++index < r-1) {
+ p[index] = i;
+ continue;
}
- }
- else {
- if (!yield_indexed_values(values, r, p)) {
- rb_raise(rb_eRuntimeError, "repeated combination reentered");
+ for (; i < n; ++i) {
+ p[index] = i;
+ if (!yield_indexed_values(values, r, p)) {
+ rb_raise(rb_eRuntimeError, "repeated combination reentered");
+ }
}
+ do {
+ if (index <= 0) return;
+ } while ((i = ++p[--index]) >= n);
}
}
@@ -5105,13 +5171,13 @@ rb_ary_repeated_combination(VALUE ary, VALUE num)
/* yield nothing */
}
else {
- volatile VALUE t0 = tmpbuf(n, sizeof(long));
- long *p = (long*)RSTRING_PTR(t0);
+ volatile VALUE t0;
+ long *p = ALLOCV_N(long, t0, n);
VALUE ary0 = ary_make_shared_copy(ary); /* private defensive copy of ary */
RBASIC_CLEAR_CLASS(ary0);
- rcombinate0(len, n, p, 0, n, ary0); /* compute and yield repeated combinations */
- tmpbuf_discard(t0);
+ rcombinate0(len, n, p, n, ary0); /* compute and yield repeated combinations */
+ ALLOCV_END(t0);
RBASIC_SET_CLASS_RAW(ary0, rb_cArray);
}
return ary;
@@ -5342,6 +5408,31 @@ rb_ary_drop_while(VALUE ary)
}
/*
+ * call-seq:
+ * ary.any? [{ |obj| block }] -> true or false
+ *
+ * See also Enumerable#any?
+ */
+
+static VALUE
+rb_ary_any_p(VALUE ary)
+{
+ long i, len = RARRAY_LEN(ary);
+ const VALUE *ptr = RARRAY_CONST_PTR(ary);
+
+ if (!len) return Qfalse;
+ 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) {
+ if (RTEST(rb_yield(RARRAY_AREF(ary, i)))) return Qtrue;
+ }
+ }
+ return Qfalse;
+}
+
+/*
* Arrays are ordered, integer-indexed collections of any object.
*
* Array indexing starts at 0, as in C or Java. A negative index is assumed
@@ -5690,6 +5781,7 @@ Init_Array(void)
rb_define_method(rb_cArray, "drop", rb_ary_drop, 1);
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, "any?", rb_ary_any_p, 0);
id_cmp = rb_intern("<=>");
id_random = rb_intern("random");
diff --git a/benchmark/bm_app_aobench.rb b/benchmark/bm_app_aobench.rb
index 807349089f..ffab116fcd 100644
--- a/benchmark/bm_app_aobench.rb
+++ b/benchmark/bm_app_aobench.rb
@@ -1,7 +1,6 @@
-# AO rebder benchmark
+# AO render benchmark
# Original program (C) Syoyo Fujita in Javascript (and other languages)
-# http://lucille.atso-net.jp/blog/?p=642
-# http://lucille.atso-net.jp/blog/?p=711
+# https://code.google.com/p/aobench/
# Ruby(yarv2llvm) version by Hideki Miura
#
diff --git a/benchmark/bm_app_lc_fizzbuzz.rb b/benchmark/bm_app_lc_fizzbuzz.rb
new file mode 100644
index 0000000000..f09574bbeb
--- /dev/null
+++ b/benchmark/bm_app_lc_fizzbuzz.rb
@@ -0,0 +1,52 @@
+#
+# FizzBuzz program using only lambda calculus
+#
+# This program is quoted from
+# "Understanding Computation" by Tom Stuart
+# http://computationbook.com/
+#
+# You can understand why this program works fine by reading this book.
+#
+
+solution = -> k { -> f { -> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> l { -> x { -> g { -> b { b }[-> p { p[-> x { -> y { x } }] }[l]][x][-> y { g[f[-> l { -> p { p[-> x { -> y { y } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][x][g]][-> l { -> p { p[-> x { -> y { x } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][y] }] } } } }][k][-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> l { -> x { -> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[l][f[x]] } }] } }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[m][n]][-> x { -> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[f[-> n { -> p { -> x { p[n[p][x]] } } }[m]][n]][m][x] }][-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]] } } }][-> p { -> x { p[x] } }][-> p { -> x { p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[x]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]] } }]][-> n { -> b { b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[p[p[p[p[p[p[p[p[p[p[p[p[x]]]]]]]]]]]]]]] } }]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]][-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]][-> b { b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[x]]] } }]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]][-> b { b }[-> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]]][-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> n { -> p { -> x { p[n[p][x]] } } }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]]]][-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> n { -> l { -> x { -> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> l { -> x { -> g { -> b { b }[-> p { p[-> x { -> y { x } }] }[l]][x][-> y { g[f[-> l { -> p { p[-> x { -> y { y } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][x][g]][-> l { -> p { p[-> x { -> y { x } }] }[-> p { p[-> x { -> y { y } }] }[l]] }[l]][y] }] } } } }][l][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }[-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][x]][-> l { -> x { -> x { -> y { -> f { f[x][y] } } }[-> x { -> y { y } }][-> x { -> y { -> f { f[x][y] } } }[x][l]] } }] } }[-> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }[-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]]][-> x { -> y { -> f { f[x][y] } } }[-> x { -> y { x } }][-> x { -> y { x } }]][-> x { f[-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { -> n { -> p { -> x { p[n[p][x]] } } }[f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n]][x] }][-> p { -> x { x } }] } } }][n][-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]][x] }]][-> f { -> x { f[-> y { x[x][y] }] }[-> x { f[-> y { x[x][y] }] }] }[-> f { -> m { -> n { -> b { b }[-> m { -> n { -> n { n[-> x { -> x { -> y { y } } }][-> x { -> y { x } }] }[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]] } }[n][m]][-> x { f[-> m { -> n { n[-> n { -> p { p[-> x { -> y { x } }] }[n[-> p { -> x { -> y { -> f { f[x][y] } } }[-> p { p[-> x { -> y { y } }] }[p]][-> n { -> p { -> x { p[n[p][x]] } } }[-> p { p[-> x { -> y { y } }] }[p]]] }][-> x { -> y { -> f { f[x][y] } } }[-> p { -> x { x } }][-> p { -> x { x } }]]] }][m] } }[m][n]][n][x] }][m] } } }][n][-> m { -> n { n[-> m { -> n { n[-> n { -> p { -> x { p[n[p][x]] } } }][m] } }[m]][-> p { -> x { x } }] } }[-> p { -> x { p[p[x]] } }][-> p { -> x { p[p[p[p[p[x]]]]] } }]]] } }][n]]]] }]
+
+FIRST = -> l { LEFT[RIGHT[l]] }
+IF = -> b { b }
+LEFT = -> p { p[-> x { -> y { x } } ] }
+RIGHT = -> p { p[-> x { -> y { y } } ] }
+IS_EMPTY = LEFT
+REST = -> l { RIGHT[RIGHT[l]] }
+
+def to_integer(proc)
+ proc[-> n { n + 1 }][0]
+end
+
+def to_boolean(proc)
+ IF[proc][true][false]
+end
+
+def to_array(proc)
+ array = []
+
+ until to_boolean(IS_EMPTY[proc])
+ array.push(FIRST[proc])
+ proc = REST[proc]
+ end
+
+ array
+end
+
+def to_char(c)
+ '0123456789BFiuz'.slice(to_integer(c))
+end
+
+def to_string(s)
+ to_array(s).map { |c| to_char(c) }.join
+end
+
+answer = to_array(solution).map do |p|
+ to_string(p)
+end
+
+answer_ary = answer.to_a
+# puts answer_ary
diff --git a/benchmark/bm_hash_aref_miss.rb b/benchmark/bm_hash_aref_miss.rb
new file mode 100644
index 0000000000..b0913dd4bb
--- /dev/null
+++ b/benchmark/bm_hash_aref_miss.rb
@@ -0,0 +1,5 @@
+h = {}
+strs = ('a'..'z').to_a.map!(&:freeze)
+strs.each { |s| h[s] = s }
+strs = ('A'..'Z').to_a
+200_000.times { strs.each { |s| h[s] } }
diff --git a/benchmark/bm_hash_aref_str.rb b/benchmark/bm_hash_aref_str.rb
new file mode 100644
index 0000000000..19439b061b
--- /dev/null
+++ b/benchmark/bm_hash_aref_str.rb
@@ -0,0 +1,4 @@
+h = {}
+strs = ('a'..'z').to_a.map!(&:freeze)
+strs.each { |s| h[s] = s }
+200_000.times { strs.each { |s| h[s] } }
diff --git a/benchmark/bm_hash_aref_sym.rb b/benchmark/bm_hash_aref_sym.rb
new file mode 100644
index 0000000000..54298ffc9e
--- /dev/null
+++ b/benchmark/bm_hash_aref_sym.rb
@@ -0,0 +1,4 @@
+h = {}
+syms = ('a'..'z').to_a.map(&:to_sym)
+syms.each { |s| h[s] = s }
+200_000.times { syms.each { |s| h[s] } }
diff --git a/benchmark/bm_hash_aref_sym_long.rb b/benchmark/bm_hash_aref_sym_long.rb
new file mode 100644
index 0000000000..a9be4059e6
--- /dev/null
+++ b/benchmark/bm_hash_aref_sym_long.rb
@@ -0,0 +1,8 @@
+h = {}
+syms = %w[puts warn syswrite write stat bacon lettuce tomato
+some symbols in this array may already be interned others should not be
+hash browns make good breakfast but not cooked using prime numbers
+shift for division entries delete_if keys exist?
+].map!(&:to_sym)
+syms.each { |s| h[s] = s }
+200_000.times { syms.each { |s| h[s] } }
diff --git a/benchmark/bm_hash_ident_num.rb b/benchmark/bm_hash_ident_num.rb
new file mode 100644
index 0000000000..b226736c6f
--- /dev/null
+++ b/benchmark/bm_hash_ident_num.rb
@@ -0,0 +1,4 @@
+h = {}.compare_by_identity
+nums = (1..26).to_a
+nums.each { |n| h[n] = n }
+200_000.times { nums.each { |n| h[n] } }
diff --git a/benchmark/bm_hash_ident_obj.rb b/benchmark/bm_hash_ident_obj.rb
new file mode 100644
index 0000000000..4b3b58edec
--- /dev/null
+++ b/benchmark/bm_hash_ident_obj.rb
@@ -0,0 +1,4 @@
+h = {}.compare_by_identity
+objs = 26.times.map { Object.new }
+objs.each { |o| h[o] = o }
+200_000.times { objs.each { |o| h[o] } }
diff --git a/benchmark/bm_hash_ident_str.rb b/benchmark/bm_hash_ident_str.rb
new file mode 100644
index 0000000000..8582b38e31
--- /dev/null
+++ b/benchmark/bm_hash_ident_str.rb
@@ -0,0 +1,4 @@
+h = {}.compare_by_identity
+strs = ('a'..'z').to_a
+strs.each { |s| h[s] = s }
+200_000.times { strs.each { |s| h[s] } }
diff --git a/benchmark/bm_hash_ident_sym.rb b/benchmark/bm_hash_ident_sym.rb
new file mode 100644
index 0000000000..4c81e3d28e
--- /dev/null
+++ b/benchmark/bm_hash_ident_sym.rb
@@ -0,0 +1,4 @@
+h = {}.compare_by_identity
+syms = ('a'..'z').to_a.map(&:to_sym)
+syms.each { |s| h[s] = s }
+200_000.times { syms.each { |s| h[s] } }
diff --git a/benchmark/bm_securerandom.rb b/benchmark/bm_securerandom.rb
new file mode 100644
index 0000000000..a082ea6d5b
--- /dev/null
+++ b/benchmark/bm_securerandom.rb
@@ -0,0 +1,5 @@
+require "securerandom"
+
+20_0000.times do
+ SecureRandom.random_number(100)
+end
diff --git a/benchmark/bm_so_meteor_contest.rb b/benchmark/bm_so_meteor_contest.rb
index 99cf6a91cc..b8e93bd150 100644
--- a/benchmark/bm_so_meteor_contest.rb
+++ b/benchmark/bm_so_meteor_contest.rb
@@ -32,7 +32,7 @@ class Rotation
@start_masks = Array.new(60)
# create the rotational masks by placing the base mask at the location and seeing if
- # 1) it overlaps the boundries and 2) it produces a prunable board. if either of these
+ # 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)
@@ -326,9 +326,9 @@ end
# The exact procedure is described in-code
def prunable( board, location, slotting = false)
collectors = []
- # loop accross the rows
+ # loop across the rows
(location / 6).to_i.upto(9) do | row_on |
- # obtain a set of regions representing the bits of the curent row.
+ # obtain a set of regions representing the bits of the current row.
regions = $regions[(board >> (row_on * 6)) & 0b11111]
converter = $converter[row_on]
@@ -370,7 +370,7 @@ def prunable( board, location, slotting = false)
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 muliple of five true is returned since
+ # 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.
@@ -382,7 +382,7 @@ def prunable( board, location, slotting = false)
collectors[collector_num] = nil
else
# if a collector matches all bits in the row then we can return unprunable early for the
- # follwing reasons:
+ # 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
@@ -526,7 +526,7 @@ def save( board_string)
@boards_found += 1
# the exit motif is a time saver. Ideally the function should return, but those tests
- # take noticable time (performance).
+ # take noticeable time (performance).
if (@boards_found == @stop_count) then
print_results
exit(0)
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_vm_thread_close.rb b/benchmark/bm_vm_thread_close.rb
new file mode 100644
index 0000000000..3e9a265ce8
--- /dev/null
+++ b/benchmark/bm_vm_thread_close.rb
@@ -0,0 +1,6 @@
+1000.times { Thread.new { sleep } }
+i = 0
+while i<100_000 # benchmark loop 3
+ i += 1
+ IO.pipe.each(&:close)
+end
diff --git a/benchmark/driver.rb b/benchmark/driver.rb
index cbc72cf604..3904e25503 100644
--- a/benchmark/driver.rb
+++ b/benchmark/driver.rb
@@ -77,6 +77,7 @@ class BenchmarkDriver
@exclude = opt[:exclude] || nil
@verbose = opt[:quiet] ? false : (opt[:verbose] || false)
@output = opt[:output] ? open(opt[:output], 'w') : nil
+ @rawdata_output = opt[:rawdata_output] ? open(opt[:rawdata_output], 'w') : nil
@loop_wl1 = @loop_wl2 = nil
@ruby_arg = opt[:ruby_arg] || nil
@opt = opt
@@ -128,6 +129,14 @@ class BenchmarkDriver
message "Elapsed time: #{Time.now - @start_time} (sec)"
end
+ if @rawdata_output
+ h = {}
+ h[:cpuinfo] = File.read('/proc/cpuinfo') if File.exist?('/proc/cpuinfo')
+ h[:executables] = @execs
+ h[:results] = @results
+ @rawdata_output.puts h.inspect
+ end
+
output '-----------------------------------------------------------'
output 'benchmark results:'
@@ -238,6 +247,12 @@ class BenchmarkDriver
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}"
@@ -260,6 +275,7 @@ if __FILE__ == $0
:dir => File.dirname(__FILE__),
:repeat => 1,
:output => "bmlog-#{Time.now.strftime('%Y%m%d-%H%M%S')}.#{$$}",
+ :raw_output => nil
}
parser = OptionParser.new{|o|
@@ -287,12 +303,16 @@ if __FILE__ == $0
o.on('--ruby-arg [ARG]', "Optional argument for ruby"){|a|
opt[:ruby_arg] = a
}
- o.on('-q', '--quiet', "Run without notify information except result table."){|q|
- opt[:quiet] = q
+ o.on('--rawdata-output [FILE]', 'output rawdata'){|r|
+ opt[:rawdata_output] = 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)
diff --git a/benchmark/prepare_so_k_nucleotide.rb b/benchmark/prepare_so_k_nucleotide.rb
index f28f4460a1..d83aeb7a7e 100644
--- a/benchmark/prepare_so_k_nucleotide.rb
+++ b/benchmark/prepare_so_k_nucleotide.rb
@@ -1,2 +1,2 @@
-require File.join(File.dirname(__FILE__), 'make_fasta_output')
+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
index 7f089109de..da3ec2df14 100644
--- a/benchmark/prepare_so_reverse_complement.rb
+++ b/benchmark/prepare_so_reverse_complement.rb
@@ -1,2 +1,2 @@
-require File.join(File.dirname(__FILE__), 'make_fasta_output')
+require_relative 'make_fasta_output'
prepare_fasta_output(2_500_000)
diff --git a/bignum.c b/bignum.c
index 27d8d8a6a7..08b4337262 100644
--- a/bignum.c
+++ b/bignum.c
@@ -45,17 +45,17 @@ const char ruby_digitmap[] = "0123456789abcdefghijklmnopqrstuvwxyz";
STATIC_ASSERT(sizeof_bdigit_dbl, sizeof(BDIGIT_DBL) == SIZEOF_BDIGIT_DBL);
STATIC_ASSERT(sizeof_bdigit_dbl_signed, sizeof(BDIGIT_DBL_SIGNED) == SIZEOF_BDIGIT_DBL);
-STATIC_ASSERT(sizeof_bdigit, SIZEOF_BDIGITS <= sizeof(BDIGIT));
-STATIC_ASSERT(sizeof_bdigit_and_dbl, SIZEOF_BDIGITS*2 <= SIZEOF_BDIGIT_DBL);
+STATIC_ASSERT(sizeof_bdigit, SIZEOF_BDIGIT <= sizeof(BDIGIT));
+STATIC_ASSERT(sizeof_bdigit_and_dbl, SIZEOF_BDIGIT*2 <= SIZEOF_BDIGIT_DBL);
STATIC_ASSERT(bdigit_signedness, 0 < (BDIGIT)-1);
STATIC_ASSERT(bdigit_dbl_signedness, 0 < (BDIGIT_DBL)-1);
STATIC_ASSERT(bdigit_dbl_signed_signedness, 0 > (BDIGIT_DBL_SIGNED)-1);
-STATIC_ASSERT(rbignum_embed_len_max, RBIGNUM_EMBED_LEN_MAX <= (RBIGNUM_EMBED_LEN_MASK >> RBIGNUM_EMBED_LEN_SHIFT));
+STATIC_ASSERT(rbignum_embed_len_max, BIGNUM_EMBED_LEN_MAX <= (BIGNUM_EMBED_LEN_MASK >> BIGNUM_EMBED_LEN_SHIFT));
-#if SIZEOF_BDIGITS < SIZEOF_LONG
-STATIC_ASSERT(sizeof_long_and_sizeof_bdigit, SIZEOF_LONG % SIZEOF_BDIGITS == 0);
+#if SIZEOF_BDIGIT < SIZEOF_LONG
+STATIC_ASSERT(sizeof_long_and_sizeof_bdigit, SIZEOF_LONG % SIZEOF_BDIGIT == 0);
#else
-STATIC_ASSERT(sizeof_long_and_sizeof_bdigit, SIZEOF_BDIGITS % SIZEOF_LONG == 0);
+STATIC_ASSERT(sizeof_long_and_sizeof_bdigit, SIZEOF_BDIGIT % SIZEOF_LONG == 0);
#endif
#ifdef WORDS_BIGENDIAN
@@ -71,8 +71,8 @@ STATIC_ASSERT(sizeof_long_and_sizeof_bdigit, SIZEOF_BDIGITS % SIZEOF_LONG == 0);
#define FILL_LOWBITS(d, numbits) ((d) | (LSHIFTX(((d)*0+1), (numbits))-1))
#define POW2_P(x) (((x)&((x)-1))==0)
-#define BDIGITS(x) (RBIGNUM_DIGITS(x))
-#define BITSPERDIG (SIZEOF_BDIGITS*CHAR_BIT)
+#define BDIGITS(x) (BIGNUM_DIGITS(x))
+#define BITSPERDIG (SIZEOF_BDIGIT*CHAR_BIT)
#define BIGRAD ((BDIGIT_DBL)1 << BITSPERDIG)
#define BIGRAD_HALF ((BDIGIT)(BIGRAD >> 1))
#define BDIGIT_MSB(d) (((d) & BIGRAD_HALF) != 0)
@@ -82,25 +82,25 @@ STATIC_ASSERT(sizeof_long_and_sizeof_bdigit, SIZEOF_BDIGITS % SIZEOF_LONG == 0);
#define BDIGMAX ((BDIGIT)(BIGRAD-1))
#define BDIGIT_DBL_MAX (~(BDIGIT_DBL)0)
-#if SIZEOF_BDIGITS == 2
+#if SIZEOF_BDIGIT == 2
# define swap_bdigit(x) swap16(x)
-#elif SIZEOF_BDIGITS == 4
+#elif SIZEOF_BDIGIT == 4
# define swap_bdigit(x) swap32(x)
-#elif SIZEOF_BDIGITS == 8
+#elif SIZEOF_BDIGIT == 8
# define swap_bdigit(x) swap64(x)
#endif
-#define BIGZEROP(x) (RBIGNUM_LEN(x) == 0 || \
+#define BIGZEROP(x) (BIGNUM_LEN(x) == 0 || \
(BDIGITS(x)[0] == 0 && \
- (RBIGNUM_LEN(x) == 1 || bigzero_p(x))))
-#define BIGSIZE(x) (RBIGNUM_LEN(x) == 0 ? (size_t)0 : \
- BDIGITS(x)[RBIGNUM_LEN(x)-1] ? \
- (size_t)(RBIGNUM_LEN(x)*SIZEOF_BDIGITS - nlz(BDIGITS(x)[RBIGNUM_LEN(x)-1])/CHAR_BIT) : \
+ (BIGNUM_LEN(x) == 1 || bigzero_p(x))))
+#define BIGSIZE(x) (BIGNUM_LEN(x) == 0 ? (size_t)0 : \
+ BDIGITS(x)[BIGNUM_LEN(x)-1] ? \
+ (size_t)(BIGNUM_LEN(x)*SIZEOF_BDIGIT - nlz(BDIGITS(x)[BIGNUM_LEN(x)-1])/CHAR_BIT) : \
rb_absint_size(x, NULL))
#define BIGDIVREM_EXTRA_WORDS 1
#define roomof(n, m) ((long)(((n)+(m)-1) / (m)))
-#define bdigit_roomof(n) roomof(n, SIZEOF_BDIGITS)
+#define bdigit_roomof(n) roomof(n, SIZEOF_BDIGIT)
#define BARY_ARGS(ary) ary, numberof(ary)
#define BARY_ADD(z, x, y) bary_add(BARY_ARGS(z), BARY_ARGS(x), BARY_ARGS(y))
@@ -109,8 +109,8 @@ STATIC_ASSERT(sizeof_long_and_sizeof_bdigit, SIZEOF_BDIGITS % SIZEOF_LONG == 0);
#define BARY_DIVMOD(q, r, x, y) bary_divmod(BARY_ARGS(q), BARY_ARGS(r), BARY_ARGS(x), BARY_ARGS(y))
#define BARY_ZERO_P(x) bary_zero_p(BARY_ARGS(x))
-#define RBIGNUM_SET_NEGATIVE_SIGN(b) RBIGNUM_SET_SIGN(b, 0)
-#define RBIGNUM_SET_POSITIVE_SIGN(b) RBIGNUM_SET_SIGN(b, 1)
+#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_cBignum,(len),(sign))
@@ -148,21 +148,21 @@ static void bary_divmod(BDIGIT *qds, size_t qn, BDIGIT *rds, size_t rn, const BD
static VALUE bigmul0(VALUE x, VALUE y);
static void bary_mul_toom3(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIGIT *yds, size_t yn, BDIGIT *wds, size_t wn);
-static VALUE bignew_1(VALUE klass, long len, int sign);
+static VALUE bignew_1(VALUE klass, size_t len, int sign);
static inline VALUE bigtrunc(VALUE x);
static VALUE bigsq(VALUE x);
static void bigdivmod(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp);
static inline VALUE power_cache_get_power(int base, int power_level, size_t *numdigits_ret);
-#if SIZEOF_BDIGITS <= SIZEOF_INT
-static int nlz(BDIGIT x) { return nlz_int((unsigned int)x) - (SIZEOF_INT-SIZEOF_BDIGITS) * CHAR_BIT; }
-#elif SIZEOF_BDIGITS <= SIZEOF_LONG
-static int nlz(BDIGIT x) { return nlz_long((unsigned long)x) - (SIZEOF_LONG-SIZEOF_BDIGITS) * CHAR_BIT; }
-#elif SIZEOF_BDIGITS <= SIZEOF_LONG_LONG
-static int nlz(BDIGIT x) { return nlz_long_long((unsigned LONG_LONG)x) - (SIZEOF_LONG_LONG-SIZEOF_BDIGITS) * CHAR_BIT; }
-#elif SIZEOF_BDIGITS <= SIZEOF_INT128_T
-static int nlz(BDIGIT x) { return nlz_int128((uint128_t)x) - (SIZEOF_INT128_T-SIZEOF_BDIGITS) * CHAR_BIT; }
+#if SIZEOF_BDIGIT <= SIZEOF_INT
+static int nlz(BDIGIT x) { return nlz_int((unsigned int)x) - (SIZEOF_INT-SIZEOF_BDIGIT) * CHAR_BIT; }
+#elif SIZEOF_BDIGIT <= SIZEOF_LONG
+static int nlz(BDIGIT x) { return nlz_long((unsigned long)x) - (SIZEOF_LONG-SIZEOF_BDIGIT) * CHAR_BIT; }
+#elif SIZEOF_BDIGIT <= SIZEOF_LONG_LONG
+static int nlz(BDIGIT x) { return nlz_long_long((unsigned LONG_LONG)x) - (SIZEOF_LONG_LONG-SIZEOF_BDIGIT) * CHAR_BIT; }
+#elif SIZEOF_BDIGIT <= SIZEOF_INT128_T
+static int nlz(BDIGIT x) { return nlz_int128((uint128_t)x) - (SIZEOF_INT128_T-SIZEOF_BDIGIT) * CHAR_BIT; }
#endif
#define U16(a) ((uint16_t)(a))
@@ -662,7 +662,7 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
*((unsigned char *)words) = (unsigned char)(d = dp[0]);
return ((1 < de - dp || CLEAR_LOWBITS(d, 8) != 0) ? 2 : 1) * sign;
}
-#if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGITS
+#if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGIT
if (wordsize == 2 && (uintptr_t)words % ALIGNOF(uint16_t) == 0) {
uint16_t u = (uint16_t)(d = dp[0]);
if (need_swap) u = swap16(u);
@@ -670,7 +670,7 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
return ((1 < de - dp || CLEAR_LOWBITS(d, 16) != 0) ? 2 : 1) * sign;
}
#endif
-#if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGITS
+#if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGIT
if (wordsize == 4 && (uintptr_t)words % ALIGNOF(uint32_t) == 0) {
uint32_t u = (uint32_t)(d = dp[0]);
if (need_swap) u = swap32(u);
@@ -678,7 +678,7 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
return ((1 < de - dp || CLEAR_LOWBITS(d, 32) != 0) ? 2 : 1) * sign;
}
#endif
-#if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGITS
+#if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGIT
if (wordsize == 8 && (uintptr_t)words % ALIGNOF(uint64_t) == 0) {
uint64_t u = (uint64_t)(d = dp[0]);
if (need_swap) u = swap64(u);
@@ -693,40 +693,40 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
*((unsigned char *)words) = (unsigned char)(d = -(BDIGIT_DBL_SIGNED)dp[0]);
return (1 < de - dp || FILL_LOWBITS(d, 8) != -1) ? -2 : -1;
}
-#if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGITS
+#if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGIT
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;
- return (wordsize == SIZEOF_BDIGITS && de - dp == 2 && dp[1] == 1 && dp[0] == 0) ? -1 :
+ return (wordsize == SIZEOF_BDIGIT && de - dp == 2 && dp[1] == 1 && dp[0] == 0) ? -1 :
(1 < de - dp || FILL_LOWBITS(d, 16) != -1) ? -2 : -1;
}
#endif
-#if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGITS
+#if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGIT
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;
- return (wordsize == SIZEOF_BDIGITS && de - dp == 2 && dp[1] == 1 && dp[0] == 0) ? -1 :
+ return (wordsize == SIZEOF_BDIGIT && de - dp == 2 && dp[1] == 1 && dp[0] == 0) ? -1 :
(1 < de - dp || FILL_LOWBITS(d, 32) != -1) ? -2 : -1;
}
#endif
-#if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGITS
+#if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGIT
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;
- return (wordsize == SIZEOF_BDIGITS && de - dp == 2 && dp[1] == 1 && dp[0] == 0) ? -1 :
+ return (wordsize == SIZEOF_BDIGIT && de - dp == 2 && dp[1] == 1 && dp[0] == 0) ? -1 :
(1 < de - dp || FILL_LOWBITS(d, 64) != -1) ? -2 : -1;
}
#endif
}
}
#if !defined(WORDS_BIGENDIAN)
- if (nails == 0 && SIZEOF_BDIGITS == sizeof(BDIGIT) &&
+ if (nails == 0 && SIZEOF_BDIGIT == sizeof(BDIGIT) &&
(flags & INTEGER_PACK_WORDORDER_MASK) == INTEGER_PACK_LSWORD_FIRST &&
(flags & INTEGER_PACK_BYTEORDER_MASK) != INTEGER_PACK_MSBYTE_FIRST) {
- size_t src_size = (de - dp) * SIZEOF_BDIGITS;
+ size_t src_size = (de - dp) * SIZEOF_BDIGIT;
size_t dst_size = numwords * wordsize;
int overflow = 0;
while (0 < src_size && ((unsigned char *)ds)[src_size-1] == 0)
@@ -754,9 +754,9 @@ bary_pack(int sign, BDIGIT *ds, size_t num_bdigits, void *words, size_t numwords
return sign;
}
#endif
- if (nails == 0 && SIZEOF_BDIGITS == sizeof(BDIGIT) &&
- wordsize % SIZEOF_BDIGITS == 0 && (uintptr_t)words % ALIGNOF(BDIGIT) == 0) {
- size_t bdigits_per_word = wordsize / SIZEOF_BDIGITS;
+ if (nails == 0 && SIZEOF_BDIGIT == sizeof(BDIGIT) &&
+ 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;
int overflow = 0;
@@ -967,7 +967,7 @@ integer_unpack_num_bdigits_small(size_t numwords, size_t wordsize, size_t nails,
static size_t
integer_unpack_num_bdigits_generic(size_t numwords, size_t wordsize, size_t nails, int *nlp_bits_ret)
{
- /* BITSPERDIG = SIZEOF_BDIGITS * CHAR_BIT */
+ /* BITSPERDIG = SIZEOF_BDIGIT * CHAR_BIT */
/* num_bits = (wordsize * CHAR_BIT - nails) * numwords */
/* num_bdigits = (num_bits + BITSPERDIG - 1) / BITSPERDIG */
@@ -1064,7 +1064,7 @@ integer_unpack_single_bdigit(BDIGIT u, size_t size, int flags, BDIGIT *dp)
int sign;
if (flags & INTEGER_PACK_2COMP) {
sign = (flags & INTEGER_PACK_NEGATIVE) ?
- ((size == SIZEOF_BDIGITS && u == 0) ? -2 : -1) :
+ ((size == SIZEOF_BDIGIT && u == 0) ? -2 : -1) :
((u >> (size * CHAR_BIT - 1)) ? -1 : 1);
if (sign < 0) {
u |= LSHIFTX(BDIGMAX, size * CHAR_BIT);
@@ -1096,19 +1096,19 @@ bary_unpack_internal(BDIGIT *bdigits, size_t num_bdigits, const void *words, siz
if (wordsize == 1) {
return integer_unpack_single_bdigit(*(uint8_t *)buf, sizeof(uint8_t), flags, dp);
}
-#if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGITS
+#if defined(HAVE_UINT16_T) && 2 <= SIZEOF_BDIGIT
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_BDIGITS
+#if defined(HAVE_UINT32_T) && 4 <= SIZEOF_BDIGIT
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_BDIGITS
+#if defined(HAVE_UINT64_T) && 8 <= SIZEOF_BDIGIT
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);
@@ -1116,11 +1116,11 @@ bary_unpack_internal(BDIGIT *bdigits, size_t num_bdigits, const void *words, siz
#endif
}
#if !defined(WORDS_BIGENDIAN)
- if (nails == 0 && SIZEOF_BDIGITS == sizeof(BDIGIT) &&
+ if (nails == 0 && SIZEOF_BDIGIT == sizeof(BDIGIT) &&
(flags & INTEGER_PACK_WORDORDER_MASK) == INTEGER_PACK_LSWORD_FIRST &&
(flags & INTEGER_PACK_BYTEORDER_MASK) != INTEGER_PACK_MSBYTE_FIRST) {
size_t src_size = numwords * wordsize;
- size_t dst_size = num_bdigits * SIZEOF_BDIGITS;
+ size_t dst_size = num_bdigits * SIZEOF_BDIGIT;
MEMCPY(dp, words, char, src_size);
if (flags & INTEGER_PACK_2COMP) {
if (flags & INTEGER_PACK_NEGATIVE) {
@@ -1146,9 +1146,9 @@ bary_unpack_internal(BDIGIT *bdigits, size_t num_bdigits, const void *words, siz
return sign;
}
#endif
- if (nails == 0 && SIZEOF_BDIGITS == sizeof(BDIGIT) &&
- wordsize % SIZEOF_BDIGITS == 0) {
- size_t bdigits_per_word = wordsize / SIZEOF_BDIGITS;
+ if (nails == 0 && SIZEOF_BDIGIT == sizeof(BDIGIT) &&
+ wordsize % SIZEOF_BDIGIT == 0) {
+ size_t bdigits_per_word = wordsize / SIZEOF_BDIGIT;
int mswordfirst_p = (flags & INTEGER_PACK_MSWORD_FIRST) != 0;
int msbytefirst_p = (flags & INTEGER_PACK_NATIVE_BYTE_ORDER) ? HOST_BIGENDIAN_P :
(flags & INTEGER_PACK_MSBYTE_FIRST) != 0;
@@ -1539,8 +1539,8 @@ bary_mul_normal(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIG
VALUE
rb_big_mul_normal(VALUE x, VALUE y)
{
- size_t xn = RBIGNUM_LEN(x), yn = RBIGNUM_LEN(y), zn = xn + yn;
- VALUE z = bignew(zn, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ size_t xn = BIGNUM_LEN(x), yn = BIGNUM_LEN(y), zn = xn + yn;
+ VALUE z = bignew(zn, BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
bary_mul_normal(BDIGITS(z), zn, BDIGITS(x), xn, BDIGITS(y), yn);
RB_GC_GUARD(x);
RB_GC_GUARD(y);
@@ -1608,7 +1608,7 @@ bary_sq_fast(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn)
VALUE
rb_big_sq_fast(VALUE x)
{
- size_t xn = RBIGNUM_LEN(x), zn = 2 * xn;
+ size_t xn = BIGNUM_LEN(x), zn = 2 * xn;
VALUE z = bignew(zn, 1);
bary_sq_fast(BDIGITS(z), zn, BDIGITS(x), xn);
RB_GC_GUARD(x);
@@ -1650,7 +1650,7 @@ bary_mul_balance_with_mulfunc(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t
}
tds = zds + n;
MEMCPY(wds, zds + n, BDIGIT, xn);
- mulfunc(tds, tn, xds, xn, yds + n, r, wds+xn, wn-xn);
+ mulfunc(tds, tn, xds, xn, yds + n, r, wds-xn, wn-xn);
bary_add(zds + n, tn,
zds + n, tn,
wds, xn);
@@ -1667,8 +1667,8 @@ bary_mul_balance_with_mulfunc(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t
VALUE
rb_big_mul_balance(VALUE x, VALUE y)
{
- size_t xn = RBIGNUM_LEN(x), yn = RBIGNUM_LEN(y), zn = xn + yn;
- VALUE z = bignew(zn, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ size_t xn = BIGNUM_LEN(x), yn = BIGNUM_LEN(y), zn = xn + yn;
+ VALUE z = bignew(zn, BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
bary_mul_balance_with_mulfunc(BDIGITS(z), zn, BDIGITS(x), xn, BDIGITS(y), yn, NULL, 0, bary_mul_toom3_start);
RB_GC_GUARD(x);
RB_GC_GUARD(y);
@@ -1823,12 +1823,12 @@ bary_mul_karatsuba(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const B
}
/*
- if (SIZEOF_BDIGITS * zn <= 16) {
+ if (SIZEOF_BDIGIT * zn <= 16) {
uint128_t z, x, y;
ssize_t i;
- for (x = 0, i = xn-1; 0 <= i; i--) { x <<= SIZEOF_BDIGITS*CHAR_BIT; x |= xds[i]; }
- for (y = 0, i = yn-1; 0 <= i; i--) { y <<= SIZEOF_BDIGITS*CHAR_BIT; y |= yds[i]; }
- for (z = 0, i = zn-1; 0 <= i; i--) { z <<= SIZEOF_BDIGITS*CHAR_BIT; z |= zds[i]; }
+ for (x = 0, i = xn-1; 0 <= i; i--) { x <<= SIZEOF_BDIGIT*CHAR_BIT; x |= xds[i]; }
+ for (y = 0, i = yn-1; 0 <= i; i--) { y <<= SIZEOF_BDIGIT*CHAR_BIT; y |= yds[i]; }
+ for (z = 0, i = zn-1; 0 <= i; i--) { z <<= SIZEOF_BDIGIT*CHAR_BIT; z |= zds[i]; }
assert(z == x * y);
}
*/
@@ -1848,8 +1848,8 @@ bary_mul_karatsuba(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const B
VALUE
rb_big_mul_karatsuba(VALUE x, VALUE y)
{
- size_t xn = RBIGNUM_LEN(x), yn = RBIGNUM_LEN(y), zn = xn + yn;
- VALUE z = bignew(zn, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ size_t xn = BIGNUM_LEN(x), yn = BIGNUM_LEN(y), zn = xn + yn;
+ VALUE z = bignew(zn, BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
if (!((xn <= yn && yn < 2) || KARATSUBA_BALANCED(xn, yn)))
rb_raise(rb_eArgError, "unexpected bignum length for karatsuba");
bary_mul_karatsuba(BDIGITS(z), zn, BDIGITS(x), xn, BDIGITS(y), yn, NULL, 0);
@@ -2245,8 +2245,8 @@ bary_mul_toom3(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIGI
VALUE
rb_big_mul_toom3(VALUE x, VALUE y)
{
- size_t xn = RBIGNUM_LEN(x), yn = RBIGNUM_LEN(y), zn = xn + yn;
- VALUE z = bignew(zn, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ size_t xn = BIGNUM_LEN(x), yn = BIGNUM_LEN(y), zn = xn + yn;
+ VALUE z = bignew(zn, BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
if (xn > yn || yn < 3 || !TOOM3_BALANCED(xn,yn))
rb_raise(rb_eArgError, "unexpected bignum length for toom3");
bary_mul_toom3(BDIGITS(z), zn, BDIGITS(x), xn, BDIGITS(y), yn, NULL, 0);
@@ -2259,7 +2259,7 @@ rb_big_mul_toom3(VALUE x, VALUE y)
static void
bary_mul_gmp(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIGIT *yds, size_t yn)
{
- const size_t nails = (sizeof(BDIGIT)-SIZEOF_BDIGITS)*CHAR_BIT;
+ const size_t nails = (sizeof(BDIGIT)-SIZEOF_BDIGIT)*CHAR_BIT;
mpz_t x, y, z;
size_t count;
@@ -2286,8 +2286,8 @@ bary_mul_gmp(BDIGIT *zds, size_t zn, const BDIGIT *xds, size_t xn, const BDIGIT
VALUE
rb_big_mul_gmp(VALUE x, VALUE y)
{
- size_t xn = RBIGNUM_LEN(x), yn = RBIGNUM_LEN(y), zn = xn + yn;
- VALUE z = bignew(zn, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ size_t xn = BIGNUM_LEN(x), yn = BIGNUM_LEN(y), zn = xn + yn;
+ VALUE z = bignew(zn, BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
bary_mul_gmp(BDIGITS(z), zn, BDIGITS(x), xn, BDIGITS(y), yn);
RB_GC_GUARD(x);
RB_GC_GUARD(y);
@@ -2360,7 +2360,7 @@ bary_mul_precheck(BDIGIT **zdsp, size_t *znp, const BDIGIT **xdsp, size_t *xnp,
}
else {
do {
- if (xds[0] != 0)
+ if (yds[0] != 0)
break;
yds++;
yn--;
@@ -2697,7 +2697,7 @@ bary_divmod_normal(BDIGIT *qds, size_t qn, BDIGIT *rds, size_t rn, const BDIGIT
VALUE
rb_big_divrem_normal(VALUE x, VALUE y)
{
- size_t xn = RBIGNUM_LEN(x), yn = RBIGNUM_LEN(y), qn, rn;
+ size_t xn = BIGNUM_LEN(x), yn = BIGNUM_LEN(y), qn, rn;
BDIGIT *xds = BDIGITS(x), *yds = BDIGITS(y), *qds, *rds;
VALUE q, r;
@@ -2710,11 +2710,11 @@ rb_big_divrem_normal(VALUE x, VALUE y)
return rb_assoc_new(LONG2FIX(0), x);
qn = xn + BIGDIVREM_EXTRA_WORDS;
- q = bignew(qn, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ q = bignew(qn, BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
qds = BDIGITS(q);
rn = yn;
- r = bignew(rn, RBIGNUM_SIGN(x));
+ r = bignew(rn, BIGNUM_SIGN(x));
rds = BDIGITS(r);
bary_divmod_normal(qds, qn, rds, rn, xds, xn, yds, yn);
@@ -2732,7 +2732,7 @@ rb_big_divrem_normal(VALUE x, VALUE y)
static void
bary_divmod_gmp(BDIGIT *qds, size_t qn, BDIGIT *rds, size_t rn, const BDIGIT *xds, size_t xn, const BDIGIT *yds, size_t yn)
{
- const size_t nails = (sizeof(BDIGIT)-SIZEOF_BDIGITS)*CHAR_BIT;
+ const size_t nails = (sizeof(BDIGIT)-SIZEOF_BDIGIT)*CHAR_BIT;
mpz_t x, y, q, r;
size_t count;
@@ -2778,7 +2778,7 @@ bary_divmod_gmp(BDIGIT *qds, size_t qn, BDIGIT *rds, size_t rn, const BDIGIT *xd
VALUE
rb_big_divrem_gmp(VALUE x, VALUE y)
{
- size_t xn = RBIGNUM_LEN(x), yn = RBIGNUM_LEN(y), qn, rn;
+ size_t xn = BIGNUM_LEN(x), yn = BIGNUM_LEN(y), qn, rn;
BDIGIT *xds = BDIGITS(x), *yds = BDIGITS(y), *qds, *rds;
VALUE q, r;
@@ -2791,11 +2791,11 @@ rb_big_divrem_gmp(VALUE x, VALUE y)
return rb_assoc_new(LONG2FIX(0), x);
qn = xn - yn + 1;
- q = bignew(qn, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ q = bignew(qn, BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
qds = BDIGITS(q);
rn = yn;
- r = bignew(rn, RBIGNUM_SIGN(x));
+ r = bignew(rn, BIGNUM_SIGN(x));
rds = BDIGITS(r);
bary_divmod_gmp(qds, qn, rds, rn, xds, xn, yds, yn);
@@ -2875,11 +2875,11 @@ static void
dump_bignum(VALUE x)
{
long i;
- printf("%c0x0", RBIGNUM_SIGN(x) ? '+' : '-');
- for (i = RBIGNUM_LEN(x); i--; ) {
- printf("_%0*"PRIxBDIGIT, SIZEOF_BDIGITS*2, BDIGITS(x)[i]);
+ printf("%c0x0", BIGNUM_SIGN(x) ? '+' : '-');
+ for (i = BIGNUM_LEN(x); i--; ) {
+ printf("_%0*"PRIxBDIGIT, SIZEOF_BDIGIT*2, BDIGITS(x)[i]);
}
- printf(", len=%lu", RBIGNUM_LEN(x));
+ printf(", len=%"PRIuSIZE, BIGNUM_LEN(x));
puts("");
}
@@ -2896,7 +2896,7 @@ rb_big_dump(VALUE x)
static int
bigzero_p(VALUE x)
{
- return bary_zero_p(BDIGITS(x), RBIGNUM_LEN(x));
+ return bary_zero_p(BDIGITS(x), BIGNUM_LEN(x));
}
int
@@ -2919,7 +2919,7 @@ rb_cmpint(VALUE val, VALUE a, VALUE b)
}
if (RB_BIGNUM_TYPE_P(val)) {
if (BIGZEROP(val)) return 0;
- if (RBIGNUM_SIGN(val)) return 1;
+ if (BIGNUM_SIGN(val)) return 1;
return -1;
}
if (RTEST(rb_funcall(val, '>', 1, INT2FIX(0)))) return 1;
@@ -2927,31 +2927,31 @@ rb_cmpint(VALUE val, VALUE a, VALUE b)
return 0;
}
-#define RBIGNUM_SET_LEN(b,l) \
- ((RBASIC(b)->flags & RBIGNUM_EMBED_FLAG) ? \
+#define BIGNUM_SET_LEN(b,l) \
+ ((RBASIC(b)->flags & BIGNUM_EMBED_FLAG) ? \
(void)(RBASIC(b)->flags = \
- (RBASIC(b)->flags & ~RBIGNUM_EMBED_LEN_MASK) | \
- ((l) << RBIGNUM_EMBED_LEN_SHIFT)) : \
+ (RBASIC(b)->flags & ~BIGNUM_EMBED_LEN_MASK) | \
+ ((l) << BIGNUM_EMBED_LEN_SHIFT)) : \
(void)(RBIGNUM(b)->as.heap.len = (l)))
static void
-rb_big_realloc(VALUE big, long len)
+rb_big_realloc(VALUE big, size_t len)
{
BDIGIT *ds;
- if (RBASIC(big)->flags & RBIGNUM_EMBED_FLAG) {
- if (RBIGNUM_EMBED_LEN_MAX < len) {
+ if (RBASIC(big)->flags & BIGNUM_EMBED_FLAG) {
+ if (BIGNUM_EMBED_LEN_MAX < len) {
ds = ALLOC_N(BDIGIT, len);
- MEMCPY(ds, RBIGNUM(big)->as.ary, BDIGIT, RBIGNUM_EMBED_LEN_MAX);
- RBIGNUM(big)->as.heap.len = RBIGNUM_LEN(big);
+ MEMCPY(ds, RBIGNUM(big)->as.ary, BDIGIT, BIGNUM_EMBED_LEN_MAX);
+ RBIGNUM(big)->as.heap.len = BIGNUM_LEN(big);
RBIGNUM(big)->as.heap.digits = ds;
- RBASIC(big)->flags &= ~RBIGNUM_EMBED_FLAG;
+ RBASIC(big)->flags &= ~BIGNUM_EMBED_FLAG;
}
}
else {
- if (len <= RBIGNUM_EMBED_LEN_MAX) {
+ if (len <= BIGNUM_EMBED_LEN_MAX) {
ds = RBIGNUM(big)->as.heap.digits;
- RBASIC(big)->flags |= RBIGNUM_EMBED_FLAG;
- RBIGNUM_SET_LEN(big, len);
+ RBASIC(big)->flags |= BIGNUM_EMBED_FLAG;
+ BIGNUM_SET_LEN(big, len);
(void)VALGRIND_MAKE_MEM_UNDEFINED((void*)RBIGNUM(big)->as.ary, sizeof(RBIGNUM(big)->as.ary));
if (ds) {
MEMCPY(RBIGNUM(big)->as.ary, ds, BDIGIT, len);
@@ -2959,7 +2959,7 @@ rb_big_realloc(VALUE big, long len)
}
}
else {
- if (RBIGNUM_LEN(big) == 0) {
+ if (BIGNUM_LEN(big) == 0) {
RBIGNUM(big)->as.heap.digits = ALLOC_N(BDIGIT, len);
}
else {
@@ -2970,20 +2970,20 @@ rb_big_realloc(VALUE big, long len)
}
void
-rb_big_resize(VALUE big, long len)
+rb_big_resize(VALUE big, size_t len)
{
rb_big_realloc(big, len);
- RBIGNUM_SET_LEN(big, len);
+ BIGNUM_SET_LEN(big, len);
}
static VALUE
-bignew_1(VALUE klass, long len, int sign)
+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));
- RBIGNUM_SET_SIGN(big, sign?1:0);
- if (len <= RBIGNUM_EMBED_LEN_MAX) {
- RBASIC(big)->flags |= RBIGNUM_EMBED_FLAG;
- RBIGNUM_SET_LEN(big, len);
+ BIGNUM_SET_SIGN(big, sign?1:0);
+ if (len <= BIGNUM_EMBED_LEN_MAX) {
+ RBASIC(big)->flags |= BIGNUM_EMBED_FLAG;
+ BIGNUM_SET_LEN(big, len);
(void)VALGRIND_MAKE_MEM_UNDEFINED((void*)RBIGNUM(big)->as.ary, sizeof(RBIGNUM(big)->as.ary));
}
else {
@@ -2995,7 +2995,7 @@ bignew_1(VALUE klass, long len, int sign)
}
VALUE
-rb_big_new(long len, int sign)
+rb_big_new(size_t len, int sign)
{
return bignew(len, sign != 0);
}
@@ -3003,8 +3003,8 @@ rb_big_new(long len, int sign)
VALUE
rb_big_clone(VALUE x)
{
- long len = RBIGNUM_LEN(x);
- VALUE z = bignew_1(CLASS_OF(x), len, RBIGNUM_SIGN(x));
+ size_t len = BIGNUM_LEN(x);
+ VALUE z = bignew_1(CLASS_OF(x), len, BIGNUM_SIGN(x));
MEMCPY(BDIGITS(z), BDIGITS(x), BDIGIT, len);
return z;
@@ -3013,15 +3013,15 @@ rb_big_clone(VALUE x)
static void
big_extend_carry(VALUE x)
{
- rb_big_resize(x, RBIGNUM_LEN(x)+1);
- BDIGITS(x)[RBIGNUM_LEN(x)-1] = 1;
+ rb_big_resize(x, BIGNUM_LEN(x)+1);
+ BDIGITS(x)[BIGNUM_LEN(x)-1] = 1;
}
/* modify a bignum by 2's complement */
static void
get2comp(VALUE x)
{
- long i = RBIGNUM_LEN(x);
+ long i = BIGNUM_LEN(x);
BDIGIT *ds = BDIGITS(x);
if (bary_2comp(ds, i)) {
@@ -3039,13 +3039,13 @@ static BDIGIT
abs2twocomp(VALUE *xp, long *n_ret)
{
VALUE x = *xp;
- long n = RBIGNUM_LEN(x);
+ long n = BIGNUM_LEN(x);
BDIGIT *ds = BDIGITS(x);
BDIGIT hibits = 0;
BARY_TRUNC(ds, n);
- if (n != 0 && RBIGNUM_NEGATIVE_P(x)) {
+ if (n != 0 && BIGNUM_NEGATIVE_P(x)) {
VALUE z = bignew_1(CLASS_OF(x), n, 0);
MEMCPY(BDIGITS(z), ds, BDIGIT, n);
bary_2comp(BDIGITS(z), n);
@@ -3059,7 +3059,7 @@ abs2twocomp(VALUE *xp, long *n_ret)
static void
twocomp2abs_bang(VALUE x, int hibits)
{
- RBIGNUM_SET_SIGN(x, !hibits);
+ BIGNUM_SET_SIGN(x, !hibits);
if (hibits) {
get2comp(x);
}
@@ -3068,12 +3068,12 @@ twocomp2abs_bang(VALUE x, int hibits)
static inline VALUE
bigtrunc(VALUE x)
{
- long len = RBIGNUM_LEN(x);
+ size_t len = BIGNUM_LEN(x);
BDIGIT *ds = BDIGITS(x);
if (len == 0) return x;
while (--len && !ds[len]);
- if (RBIGNUM_LEN(x) > len+1) {
+ if (BIGNUM_LEN(x) > len+1) {
rb_big_resize(x, len+1);
}
return x;
@@ -3082,9 +3082,9 @@ bigtrunc(VALUE x)
static inline VALUE
bigfixize(VALUE x)
{
- size_t n = RBIGNUM_LEN(x);
+ size_t n = BIGNUM_LEN(x);
BDIGIT *ds = BDIGITS(x);
-#if SIZEOF_BDIGITS < SIZEOF_LONG
+#if SIZEOF_BDIGIT < SIZEOF_LONG
unsigned long u;
#else
BDIGIT u;
@@ -3094,8 +3094,8 @@ bigfixize(VALUE x)
if (n == 0) return INT2FIX(0);
-#if SIZEOF_BDIGITS < SIZEOF_LONG
- if (sizeof(long)/SIZEOF_BDIGITS < n)
+#if SIZEOF_BDIGIT < SIZEOF_LONG
+ if (sizeof(long)/SIZEOF_BDIGIT < n)
goto return_big;
else {
int i = (int)n;
@@ -3104,14 +3104,14 @@ bigfixize(VALUE x)
u = (unsigned long)(BIGUP(u) + ds[i]);
}
}
-#else /* SIZEOF_BDIGITS >= SIZEOF_LONG */
+#else /* SIZEOF_BDIGIT >= SIZEOF_LONG */
if (1 < n)
goto return_big;
else
u = ds[0];
#endif
- if (RBIGNUM_POSITIVE_P(x)) {
+ if (BIGNUM_POSITIVE_P(x)) {
if (POSFIXABLE(u)) return LONG2FIX((long)u);
}
else {
@@ -3145,7 +3145,7 @@ rb_uint2big(VALUE n)
VALUE big = bignew(bdigit_roomof(SIZEOF_VALUE), 1);
BDIGIT *digits = BDIGITS(big);
-#if SIZEOF_BDIGITS >= SIZEOF_VALUE
+#if SIZEOF_BDIGIT >= SIZEOF_VALUE
digits[0] = n;
#else
for (i = 0; i < bdigit_roomof(SIZEOF_VALUE); i++) {
@@ -3156,7 +3156,7 @@ rb_uint2big(VALUE n)
i = bdigit_roomof(SIZEOF_VALUE);
while (--i && !digits[i]) ;
- RBIGNUM_SET_LEN(big, i+1);
+ BIGNUM_SET_LEN(big, i+1);
return big;
}
@@ -3176,7 +3176,7 @@ rb_int2big(SIGNED_VALUE n)
}
big = rb_uint2big(u);
if (neg) {
- RBIGNUM_SET_SIGN(big, 0);
+ BIGNUM_SET_SIGN(big, 0);
}
return big;
}
@@ -3243,7 +3243,7 @@ rb_absint_size(VALUE val, int *nlz_bits_ret)
if (v < 0) {
v = -v;
}
-#if SIZEOF_BDIGITS >= SIZEOF_LONG
+#if SIZEOF_BDIGIT >= SIZEOF_LONG
fixbuf[0] = v;
#else
{
@@ -3259,7 +3259,7 @@ rb_absint_size(VALUE val, int *nlz_bits_ret)
}
else {
dp = BDIGITS(val);
- de = dp + RBIGNUM_LEN(val);
+ de = dp + BIGNUM_LEN(val);
}
while (dp < de && de[-1] == 0)
de--;
@@ -3271,7 +3271,7 @@ rb_absint_size(VALUE val, int *nlz_bits_ret)
num_leading_zeros = nlz(de[-1]);
if (nlz_bits_ret)
*nlz_bits_ret = num_leading_zeros % CHAR_BIT;
- return (de - dp) * SIZEOF_BDIGITS - num_leading_zeros / CHAR_BIT;
+ return (de - dp) * SIZEOF_BDIGIT - num_leading_zeros / CHAR_BIT;
}
static size_t
@@ -3294,7 +3294,7 @@ absint_numwords_generic(size_t numbytes, int nlz_bits_in_msbyte, size_t word_num
static const BDIGIT char_bit[1] = { CHAR_BIT };
BDIGIT numbytes_bary[bdigit_roomof(sizeof(numbytes))];
BDIGIT val_numbits_bary[bdigit_roomof(sizeof(numbytes) + 1)];
- BDIGIT nlz_bits_in_msbyte_bary[1];
+ BDIGIT nlz_bits_in_msbyte_bary[1] = { nlz_bits_in_msbyte };
BDIGIT word_numbits_bary[bdigit_roomof(sizeof(word_numbits))];
BDIGIT div_bary[numberof(val_numbits_bary) + BIGDIVREM_EXTRA_WORDS];
BDIGIT mod_bary[numberof(word_numbits_bary)];
@@ -3304,8 +3304,6 @@ absint_numwords_generic(size_t numbytes, int nlz_bits_in_msbyte, size_t word_num
int sign;
size_t numwords;
- nlz_bits_in_msbyte_bary[0] = nlz_bits_in_msbyte;
-
/*
* val_numbits = numbytes * CHAR_BIT - nlz_bits_in_msbyte
* div, mod = val_numbits.divmod(word_numbits)
@@ -3410,7 +3408,7 @@ rb_absint_numwords(VALUE val, size_t word_numbits, size_t *nlz_bits_ret)
* represent val in two's complement number, without sign bit.
*
* size_t size;
- * int neg = FIXNUM_P(val) ? FIX2LONG(val) < 0 : RBIGNUM_NEGATIVE_P(val);
+ * int neg = FIXNUM_P(val) ? FIX2LONG(val) < 0 : BIGNUM_NEGATIVE_P(val);
* size = rb_absint_numwords(val, 1, NULL)
* if (size == (size_t)-1) ...overflow...
* if (neg && rb_absint_singlebit_p(val))
@@ -3420,7 +3418,7 @@ rb_absint_numwords(VALUE val, size_t word_numbits, size_t *nlz_bits_ret)
* represent val in two's complement number, with sign bit.
*
* size_t size;
- * int neg = FIXNUM_P(val) ? FIX2LONG(val) < 0 : RBIGNUM_NEGATIVE_P(val);
+ * int neg = FIXNUM_P(val) ? FIX2LONG(val) < 0 : BIGNUM_NEGATIVE_P(val);
* int nlz_bits;
* size = rb_absint_size(val, &nlz_bits);
* if (nlz_bits == 0 && !(neg && rb_absint_singlebit_p(val)))
@@ -3441,7 +3439,7 @@ rb_absint_singlebit_p(VALUE val)
if (v < 0) {
v = -v;
}
-#if SIZEOF_BDIGITS >= SIZEOF_LONG
+#if SIZEOF_BDIGIT >= SIZEOF_LONG
fixbuf[0] = v;
#else
{
@@ -3457,7 +3455,7 @@ rb_absint_singlebit_p(VALUE val)
}
else {
dp = BDIGITS(val);
- de = dp + RBIGNUM_LEN(val);
+ de = dp + BIGNUM_LEN(val);
}
while (dp < de && de[-1] == 0)
de--;
@@ -3546,7 +3544,7 @@ rb_integer_pack(VALUE val, void *words, size_t numwords, size_t wordsize, size_t
else {
sign = 1;
}
-#if SIZEOF_BDIGITS >= SIZEOF_LONG
+#if SIZEOF_BDIGIT >= SIZEOF_LONG
fixbuf[0] = v;
#else
{
@@ -3561,9 +3559,9 @@ rb_integer_pack(VALUE val, void *words, size_t numwords, size_t wordsize, size_t
num_bdigits = numberof(fixbuf);
}
else {
- sign = RBIGNUM_POSITIVE_P(val) ? 1 : -1;
+ sign = BIGNUM_POSITIVE_P(val) ? 1 : -1;
ds = BDIGITS(val);
- num_bdigits = RBIGNUM_LEN(val);
+ num_bdigits = BIGNUM_LEN(val);
}
return bary_pack(sign, ds, num_bdigits, words, numwords, wordsize, nails, flags);
@@ -3676,33 +3674,15 @@ rb_integer_unpack(const void *words, size_t numwords, size_t wordsize, size_t na
}
if ((flags & INTEGER_PACK_FORCE_BIGNUM) && sign != 0 &&
- bary_zero_p(BDIGITS(val), RBIGNUM_LEN(val)))
+ bary_zero_p(BDIGITS(val), BIGNUM_LEN(val)))
sign = 0;
- RBIGNUM_SET_SIGN(val, 0 <= sign);
+ BIGNUM_SET_SIGN(val, 0 <= sign);
if (flags & INTEGER_PACK_FORCE_BIGNUM)
return bigtrunc(val);
return bignorm(val);
}
-#define QUAD_SIZE 8
-
-void
-rb_quad_pack(char *buf, VALUE val)
-{
- rb_integer_pack(val, buf, 1, QUAD_SIZE, 0,
- INTEGER_PACK_NATIVE_BYTE_ORDER|
- INTEGER_PACK_2COMP);
-}
-
-VALUE
-rb_quad_unpack(const char *buf, int signed_p)
-{
- return rb_integer_unpack(buf, 1, QUAD_SIZE, 0,
- INTEGER_PACK_NATIVE_BYTE_ORDER|
- (signed_p ? INTEGER_PACK_2COMP : 0));
-}
-
#define conv_digit(c) (ruby_digit36_to_number_table[(unsigned char)(c)])
static void
@@ -3888,11 +3868,11 @@ str2big_karatsuba(
for (unit = 2; unit < num_bdigits; unit *= 2) {
for (i = 0; i < num_bdigits; i += unit*2) {
if (2*unit <= num_bdigits - i) {
- bary_mul(vds+i, unit*2, BDIGITS(powerv), RBIGNUM_LEN(powerv), uds+i+unit, unit);
+ bary_mul(vds+i, unit*2, BDIGITS(powerv), BIGNUM_LEN(powerv), uds+i+unit, unit);
bary_add(vds+i, unit*2, vds+i, unit*2, uds+i, unit);
}
else if (unit <= num_bdigits - i) {
- bary_mul(vds+i, num_bdigits-i, BDIGITS(powerv), RBIGNUM_LEN(powerv), uds+i+unit, num_bdigits-(i+unit));
+ bary_mul(vds+i, num_bdigits-i, BDIGITS(powerv), BIGNUM_LEN(powerv), uds+i+unit, num_bdigits-(i+unit));
bary_add(vds+i, num_bdigits-i, vds+i, num_bdigits-i, uds+i, unit);
}
else {
@@ -3925,7 +3905,7 @@ str2big_gmp(
size_t num_bdigits,
int base)
{
- const size_t nails = (sizeof(BDIGIT)-SIZEOF_BDIGITS)*CHAR_BIT;
+ const size_t nails = (sizeof(BDIGIT)-SIZEOF_BDIGIT)*CHAR_BIT;
char *buf, *p;
const char *q;
VALUE tmps;
@@ -4053,8 +4033,10 @@ rb_cstr_to_inum(const char *str, int base, int badcheck)
if (c == '_') {
if (++us >= 2)
break;
- } else
+ }
+ else {
us = 0;
+ }
}
if (!(c = *str) || ISSPACE(c)) --str;
}
@@ -4086,7 +4068,7 @@ rb_cstr_to_inum(const char *str, int base, int badcheck)
}
else {
VALUE big = rb_uint2big(val);
- RBIGNUM_SET_SIGN(big, sign);
+ BIGNUM_SET_SIGN(big, sign);
return bignorm(big);
}
}
@@ -4317,7 +4299,7 @@ rb_ull2big(unsigned LONG_LONG n)
VALUE big = bignew(bdigit_roomof(SIZEOF_LONG_LONG), 1);
BDIGIT *digits = BDIGITS(big);
-#if SIZEOF_BDIGITS >= SIZEOF_LONG_LONG
+#if SIZEOF_BDIGIT >= SIZEOF_LONG_LONG
digits[0] = n;
#else
for (i = 0; i < bdigit_roomof(SIZEOF_LONG_LONG); i++) {
@@ -4328,7 +4310,7 @@ rb_ull2big(unsigned LONG_LONG n)
i = bdigit_roomof(SIZEOF_LONG_LONG);
while (i-- && !digits[i]) ;
- RBIGNUM_SET_LEN(big, i+1);
+ BIGNUM_SET_LEN(big, i+1);
return big;
}
@@ -4348,7 +4330,7 @@ rb_ll2big(LONG_LONG n)
}
big = rb_ull2big(u);
if (neg) {
- RBIGNUM_SET_SIGN(big, 0);
+ BIGNUM_SET_SIGN(big, 0);
}
return big;
}
@@ -4396,8 +4378,8 @@ big_shift3(VALUE x, int lshift_p, size_t shift_numdigits, int shift_numbits)
}
s1 = shift_numdigits;
s2 = shift_numbits;
- xn = RBIGNUM_LEN(x);
- z = bignew(xn+s1+1, RBIGNUM_SIGN(x));
+ xn = BIGNUM_LEN(x);
+ z = bignew(xn+s1+1, BIGNUM_SIGN(x));
zds = BDIGITS(z);
BDIGITS_ZERO(zds, s1);
xds = BDIGITS(x);
@@ -4406,9 +4388,9 @@ big_shift3(VALUE x, int lshift_p, size_t shift_numdigits, int shift_numbits)
else {
long zn;
BDIGIT hibitsx;
- if (LONG_MAX < shift_numdigits || (size_t)RBIGNUM_LEN(x) <= shift_numdigits) {
- if (RBIGNUM_POSITIVE_P(x) ||
- bary_zero_p(BDIGITS(x), RBIGNUM_LEN(x)))
+ if (LONG_MAX < shift_numdigits || (size_t)BIGNUM_LEN(x) <= shift_numdigits) {
+ if (BIGNUM_POSITIVE_P(x) ||
+ bary_zero_p(BDIGITS(x), BIGNUM_LEN(x)))
return INT2FIX(0);
else
return INT2FIX(-1);
@@ -4455,7 +4437,7 @@ big_shift2(VALUE x, int lshift_p, VALUE y)
}
else {
if (1 < sign || CHAR_BIT <= lens[1])
- return RBIGNUM_POSITIVE_P(x) ? INT2FIX(0) : INT2FIX(-1);
+ return BIGNUM_POSITIVE_P(x) ? INT2FIX(0) : INT2FIX(-1);
}
shift_numbits = (int)(lens[0] & (BITSPERDIG-1));
shift_numdigits = (lens[0] >> bit_length(BITSPERDIG-1)) |
@@ -4539,61 +4521,6 @@ power_cache_get_power(int base, int power_level, size_t *numdigits_ret)
return base36_power_cache[base - 2][power_level];
}
-/*
- * deprecated. (used only from deprecated rb_big2str0)
- *
- * big2str_muraken_find_n1
- *
- * Let a natural number x is given by:
- * x = 2^0 * x_0 + 2^1 * x_1 + ... + 2^(B*n_0 - 1) * x_{B*n_0 - 1},
- * where B is BITSPERDIG (i.e. BDIGITS*CHAR_BIT) and n_0 is
- * RBIGNUM_LEN(x).
- *
- * Now, we assume n_1 = min_n \{ n | 2^(B*n_0/2) <= b_1^(n_1) \}, so
- * it is realized that 2^(B*n_0) <= {b_1}^{2*n_1}, where b_1 is a
- * given radix number. And then, we have n_1 <= (B*n_0) /
- * (2*log_2(b_1)), therefore n_1 is given by ceil((B*n_0) /
- * (2*log_2(b_1))).
- */
-static long
-big2str_find_n1(VALUE x, int base)
-{
- static const double log_2[] = {
- 1.0, 1.58496250072116, 2.0,
- 2.32192809488736, 2.58496250072116, 2.8073549220576,
- 3.0, 3.16992500144231, 3.32192809488736,
- 3.4594316186373, 3.58496250072116, 3.70043971814109,
- 3.8073549220576, 3.90689059560852, 4.0,
- 4.08746284125034, 4.16992500144231, 4.24792751344359,
- 4.32192809488736, 4.39231742277876, 4.4594316186373,
- 4.52356195605701, 4.58496250072116, 4.64385618977472,
- 4.70043971814109, 4.75488750216347, 4.8073549220576,
- 4.85798099512757, 4.90689059560852, 4.95419631038688,
- 5.0, 5.04439411935845, 5.08746284125034,
- 5.12928301694497, 5.16992500144231
- };
- long bits;
-
- if (base < 2 || 36 < base)
- rb_bug("invalid radix %d", base);
-
- if (FIXNUM_P(x)) {
- bits = (SIZEOF_LONG*CHAR_BIT - 1)/2 + 1;
- }
- else if (BIGZEROP(x)) {
- return 0;
- }
- else if (RBIGNUM_LEN(x) >= LONG_MAX/BITSPERDIG) {
- rb_raise(rb_eRangeError, "bignum too big to convert into `string'");
- }
- else {
- bits = BITSPERDIG*RBIGNUM_LEN(x);
- }
-
- /* @shyouhei note: vvvvvvvvvvvvv this cast is suspicious. But I believe it is OK, because if that cast loses data, this x value is too big, and should have raised RangeError. */
- return (long)ceil(((double)bits)/log_2[base - 2]);
-}
-
struct big2str_struct {
int negative;
int base;
@@ -4699,7 +4626,7 @@ big2str_karatsuba(struct big2str_struct *b2s, BDIGIT *xds, size_t xn, size_t wn,
lower_power_level = power_level-1;
b = power_cache_get_power(b2s->base, lower_power_level, &lower_numdigits);
- bn = RBIGNUM_LEN(b);
+ bn = BIGNUM_LEN(b);
bds = BDIGITS(b);
half_numdigits = lower_numdigits;
@@ -4709,7 +4636,7 @@ big2str_karatsuba(struct big2str_struct *b2s, BDIGIT *xds, size_t xn, size_t wn,
(xn == bn && bary_cmp(xds, xn, bds, bn) < 0))) {
lower_power_level--;
b = power_cache_get_power(b2s->base, lower_power_level, &lower_numdigits);
- bn = RBIGNUM_LEN(b);
+ bn = BIGNUM_LEN(b);
bds = BDIGITS(b);
}
@@ -4782,12 +4709,12 @@ big2str_base_poweroftwo(VALUE x, int base)
VALUE result;
char *ptr;
numwords = rb_absint_numwords(x, word_numbits, NULL);
- if (RBIGNUM_NEGATIVE_P(x)) {
+ if (BIGNUM_NEGATIVE_P(x)) {
if (LONG_MAX-1 < numwords)
rb_raise(rb_eArgError, "too big number");
result = rb_usascii_str_new(0, 1+numwords);
ptr = RSTRING_PTR(result);
- *ptr++ = RBIGNUM_POSITIVE_P(x) ? '+' : '-';
+ *ptr++ = BIGNUM_POSITIVE_P(x) ? '+' : '-';
}
else {
if (LONG_MAX < numwords)
@@ -4821,7 +4748,7 @@ big2str_generic(VALUE x, int base)
VALUE power;
xds = BDIGITS(x);
- xn = RBIGNUM_LEN(x);
+ xn = BIGNUM_LEN(x);
BARY_TRUNC(xds, xn);
if (xn == 0) {
@@ -4838,13 +4765,13 @@ big2str_generic(VALUE x, int base)
power_level = 0;
power = power_cache_get_power(base, power_level, NULL);
while (power_level < MAX_BASE36_POWER_TABLE_ENTRIES &&
- (size_t)RBIGNUM_LEN(power) <= (xn+1)/2) {
+ (size_t)BIGNUM_LEN(power) <= (xn+1)/2) {
power_level++;
power = power_cache_get_power(base, power_level, NULL);
}
assert(power_level != MAX_BASE36_POWER_TABLE_ENTRIES);
- if ((size_t)RBIGNUM_LEN(power) <= xn) {
+ if ((size_t)BIGNUM_LEN(power) <= xn) {
/*
* This increment guarantees x < power_cache_get_power(base, power_level)
* without invoking it actually.
@@ -4858,7 +4785,7 @@ big2str_generic(VALUE x, int base)
power_level++;
}
- b2s_data.negative = RBIGNUM_NEGATIVE_P(x);
+ b2s_data.negative = BIGNUM_NEGATIVE_P(x);
b2s_data.base = base;
b2s_data.hbase2 = maxpow_in_bdigit_dbl(base, &b2s_data.hbase2_numdigits);
@@ -4872,7 +4799,7 @@ big2str_generic(VALUE x, int base)
VALUE tmpw = 0;
BDIGIT *wds;
size_t wn;
- wn = power_level * BIGDIVREM_EXTRA_WORDS + RBIGNUM_LEN(power);
+ wn = power_level * BIGDIVREM_EXTRA_WORDS + BIGNUM_LEN(power);
wds = ALLOCV_N(BDIGIT, tmpw, xn + wn);
MEMCPY(wds, xds, BDIGIT, xn);
big2str_karatsuba(&b2s_data, wds, xn, wn, power_level, 0);
@@ -4898,19 +4825,19 @@ rb_big2str_generic(VALUE x, int base)
VALUE
big2str_gmp(VALUE x, int base)
{
- const size_t nails = (sizeof(BDIGIT)-SIZEOF_BDIGITS)*CHAR_BIT;
+ const size_t nails = (sizeof(BDIGIT)-SIZEOF_BDIGIT)*CHAR_BIT;
mpz_t mx;
size_t size;
VALUE str;
BDIGIT *xds = BDIGITS(x);
- size_t xn = RBIGNUM_LEN(x);
+ size_t xn = BIGNUM_LEN(x);
mpz_init(mx);
mpz_import(mx, xn, -1, sizeof(BDIGIT), 0, nails, xds);
size = mpz_sizeinbase(mx, base);
- if (RBIGNUM_NEGATIVE_P(x)) {
+ if (BIGNUM_NEGATIVE_P(x)) {
mpz_neg(mx, mx);
str = rb_usascii_str_new(0, size+1);
}
@@ -4947,7 +4874,7 @@ rb_big2str1(VALUE x, int base)
bigtrunc(x);
xds = BDIGITS(x);
- xn = RBIGNUM_LEN(x);
+ xn = BIGNUM_LEN(x);
BARY_TRUNC(xds, xn);
if (xn == 0) {
@@ -4975,41 +4902,6 @@ rb_big2str1(VALUE x, int base)
return big2str_generic(x, base);
}
-/* deprecated */
-VALUE
-rb_big2str0(VALUE x, int base, int trim)
-{
- VALUE str;
- long oldlen;
- long n2;
-
- str = rb_big2str1(x, base);
-
- if (trim || FIXNUM_P(x) || BIGZEROP(x))
- return str;
-
- oldlen = RSTRING_LEN(str);
- if (oldlen && RSTRING_PTR(str)[0] != '-') {
- rb_str_resize(str, oldlen+1);
- MEMMOVE(RSTRING_PTR(str)+1, RSTRING_PTR(str), char, oldlen);
- RSTRING_PTR(str)[0] = '+';
- }
-
- n2 = big2str_find_n1(x, base);
-
- oldlen = RSTRING_LEN(str);
- if (oldlen-1 < n2) {
- long off = n2 - (oldlen-1);
- rb_str_resize(str, n2+1);
- MEMMOVE(RSTRING_PTR(str)+1+off, RSTRING_PTR(str)+1, char, oldlen-1);
- memset(RSTRING_PTR(str)+1, '0', off);
- }
-
- RSTRING_PTR(str)[RSTRING_LEN(str)] = '\0';
-
- return str;
-}
-
VALUE
rb_big2str(VALUE x, int base)
{
@@ -5048,7 +4940,7 @@ rb_big_to_s(int argc, VALUE *argv, VALUE x)
static unsigned long
big2ulong(VALUE x, const char *type)
{
- long len = RBIGNUM_LEN(x);
+ size_t len = BIGNUM_LEN(x);
unsigned long num;
BDIGIT *ds;
@@ -5058,7 +4950,7 @@ big2ulong(VALUE x, const char *type)
rb_raise(rb_eRangeError, "bignum too big to convert into `%s'", type);
}
ds = BDIGITS(x);
-#if SIZEOF_LONG <= SIZEOF_BDIGITS
+#if SIZEOF_LONG <= SIZEOF_BDIGIT
num = (unsigned long)ds[0];
#else
num = 0;
@@ -5070,22 +4962,12 @@ big2ulong(VALUE x, const char *type)
return num;
}
-/* deprecated */
-VALUE
-rb_big2ulong_pack(VALUE x)
-{
- unsigned long num;
- rb_integer_pack(x, &num, 1, sizeof(num), 0,
- INTEGER_PACK_NATIVE_BYTE_ORDER|INTEGER_PACK_2COMP);
- return num;
-}
-
-VALUE
+unsigned long
rb_big2ulong(VALUE x)
{
unsigned long num = big2ulong(x, "unsigned long");
- if (RBIGNUM_POSITIVE_P(x)) {
+ if (BIGNUM_POSITIVE_P(x)) {
return num;
}
else {
@@ -5097,12 +4979,12 @@ rb_big2ulong(VALUE x)
rb_raise(rb_eRangeError, "bignum out of range of unsigned long");
}
-SIGNED_VALUE
+long
rb_big2long(VALUE x)
{
unsigned long num = big2ulong(x, "long");
- if (RBIGNUM_POSITIVE_P(x)) {
+ if (BIGNUM_POSITIVE_P(x)) {
if (num <= LONG_MAX)
return num;
}
@@ -5120,7 +5002,7 @@ rb_big2long(VALUE x)
static unsigned LONG_LONG
big2ull(VALUE x, const char *type)
{
- long len = RBIGNUM_LEN(x);
+ size_t len = BIGNUM_LEN(x);
unsigned LONG_LONG num;
BDIGIT *ds = BDIGITS(x);
@@ -5128,7 +5010,7 @@ big2ull(VALUE x, const char *type)
return 0;
if (BIGSIZE(x) > SIZEOF_LONG_LONG)
rb_raise(rb_eRangeError, "bignum too big to convert into `%s'", type);
-#if SIZEOF_LONG_LONG <= SIZEOF_BDIGITS
+#if SIZEOF_LONG_LONG <= SIZEOF_BDIGIT
num = (unsigned LONG_LONG)ds[0];
#else
num = 0;
@@ -5145,7 +5027,7 @@ rb_big2ull(VALUE x)
{
unsigned LONG_LONG num = big2ull(x, "unsigned long long");
- if (RBIGNUM_POSITIVE_P(x)) {
+ if (BIGNUM_POSITIVE_P(x)) {
return num;
}
else {
@@ -5162,7 +5044,7 @@ rb_big2ll(VALUE x)
{
unsigned LONG_LONG num = big2ull(x, "long long");
- if (RBIGNUM_POSITIVE_P(x)) {
+ if (BIGNUM_POSITIVE_P(x)) {
if (num <= LLONG_MAX)
return num;
}
@@ -5219,7 +5101,7 @@ static double
big2dbl(VALUE x)
{
double d = 0.0;
- long i = (bigtrunc(x), RBIGNUM_LEN(x)), lo = 0, bits;
+ long i = (bigtrunc(x), BIGNUM_LEN(x)), lo = 0, bits;
BDIGIT *ds = BDIGITS(x), dl;
if (i) {
@@ -5261,7 +5143,7 @@ big2dbl(VALUE x)
}
}
}
- if (!RBIGNUM_SIGN(x)) d = -d;
+ if (!BIGNUM_SIGN(x)) d = -d;
return d;
}
@@ -5395,7 +5277,16 @@ rb_big_cmp(VALUE x, VALUE y)
int cmp;
if (FIXNUM_P(y)) {
- y = rb_int2big(FIX2LONG(y));
+ x = bignorm(x);
+ if (FIXNUM_P(x)) {
+ 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)) {
}
@@ -5406,11 +5297,11 @@ rb_big_cmp(VALUE x, VALUE y)
return rb_num_coerce_cmp(x, y, rb_intern("<=>"));
}
- if (RBIGNUM_SIGN(x) > RBIGNUM_SIGN(y)) return INT2FIX(1);
- if (RBIGNUM_SIGN(x) < RBIGNUM_SIGN(y)) return INT2FIX(-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), RBIGNUM_LEN(x), BDIGITS(y), RBIGNUM_LEN(y));
- if (RBIGNUM_SIGN(x))
+ cmp = bary_cmp(BDIGITS(x), BIGNUM_LEN(x), BDIGITS(y), BIGNUM_LEN(y));
+ if (BIGNUM_SIGN(x))
return INT2FIX(cmp);
else
return INT2FIX(-cmp);
@@ -5540,9 +5431,9 @@ rb_big_eq(VALUE x, VALUE y)
else {
return rb_equal(y, x);
}
- if (RBIGNUM_SIGN(x) != RBIGNUM_SIGN(y)) return Qfalse;
- if (RBIGNUM_LEN(x) != RBIGNUM_LEN(y)) return Qfalse;
- if (MEMCMP(BDIGITS(x),BDIGITS(y),BDIGIT,RBIGNUM_LEN(y)) != 0) return Qfalse;
+ if (BIGNUM_SIGN(x) != BIGNUM_SIGN(y)) return Qfalse;
+ if (BIGNUM_LEN(x) != BIGNUM_LEN(y)) return Qfalse;
+ if (MEMCMP(BDIGITS(x),BDIGITS(y),BDIGIT,BIGNUM_LEN(y)) != 0) return Qfalse;
return Qtrue;
}
@@ -5561,9 +5452,9 @@ VALUE
rb_big_eql(VALUE x, VALUE y)
{
if (!RB_BIGNUM_TYPE_P(y)) return Qfalse;
- if (RBIGNUM_SIGN(x) != RBIGNUM_SIGN(y)) return Qfalse;
- if (RBIGNUM_LEN(x) != RBIGNUM_LEN(y)) return Qfalse;
- if (MEMCMP(BDIGITS(x),BDIGITS(y),BDIGIT,RBIGNUM_LEN(y)) != 0) return Qfalse;
+ if (BIGNUM_SIGN(x) != BIGNUM_SIGN(y)) return Qfalse;
+ if (BIGNUM_LEN(x) != BIGNUM_LEN(y)) return Qfalse;
+ if (MEMCMP(BDIGITS(x),BDIGITS(y),BDIGIT,BIGNUM_LEN(y)) != 0) return Qfalse;
return Qtrue;
}
@@ -5579,7 +5470,7 @@ rb_big_uminus(VALUE x)
{
VALUE z = rb_big_clone(x);
- RBIGNUM_SET_SIGN(z, !RBIGNUM_SIGN(x));
+ BIGNUM_SET_SIGN(z, !BIGNUM_SIGN(x));
return bignorm(z);
}
@@ -5601,22 +5492,22 @@ rb_big_neg(VALUE x)
{
VALUE z = rb_big_clone(x);
BDIGIT *ds = BDIGITS(z);
- long n = RBIGNUM_LEN(z);
+ long n = BIGNUM_LEN(z);
if (!n) return INT2FIX(-1);
- if (RBIGNUM_POSITIVE_P(z)) {
+ if (BIGNUM_POSITIVE_P(z)) {
if (bary_add_one(ds, n)) {
big_extend_carry(z);
}
- RBIGNUM_SET_NEGATIVE_SIGN(z);
+ BIGNUM_SET_NEGATIVE_SIGN(z);
}
else {
bary_neg(ds, n);
if (bary_add_one(ds, n))
return INT2FIX(-1);
bary_neg(ds, n);
- RBIGNUM_SET_POSITIVE_SIGN(z);
+ BIGNUM_SET_POSITIVE_SIGN(z);
}
return bignorm(z);
@@ -5629,8 +5520,8 @@ bigsub(VALUE x, VALUE y)
BDIGIT *xds, *yds, *zds;
long xn, yn, zn;
- xn = RBIGNUM_LEN(x);
- yn = RBIGNUM_LEN(y);
+ xn = BIGNUM_LEN(x);
+ yn = BIGNUM_LEN(y);
zn = xn < yn ? yn : xn;
z = bignew(zn, 1);
@@ -5641,7 +5532,7 @@ bigsub(VALUE x, VALUE y)
if (bary_sub(zds, zn, xds, xn, yds, yn)) {
bary_2comp(zds, zn);
- RBIGNUM_SET_NEGATIVE_SIGN(z);
+ BIGNUM_SET_NEGATIVE_SIGN(z);
}
return z;
@@ -5660,24 +5551,24 @@ bigsub_int(VALUE x, long y0)
y = y0;
xds = BDIGITS(x);
- xn = RBIGNUM_LEN(x);
+ xn = BIGNUM_LEN(x);
if (xn == 0)
return LONG2NUM(-y0);
zn = xn;
-#if SIZEOF_BDIGITS < SIZEOF_LONG
+#if SIZEOF_BDIGIT < SIZEOF_LONG
if (zn < bdigit_roomof(SIZEOF_LONG))
zn = bdigit_roomof(SIZEOF_LONG);
#endif
- z = bignew(zn, RBIGNUM_SIGN(x));
+ z = bignew(zn, BIGNUM_SIGN(x));
zds = BDIGITS(z);
-#if SIZEOF_BDIGITS >= SIZEOF_LONG
+#if SIZEOF_BDIGIT >= SIZEOF_LONG
assert(xn == zn);
num = (BDIGIT_DBL_SIGNED)xds[0] - y;
if (xn == 1 && num < 0) {
- RBIGNUM_SET_SIGN(z, !RBIGNUM_SIGN(x));
+ BIGNUM_SET_SIGN(z, !BIGNUM_SIGN(x));
zds[0] = (BDIGIT)-num;
RB_GC_GUARD(x);
return bignorm(z);
@@ -5714,7 +5605,7 @@ bigsub_int(VALUE x, long y0)
zds[i] = BIGLO(num);
num = BIGDN(num);
}
-#if SIZEOF_BDIGITS < SIZEOF_LONG
+#if SIZEOF_BDIGIT < SIZEOF_LONG
for (; i < zn; i++) {
y_is_zero_z:
if (num == 0) goto num_is_zero_z;
@@ -5728,7 +5619,7 @@ bigsub_int(VALUE x, long y0)
num_is_zero_x:
zds[i] = xds[i];
}
-#if SIZEOF_BDIGITS < SIZEOF_LONG
+#if SIZEOF_BDIGIT < SIZEOF_LONG
for (; i < zn; i++) {
num_is_zero_z:
zds[i] = 0;
@@ -5740,7 +5631,7 @@ bigsub_int(VALUE x, long y0)
assert(num == 0 || num == -1);
if (num < 0) {
get2comp(z);
- RBIGNUM_SET_SIGN(z, !RBIGNUM_SIGN(x));
+ BIGNUM_SET_SIGN(z, !BIGNUM_SIGN(x));
}
RB_GC_GUARD(x);
return bignorm(z);
@@ -5756,22 +5647,22 @@ bigadd_int(VALUE x, long y)
long i;
xds = BDIGITS(x);
- xn = RBIGNUM_LEN(x);
+ xn = BIGNUM_LEN(x);
if (xn == 0)
return LONG2NUM(y);
zn = xn;
-#if SIZEOF_BDIGITS < SIZEOF_LONG
+#if SIZEOF_BDIGIT < SIZEOF_LONG
if (zn < bdigit_roomof(SIZEOF_LONG))
zn = bdigit_roomof(SIZEOF_LONG);
#endif
zn++;
- z = bignew(zn, RBIGNUM_SIGN(x));
+ z = bignew(zn, BIGNUM_SIGN(x));
zds = BDIGITS(z);
-#if SIZEOF_BDIGITS >= SIZEOF_LONG
+#if SIZEOF_BDIGIT >= SIZEOF_LONG
num = (BDIGIT_DBL)xds[0] + y;
zds[0] = BIGLO(num);
num = BIGDN(num);
@@ -5833,25 +5724,25 @@ static VALUE
bigadd(VALUE x, VALUE y, int sign)
{
VALUE z;
- long len;
+ size_t len;
- sign = (sign == RBIGNUM_SIGN(y));
- if (RBIGNUM_SIGN(x) != sign) {
+ sign = (sign == BIGNUM_SIGN(y));
+ if (BIGNUM_SIGN(x) != sign) {
if (sign) return bigsub(y, x);
return bigsub(x, y);
}
- if (RBIGNUM_LEN(x) > RBIGNUM_LEN(y)) {
- len = RBIGNUM_LEN(x) + 1;
+ if (BIGNUM_LEN(x) > BIGNUM_LEN(y)) {
+ len = BIGNUM_LEN(x) + 1;
}
else {
- len = RBIGNUM_LEN(y) + 1;
+ len = BIGNUM_LEN(y) + 1;
}
z = bignew(len, sign);
- bary_add(BDIGITS(z), RBIGNUM_LEN(z),
- BDIGITS(x), RBIGNUM_LEN(x),
- BDIGITS(y), RBIGNUM_LEN(y));
+ bary_add(BDIGITS(z), BIGNUM_LEN(z),
+ BDIGITS(x), BIGNUM_LEN(x),
+ BDIGITS(y), BIGNUM_LEN(y));
return z;
}
@@ -5870,7 +5761,7 @@ rb_big_plus(VALUE x, VALUE y)
if (FIXNUM_P(y)) {
n = FIX2LONG(y);
- if ((n > 0) != RBIGNUM_SIGN(x)) {
+ if ((n > 0) != BIGNUM_SIGN(x)) {
if (n < 0) {
n = -n;
}
@@ -5906,7 +5797,7 @@ rb_big_minus(VALUE x, VALUE y)
if (FIXNUM_P(y)) {
n = FIX2LONG(y);
- if ((n > 0) != RBIGNUM_SIGN(x)) {
+ if ((n > 0) != BIGNUM_SIGN(x)) {
if (n < 0) {
n = -n;
}
@@ -5935,7 +5826,7 @@ bigsq(VALUE x)
VALUE z;
BDIGIT *xds, *zds;
- xn = RBIGNUM_LEN(x);
+ xn = BIGNUM_LEN(x);
zn = 2 * xn;
z = bignew(zn, 1);
@@ -5969,11 +5860,11 @@ bigmul0(VALUE x, VALUE y)
if (x == y)
return bigsq(x);
- xn = RBIGNUM_LEN(x);
- yn = RBIGNUM_LEN(y);
+ xn = BIGNUM_LEN(x);
+ yn = BIGNUM_LEN(y);
zn = xn + yn;
- z = bignew(zn, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ z = bignew(zn, BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
xds = BDIGITS(x);
yds = BDIGITS(y);
@@ -6014,7 +5905,7 @@ rb_big_mul(VALUE x, VALUE y)
static VALUE
bigdivrem(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp)
{
- long xn = RBIGNUM_LEN(x), yn = RBIGNUM_LEN(y);
+ long xn = BIGNUM_LEN(x), yn = BIGNUM_LEN(y);
VALUE z;
BDIGIT *xds, *yds, *zds;
BDIGIT dd;
@@ -6038,12 +5929,12 @@ bigdivrem(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp)
}
if (yn == 1) {
dd = yds[0];
- z = bignew(xn, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ z = bignew(xn, BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
zds = BDIGITS(z);
dd = bigdivrem_single(zds, xds, xn, dd);
if (modp) {
*modp = rb_uint2big((VALUE)dd);
- RBIGNUM_SET_SIGN(*modp, RBIGNUM_SIGN(x));
+ BIGNUM_SET_SIGN(*modp, BIGNUM_SIGN(x));
}
if (divp) *divp = z;
return Qnil;
@@ -6054,14 +5945,14 @@ bigdivrem(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp)
BDIGIT_DBL q0 = x0 / y0;
BDIGIT_DBL r0 = x0 % y0;
if (divp) {
- z = bignew(bdigit_roomof(sizeof(BDIGIT_DBL)), RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ z = bignew(bdigit_roomof(sizeof(BDIGIT_DBL)), BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
zds = BDIGITS(z);
zds[0] = BIGLO(q0);
zds[1] = BIGLO(BIGDN(q0));
*divp = z;
}
if (modp) {
- z = bignew(bdigit_roomof(sizeof(BDIGIT_DBL)), RBIGNUM_SIGN(x));
+ z = bignew(bdigit_roomof(sizeof(BDIGIT_DBL)), BIGNUM_SIGN(x));
zds = BDIGITS(z);
zds[0] = BIGLO(r0);
zds[1] = BIGLO(BIGDN(r0));
@@ -6072,7 +5963,7 @@ bigdivrem(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp)
if (divp) {
qn = xn + BIGDIVREM_EXTRA_WORDS;
- q = bignew(qn, RBIGNUM_SIGN(x)==RBIGNUM_SIGN(y));
+ q = bignew(qn, BIGNUM_SIGN(x)==BIGNUM_SIGN(y));
qds = BDIGITS(q);
}
else {
@@ -6082,7 +5973,7 @@ bigdivrem(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp)
if (modp) {
rn = yn;
- r = bignew(rn, RBIGNUM_SIGN(x));
+ r = bignew(rn, BIGNUM_SIGN(x));
rds = BDIGITS(r);
}
else {
@@ -6110,7 +6001,7 @@ bigdivmod(VALUE x, VALUE y, volatile VALUE *divp, volatile VALUE *modp)
VALUE mod;
bigdivrem(x, y, divp, &mod);
- if (RBIGNUM_SIGN(x) != RBIGNUM_SIGN(y) && !BIGZEROP(mod)) {
+ if (BIGNUM_SIGN(x) != BIGNUM_SIGN(y) && !BIGZEROP(mod)) {
if (divp) *divp = bigadd(*divp, rb_int2big(1), 0);
if (modp) *modp = bigadd(mod, y, 1);
}
@@ -6267,7 +6158,7 @@ big_fdiv(VALUE x, VALUE y, long ey)
long l, ex;
bigtrunc(x);
- l = RBIGNUM_LEN(x);
+ l = BIGNUM_LEN(x);
ex = l * BITSPERDIG - nlz(BDIGITS(x)[l-1]);
ex -= 2 * DBL_BIGDIG * BITSPERDIG;
if (ex) x = big_shift(x, ex);
@@ -6289,7 +6180,7 @@ big_fdiv_int(VALUE x, VALUE y)
{
long l, ey;
bigtrunc(y);
- l = RBIGNUM_LEN(y);
+ l = BIGNUM_LEN(y);
ey = l * BITSPERDIG - nlz(BDIGITS(y)[l-1]);
ey -= DBL_BIGDIG * BITSPERDIG;
if (ey) y = big_shift(y, ey);
@@ -6369,7 +6260,7 @@ rb_big_pow(VALUE x, VALUE y)
if (y == INT2FIX(0)) return INT2FIX(1);
if (RB_FLOAT_TYPE_P(y)) {
d = RFLOAT_VALUE(y);
- if ((!RBIGNUM_SIGN(x) && !BIGZEROP(x)) && d != round(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)) {
@@ -6426,7 +6317,7 @@ bigand_int(VALUE x, long xn, BDIGIT hibitsx, long y)
if (xn == 0) return hibitsx ? LONG2NUM(y) : 0;
hibitsy = 0 <= y ? 0 : BDIGMAX;
xds = BDIGITS(x);
-#if SIZEOF_BDIGITS >= SIZEOF_LONG
+#if SIZEOF_BDIGIT >= SIZEOF_LONG
if (!hibitsy) {
y &= xds[0];
return LONG2NUM(y);
@@ -6434,7 +6325,7 @@ bigand_int(VALUE x, long xn, BDIGIT hibitsx, long y)
#endif
zn = xn;
-#if SIZEOF_BDIGITS < SIZEOF_LONG
+#if SIZEOF_BDIGIT < SIZEOF_LONG
if (hibitsx && zn < bdigit_roomof(SIZEOF_LONG))
zn = bdigit_roomof(SIZEOF_LONG);
#endif
@@ -6442,7 +6333,7 @@ bigand_int(VALUE x, long xn, BDIGIT hibitsx, long y)
z = bignew(zn, 0);
zds = BDIGITS(z);
-#if SIZEOF_BDIGITS >= SIZEOF_LONG
+#if SIZEOF_BDIGIT >= SIZEOF_LONG
i = 1;
zds[0] = xds[0] & BIGLO(y);
#else
@@ -6540,15 +6431,15 @@ bigor_int(VALUE x, long xn, BDIGIT hibitsx, long y)
hibitsy = 0 <= y ? 0 : BDIGMAX;
xds = BDIGITS(x);
- zn = RBIGNUM_LEN(x);
-#if SIZEOF_BDIGITS < SIZEOF_LONG
+ zn = BIGNUM_LEN(x);
+#if SIZEOF_BDIGIT < SIZEOF_LONG
if (zn < bdigit_roomof(SIZEOF_LONG))
zn = bdigit_roomof(SIZEOF_LONG);
#endif
z = bignew(zn, 0);
zds = BDIGITS(z);
-#if SIZEOF_BDIGITS >= SIZEOF_LONG
+#if SIZEOF_BDIGIT >= SIZEOF_LONG
i = 1;
zds[0] = xds[0] | BIGLO(y);
if (i < zn)
@@ -6663,15 +6554,15 @@ bigxor_int(VALUE x, long xn, BDIGIT hibitsx, long y)
hibitsy = 0 <= y ? 0 : BDIGMAX;
xds = BDIGITS(x);
- zn = RBIGNUM_LEN(x);
-#if SIZEOF_BDIGITS < SIZEOF_LONG
+ zn = BIGNUM_LEN(x);
+#if SIZEOF_BDIGIT < SIZEOF_LONG
if (zn < bdigit_roomof(SIZEOF_LONG))
zn = bdigit_roomof(SIZEOF_LONG);
#endif
z = bignew(zn, 0);
zds = BDIGITS(z);
-#if SIZEOF_BDIGITS >= SIZEOF_LONG
+#if SIZEOF_BDIGIT >= SIZEOF_LONG
i = 1;
zds[0] = xds[0] ^ BIGLO(y);
#else
@@ -6847,33 +6738,38 @@ static VALUE
rb_big_aref(VALUE x, VALUE y)
{
BDIGIT *xds;
- unsigned long shift;
- long i, s1, s2;
+ size_t shift;
+ size_t i, s1, s2;
+ long l;
BDIGIT bit;
if (RB_BIGNUM_TYPE_P(y)) {
- if (!RBIGNUM_SIGN(y))
+ if (!BIGNUM_SIGN(y))
return INT2FIX(0);
bigtrunc(y);
- if (BIGSIZE(y) > sizeof(long)) {
+ if (BIGSIZE(y) > sizeof(size_t)) {
out_of_range:
- return RBIGNUM_SIGN(x) ? INT2FIX(0) : INT2FIX(1);
+ return BIGNUM_SIGN(x) ? INT2FIX(0) : INT2FIX(1);
}
+#if SIZEOF_SIZE_T <= SIZEOF_LONG
shift = big2ulong(y, "long");
+#else
+ shift = big2ull(y, "long long");
+#endif
}
else {
- i = NUM2LONG(y);
- if (i < 0) return INT2FIX(0);
- shift = i;
+ l = NUM2LONG(y);
+ if (l < 0) return INT2FIX(0);
+ shift = (size_t)l;
}
s1 = shift/BITSPERDIG;
s2 = shift%BITSPERDIG;
bit = (BDIGIT)1 << s2;
- if (s1 >= RBIGNUM_LEN(x)) goto out_of_range;
+ if (s1 >= BIGNUM_LEN(x)) goto out_of_range;
xds = BDIGITS(x);
- if (RBIGNUM_POSITIVE_P(x))
+ if (BIGNUM_POSITIVE_P(x))
return (xds[s1] & bit) ? INT2FIX(1) : INT2FIX(0);
if (xds[s1] & (bit-1))
return (xds[s1] & bit) ? INT2FIX(0) : INT2FIX(1);
@@ -6888,6 +6784,8 @@ rb_big_aref(VALUE x, VALUE y)
* big.hash -> fixnum
*
* Compute a hash based on the value of _big_.
+ *
+ * See also Object#hash.
*/
static VALUE
@@ -6895,7 +6793,7 @@ rb_big_hash(VALUE x)
{
st_index_t hash;
- hash = rb_memhash(BDIGITS(x), sizeof(BDIGIT)*RBIGNUM_LEN(x)) ^ RBIGNUM_SIGN(x);
+ hash = rb_memhash(BDIGITS(x), sizeof(BDIGIT)*BIGNUM_LEN(x)) ^ BIGNUM_SIGN(x);
return INT2FIX(hash);
}
@@ -6939,9 +6837,9 @@ rb_big_coerce(VALUE x, VALUE y)
static VALUE
rb_big_abs(VALUE x)
{
- if (!RBIGNUM_SIGN(x)) {
+ if (!BIGNUM_SIGN(x)) {
x = rb_big_clone(x);
- RBIGNUM_SET_SIGN(x, 1);
+ BIGNUM_SET_SIGN(x, 1);
}
return x;
}
@@ -6993,6 +6891,13 @@ rb_big_size(VALUE big)
* (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
*/
static VALUE
@@ -7011,7 +6916,7 @@ rb_big_bit_length(VALUE big)
if (numbytes == 0)
return LONG2FIX(0);
- if (RBIGNUM_NEGATIVE_P(big) && rb_absint_singlebit_p(big)) {
+ if (BIGNUM_NEGATIVE_P(big) && rb_absint_singlebit_p(big)) {
if (nlz_bits != CHAR_BIT-1) {
nlz_bits++;
}
@@ -7046,7 +6951,7 @@ rb_big_bit_length(VALUE big)
static VALUE
rb_big_odd_p(VALUE num)
{
- if (RBIGNUM_LEN(num) != 0 && BDIGITS(num)[0] & 1) {
+ if (BIGNUM_LEN(num) != 0 && BDIGITS(num)[0] & 1) {
return Qtrue;
}
return Qfalse;
@@ -7062,7 +6967,7 @@ rb_big_odd_p(VALUE num)
static VALUE
rb_big_even_p(VALUE num)
{
- if (RBIGNUM_LEN(num) != 0 && BDIGITS(num)[0] & 1) {
+ if (BIGNUM_LEN(num) != 0 && BDIGITS(num)[0] & 1) {
return Qfalse;
}
return Qtrue;
@@ -7132,6 +7037,7 @@ Init_Bignum(void)
rb_define_method(rb_cBignum, "even?", rb_big_even_p, 0);
#ifdef USE_GMP
+ /* The version of loaded GMP. */
rb_define_const(rb_cBignum, "GMP_VERSION", rb_sprintf("GMP %s", gmp_version));
#endif
diff --git a/bin/testrb b/bin/testrb
deleted file mode 100755
index 23a00b439f..0000000000
--- a/bin/testrb
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/usr/bin/env ruby
-require 'test/unit'
-exit Test::Unit::AutoRunner.run(true)
diff --git a/bootstraptest/runner.rb b/bootstraptest/runner.rb
index 5fdfc42a63..d58b824386 100755
--- a/bootstraptest/runner.rb
+++ b/bootstraptest/runner.rb
@@ -140,9 +140,8 @@ End
@passed = "\e[#{colors["pass"] || "32"}m"
@failed = "\e[#{colors["fail"] || "31"}m"
@reset = "\e[m"
- @erase = "\r\e[2K\r"
else
- @passed = @failed = @reset = @erase = ""
+ @passed = @failed = @reset = ""
end
unless quiet
puts Time.now
@@ -163,28 +162,44 @@ End
}
end
+def erase(e = true)
+ if e and @columns > 0 and !@verbose
+ "\r#{" "*@columns}\r"
+ else
+ ""
+ end
+end
+
def exec_test(pathes)
@count = 0
@error = 0
@errbuf = []
@location = nil
+ @columns = 0
+ @width = pathes.map {|path| File.basename(path).size}.max + 2
pathes.each do |path|
@basename = File.basename(path)
- $stderr.print @basename, " "
+ $stderr.printf("%s%-*s ", erase(@quiet), @width, @basename)
+ $stderr.flush
+ @columns = @width + 1
$stderr.puts if @verbose
count = @count
error = @error
load File.expand_path(path)
if @tty
if @error == error
- $stderr.print "#{@progress_bs}#{@passed}PASS #{@count-count}#{@reset}"
- $stderr.print @erase if @quiet
+ msg = "PASS #{@count-count}"
+ @columns += msg.size - 1
+ $stderr.print "#{@progress_bs}#{@passed}#{msg}#{@reset}"
else
- $stderr.print "#{@progress_bs}#{@failed}FAIL #{@error-error}/#{@count-count}#{@reset}"
+ msg = "FAIL #{@error-error}/#{@count-count}"
+ $stderr.print "#{@progress_bs}#{@failed}#{msg}#{@reset}"
+ @columns = 0
end
end
- $stderr.puts unless @quiet and @tty
+ $stderr.puts unless @quiet and @tty and @error == error
end
+ $stderr.print(erase) if @quiet
if @error == 0
if @count == 0
$stderr.puts "No tests, no problem"
@@ -207,23 +222,28 @@ def show_progress(message = '')
elsif @tty
$stderr.print "#{@progress_bs}#{@progress[@count % @progress.size]}"
end
+ t = Time.now if @verbose
faildesc, errout = with_stderr {yield}
+ t = Time.now - t if @verbose
if !faildesc
if @tty
$stderr.print "#{@progress_bs}#{@progress[@count % @progress.size]}"
+ elsif @verbose
+ $stderr.printf(". %.3f\n", t)
else
$stderr.print '.'
end
- $stderr.puts if @verbose
else
- $stderr.print "#{@failed}F#{@reset}"
+ $stderr.print "#{@failed}F"
+ $stderr.printf(" %.3f", t) if @verbose
+ $stderr.print "#{@reset}"
$stderr.puts if @verbose
error faildesc, message
unless errout.empty?
$stderr.print "#{@failed}stderr output is not empty#{@reset}\n", adjust_indent(errout)
end
if @tty and !@verbose
- $stderr.print @basename, " ", @progress[@count % @progress.size]
+ $stderr.printf("%-*s%s", @width, @basename, @progress[@count % @progress.size])
end
end
rescue Interrupt
@@ -385,7 +405,7 @@ end
INDENT = 27
def adjust_indent(src)
- untabify(src).gsub(/^ {#{INDENT}}/o, '').gsub(/^/, ' ')
+ untabify(src).gsub(/^ {#{INDENT}}/o, '').gsub(/^/, ' ').sub(/\s*\z/, "\n")
end
def untabify(str)
@@ -445,7 +465,7 @@ end
def error(msg, additional_message)
msg = "#{@failed}\##{@count} #{@location}#{@reset}: #{msg} #{additional_message}"
if @tty
- $stderr.puts "#{@erase}#{msg}"
+ $stderr.puts "#{erase}#{msg}"
else
@errbuf.push msg
end
diff --git a/bootstraptest/test_fork.rb b/bootstraptest/test_fork.rb
index 384294727f..5de6ee1b12 100644
--- a/bootstraptest/test_fork.rb
+++ b/bootstraptest/test_fork.rb
@@ -22,26 +22,32 @@ assert_finish 10, %q{
}, '[ruby-core:22158]'
assert_normal_exit(<<'End', '[ruby-dev:37934]')
- Thread.new { sleep 1; Thread.kill Thread.main }
+ main = Thread.current
+ Thread.new { sleep 0.01 until main.stop?; Thread.kill main }
Process.setrlimit(:NPROC, 1)
fork {}
End
assert_equal 'ok', %q{
begin
+ r, w = IO.pipe
if pid1 = fork
- sleep 1
+ w.close
+ r.read(1)
Process.kill("USR1", pid1)
_, s = Process.wait2(pid1)
s.success? ? :ok : :ng
else
+ r.close
if pid2 = fork
- trap("USR1") { Time.now.to_s }
+ trap("USR1") { Time.now.to_s; Process.kill("USR2", pid2) }
+ w.close
Process.wait2(pid2)
else
- sleep 2
+ w.close
+ sleep 0.2
end
- exit 0
+ exit true
end
rescue NotImplementedError
:ok
@@ -50,17 +56,17 @@ assert_equal 'ok', %q{
assert_equal '[1, 2]', %q{
a = []
- trap(:INT) { a.push(1) }
- trap(:TERM) { a.push(2) }
+ main = Thread.current
+ trap(:INT) { a.push(1).size == 2 and main.wakeup }
+ trap(:TERM) { a.push(2).size == 2 and main.wakeup }
pid = $$
begin
- fork do
- sleep 0.5
+ pid = fork do
Process.kill(:INT, pid)
Process.kill(:TERM, pid)
end
-
- sleep 1
+ Process.wait(pid)
+ 100.times {break if a.size > 1; sleep 0.001}
a.sort
rescue NotImplementedError
[1, 2]
diff --git a/bootstraptest/test_io.rb b/bootstraptest/test_io.rb
index f7360f34b3..cee8cb399e 100644
--- a/bootstraptest/test_io.rb
+++ b/bootstraptest/test_io.rb
@@ -2,9 +2,8 @@ assert_finish 5, %q{
r, w = IO.pipe
t1 = Thread.new { r.sysread(1) }
t2 = Thread.new { r.sysread(1) }
- sleep 0.1
+ sleep 0.01 until t1.stop? and t2.stop?
w.write "a"
- sleep 0.1
w.write "a"
}, '[ruby-dev:31866]'
@@ -34,9 +33,9 @@ assert_finish 10, %q{
assert_finish 1, %q{
r, w = IO.pipe
Thread.new {
- w << "ab"
- sleep 0.1
- w << "ab"
+ w << "ab"
+ sleep 0.01
+ w << "ab"
}
r.gets("abab")
}
@@ -91,7 +90,8 @@ assert_normal_exit %q{
megacontent = "abc" * 12345678
#File.open("megasrc", "w") {|f| f << megacontent }
- Thread.new { sleep rand*0.2; Process.kill(:INT, $$) }
+ t0 = Thread.main
+ Thread.new { sleep 0.001 until t0.stop?; Process.kill(:INT, $$) }
r1, w1 = IO.pipe
r2, w2 = IO.pipe
diff --git a/bootstraptest/test_literal.rb b/bootstraptest/test_literal.rb
index b95a2f2d0a..aa65bddae1 100644
--- a/bootstraptest/test_literal.rb
+++ b/bootstraptest/test_literal.rb
@@ -84,7 +84,7 @@ assert_equal '0', 're = /test/; re =~ "test"'
assert_equal '0', 'str = "test"; /test/ =~ str'
assert_equal '0', 're = /test/; str = "test"; re =~ str'
-# dynacmi regexp
+# dynamic regexp
assert_equal 'regexp', %q(/re#{'ge'}xp/.source)
assert_equal 'Regexp', %q(/re#{'ge'}xp/.class)
diff --git a/bootstraptest/test_thread.rb b/bootstraptest/test_thread.rb
index 7baa806a45..048aeb19c2 100644
--- a/bootstraptest/test_thread.rb
+++ b/bootstraptest/test_thread.rb
@@ -241,16 +241,16 @@ assert_equal 'ok', %{
}
assert_finish 3, %{
- th = Thread.new {sleep 2}
- th.join(1)
+ th = Thread.new {sleep 0.2}
+ th.join(0.1)
th.join
}
assert_finish 3, %{
require 'timeout'
- th = Thread.new {sleep 2}
+ th = Thread.new {sleep 0.2}
begin
- Timeout.timeout(1) {th.join}
+ Timeout.timeout(0.1) {th.join}
rescue Timeout::Error
end
th.join
@@ -276,7 +276,7 @@ assert_normal_exit %q{
assert_equal 'ok', %q{
def m
t = Thread.new { while true; // =~ "" end }
- sleep 0.1
+ sleep 0.01
10.times {
if /((ab)*(ab)*)*(b)/ =~ "ab"*7
return :ng if !$4
@@ -340,8 +340,9 @@ assert_equal 'ok', %q{
assert_equal 'ok', %q{
begin
m1, m2 = Mutex.new, Mutex.new
- Thread.new { m1.lock; sleep 1; m2.lock }
- m2.lock; sleep 1; m1.lock
+ 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
:ng
rescue Exception
:ok
@@ -350,7 +351,7 @@ assert_equal 'ok', %q{
assert_equal 'ok', %q{
m = Mutex.new
- Thread.new { m.lock }; sleep 1; m.lock
+ Thread.new { m.lock }; sleep 0.1; m.lock
:ok
}
@@ -368,15 +369,15 @@ assert_equal 'ok', %q{
assert_equal 'ok', %q{
m = Mutex.new
- Thread.new { m.lock; sleep 2 }
- sleep 1; m.lock
+ Thread.new { m.lock; sleep 0.2 }
+ sleep 0.1; m.lock
:ok
}
assert_equal 'ok', %q{
m = Mutex.new
- Thread.new { m.lock; sleep 2; m.unlock }
- sleep 1; m.lock
+ Thread.new { m.lock; sleep 0.2; m.unlock }
+ sleep 0.1; m.lock
:ok
}
@@ -398,19 +399,20 @@ assert_equal 'ok', %q{
assert_equal 'ok', %{
open("zzz.rb", "w") do |f|
- f.puts <<-END
+ f.puts <<-'end;' # do
begin
m = Mutex.new
- Thread.new { m.lock; sleep 1 }
- sleep 0.3
parent = Thread.current
+ th1 = Thread.new { m.lock; sleep }
+ sleep 0.01 until th1.stop?
Thread.new do
- sleep 0.3
+ sleep 0.01 until parent.stop?
begin
fork { GC.start }
rescue Exception
parent.raise $!
end
+ th1.run
end
m.lock
pid, status = Process.wait2
@@ -418,7 +420,7 @@ assert_equal 'ok', %{
rescue NotImplementedError
$result = :ok
end
- END
+ end;
end
require "./zzz.rb"
$result
@@ -448,17 +450,27 @@ assert_finish 3, %q{
assert_equal 'ok', %q{
begin
- Process.waitpid2(fork {sleep 1})[1].success? ? 'ok' : 'ng'
+ Process.waitpid2(fork {})[1].success? ? 'ok' : 'ng'
rescue NotImplementedError
'ok'
end
}
assert_equal 'foo', %q{
- f = proc {|s| /#{ sleep 1; s }/o }
- [ Thread.new { f.call("foo"); nil },
- Thread.new { sleep 0.5; f.call("bar"); nil },
- ].each {|t| t.join }
+ i = 0
+ Thread.start {sleep 1; exit!}
+ f = proc {|s, c| /#{c.call; s}/o }
+ th2 = Thread.new {
+ sleep 0.01 until i == 1
+ i = 2
+ f.call("bar", proc {sleep 2});
+ nil
+ }
+ th1 = Thread.new {
+ f.call("foo", proc {i = 1; sleep 0.01 until i == 2; sleep 0.01})
+ nil
+ }
+ [th1, th2].each {|t| t.join }
GC.start
f.call.source
}
diff --git a/ccan/build_assert/build_assert.h b/ccan/build_assert/build_assert.h
new file mode 100644
index 0000000000..a04d1d4709
--- /dev/null
+++ b/ccan/build_assert/build_assert.h
@@ -0,0 +1,40 @@
+/* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
+#ifndef CCAN_BUILD_ASSERT_H
+#define CCAN_BUILD_ASSERT_H
+
+/**
+ * BUILD_ASSERT - assert a build-time dependency.
+ * @cond: the compile-time condition which must be true.
+ *
+ * Your compile will fail if the condition isn't true, or can't be evaluated
+ * by the compiler. This can only be used within a function.
+ *
+ * Example:
+ * #include <stddef.h>
+ * ...
+ * static char *foo_to_char(struct foo *foo)
+ * {
+ * // This code needs string to be at start of foo.
+ * BUILD_ASSERT(offsetof(struct foo, string) == 0);
+ * return (char *)foo;
+ * }
+ */
+#define BUILD_ASSERT(cond) \
+ do { (void) sizeof(char [1 - 2*!(cond)]); } while(0)
+
+/**
+ * BUILD_ASSERT_OR_ZERO - assert a build-time dependency, as an expression.
+ * @cond: the compile-time condition which must be true.
+ *
+ * Your compile will fail if the condition isn't true, or can't be evaluated
+ * by the compiler. This can be used in an expression: its value is "0".
+ *
+ * Example:
+ * #define foo_to_char(foo) \
+ * ((char *)(foo) \
+ * + BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0))
+ */
+#define BUILD_ASSERT_OR_ZERO(cond) \
+ (sizeof(char [1 - 2*!(cond)]) - 1)
+
+#endif /* CCAN_BUILD_ASSERT_H */
diff --git a/ccan/check_type/check_type.h b/ccan/check_type/check_type.h
new file mode 100644
index 0000000000..1f77a535e4
--- /dev/null
+++ b/ccan/check_type/check_type.h
@@ -0,0 +1,63 @@
+/* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
+#ifndef CCAN_CHECK_TYPE_H
+#define CCAN_CHECK_TYPE_H
+
+/**
+ * check_type - issue a warning or build failure if type is not correct.
+ * @expr: the expression whose type we should check (not evaluated).
+ * @type: the exact type we expect the expression to be.
+ *
+ * This macro is usually used within other macros to try to ensure that a macro
+ * argument is of the expected type. No type promotion of the expression is
+ * done: an unsigned int is not the same as an int!
+ *
+ * check_type() always evaluates to 0.
+ *
+ * If your compiler does not support typeof, then the best we can do is fail
+ * to compile if the sizes of the types are unequal (a less complete check).
+ *
+ * Example:
+ * // They should always pass a 64-bit value to _set_some_value!
+ * #define set_some_value(expr) \
+ * _set_some_value((check_type((expr), uint64_t), (expr)))
+ */
+
+/**
+ * check_types_match - issue a warning or build failure if types are not same.
+ * @expr1: the first expression (not evaluated).
+ * @expr2: the second expression (not evaluated).
+ *
+ * This macro is usually used within other macros to try to ensure that
+ * arguments are of identical types. No type promotion of the expressions is
+ * done: an unsigned int is not the same as an int!
+ *
+ * check_types_match() always evaluates to 0.
+ *
+ * If your compiler does not support typeof, then the best we can do is fail
+ * to compile if the sizes of the types are unequal (a less complete check).
+ *
+ * Example:
+ * // Do subtraction to get to enclosing type, but make sure that
+ * // pointer is of correct type for that member.
+ * #define container_of(mbr_ptr, encl_type, mbr) \
+ * (check_types_match((mbr_ptr), &((encl_type *)0)->mbr), \
+ * ((encl_type *) \
+ * ((char *)(mbr_ptr) - offsetof(enclosing_type, mbr))))
+ */
+#if HAVE_TYPEOF
+#define check_type(expr, type) \
+ ((typeof(expr) *)0 != (type *)0)
+
+#define check_types_match(expr1, expr2) \
+ ((typeof(expr1) *)0 != (typeof(expr2) *)0)
+#else
+#include "ccan/build_assert/build_assert.h"
+/* Without typeof, we can only test the sizes. */
+#define check_type(expr, type) \
+ BUILD_ASSERT_OR_ZERO(sizeof(expr) == sizeof(type))
+
+#define check_types_match(expr1, expr2) \
+ BUILD_ASSERT_OR_ZERO(sizeof(expr1) == sizeof(expr2))
+#endif /* HAVE_TYPEOF */
+
+#endif /* CCAN_CHECK_TYPE_H */
diff --git a/ccan/container_of/container_of.h b/ccan/container_of/container_of.h
new file mode 100644
index 0000000000..ae3e1fc81f
--- /dev/null
+++ b/ccan/container_of/container_of.h
@@ -0,0 +1,142 @@
+/* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
+#ifndef CCAN_CONTAINER_OF_H
+#define CCAN_CONTAINER_OF_H
+#include "ccan/check_type/check_type.h"
+
+/**
+ * container_of - get pointer to enclosing structure
+ * @member_ptr: pointer to the structure member
+ * @containing_type: the type this member is within
+ * @member: the name of this member within the structure.
+ *
+ * Given a pointer to a member of a structure, this macro does pointer
+ * subtraction to return the pointer to the enclosing type.
+ *
+ * Example:
+ * struct foo {
+ * int fielda, fieldb;
+ * // ...
+ * };
+ * struct info {
+ * int some_other_field;
+ * struct foo my_foo;
+ * };
+ *
+ * static struct info *foo_to_info(struct foo *foo)
+ * {
+ * return container_of(foo, struct info, my_foo);
+ * }
+ */
+#define container_of(member_ptr, containing_type, member) \
+ ((containing_type *) \
+ ((char *)(member_ptr) \
+ - container_off(containing_type, member)) \
+ + check_types_match(*(member_ptr), ((containing_type *)0)->member))
+
+
+/**
+ * container_of_or_null - get pointer to enclosing structure, or NULL
+ * @member_ptr: pointer to the structure member
+ * @containing_type: the type this member is within
+ * @member: the name of this member within the structure.
+ *
+ * Given a pointer to a member of a structure, this macro does pointer
+ * subtraction to return the pointer to the enclosing type, unless it
+ * is given NULL, in which case it also returns NULL.
+ *
+ * Example:
+ * struct foo {
+ * int fielda, fieldb;
+ * // ...
+ * };
+ * struct info {
+ * int some_other_field;
+ * struct foo my_foo;
+ * };
+ *
+ * static struct info *foo_to_info_allowing_null(struct foo *foo)
+ * {
+ * return container_of_or_null(foo, struct info, my_foo);
+ * }
+ */
+static inline char *container_of_or_null_(void *member_ptr, size_t offset)
+{
+ return member_ptr ? (char *)member_ptr - offset : NULL;
+}
+#define container_of_or_null(member_ptr, containing_type, member) \
+ ((containing_type *) \
+ container_of_or_null_(member_ptr, \
+ container_off(containing_type, member)) \
+ + check_types_match(*(member_ptr), ((containing_type *)0)->member))
+
+/**
+ * container_off - get offset to enclosing structure
+ * @containing_type: the type this member is within
+ * @member: the name of this member within the structure.
+ *
+ * Given a pointer to a member of a structure, this macro does
+ * typechecking and figures out the offset to the enclosing type.
+ *
+ * Example:
+ * struct foo {
+ * int fielda, fieldb;
+ * // ...
+ * };
+ * struct info {
+ * int some_other_field;
+ * struct foo my_foo;
+ * };
+ *
+ * static struct info *foo_to_info(struct foo *foo)
+ * {
+ * size_t off = container_off(struct info, my_foo);
+ * return (void *)((char *)foo - off);
+ * }
+ */
+#define container_off(containing_type, member) \
+ offsetof(containing_type, member)
+
+/**
+ * container_of_var - get pointer to enclosing structure using a variable
+ * @member_ptr: pointer to the structure member
+ * @container_var: a pointer of same type as this member's container
+ * @member: the name of this member within the structure.
+ *
+ * Given a pointer to a member of a structure, this macro does pointer
+ * subtraction to return the pointer to the enclosing type.
+ *
+ * Example:
+ * static struct info *foo_to_i(struct foo *foo)
+ * {
+ * struct info *i = container_of_var(foo, i, my_foo);
+ * return i;
+ * }
+ */
+#if HAVE_TYPEOF
+#define container_of_var(member_ptr, container_var, member) \
+ container_of(member_ptr, typeof(*container_var), member)
+#else
+#define container_of_var(member_ptr, container_var, member) \
+ ((void *)((char *)(member_ptr) - \
+ container_off_var(container_var, member)))
+#endif
+
+/**
+ * container_off_var - get offset of a field in enclosing structure
+ * @container_var: a pointer to a container structure
+ * @member: the name of a member within the structure.
+ *
+ * Given (any) pointer to a structure and a its member name, this
+ * macro does pointer subtraction to return offset of member in a
+ * structure memory layout.
+ *
+ */
+#if HAVE_TYPEOF
+#define container_off_var(var, member) \
+ container_off(typeof(*var), member)
+#else
+#define container_off_var(var, member) \
+ ((const char *)&(var)->member - (const char *)(var))
+#endif
+
+#endif /* CCAN_CONTAINER_OF_H */
diff --git a/ccan/licenses/BSD-MIT b/ccan/licenses/BSD-MIT
new file mode 100644
index 0000000000..89de354795
--- /dev/null
+++ b/ccan/licenses/BSD-MIT
@@ -0,0 +1,17 @@
+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/ccan/licenses/CC0 b/ccan/licenses/CC0
new file mode 100644
index 0000000000..feb9b118e6
--- /dev/null
+++ b/ccan/licenses/CC0
@@ -0,0 +1,28 @@
+Statement of Purpose
+
+The laws of most jurisdictions throughout the world automatically confer exclusive Copyright and Related Rights (defined below) upon the creator and subsequent owner(s) (each and all, an "owner") of an original work of authorship and/or a database (each, a "Work").
+
+Certain owners wish to permanently relinquish those rights to a Work for the purpose of contributing to a commons of creative, cultural and scientific works ("Commons") that the public can reliably and without fear of later claims of infringement build upon, modify, incorporate in other works, reuse and redistribute as freely as possible in any form whatsoever and for any purposes, including without limitation commercial purposes. These owners may contribute to the Commons to promote the ideal of a free culture and the further production of creative, cultural and scientific works, or to gain reputation or greater distribution for their Work in part through the use and efforts of others.
+
+For these and/or other purposes and motivations, and without any expectation of additional consideration or compensation, the person associating CC0 with a Work (the "Affirmer"), to the extent that he or she is an owner of Copyright and Related Rights in the Work, voluntarily elects to apply CC0 to the Work and publicly distribute the Work under its terms, with knowledge of his or her Copyright and Related Rights in the Work and the meaning and intended legal effect of CC0 on those rights.
+
+1. Copyright and Related Rights. A Work made available under CC0 may be protected by copyright and related or neighboring rights ("Copyright and Related Rights"). Copyright and Related Rights include, but are not limited to, the following:
+
+ the right to reproduce, adapt, distribute, perform, display, communicate, and translate a Work;
+ moral rights retained by the original author(s) and/or performer(s);
+ publicity and privacy rights pertaining to a person's image or likeness depicted in a Work;
+ rights protecting against unfair competition in regards to a Work, subject to the limitations in paragraph 4(a), below;
+ rights protecting the extraction, dissemination, use and reuse of data in a Work;
+ database rights (such as those arising under Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, and under any national implementation thereof, including any amended or successor version of such directive); and
+ other similar, equivalent or corresponding rights throughout the world based on applicable law or treaty, and any national implementations thereof.
+
+2. Waiver. To the greatest extent permitted by, but not in contravention of, applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and unconditionally waives, abandons, and surrenders all of Affirmer's Copyright and Related Rights and associated claims and causes of action, whether now known or unknown (including existing as well as future claims and causes of action), in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each member of the public at large and to the detriment of Affirmer's heirs and successors, fully intending that such Waiver shall not be subject to revocation, rescission, cancellation, termination, or any other legal or equitable action to disrupt the quiet enjoyment of the Work by the public as contemplated by Affirmer's express Statement of Purpose.
+
+3. Public License Fallback. Should any part of the Waiver for any reason be judged legally invalid or ineffective under applicable law, then the Waiver shall be preserved to the maximum extent permitted taking into account Affirmer's express Statement of Purpose. In addition, to the extent the Waiver is so judged Affirmer hereby grants to each affected person a royalty-free, non transferable, non sublicensable, non exclusive, irrevocable and unconditional license to exercise Affirmer's Copyright and Related Rights in the Work (i) in all territories worldwide, (ii) for the maximum duration provided by applicable law or treaty (including future time extensions), (iii) in any current or future medium and for any number of copies, and (iv) for any purpose whatsoever, including without limitation commercial, advertising or promotional purposes (the "License"). The License shall be deemed effective as of the date CC0 was applied by Affirmer to the Work. Should any part of the License for any reason be judged legally invalid or ineffective under applicable law, such partial invalidity or ineffectiveness shall not invalidate the remainder of the License, and in such case Affirmer hereby affirms that he or she will not (i) exercise any of his or her remaining Copyright and Related Rights in the Work or (ii) assert any associated claims and causes of action with respect to the Work, in either case contrary to Affirmer's express Statement of Purpose.
+
+4. Limitations and Disclaimers.
+
+ No trademark or patent rights held by Affirmer are waived, abandoned, surrendered, licensed or otherwise affected by this document.
+ Affirmer offers the Work as-is and makes no representations or warranties of any kind concerning the Work, express, implied, statutory or otherwise, including without limitation warranties of title, merchantability, fitness for a particular purpose, non infringement, or the absence of latent or other defects, accuracy, or the present or absence of errors, whether or not discoverable, all to the greatest extent permissible under applicable law.
+ Affirmer disclaims responsibility for clearing rights of other persons that may apply to the Work or any use thereof, including without limitation any person's Copyright and Related Rights in the Work. Further, Affirmer disclaims responsibility for obtaining any necessary consents, permissions or other rights required for any use of the Work.
+ Affirmer understands and acknowledges that Creative Commons is not a party to this document and has no duty or obligation with respect to this CC0 or use of the Work.
diff --git a/ccan/list/list.h b/ccan/list/list.h
new file mode 100644
index 0000000000..749db7849a
--- /dev/null
+++ b/ccan/list/list.h
@@ -0,0 +1,635 @@
+/* Licensed under BSD-MIT - see ccan/licenses/BSD-MIT file for details */
+#ifndef CCAN_LIST_H
+#define CCAN_LIST_H
+#include <assert.h>
+#include "ccan/str/str.h"
+#include "ccan/container_of/container_of.h"
+#include "ccan/check_type/check_type.h"
+
+/**
+ * struct list_node - an entry in a doubly-linked list
+ * @next: next entry (self if empty)
+ * @prev: previous entry (self if empty)
+ *
+ * This is used as an entry in a linked list.
+ * Example:
+ * struct child {
+ * const char *name;
+ * // Linked list of all us children.
+ * struct list_node list;
+ * };
+ */
+struct list_node
+{
+ struct list_node *next, *prev;
+};
+
+/**
+ * struct list_head - the head of a doubly-linked list
+ * @h: the list_head (containing next and prev pointers)
+ *
+ * This is used as the head of a linked list.
+ * Example:
+ * struct parent {
+ * const char *name;
+ * struct list_head children;
+ * unsigned int num_children;
+ * };
+ */
+struct list_head
+{
+ struct list_node n;
+};
+
+#define LIST_LOC __FILE__ ":" stringify(__LINE__)
+#define list_debug(h, loc) (h)
+#define list_debug_node(n, loc) (n)
+
+/**
+ * LIST_HEAD_INIT - initializer for an empty list_head
+ * @name: the name of the list.
+ *
+ * Explicit initializer for an empty list.
+ *
+ * See also:
+ * LIST_HEAD, list_head_init()
+ *
+ * Example:
+ * static struct list_head my_list = LIST_HEAD_INIT(my_list);
+ */
+#define LIST_HEAD_INIT(name) { { &name.n, &name.n } }
+
+/**
+ * LIST_HEAD - define and initialize an empty list_head
+ * @name: the name of the list.
+ *
+ * The LIST_HEAD macro defines a list_head and initializes it to an empty
+ * list. It can be prepended by "static" to define a static list_head.
+ *
+ * See also:
+ * LIST_HEAD_INIT, list_head_init()
+ *
+ * Example:
+ * static LIST_HEAD(my_global_list);
+ */
+#define LIST_HEAD(name) \
+ struct list_head name = LIST_HEAD_INIT(name)
+
+/**
+ * list_head_init - initialize a list_head
+ * @h: the list_head to set to the empty list
+ *
+ * Example:
+ * ...
+ * struct parent *parent = malloc(sizeof(*parent));
+ *
+ * list_head_init(&parent->children);
+ * parent->num_children = 0;
+ */
+static inline void list_head_init(struct list_head *h)
+{
+ h->n.next = h->n.prev = &h->n;
+}
+
+/**
+ * list_node_init - initialize a list_node
+ * @n: the list_node to link to itself.
+ *
+ * You don't need to use this normally! But it lets you list_del(@n)
+ * safely.
+ */
+static inline void list_node_init(struct list_node *n)
+{
+ n->next = n->prev = n;
+}
+
+/**
+ * list_add - add an entry at the start of a linked list.
+ * @h: the list_head to add the node to
+ * @n: the list_node to add to the list.
+ *
+ * The list_node does not need to be initialized; it will be overwritten.
+ * Example:
+ * struct child *child = malloc(sizeof(*child));
+ *
+ * child->name = "marvin";
+ * list_add(&parent->children, &child->list);
+ * parent->num_children++;
+ */
+#define list_add(h, n) list_add_(h, n, LIST_LOC)
+static inline void list_add_(struct list_head *h,
+ struct list_node *n,
+ const char *abortstr)
+{
+ n->next = h->n.next;
+ n->prev = &h->n;
+ h->n.next->prev = n;
+ h->n.next = n;
+ (void)list_debug(h, abortstr);
+}
+
+/**
+ * list_add_tail - add an entry at the end of a linked list.
+ * @h: the list_head to add the node to
+ * @n: the list_node to add to the list.
+ *
+ * The list_node does not need to be initialized; it will be overwritten.
+ * Example:
+ * list_add_tail(&parent->children, &child->list);
+ * parent->num_children++;
+ */
+#define list_add_tail(h, n) list_add_tail_(h, n, LIST_LOC)
+static inline void list_add_tail_(struct list_head *h,
+ struct list_node *n,
+ const char *abortstr)
+{
+ n->next = &h->n;
+ n->prev = h->n.prev;
+ h->n.prev->next = n;
+ h->n.prev = n;
+ (void)list_debug(h, abortstr);
+}
+
+/**
+ * list_empty - is a list empty?
+ * @h: the list_head
+ *
+ * If the list is empty, returns true.
+ *
+ * Example:
+ * assert(list_empty(&parent->children) == (parent->num_children == 0));
+ */
+#define list_empty(h) list_empty_(h, LIST_LOC)
+static inline int list_empty_(const struct list_head *h, const char* abortstr)
+{
+ (void)list_debug(h, abortstr);
+ return h->n.next == &h->n;
+}
+
+/**
+ * list_empty_nodebug - is a list empty (and don't perform debug checks)?
+ * @h: the list_head
+ *
+ * If the list is empty, returns true.
+ * This differs from list_empty() in that if CCAN_LIST_DEBUG is set it
+ * will NOT perform debug checks. Only use this function if you REALLY
+ * know what you're doing.
+ *
+ * Example:
+ * assert(list_empty_nodebug(&parent->children) == (parent->num_children == 0));
+ */
+#ifndef CCAN_LIST_DEBUG
+#define list_empty_nodebug(h) list_empty(h)
+#else
+static inline int list_empty_nodebug(const struct list_head *h)
+{
+ return h->n.next == &h->n;
+}
+#endif
+
+/**
+ * list_del - delete an entry from an (unknown) linked list.
+ * @n: the list_node to delete from the list.
+ *
+ * Note that this leaves @n in an undefined state; it can be added to
+ * another list, but not deleted again.
+ *
+ * See also:
+ * list_del_from(), list_del_init()
+ *
+ * Example:
+ * list_del(&child->list);
+ * parent->num_children--;
+ */
+#define list_del(n) list_del_(n, LIST_LOC)
+static inline void list_del_(struct list_node *n, const char* abortstr)
+{
+ (void)list_debug_node(n, abortstr);
+ n->next->prev = n->prev;
+ n->prev->next = n->next;
+#ifdef CCAN_LIST_DEBUG
+ /* Catch use-after-del. */
+ n->next = n->prev = NULL;
+#endif
+}
+
+/**
+ * list_del_init - delete a node, and reset it so it can be deleted again.
+ * @n: the list_node to be deleted.
+ *
+ * list_del(@n) or list_del_init() again after this will be safe,
+ * which can be useful in some cases.
+ *
+ * See also:
+ * list_del_from(), list_del()
+ *
+ * Example:
+ * list_del_init(&child->list);
+ * parent->num_children--;
+ */
+#define list_del_init(n) list_del_init_(n, LIST_LOC)
+static inline void list_del_init_(struct list_node *n, const char *abortstr)
+{
+ list_del_(n, abortstr);
+ list_node_init(n);
+}
+
+/**
+ * list_del_from - delete an entry from a known linked list.
+ * @h: the list_head the node is in.
+ * @n: the list_node to delete from the list.
+ *
+ * This explicitly indicates which list a node is expected to be in,
+ * which is better documentation and can catch more bugs.
+ *
+ * See also: list_del()
+ *
+ * Example:
+ * list_del_from(&parent->children, &child->list);
+ * parent->num_children--;
+ */
+static inline void list_del_from(struct list_head *h, struct list_node *n)
+{
+#ifdef CCAN_LIST_DEBUG
+ {
+ /* Thorough check: make sure it was in list! */
+ struct list_node *i;
+ for (i = h->n.next; i != n; i = i->next)
+ assert(i != &h->n);
+ }
+#endif /* CCAN_LIST_DEBUG */
+
+ /* Quick test that catches a surprising number of bugs. */
+ assert(!list_empty(h));
+ list_del(n);
+}
+
+/**
+ * list_entry - convert a list_node back into the structure containing it.
+ * @n: the list_node
+ * @type: the type of the entry
+ * @member: the list_node member of the type
+ *
+ * Example:
+ * // First list entry is children.next; convert back to child.
+ * child = list_entry(parent->children.n.next, struct child, list);
+ *
+ * See Also:
+ * list_top(), list_for_each()
+ */
+#define list_entry(n, type, member) container_of(n, type, member)
+
+/**
+ * list_top - get the first entry in a list
+ * @h: the list_head
+ * @type: the type of the entry
+ * @member: the list_node member of the type
+ *
+ * If the list is empty, returns NULL.
+ *
+ * Example:
+ * struct child *first;
+ * first = list_top(&parent->children, struct child, list);
+ * if (!first)
+ * printf("Empty list!\n");
+ */
+#define list_top(h, type, member) \
+ ((type *)list_top_((h), list_off_(type, member)))
+
+static inline const void *list_top_(const struct list_head *h, size_t off)
+{
+ if (list_empty(h))
+ return NULL;
+ return (const char *)h->n.next - off;
+}
+
+/**
+ * list_pop - remove the first entry in a list
+ * @h: the list_head
+ * @type: the type of the entry
+ * @member: the list_node member of the type
+ *
+ * If the list is empty, returns NULL.
+ *
+ * Example:
+ * struct child *one;
+ * one = list_pop(&parent->children, struct child, list);
+ * if (!one)
+ * printf("Empty list!\n");
+ */
+#define list_pop(h, type, member) \
+ ((type *)list_pop_((h), list_off_(type, member)))
+
+static inline const void *list_pop_(const struct list_head *h, size_t off)
+{
+ struct list_node *n;
+
+ if (list_empty(h))
+ return NULL;
+ n = h->n.next;
+ list_del(n);
+ return (const char *)n - off;
+}
+
+/**
+ * list_tail - get the last entry in a list
+ * @h: the list_head
+ * @type: the type of the entry
+ * @member: the list_node member of the type
+ *
+ * If the list is empty, returns NULL.
+ *
+ * Example:
+ * struct child *last;
+ * last = list_tail(&parent->children, struct child, list);
+ * if (!last)
+ * printf("Empty list!\n");
+ */
+#define list_tail(h, type, member) \
+ ((type *)list_tail_((h), list_off_(type, member)))
+
+static inline const void *list_tail_(const struct list_head *h, size_t off)
+{
+ if (list_empty(h))
+ return NULL;
+ return (const char *)h->n.prev - off;
+}
+
+/**
+ * list_for_each - iterate through a list.
+ * @h: the list_head (warning: evaluated multiple times!)
+ * @i: the structure containing the list_node
+ * @member: the list_node member of the structure
+ *
+ * This is a convenient wrapper to iterate @i over the entire list. It's
+ * a for loop, so you can break and continue as normal.
+ *
+ * Example:
+ * list_for_each(&parent->children, child, list)
+ * printf("Name: %s\n", child->name);
+ */
+#define list_for_each(h, i, member) \
+ list_for_each_off(h, i, list_off_var_(i, member))
+
+/**
+ * list_for_each_rev - iterate through a list backwards.
+ * @h: the list_head
+ * @i: the structure containing the list_node
+ * @member: the list_node member of the structure
+ *
+ * This is a convenient wrapper to iterate @i over the entire list. It's
+ * a for loop, so you can break and continue as normal.
+ *
+ * Example:
+ * list_for_each_rev(&parent->children, child, list)
+ * printf("Name: %s\n", child->name);
+ */
+#define list_for_each_rev(h, i, member) \
+ for (i = container_of_var(list_debug(h, LIST_LOC)->n.prev, i, member); \
+ &i->member != &(h)->n; \
+ i = container_of_var(i->member.prev, i, member))
+
+/**
+ * list_for_each_safe - iterate through a list, maybe during deletion
+ * @h: the list_head
+ * @i: the structure containing the list_node
+ * @nxt: the structure containing the list_node
+ * @member: the list_node member of the structure
+ *
+ * This is a convenient wrapper to iterate @i over the entire list. It's
+ * a for loop, so you can break and continue as normal. The extra variable
+ * @nxt is used to hold the next element, so you can delete @i from the list.
+ *
+ * Example:
+ * struct child *next;
+ * list_for_each_safe(&parent->children, child, next, list) {
+ * list_del(&child->list);
+ * parent->num_children--;
+ * }
+ */
+#define list_for_each_safe(h, i, nxt, member) \
+ list_for_each_safe_off(h, i, nxt, list_off_var_(i, member))
+
+/**
+ * list_next - get the next entry in a list
+ * @h: the list_head
+ * @i: a pointer to an entry in the list.
+ * @member: the list_node member of the structure
+ *
+ * If @i was the last entry in the list, returns NULL.
+ *
+ * Example:
+ * struct child *second;
+ * second = list_next(&parent->children, first, list);
+ * if (!second)
+ * printf("No second child!\n");
+ */
+#define list_next(h, i, member) \
+ ((list_typeof(i))list_entry_or_null(list_debug(h, \
+ __FILE__ ":" stringify(__LINE__)), \
+ (i)->member.next, \
+ list_off_var_((i), member)))
+
+/**
+ * list_prev - get the previous entry in a list
+ * @h: the list_head
+ * @i: a pointer to an entry in the list.
+ * @member: the list_node member of the structure
+ *
+ * If @i was the first entry in the list, returns NULL.
+ *
+ * Example:
+ * first = list_prev(&parent->children, second, list);
+ * if (!first)
+ * printf("Can't go back to first child?!\n");
+ */
+#define list_prev(h, i, member) \
+ ((list_typeof(i))list_entry_or_null(list_debug(h, \
+ __FILE__ ":" stringify(__LINE__)), \
+ (i)->member.prev, \
+ list_off_var_((i), member)))
+
+/**
+ * list_append_list - empty one list onto the end of another.
+ * @to: the list to append into
+ * @from: the list to empty.
+ *
+ * This takes the entire contents of @from and moves it to the end of
+ * @to. After this @from will be empty.
+ *
+ * Example:
+ * struct list_head adopter;
+ *
+ * list_append_list(&adopter, &parent->children);
+ * assert(list_empty(&parent->children));
+ * parent->num_children = 0;
+ */
+#define list_append_list(t, f) list_append_list_(t, f, \
+ __FILE__ ":" stringify(__LINE__))
+static inline void list_append_list_(struct list_head *to,
+ struct list_head *from,
+ const char *abortstr)
+{
+ struct list_node *from_tail = list_debug(from, abortstr)->n.prev;
+ struct list_node *to_tail = list_debug(to, abortstr)->n.prev;
+
+ /* Sew in head and entire list. */
+ to->n.prev = from_tail;
+ from_tail->next = &to->n;
+ to_tail->next = &from->n;
+ from->n.prev = to_tail;
+
+ /* Now remove head. */
+ list_del(&from->n);
+ list_head_init(from);
+}
+
+/**
+ * list_prepend_list - empty one list into the start of another.
+ * @to: the list to prepend into
+ * @from: the list to empty.
+ *
+ * This takes the entire contents of @from and moves it to the start
+ * of @to. After this @from will be empty.
+ *
+ * Example:
+ * list_prepend_list(&adopter, &parent->children);
+ * assert(list_empty(&parent->children));
+ * parent->num_children = 0;
+ */
+#define list_prepend_list(t, f) list_prepend_list_(t, f, LIST_LOC)
+static inline void list_prepend_list_(struct list_head *to,
+ struct list_head *from,
+ const char *abortstr)
+{
+ struct list_node *from_tail = list_debug(from, abortstr)->n.prev;
+ struct list_node *to_head = list_debug(to, abortstr)->n.next;
+
+ /* Sew in head and entire list. */
+ to->n.next = &from->n;
+ from->n.prev = &to->n;
+ to_head->prev = from_tail;
+ from_tail->next = to_head;
+
+ /* Now remove head. */
+ list_del(&from->n);
+ list_head_init(from);
+}
+
+/**
+ * list_for_each_off - iterate through a list of memory regions.
+ * @h: the list_head
+ * @i: the pointer to a memory region wich contains list node data.
+ * @off: offset(relative to @i) at which list node data resides.
+ *
+ * This is a low-level wrapper to iterate @i over the entire list, used to
+ * implement all oher, more high-level, for-each constructs. It's a for loop,
+ * 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 assumtion made is that @i points
+ * to a chunk of memory that at some @offset, relative to @i, contains a
+ * 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
+ * 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
+ * is operation on opaque types with known offset for `struct list_node'
+ * member(preferably 0), because it allows you not to disclose the type of
+ * @i.
+ *
+ * Example:
+ * list_for_each_off(&parent->children, child,
+ * offsetof(struct child, list))
+ * printf("Name: %s\n", child->name);
+ */
+#define list_for_each_off(h, i, off) \
+ for (i = list_node_to_off_(list_debug(h, LIST_LOC)->n.next, \
+ (off)); \
+ list_node_from_off_((void *)i, (off)) != &(h)->n; \
+ i = list_node_to_off_(list_node_from_off_((void *)i, (off))->next, \
+ (off)))
+
+/**
+ * list_for_each_safe_off - iterate through a list of memory regions, maybe
+ * during deletion
+ * @h: the list_head
+ * @i: the pointer to a memory region wich contains list node data.
+ * @nxt: the structure containing the list_node
+ * @off: offset(relative to @i) at which list node data resides.
+ *
+ * For details see `list_for_each_off' and `list_for_each_safe'
+ * descriptions.
+ *
+ * Example:
+ * list_for_each_safe_off(&parent->children, child,
+ * next, offsetof(struct child, list))
+ * printf("Name: %s\n", child->name);
+ */
+#define list_for_each_safe_off(h, i, nxt, off) \
+ for (i = list_node_to_off_(list_debug(h, LIST_LOC)->n.next, \
+ (off)), \
+ nxt = list_node_to_off_(list_node_from_off_(i, (off))->next, \
+ (off)); \
+ list_node_from_off_(i, (off)) != &(h)->n; \
+ i = nxt, \
+ nxt = list_node_to_off_(list_node_from_off_(i, (off))->next, \
+ (off)))
+
+
+/* Other -off variants. */
+#define list_entry_off(n, type, off) \
+ ((type *)list_node_from_off_((n), (off)))
+
+#define list_head_off(h, type, off) \
+ ((type *)list_head_off((h), (off)))
+
+#define list_tail_off(h, type, off) \
+ ((type *)list_tail_((h), (off)))
+
+#define list_add_off(h, n, off) \
+ list_add((h), list_node_from_off_((n), (off)))
+
+#define list_del_off(n, off) \
+ list_del(list_node_from_off_((n), (off)))
+
+#define list_del_from_off(h, n, off) \
+ list_del_from(h, list_node_from_off_((n), (off)))
+
+/* Offset helper functions so we only single-evaluate. */
+static inline void *list_node_to_off_(struct list_node *node, size_t off)
+{
+ return (void *)((char *)node - off);
+}
+static inline struct list_node *list_node_from_off_(void *ptr, size_t off)
+{
+ return (struct list_node *)((char *)ptr + off);
+}
+
+/* Get the offset of the member, but make sure it's a list_node. */
+#define list_off_(type, member) \
+ (container_off(type, member) + \
+ check_type(((type *)0)->member, struct list_node))
+
+#define list_off_var_(var, member) \
+ (container_off_var(var, member) + \
+ check_type(var->member, struct list_node))
+
+#if HAVE_TYPEOF
+#define list_typeof(var) typeof(var)
+#else
+#define list_typeof(var) void *
+#endif
+
+/* Returns member, or NULL if at end of list. */
+static inline void *list_entry_or_null(const struct list_head *h,
+ const struct list_node *n,
+ size_t off)
+{
+ if (n == &h->n)
+ return NULL;
+ return (char *)n - off;
+}
+#endif /* CCAN_LIST_H */
diff --git a/ccan/str/str.h b/ccan/str/str.h
new file mode 100644
index 0000000000..9a9da9cd3f
--- /dev/null
+++ b/ccan/str/str.h
@@ -0,0 +1,16 @@
+/* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
+#ifndef CCAN_STR_H
+#define CCAN_STR_H
+/**
+ * stringify - Turn expression into a string literal
+ * @expr: any C expression
+ *
+ * Example:
+ * #define PRINT_COND_IF_FALSE(cond) \
+ * ((cond) || printf("%s is false!", stringify(cond)))
+ */
+#define stringify(expr) stringify_1(expr)
+/* Double-indirection required to stringify expansions */
+#define stringify_1(expr) #expr
+
+#endif /* CCAN_STR_H */
diff --git a/class.c b/class.c
index ae190eec09..d841328077 100644
--- a/class.c
+++ b/class.c
@@ -42,7 +42,7 @@ rb_class_subclass_add(VALUE super, VALUE klass)
rb_subclass_entry_t *entry, *head;
if (super && super != Qundef) {
- entry = xmalloc(sizeof(*entry));
+ entry = ALLOC(rb_subclass_entry_t);
entry->klass = klass;
entry->next = NULL;
@@ -62,7 +62,7 @@ rb_module_add_to_subclasses_list(VALUE module, VALUE iclass)
{
rb_subclass_entry_t *entry, *head;
- entry = xmalloc(sizeof(*entry));
+ entry = ALLOC(rb_subclass_entry_t);
entry->klass = iclass;
entry->next = NULL;
@@ -233,6 +233,25 @@ rb_class_new(VALUE super)
}
static void
+rewrite_cref_stack(NODE *node, VALUE old_klass, VALUE new_klass, NODE **new_cref_ptr)
+{
+ NODE *new_node;
+ while (node) {
+ if (node->nd_clss == old_klass) {
+ new_node = NEW_CREF(new_klass);
+ RB_OBJ_WRITE(new_node, &new_node->nd_next, node->nd_next);
+ *new_cref_ptr = new_node;
+ return;
+ }
+ new_node = NEW_CREF(node->nd_clss);
+ node = node->nd_next;
+ *new_cref_ptr = new_node;
+ new_cref_ptr = &new_node->nd_next;
+ }
+ *new_cref_ptr = NULL;
+}
+
+static void
clone_method(VALUE klass, ID mid, const rb_method_entry_t *me)
{
VALUE newiseqval;
@@ -241,7 +260,7 @@ clone_method(VALUE klass, ID mid, const rb_method_entry_t *me)
NODE *new_cref;
newiseqval = rb_iseq_clone(me->def->body.iseq->self, klass);
GetISeqPtr(newiseqval, iseq);
- rb_vm_rewrite_cref_stack(me->def->body.iseq->cref_stack, me->klass, klass, &new_cref);
+ rewrite_cref_stack(me->def->body.iseq->cref_stack, me->klass, klass, &new_cref);
RB_OBJ_WRITE(iseq->self, &iseq->cref_stack, new_cref);
rb_add_method(klass, mid, VM_METHOD_TYPE_ISEQ, iseq, me->flag);
RB_GC_GUARD(newiseqval);
@@ -520,7 +539,7 @@ Init_class_hierarchy(void)
rb_cModule = boot_defclass("Module", rb_cObject);
rb_cClass = boot_defclass("Class", rb_cModule);
- rb_const_set(rb_cObject, rb_intern("BasicObject"), rb_cBasicObject);
+ rb_const_set(rb_cObject, rb_intern_const("BasicObject"), rb_cBasicObject);
RBASIC_SET_CLASS(rb_cClass, rb_cClass);
RBASIC_SET_CLASS(rb_cModule, rb_cClass);
RBASIC_SET_CLASS(rb_cObject, rb_cClass);
@@ -864,7 +883,8 @@ include_modules_at(const VALUE klass, VALUE c, VALUE module)
if (BUILTIN_TYPE(module) == T_ICLASS) {
rb_module_add_to_subclasses_list(RBASIC(module)->klass, iclass);
- } else {
+ }
+ else {
rb_module_add_to_subclasses_list(module, iclass);
}
@@ -933,10 +953,10 @@ rb_prepend_module(VALUE klass, VALUE module)
origin = RCLASS_ORIGIN(klass);
if (origin == klass) {
origin = class_alloc(T_ICLASS, klass);
- OBJ_WB_UNPROTECT(origin); /* TODO: conservertive shading. Need more survery. */
+ OBJ_WB_UNPROTECT(origin); /* TODO: conservative shading. Need more survey. */
RCLASS_SET_SUPER(origin, RCLASS_SUPER(klass));
RCLASS_SET_SUPER(klass, origin);
- RB_OBJ_WRITE(klass, &RCLASS_ORIGIN(klass), origin);
+ RCLASS_ORIGIN(klass) = origin;
RCLASS_M_TBL_WRAPPER(origin) = RCLASS_M_TBL_WRAPPER(klass);
RCLASS_M_TBL_INIT(klass);
st_foreach(RCLASS_M_TBL(origin), move_refined_method,
@@ -1021,16 +1041,18 @@ rb_mod_include_p(VALUE mod, VALUE mod2)
* call-seq:
* mod.ancestors -> array
*
- * Returns a list of modules included in <i>mod</i> (including
- * <i>mod</i> itself).
+ * Returns a list of modules included/prepended in <i>mod</i>
+ * (including <i>mod</i> itself).
*
* module Mod
* include Math
* include Comparable
+ * prepend Enumerable
* end
*
- * Mod.ancestors #=> [Mod, Comparable, Math]
- * Math.ancestors #=> [Math]
+ * Mod.ancestors #=> [Enumerable, Mod, Comparable, Math]
+ * Math.ancestors #=> [Math]
+ * Enumerable.ancestors #=> [Enumerable]
*/
VALUE
@@ -1097,42 +1119,35 @@ ins_methods_pub_i(st_data_t name, st_data_t type, st_data_t ary)
return ins_methods_push((ID)name, (long)type, (VALUE)ary, NOEX_PUBLIC);
}
-struct method_entry_arg {
- st_table *list;
- int recur;
-};
-
static int
method_entry_i(st_data_t key, st_data_t value, st_data_t data)
{
const rb_method_entry_t *me = (const rb_method_entry_t *)value;
- struct method_entry_arg *arg = (struct method_entry_arg *)data;
+ st_table *list = (st_table *)data;
long type;
if (me && me->def->type == VM_METHOD_TYPE_REFINED) {
- VALUE klass = me->klass;
me = rb_resolve_refined_method(Qnil, me, NULL);
if (!me) return ST_CONTINUE;
- if (!arg->recur && me->klass != klass) return ST_CONTINUE;
}
- if (!st_lookup(arg->list, key, 0)) {
+ if (!st_lookup(list, key, 0)) {
if (UNDEFINED_METHOD_ENTRY_P(me)) {
type = -1; /* none */
}
else {
type = VISI(me->flag);
}
- st_add_direct(arg->list, key, type);
+ st_add_direct(list, key, type);
}
return ST_CONTINUE;
}
static VALUE
-class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func) (st_data_t, st_data_t, st_data_t))
+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, prepended = 0;
- struct method_entry_arg me_arg;
+ st_table *list;
if (argc == 0) {
recur = TRUE;
@@ -1148,17 +1163,16 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func
prepended = 1;
}
- me_arg.list = st_init_numtable();
- me_arg.recur = recur;
+ list = st_init_numtable();
for (; mod; mod = RCLASS_SUPER(mod)) {
- if (RCLASS_M_TBL(mod)) st_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)&me_arg);
+ if (RCLASS_M_TBL(mod)) st_foreach(RCLASS_M_TBL(mod), method_entry_i, (st_data_t)list);
if (BUILTIN_TYPE(mod) == T_ICLASS && !prepended) continue;
if (obj && FL_TEST(mod, FL_SINGLETON)) continue;
if (!recur) break;
}
ary = rb_ary_new();
- st_foreach(me_arg.list, func, ary);
- st_free_table(me_arg.list);
+ st_foreach(list, func, ary);
+ st_free_table(list);
return ary;
}
@@ -1169,29 +1183,29 @@ class_instance_method_list(int argc, VALUE *argv, VALUE mod, int obj, int (*func
*
* Returns an array containing the names of the public and protected instance
* methods in the receiver. For a module, these are the public and protected methods;
- * for a class, they are the instance (not singleton) methods. With no
- * argument, or with an argument that is <code>false</code>, the
- * instance methods in <i>mod</i> are returned, otherwise the methods
- * in <i>mod</i> and <i>mod</i>'s superclasses are returned.
+ * for a class, they are the instance (not singleton) methods. If the optional
+ * parameter is <code>false</code>, the methods of any ancestors are not included.
*
* module A
* def method1() end
* end
* class B
+ * include A
* def method2() end
* end
* class C < B
* def method3() end
* end
*
- * A.instance_methods #=> [:method1]
- * B.instance_methods(false) #=> [:method2]
- * C.instance_methods(false) #=> [:method3]
- * C.instance_methods(true).length #=> 43
+ * A.instance_methods(false) #=> [:method1]
+ * B.instance_methods(false) #=> [:method2]
+ * B.instance_methods(true).include?(:method1) #=> true
+ * C.instance_methods(false) #=> [:method3]
+ * C.instance_methods.include?(:method2) #=> true
*/
VALUE
-rb_class_instance_methods(int argc, VALUE *argv, VALUE mod)
+rb_class_instance_methods(int argc, const VALUE *argv, VALUE mod)
{
return class_instance_method_list(argc, argv, mod, 0, ins_methods_i);
}
@@ -1201,12 +1215,12 @@ rb_class_instance_methods(int argc, VALUE *argv, VALUE mod)
* mod.protected_instance_methods(include_super=true) -> array
*
* Returns a list of the protected instance methods defined in
- * <i>mod</i>. If the optional parameter is not <code>false</code>, the
- * methods of any ancestors are included.
+ * <i>mod</i>. If the optional parameter is <code>false</code>, the
+ * methods of any ancestors are not included.
*/
VALUE
-rb_class_protected_instance_methods(int argc, VALUE *argv, VALUE mod)
+rb_class_protected_instance_methods(int argc, const VALUE *argv, VALUE mod)
{
return class_instance_method_list(argc, argv, mod, 0, ins_methods_prot_i);
}
@@ -1216,8 +1230,8 @@ rb_class_protected_instance_methods(int argc, VALUE *argv, VALUE mod)
* mod.private_instance_methods(include_super=true) -> array
*
* Returns a list of the private instance methods defined in
- * <i>mod</i>. If the optional parameter is not <code>false</code>, the
- * methods of any ancestors are included.
+ * <i>mod</i>. If the optional parameter is <code>false</code>, the
+ * methods of any ancestors are not included.
*
* module Mod
* def method1() end
@@ -1229,7 +1243,7 @@ rb_class_protected_instance_methods(int argc, VALUE *argv, VALUE mod)
*/
VALUE
-rb_class_private_instance_methods(int argc, VALUE *argv, VALUE mod)
+rb_class_private_instance_methods(int argc, const VALUE *argv, VALUE mod)
{
return class_instance_method_list(argc, argv, mod, 0, ins_methods_priv_i);
}
@@ -1239,12 +1253,12 @@ rb_class_private_instance_methods(int argc, VALUE *argv, VALUE mod)
* mod.public_instance_methods(include_super=true) -> array
*
* Returns a list of the public instance methods defined in <i>mod</i>.
- * If the optional parameter is not <code>false</code>, the methods of
- * any ancestors are included.
+ * If the optional parameter is <code>false</code>, the methods of
+ * any ancestors are not included.
*/
VALUE
-rb_class_public_instance_methods(int argc, VALUE *argv, VALUE mod)
+rb_class_public_instance_methods(int argc, const VALUE *argv, VALUE mod)
{
return class_instance_method_list(argc, argv, mod, 0, ins_methods_pub_i);
}
@@ -1256,8 +1270,8 @@ rb_class_public_instance_methods(int argc, VALUE *argv, VALUE mod)
* Returns a list of the names of public and protected methods of
* <i>obj</i>. This will include all the methods accessible in
* <i>obj</i>'s ancestors.
- * If the <i>regular</i> parameter is set to <code>false</code>,
- * Returns an array of obj's public and protected singleton methods,
+ * If the optional parameter is <code>false</code>, it
+ * returns an array of <i>obj<i>'s public and protected singleton methods,
* the array will not include methods in modules included in <i>obj</i>.
*
* class Klass
@@ -1268,7 +1282,7 @@ rb_class_public_instance_methods(int argc, VALUE *argv, VALUE mod)
* k.methods[0..9] #=> [:klass_method, :nil?, :===,
* # :==~, :!, :eql?
* # :hash, :<=>, :class, :singleton_class]
- * k.methods.length #=> 57
+ * k.methods.length #=> 56
*
* k.methods(false) #=> []
* def k.singleton_method; end
@@ -1280,22 +1294,13 @@ rb_class_public_instance_methods(int argc, VALUE *argv, VALUE mod)
*/
VALUE
-rb_obj_methods(int argc, VALUE *argv, VALUE obj)
+rb_obj_methods(int argc, const VALUE *argv, VALUE obj)
{
- retry:
- if (argc == 0) {
- return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_i);
- }
- else {
- VALUE recur;
-
- rb_scan_args(argc, argv, "1", &recur);
- if (RTEST(recur)) {
- argc = 0;
- goto retry;
- }
+ rb_check_arity(argc, 0, 1);
+ if (argc > 0 && !RTEST(argv[0])) {
return rb_obj_singleton_methods(argc, argv, obj);
}
+ return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_i);
}
/*
@@ -1308,7 +1313,7 @@ rb_obj_methods(int argc, VALUE *argv, VALUE obj)
*/
VALUE
-rb_obj_protected_methods(int argc, VALUE *argv, VALUE obj)
+rb_obj_protected_methods(int argc, const VALUE *argv, VALUE obj)
{
return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_prot_i);
}
@@ -1323,7 +1328,7 @@ rb_obj_protected_methods(int argc, VALUE *argv, VALUE obj)
*/
VALUE
-rb_obj_private_methods(int argc, VALUE *argv, VALUE obj)
+rb_obj_private_methods(int argc, const VALUE *argv, VALUE obj)
{
return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_priv_i);
}
@@ -1338,7 +1343,7 @@ rb_obj_private_methods(int argc, VALUE *argv, VALUE obj)
*/
VALUE
-rb_obj_public_methods(int argc, VALUE *argv, VALUE obj)
+rb_obj_public_methods(int argc, const VALUE *argv, VALUE obj)
{
return class_instance_method_list(argc, argv, CLASS_OF(obj), 1, ins_methods_pub_i);
}
@@ -1377,11 +1382,10 @@ rb_obj_public_methods(int argc, VALUE *argv, VALUE obj)
*/
VALUE
-rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
+rb_obj_singleton_methods(int argc, const VALUE *argv, VALUE obj)
{
VALUE recur, ary, klass, origin;
- struct method_entry_arg me_arg;
- st_table *mtbl;
+ st_table *list, *mtbl;
if (argc == 0) {
recur = Qtrue;
@@ -1391,23 +1395,22 @@ rb_obj_singleton_methods(int argc, VALUE *argv, VALUE obj)
}
klass = CLASS_OF(obj);
origin = RCLASS_ORIGIN(klass);
- me_arg.list = st_init_numtable();
- me_arg.recur = recur;
+ list = st_init_numtable();
if (klass && FL_TEST(klass, FL_SINGLETON)) {
if ((mtbl = RCLASS_M_TBL(origin)) != 0)
- st_foreach(mtbl, method_entry_i, (st_data_t)&me_arg);
+ st_foreach(mtbl, method_entry_i, (st_data_t)list);
klass = RCLASS_SUPER(klass);
}
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)
- st_foreach(mtbl, method_entry_i, (st_data_t)&me_arg);
+ st_foreach(mtbl, method_entry_i, (st_data_t)list);
klass = RCLASS_SUPER(klass);
}
}
ary = rb_ary_new();
- st_foreach(me_arg.list, ins_methods_i, ary);
- st_free_table(me_arg.list);
+ st_foreach(list, ins_methods_i, ary);
+ st_free_table(list);
return ary;
}
@@ -1558,12 +1561,10 @@ singleton_class_of(VALUE obj)
}
}
- if (FL_TEST(RBASIC(obj)->klass, FL_SINGLETON) &&
- rb_ivar_get(RBASIC(obj)->klass, id_attached) == obj) {
- klass = RBASIC(obj)->klass;
- }
- else {
- klass = rb_make_metaclass(obj, RBASIC(obj)->klass);
+ klass = RBASIC(obj)->klass;
+ if (!(FL_TEST(klass, FL_SINGLETON) &&
+ rb_ivar_get(klass, id_attached) == obj)) {
+ klass = rb_make_metaclass(obj, klass);
}
if (OBJ_TAINTED(obj)) {
@@ -1572,7 +1573,7 @@ singleton_class_of(VALUE obj)
else {
FL_UNSET(klass, FL_TAINT);
}
- if (OBJ_FROZEN(obj)) OBJ_FREEZE(klass);
+ if (OBJ_FROZEN(obj)) OBJ_FREEZE_RAW(klass);
return klass;
}
@@ -1867,12 +1868,10 @@ NORETURN(static void unknown_keyword_error(VALUE hash, const ID *table, int keyw
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);
+ rb_hash_delete(hash, ID2SYM(table[i]));
}
keys = rb_funcall(hash, rb_intern("keys"), 0, 0);
if (!RB_TYPE_P(keys, T_ARRAY)) rb_raise(rb_eArgError, "unknown keyword");
@@ -1918,6 +1917,8 @@ rb_get_kwargs(VALUE keyword_hash, const ID *table, int required, int optional, V
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;
diff --git a/common.mk b/common.mk
index 6508c4c023..2c8f914ccf 100644
--- a/common.mk
+++ b/common.mk
@@ -14,10 +14,12 @@ RUBYLIB = $(PATH_SEPARATOR)
RUBYOPT = -
RUN_OPTS = --disable-gems
-SPEC_GIT_BASE = git://github.com/ruby
+SPEC_GIT_BASE = git://github.com/nurse
MSPEC_GIT_URL = $(SPEC_GIT_BASE)/mspec.git
RUBYSPEC_GIT_URL = $(SPEC_GIT_BASE)/rubyspec.git
+SIMPLECOV_GIT_URL = git://github.com/hsbt/simplecov.git
+
STATIC_RUBY = static-ruby
EXTCONF = extconf.rb
@@ -81,6 +83,7 @@ COMMONOBJS = array.$(OBJEXT) \
strftime.$(OBJEXT) \
string.$(OBJEXT) \
struct.$(OBJEXT) \
+ symbol.$(OBJEXT) \
time.$(OBJEXT) \
transcode.$(OBJEXT) \
util.$(OBJEXT) \
@@ -109,6 +112,7 @@ ALLOBJS = $(NORMALMAINOBJ) $(MINIOBJS) $(COMMONOBJS) $(DMYEXT)
GOLFOBJS = goruby.$(OBJEXT) golf_prelude.$(OBJEXT)
+DEFAULT_PRELUDES = $(GEM_PRELUDE)
PRELUDE_SCRIPTS = $(srcdir)/prelude.rb $(srcdir)/enc/prelude.rb $(DEFAULT_PRELUDES)
GEM_PRELUDE = $(srcdir)/gem_prelude.rb
PRELUDES = prelude.c miniprelude.c
@@ -119,7 +123,8 @@ SCRIPT_ARGS = --dest-dir="$(DESTDIR)" \
--mflags="$(MFLAGS)" \
--make-flags="$(MAKEFLAGS)"
EXTMK_ARGS = $(SCRIPT_ARGS) --extension $(EXTS) --extstatic $(EXTSTATIC) \
- --make-flags="V=$(V) MINIRUBY='$(MINIRUBY)'" --
+ --make-flags="V=$(V) MINIRUBY='$(MINIRUBY)'" --gnumake=$(gnumake) \
+ --
INSTRUBY = $(SUDO) $(RUNRUBY) -r./$(arch)-fake $(srcdir)/tool/rbinstall.rb
INSTRUBY_ARGS = $(SCRIPT_ARGS) \
--data-mode=$(INSTALL_DATA_MODE) \
@@ -143,7 +148,7 @@ COMPILE_PRELUDE = $(MINIRUBY) -I$(srcdir) $(srcdir)/tool/compile_prelude.rb
all: showflags main docs
-main: showflags $(EXTSTATIC:static=lib)encs exts
+main: showflags $(ENCSTATIC:static=lib)encs exts
@$(NULLCMD)
.PHONY: showflags
@@ -177,10 +182,7 @@ $(EXTS_MK): $(MKFILES) all-incs $(PREP) $(RBCONFIG) $(LIBRUBY)
configure-ext: $(EXTS_MK)
build-ext: $(EXTS_MK)
- $(Q)$(MAKE) -f $(EXTS_MK) $(MFLAGS) $(EXTSTATIC) LIBRUBY_EXTS=$(LIBRUBY_EXTS) ENCOBJS="$(ENCOBJS)"
-
-$(MKMAIN_CMD): $(MKFILES) all-incs $(PREP) $(RBCONFIG) $(LIBRUBY)
- $(Q)$(MINIRUBY) $(srcdir)/ext/extmk.rb --make="$(MAKE)" --command-output=$@ $(EXTMK_ARGS)
+ $(Q)$(MAKE) -f $(EXTS_MK) $(MFLAGS) libdir="$(libdir)" LIBRUBY_EXTS=$(LIBRUBY_EXTS) ENCOBJS="$(ENCOBJS)"
prog: program wprogram
@@ -198,7 +200,7 @@ capi: $(CAPIOUT)/.timestamp PHONY
$(CAPIOUT)/.timestamp: Doxyfile $(PREP)
$(Q) $(MAKEDIRS) "$(@D)"
$(ECHO) generating capi
- $(Q) $(DOXYGEN) -b
+ -$(Q) $(DOXYGEN) -b
$(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)
@@ -234,80 +236,80 @@ pkgconfig-data: $(ruby_pc)
$(ruby_pc): $(srcdir)/template/ruby.pc.in config.status
install-all: docs pre-install-all do-install-all post-install-all
-pre-install-all:: pre-install-local pre-install-ext pre-install-doc
-do-install-all: 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 --rdoc-output="$(RDOCOUT)"
post-install-all:: post-install-local post-install-ext post-install-doc
@$(NULLCMD)
install-nodoc: pre-install-nodoc do-install-nodoc post-install-nodoc
pre-install-nodoc:: pre-install-local pre-install-ext
-do-install-nodoc: main
+do-install-nodoc: main pre-install-nodoc
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS)
post-install-nodoc:: post-install-local post-install-ext
install-local: pre-install-local do-install-local post-install-local
pre-install-local:: pre-install-bin pre-install-lib pre-install-man
-do-install-local: $(PROGRAM)
+do-install-local: $(PROGRAM) pre-install-local
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=local
post-install-local:: post-install-bin post-install-lib post-install-man
install-ext: pre-install-ext do-install-ext post-install-ext
pre-install-ext:: pre-install-ext-arch pre-install-ext-comm
-do-install-ext: exts
+do-install-ext: exts pre-install-ext
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=ext
post-install-ext:: post-install-ext-arch post-install-ext-comm
install-arch: pre-install-arch do-install-arch post-install-arch
pre-install-arch:: pre-install-bin pre-install-ext-arch
-do-install-arch: main
+do-install-arch: main do-install-arch
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=arch
post-install-arch:: post-install-bin post-install-ext-arch
install-comm: pre-install-comm do-install-comm post-install-comm
pre-install-comm:: pre-install-lib pre-install-ext-comm pre-install-man
-do-install-comm: $(PREP)
+do-install-comm: $(PREP) pre-install-comm
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=lib --install=ext-comm --install=man
post-install-comm:: post-install-lib post-install-ext-comm post-install-man
install-bin: pre-install-bin do-install-bin post-install-bin
pre-install-bin:: install-prereq
-do-install-bin: $(PROGRAM)
+do-install-bin: $(PROGRAM) pre-install-bin
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=bin
post-install-bin::
@$(NULLCMD)
install-lib: pre-install-lib do-install-lib post-install-lib
pre-install-lib:: install-prereq
-do-install-lib: $(PREP)
+do-install-lib: $(PREP) pre-install-lib
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=lib
post-install-lib::
@$(NULLCMD)
install-ext-comm: pre-install-ext-comm do-install-ext-comm post-install-ext-comm
pre-install-ext-comm:: install-prereq
-do-install-ext-comm: exts
+do-install-ext-comm: exts pre-install-ext-comm
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=ext-comm
post-install-ext-comm::
@$(NULLCMD)
install-ext-arch: pre-install-ext-arch do-install-ext-arch post-install-ext-arch
pre-install-ext-arch:: install-prereq
-do-install-ext-arch: exts
+do-install-ext-arch: exts pre-install-ext-arch
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=ext-arch
post-install-ext-arch::
@$(NULLCMD)
install-man: pre-install-man do-install-man post-install-man
pre-install-man:: install-prereq
-do-install-man: $(PREP)
+do-install-man: $(PREP) pre-install-man
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=man
post-install-man::
@$(NULLCMD)
install-capi: capi pre-install-capi do-install-capi post-install-capi
pre-install-capi:: install-prereq
-do-install-capi: $(PREP)
+do-install-capi: $(PREP) pre-install-capi
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=capi
post-install-capi::
@$(NULLCMD)
@@ -322,10 +324,10 @@ dont-install-all: $(PROGRAM)
post-no-install-all:: post-no-install-local post-no-install-ext post-no-install-doc
@$(NULLCMD)
-uninstall: $(INSTALLED_LIST)
+uninstall: $(INSTALLED_LIST) sudo-precheck
$(Q)$(SUDO) $(MINIRUBY) $(srcdir)/tool/rbuninstall.rb --destdir=$(DESTDIR) $(INSTALLED_LIST)
-reinstall: uninstall install
+reinstall: all uninstall install
what-where-nodoc: no-install-nodoc
no-install-nodoc: pre-no-install-nodoc dont-install-nodoc post-no-install-nodoc
@@ -404,14 +406,14 @@ 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)
+do-install-doc: $(PROGRAM) pre-install-doc
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=rdoc --rdoc-output="$(RDOCOUT)"
post-install-doc::
@$(NULLCMD)
install-gem: pre-install-gem do-install-gem post-install-gem
pre-install-gem:: pre-install-bin pre-install-lib pre-install-man
-do-install-gem: $(PROGRAM)
+do-install-gem: $(PROGRAM) pre-install-gem
$(INSTRUBY) --make="$(MAKE)" $(INSTRUBY_ARGS) --install=gem
post-install-gem::
@$(NULLCMD)
@@ -446,16 +448,21 @@ post-no-install-doc::
CLEAR_INSTALLED_LIST = clear-installed-list
-install-prereq: $(CLEAR_INSTALLED_LIST) yes-fake PHONY
+install-prereq: $(CLEAR_INSTALLED_LIST) yes-fake sudo-precheck PHONY
clear-installed-list: PHONY
@> $(INSTALLED_LIST) set MAKE="$(MAKE)"
clean: clean-ext clean-local clean-enc clean-golf clean-rdoc clean-capi clean-extout clean-platform
-clean-local:: PHONY
+clean-local:: clean-runnable
$(Q)$(RM) $(OBJS) $(MINIOBJS) $(MAINOBJ) $(LIBRUBY_A) $(LIBRUBY_SO) $(LIBRUBY) $(LIBRUBY_ALIASES)
$(Q)$(RM) $(PROGRAM) $(WPROGRAM) miniruby$(EXEEXT) dmyext.$(OBJEXT) $(ARCHFILE) .*.time
$(Q)$(RM) y.tab.c y.output encdb.h transdb.h prelude.c config.log rbconfig.rb $(ruby_pc) probes.h probes.$(OBJEXT) probes.stamp ruby-glommed.$(OBJEXT)
+ $(Q)$(RM) GNUmakefile.old Makefile.old $(arch)-fake.rb
+clean-runnable:: PHONY
+ $(Q)$(CHDIR) bin 2>$(NULL) && $(RM) $(PROGRAM) $(WPROGRAM) $(GORUBY)$(EXEEXT) bin/*.$(DLEXT) 2>$(NULL) || exit 0
+ $(Q)$(CHDIR) lib 2>$(NULL) && $(RM) $(LIBRUBY_A) $(LIBRUBY) $(LIBRUBY_ALIASES) $(RUBY_BASE_NAME)/$(RUBY_PROGRAM_VERSION) $(RUBY_BASE_NAME)/vendor_ruby 2>$(NULL) || exit 0
+ $(Q)$(RMDIR) lib/$(RUBY_BASE_NAME) lib bin 2>$(NULL) || exit 0
clean-ext:: PHONY
clean-golf: PHONY
$(Q)$(RM) $(GORUBY)$(EXEEXT) $(GOLFOBJS)
@@ -463,6 +470,7 @@ clean-rdoc: PHONY
clean-capi: PHONY
clean-platform: PHONY
clean-extout: PHONY
+ -$(Q)$(RMDIR) $(EXTOUT)/$(arch) $(EXTOUT) 2> $(NULL) || exit 0
clean-docs: clean-rdoc clean-capi
distclean: distclean-ext distclean-local distclean-enc distclean-golf distclean-extout distclean-platform
@@ -489,9 +497,22 @@ realclean-extout: distclean-extout
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
+clean-rdoc distclean-rdoc realclean-rdoc:
+ @echo $(@:-rdoc=ing) rdoc
+ $(Q)$(RMALL) $(RDOCOUT)
+
+clean-capi distclean-capi realclean-capi:
+ @echo $(@:-capi=ing) capi
+ $(Q)$(RMALL) $(CAPIOUT)
+
+clean-platform:
+ $(Q) $(RM) $(PLATFORM_D)
+ -$(Q) $(RMDIR) $(PLATFORM_DIR) 2> $(NULL) || exit 0
+
check: main test test-all
$(ECHO) check succeeded
check-ruby: test test-ruby
@@ -556,7 +577,7 @@ yes-runnable: PHONY
encs: enc trans
libencs: libenc libtrans
-encs enc trans libencs libenc libtrans: showflags $(ENC_MK) $(LIBRUBY) $(PREP)
+encs enc trans libencs libenc libtrans: showflags $(ENC_MK) $(LIBRUBY) $(PREP) PHONY
$(ECHO) making $@
$(Q) $(MAKE) -f $(ENC_MK) V="$(V)" \
RUBY="$(MINIRUBY)" MINIRUBY="$(MINIRUBY)" \
@@ -569,7 +590,7 @@ libtrans trans: {$(VPATH)}transdb.h
$(ENC_MK): $(srcdir)/enc/make_encmake.rb $(srcdir)/enc/Makefile.in $(srcdir)/enc/depend \
$(srcdir)/enc/encinit.c.erb $(srcdir)/lib/mkmf.rb $(RBCONFIG)
$(ECHO) generating $@
- $(Q) $(MINIRUBY) $(srcdir)/enc/make_encmake.rb --builtin-encs="$(BUILTIN_ENCOBJS)" --builtin-transes="$(BUILTIN_TRANSOBJS)" --module$(EXTSTATIC) $@ $(ENCS)
+ $(Q) $(MINIRUBY) $(srcdir)/enc/make_encmake.rb --builtin-encs="$(BUILTIN_ENCOBJS)" --builtin-transes="$(BUILTIN_TRANSOBJS)" --module$(ENCSTATIC) $@ $(ENCS)
.PRECIOUS: $(MKFILES)
@@ -603,6 +624,12 @@ $(PLATFORM_D):
@exit > $@
###
+CCAN_DIR = {$(VPATH)}ccan
+CCAN_LIST_INCLUDES = $(CCAN_DIR)/build_assert/build_assert.h \
+ $(CCAN_DIR)/check_type/check_type.h \
+ $(CCAN_DIR)/container_of/container_of.h \
+ $(CCAN_DIR)/list/list.h \
+ $(CCAN_DIR)/str/str.h
RUBY_H_INCLUDES = {$(VPATH)}ruby.h {$(VPATH)}config.h {$(VPATH)}defines.h \
{$(VPATH)}intern.h {$(VPATH)}missing.h {$(VPATH)}st.h \
@@ -611,7 +638,8 @@ ENCODING_H_INCLUDES= {$(VPATH)}encoding.h {$(VPATH)}oniguruma.h
PROBES_H_INCLUDES = {$(VPATH)}probes.h
VM_CORE_H_INCLUDES = {$(VPATH)}vm_core.h {$(VPATH)}thread_$(THREAD_MODEL).h \
{$(VPATH)}node.h {$(VPATH)}method.h {$(VPATH)}ruby_atomic.h \
- {$(VPATH)}vm_debug.h {$(VPATH)}id.h {$(VPATH)}thread_native.h
+ {$(VPATH)}vm_debug.h {$(VPATH)}id.h {$(VPATH)}thread_native.h \
+ $(CCAN_LIST_INCLUDES)
###
@@ -684,7 +712,7 @@ gc.$(OBJEXT): {$(VPATH)}gc.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
{$(VPATH)}gc.h {$(VPATH)}io.h {$(VPATH)}eval_intern.h {$(VPATH)}util.h \
{$(VPATH)}internal.h {$(VPATH)}constant.h \
{$(VPATH)}thread.h $(PROBES_H_INCLUDES) {$(VPATH)}vm_opts.h {$(VPATH)}debug.h
-hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
+hash.$(OBJEXT): {$(VPATH)}hash.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h {$(VPATH)}id.h \
$(ENCODING_H_INCLUDES) {$(VPATH)}internal.h $(PROBES_H_INCLUDES) {$(VPATH)}vm_opts.h
inits.$(OBJEXT): {$(VPATH)}inits.c $(RUBY_H_INCLUDES) \
{$(VPATH)}internal.h
@@ -706,10 +734,10 @@ object.$(OBJEXT): {$(VPATH)}object.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
pack.$(OBJEXT): {$(VPATH)}pack.c $(RUBY_H_INCLUDES) {$(VPATH)}encoding.h \
{$(VPATH)}oniguruma.h {$(VPATH)}internal.h
parse.$(OBJEXT): {$(VPATH)}parse.c $(RUBY_H_INCLUDES) {$(VPATH)}node.h \
- $(ENCODING_H_INCLUDES) {$(VPATH)}id.h {$(VPATH)}regenc.h \
+ $(ENCODING_H_INCLUDES) {$(VPATH)}id.h {$(VPATH)}symbol.h {$(VPATH)}regenc.h \
{$(VPATH)}regex.h {$(VPATH)}util.h {$(VPATH)}lex.c \
{$(VPATH)}defs/keywords {$(VPATH)}id.c {$(VPATH)}parse.y \
- {$(VPATH)}parse.h {$(VPATH)}internal.h $(PROBES_H_INCLUDES) {$(VPATH)}vm_opts.h
+ {$(VPATH)}parse.h {$(VPATH)}internal.h $(PROBES_H_INCLUDES) {$(VPATH)}vm_opts.h {$(VPATH)}gc.h
proc.$(OBJEXT): {$(VPATH)}proc.c {$(VPATH)}eval_intern.h \
$(RUBY_H_INCLUDES) {$(VPATH)}gc.h $(VM_CORE_H_INCLUDES) \
{$(VPATH)}internal.h {$(VPATH)}iseq.h {$(VPATH)}vm_opts.h
@@ -745,14 +773,18 @@ ruby.$(OBJEXT): {$(VPATH)}ruby.c $(RUBY_H_INCLUDES) {$(VPATH)}util.h \
safe.$(OBJEXT): {$(VPATH)}safe.c $(RUBY_H_INCLUDES) $(VM_CORE_H_INCLUDES) {$(VPATH)}vm_opts.h {$(VPATH)}internal.h
signal.$(OBJEXT): {$(VPATH)}signal.c $(RUBY_H_INCLUDES) \
$(VM_CORE_H_INCLUDES) {$(VPATH)}vm_opts.h {$(VPATH)}internal.h {$(VPATH)}ruby_atomic.h {$(VPATH)}eval_intern.h
-sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
+sprintf.$(OBJEXT): {$(VPATH)}sprintf.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h {$(VPATH)}id.h \
{$(VPATH)}regex.h {$(VPATH)}vsnprintf.c $(ENCODING_H_INCLUDES) {$(VPATH)}internal.h
st.$(OBJEXT): {$(VPATH)}st.c $(RUBY_H_INCLUDES)
strftime.$(OBJEXT): {$(VPATH)}strftime.c $(RUBY_H_INCLUDES) \
{$(VPATH)}timev.h $(ENCODING_H_INCLUDES)
-string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h \
- {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) {$(VPATH)}internal.h $(PROBES_H_INCLUDES) {$(VPATH)}vm_opts.h {$(VPATH)}node.h {$(VPATH)}ruby_atomic.h {$(VPATH)}vm_core.h {$(VPATH)}vm_debug.h {$(VPATH)}id.h {$(VPATH)}method.h {$(VPATH)}thread_$(THREAD_MODEL).h {$(VPATH)}thread_native.h
+string.$(OBJEXT): {$(VPATH)}string.c $(RUBY_H_INCLUDES) {$(VPATH)}re.h {$(VPATH)}gc.h \
+ {$(VPATH)}regex.h $(ENCODING_H_INCLUDES) {$(VPATH)}internal.h \
+ $(PROBES_H_INCLUDES)
struct.$(OBJEXT): {$(VPATH)}struct.c $(RUBY_H_INCLUDES) {$(VPATH)}internal.h
+symbol.$(OBJEXT): {$(VPATH)}symbol.c $(RUBY_H_INCLUDES) $(ENCODING_H_INCLUDES) \
+ {$(VPATH)}internal.h {$(VPATH)}node.h {$(VPATH)}id.h {$(VPATH)}symbol.h \
+ $(PROBES_H_INCLUDES)
thread.$(OBJEXT): {$(VPATH)}thread.c {$(VPATH)}eval_intern.h \
$(RUBY_H_INCLUDES) {$(VPATH)}gc.h $(VM_CORE_H_INCLUDES) \
{$(VPATH)}thread_$(THREAD_MODEL).c $(ENCODING_H_INCLUDES) \
@@ -786,7 +818,9 @@ compile.$(OBJEXT): {$(VPATH)}compile.c {$(VPATH)}iseq.h \
{$(VPATH)}internal.h {$(VPATH)}vm_opts.h
iseq.$(OBJEXT): {$(VPATH)}iseq.c {$(VPATH)}gc.h {$(VPATH)}iseq.h \
$(RUBY_H_INCLUDES) $(VM_CORE_H_INCLUDES) {$(VPATH)}insns.inc \
- {$(VPATH)}insns_info.inc {$(VPATH)}node_name.inc {$(VPATH)}internal.h {$(VPATH)}vm_opts.h {$(VPATH)}ruby_atomic.h {$(VPATH)}eval_intern.h
+ {$(VPATH)}insns_info.inc {$(VPATH)}node_name.inc {$(VPATH)}internal.h \
+ {$(VPATH)}vm_opts.h {$(VPATH)}ruby_atomic.h {$(VPATH)}eval_intern.h \
+ {$(VPATH)}util.h
vm.$(OBJEXT): {$(VPATH)}vm.c {$(VPATH)}gc.h {$(VPATH)}iseq.h \
{$(VPATH)}eval_intern.h $(RUBY_H_INCLUDES) $(ENCODING_H_INCLUDES) \
$(VM_CORE_H_INCLUDES) {$(VPATH)}vm_method.c {$(VPATH)}vm_eval.c \
@@ -817,8 +851,6 @@ golf_prelude.$(OBJEXT): {$(VPATH)}golf_prelude.c $(RUBY_H_INCLUDES) \
goruby.$(OBJEXT): {$(VPATH)}goruby.c {$(VPATH)}main.c $(RUBY_H_INCLUDES) \
{$(VPATH)}vm_debug.h {$(VPATH)}node.h $(hdrdir)/ruby.h
-sizes.$(OBJEXT): {$(VPATH)}sizes.c $(RUBY_H_INCLUDES)
-
ascii.$(OBJEXT): {$(VPATH)}ascii.c {$(VPATH)}regenc.h {$(VPATH)}config.h \
{$(VPATH)}oniguruma.h {$(VPATH)}missing.h $(RUBY_H_INCLUDES)
us_ascii.$(OBJEXT): {$(VPATH)}us_ascii.c {$(VPATH)}regenc.h \
@@ -843,9 +875,9 @@ newline.$(OBJEXT): $(NEWLINE_C) {$(VPATH)}defines.h \
{$(VPATH)}intern.h {$(VPATH)}missing.h {$(VPATH)}st.h \
{$(VPATH)}transcode_data.h {$(VPATH)}ruby.h {$(VPATH)}config.h {$(VPATH)}subst.h
-verconf.h: $(srcdir)/template/verconf.h.in $(srcdir)/tool/generic_erb.rb $(RBCONFIG)
+verconf.h: $(srcdir)/template/verconf.h.tmpl $(srcdir)/tool/generic_erb.rb $(RBCONFIG)
$(ECHO) creating $@
- $(Q) $(MINIRUBY) "$(srcdir)/tool/generic_erb.rb" $(srcdir)/template/verconf.h.in > $@
+ $(Q) $(MINIRUBY) "$(srcdir)/tool/generic_erb.rb" $(srcdir)/template/verconf.h.tmpl > $@
DTRACE_DEPENDENT_OBJS = array.$(OBJEXT) \
eval.$(OBJEXT) \
@@ -855,6 +887,7 @@ DTRACE_DEPENDENT_OBJS = array.$(OBJEXT) \
object.$(OBJEXT) \
parse.$(OBJEXT) \
string.$(OBJEXT) \
+ symbol.$(OBJEXT) \
vm.$(OBJEXT)
probes.$(OBJEXT): $(DTRACE_DEPENDENT_OBJS)
@@ -893,7 +926,8 @@ srcs-enc: $(ENC_MK)
all-incs: incs
incs: $(INSNS) {$(VPATH)}node_name.inc {$(VPATH)}encdb.h {$(VPATH)}transdb.h {$(VPATH)}known_errors.inc \
- $(srcdir)/revision.h $(REVISION_H) enc/unicode/name2ctype.h {$(VPATH)}id.h {$(VPATH)}probes.dmyh
+ $(srcdir)/revision.h $(REVISION_H) enc/unicode/name2ctype.h enc/jis/props.h \
+ {$(VPATH)}id.h {$(VPATH)}probes.dmyh
insns: $(INSNS)
@@ -1100,5 +1134,5 @@ help: PHONY
" golf: for golfers" \
"" \
"see DeveloperHowto for more detail: " \
- " http://bugs.ruby-lang.org/wiki/ruby/DeveloperHowto" \
+ " https://bugs.ruby-lang.org/projects/ruby/wiki/DeveloperHowto" \
$(MESSAGE_END)
diff --git a/compar.c b/compar.c
index 2f4db291a4..81dff38f49 100644
--- a/compar.c
+++ b/compar.c
@@ -18,17 +18,16 @@ static ID cmp;
void
rb_cmperr(VALUE x, VALUE y)
{
- const char *classname;
+ VALUE classname;
if (SPECIAL_CONST_P(y)) {
- y = rb_inspect(y);
- classname = StringValuePtr(y);
+ classname = rb_inspect(y);
}
else {
- classname = rb_obj_classname(y);
+ classname = rb_obj_class(y);
}
- rb_raise(rb_eArgError, "comparison of %s with %s failed",
- rb_obj_classname(x), classname);
+ rb_raise(rb_eArgError, "comparison of %"PRIsVALUE" with %"PRIsVALUE" failed",
+ rb_obj_class(x), classname);
}
static VALUE
@@ -54,7 +53,7 @@ rb_invcmp(VALUE x, VALUE y)
static VALUE
cmp_eq_recursive(VALUE arg1, VALUE arg2, int recursive)
{
- if (recursive) return Qfalse;
+ if (recursive) return Qnil;
return rb_funcallv(arg1, cmp, 1, &arg2);
}
@@ -71,6 +70,8 @@ cmp_eq(VALUE *a)
static VALUE
cmp_failed(void)
{
+ rb_warn("Comparable#== will no more rescue exceptions of #<=> in the next release.");
+ rb_warn("Return nil in #<=> if the comparison is inappropriate or avoid such comparison.");
return Qfalse;
}
diff --git a/compile.c b/compile.c
index 099c280f75..ac4e5bac22 100644
--- a/compile.c
+++ b/compile.c
@@ -216,7 +216,7 @@ r_value(VALUE value)
#define ADD_SEND_R(seq, line, id, argc, block, flag) \
ADD_ELEM((seq), (LINK_ELEMENT *) \
new_insn_send(iseq, (line), \
- (VALUE)(id), (VALUE)(argc), (VALUE)(block), (VALUE)(flag)))
+ (id), (VALUE)(argc), (VALUE)(block), (VALUE)(flag)))
#define ADD_TRACE(seq, line, event) \
do { \
@@ -265,6 +265,11 @@ r_value(VALUE value)
(debug_compile("== " desc "\n", \
iseq_compile_each(iseq, (anchor), (node), (poped))))
+#define COMPILE_RECV(anchor, desc, node) \
+ (private_recv_p(node) ? \
+ (ADD_INSN(anchor, nd_line(node), putself), VM_CALL_FCALL) : \
+ (COMPILE(anchor, desc, node->nd_recv), 0))
+
#define OPERAND_AT(insn, idx) \
(((INSN*)(insn))->operands[(idx)])
@@ -326,7 +331,7 @@ static void dump_disasm_list(LINK_ELEMENT *elem);
static int insn_data_length(INSN *iobj);
static int calc_sp_depth(int depth, INSN *iobj);
-static INSN *new_insn_body(rb_iseq_t *iseq, int line_no, int insn_id, int argc, ...);
+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);
@@ -562,10 +567,7 @@ rb_iseq_translate_threaded_code(rb_iseq_t *iseq)
{
#if OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE
const void * const *table = rb_vm_get_insns_address_table();
- unsigned long i;
-
- iseq->iseq_encoded = ALLOC_N(VALUE, iseq->iseq_size);
- MEMCPY(iseq->iseq_encoded, iseq->iseq, VALUE, iseq->iseq_size);
+ unsigned int i;
for (i = 0; i < iseq->iseq_size; /* */ ) {
int insn = (int)iseq->iseq_encoded[i];
@@ -573,64 +575,54 @@ rb_iseq_translate_threaded_code(rb_iseq_t *iseq)
iseq->iseq_encoded[i] = (VALUE)table[insn];
i += len;
}
-#else
- iseq->iseq_encoded = iseq->iseq;
#endif
return COMPILE_OK;
}
-/*********************************************/
-/* definition of data structure for compiler */
-/*********************************************/
+#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();
-/*
- * On 32-bit SPARC, GCC by default generates SPARC V7 code that may require
- * 8-byte word alignment. On the other hand, Oracle Solaris Studio seems to
- * generate SPARCV8PLUS code with unaligned memory accesss instructions.
- * That is why the STRICT_ALIGNMENT is defined only with GCC.
- */
-#if defined(__sparc) && SIZEOF_VOIDP == 4 && defined(__GNUC__)
- #define STRICT_ALIGNMENT
+ 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
-#ifdef STRICT_ALIGNMENT
- #if defined(HAVE_TRUE_LONG_LONG) && SIZEOF_LONG_LONG > SIZEOF_VALUE
- #define ALIGNMENT_SIZE SIZEOF_LONG_LONG
- #else
- #define ALIGNMENT_SIZE SIZEOF_VALUE
- #endif
- #define PADDING_SIZE_MAX ((size_t)((ALIGNMENT_SIZE) - 1))
- #define ALIGNMENT_SIZE_MASK PADDING_SIZE_MAX
- /* Note: ALIGNMENT_SIZE == (2 ** N) is expected. */
-#else
- #define PADDING_SIZE_MAX 0
-#endif /* STRICT_ALIGNMENT */
-
-#ifdef STRICT_ALIGNMENT
-/* calculate padding size for aligned memory access */
-static size_t
-calc_padding(void *ptr, size_t size)
+VALUE *
+rb_iseq_original_iseq(rb_iseq_t *iseq) /* cold path */
{
- size_t mis;
- size_t padding = 0;
+ if (iseq->iseq) return iseq->iseq;
- mis = (size_t)ptr & ALIGNMENT_SIZE_MASK;
- if (mis > 0) {
- padding = ALIGNMENT_SIZE - mis;
- }
-/*
- * On 32-bit sparc or equivalents, when a single VALUE is requested
- * and padding == sizeof(VALUE), it is clear that no padding is needed.
- */
-#if ALIGNMENT_SIZE > SIZEOF_VALUE
- if (size == sizeof(VALUE) && padding == sizeof(VALUE)) {
- padding = 0;
+ iseq->iseq = ALLOC_N(VALUE, iseq->iseq_size);
+
+ MEMCPY(iseq->iseq, iseq->iseq_encoded, VALUE, iseq->iseq_size);
+
+#if OPT_DIRECT_THREADED_CODE || OPT_CALL_THREADED_CODE
+ {
+ unsigned int i;
+
+ for (i = 0; i < iseq->iseq_size; /* */ ) {
+ const void *addr = (const void *)iseq->iseq[i];
+ const int insn = rb_vm_insn_addr2insn(addr);
+
+ iseq->iseq[i] = insn;
+ i += insn_len(insn);
+ }
}
#endif
-
- return padding;
+ return iseq->iseq;
}
-#endif /* STRICT_ALIGNMENT */
+
+/*********************************************/
+/* definition of data structure for compiler */
+/*********************************************/
static void *
compile_data_alloc(rb_iseq_t *iseq, size_t size)
@@ -638,39 +630,25 @@ compile_data_alloc(rb_iseq_t *iseq, size_t size)
void *ptr = 0;
struct iseq_compile_data_storage *storage =
iseq->compile_data->storage_current;
-#ifdef STRICT_ALIGNMENT
- size_t padding = calc_padding((void *)&storage->buff[storage->pos], size);
-#else
- const size_t padding = 0; /* expected to be optimized by compiler */
-#endif /* STRICT_ALIGNMENT */
- if (storage->pos + size + padding > storage->size) {
- unsigned long alloc_size = storage->size * 2;
+ if (size >= INT_MAX) rb_memerror();
+ if (storage->pos + size > storage->size) {
+ unsigned int alloc_size = storage->size;
- retry:
- if (alloc_size < size + PADDING_SIZE_MAX) {
+ while (alloc_size < size) {
+ if (alloc_size >= INT_MAX / 2) rb_memerror();
alloc_size *= 2;
- goto retry;
}
storage->next = (void *)ALLOC_N(char, alloc_size +
- sizeof(struct
- iseq_compile_data_storage));
+ SIZEOF_ISEQ_COMPILE_DATA_STORAGE);
storage = iseq->compile_data->storage_current = storage->next;
storage->next = 0;
storage->pos = 0;
storage->size = alloc_size;
- storage->buff = (char *)(&storage->buff + 1);
-#ifdef STRICT_ALIGNMENT
- padding = calc_padding((void *)&storage->buff[storage->pos], size);
-#endif /* STRICT_ALIGNMENT */
}
-#ifdef STRICT_ALIGNMENT
- storage->pos += (int)padding;
-#endif /* STRICT_ALIGNMENT */
-
ptr = (void *)&storage->buff[storage->pos];
- storage->pos += size;
+ storage->pos += (int)size;
return ptr;
}
@@ -986,7 +964,7 @@ new_insn_core(rb_iseq_t *iseq, int line_no,
}
static INSN *
-new_insn_body(rb_iseq_t *iseq, int line_no, int insn_id, int argc, ...)
+new_insn_body(rb_iseq_t *iseq, int line_no, enum ruby_vminsn_type insn_id, int argc, ...)
{
VALUE *operands = 0;
va_list argv;
@@ -1004,7 +982,7 @@ new_insn_body(rb_iseq_t *iseq, int line_no, int insn_id, int argc, ...)
}
static rb_call_info_t *
-new_callinfo(rb_iseq_t *iseq, ID mid, int argc, VALUE block, unsigned long flag)
+new_callinfo(rb_iseq_t *iseq, ID mid, int argc, VALUE block, unsigned int flag)
{
rb_call_info_t *ci = (rb_call_info_t *)compile_data_alloc(iseq, sizeof(rb_call_info_t));
ci->mid = mid;
@@ -1033,10 +1011,10 @@ new_callinfo(rb_iseq_t *iseq, ID mid, int argc, VALUE block, unsigned long flag)
}
static INSN *
-new_insn_send(rb_iseq_t *iseq, int line_no, VALUE id, VALUE argc, VALUE block, VALUE flag)
+new_insn_send(rb_iseq_t *iseq, int line_no, ID id, VALUE argc, VALUE block, VALUE flag)
{
VALUE *operands = (VALUE *)compile_data_alloc(iseq, sizeof(VALUE) * 1);
- operands[0] = (VALUE)new_callinfo(iseq, SYM2ID(id), FIX2INT(argc), block, FIX2INT(flag));
+ operands[0] = (VALUE)new_callinfo(iseq, id, FIX2INT(argc), block, FIX2INT(flag));
return new_insn_core(iseq, line_no, BIN(send), 1, operands);
}
@@ -1497,8 +1475,7 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
/* make instruction sequence */
generated_iseq = ALLOC_N(VALUE, pos);
line_info_table = ALLOC_N(struct iseq_line_info_entry, k);
- iseq->is_entries = ALLOC_N(union iseq_inline_storage_entry, iseq->is_size);
- MEMZERO(iseq->is_entries, union iseq_inline_storage_entry, iseq->is_size);
+ iseq->is_entries = ZALLOC_N(union iseq_inline_storage_entry, iseq->is_size);
iseq->callinfo_entries = ALLOC_N(rb_call_info_t, iseq->callinfo_size);
/* MEMZERO(iseq->callinfo_entries, rb_call_info_t, iseq->callinfo_size); */
@@ -1704,11 +1681,11 @@ iseq_set_sequence(rb_iseq_t *iseq, LINK_ANCHOR *anchor)
}
#endif
- iseq->iseq = (void *)generated_iseq;
+ iseq->iseq_encoded = (void *)generated_iseq;
iseq->iseq_size = pos;
iseq->stack_max = stack_max;
- line_info_table = ruby_xrealloc(line_info_table, k * sizeof(struct iseq_line_info_entry));
+ REALLOC_N(line_info_table, struct iseq_line_info_entry, k);
iseq->line_info_table = line_info_table;
iseq->line_info_size = k;
@@ -1737,12 +1714,15 @@ iseq_set_exception_table(rb_iseq_t *iseq)
tlen = (int)RARRAY_LEN(iseq->compile_data->catch_table_ary);
tptr = RARRAY_CONST_PTR(iseq->compile_data->catch_table_ary);
- iseq->catch_table = tlen ? ALLOC_N(struct iseq_catch_table_entry, tlen) : 0;
- iseq->catch_table_size = tlen;
+ iseq->catch_table = 0;
+ if (tlen > 0) {
+ iseq->catch_table = xmalloc(iseq_catch_table_bytes(tlen));
+ iseq->catch_table->size = tlen;
+ }
- for (i = 0; i < tlen; i++) {
+ if (iseq->catch_table) for (i = 0; i < iseq->catch_table->size; i++) {
ptr = RARRAY_CONST_PTR(tptr[i]);
- entry = &iseq->catch_table[i];
+ entry = &iseq->catch_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));
@@ -2490,7 +2470,7 @@ compile_array_(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE* node_root,
else { /* COMPILE_ARRAY_TYPE_HASH */
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_INSN1(ret, line, putobject, ary);
- ADD_SEND(ret, line, ID2SYM(id_core_hash_from_ary), INT2FIX(1));
+ ADD_SEND(ret, line, id_core_hash_from_ary, INT2FIX(1));
}
}
else {
@@ -2501,7 +2481,7 @@ compile_array_(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE* node_root,
else {
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_INSN1(ret, line, putobject, ary);
- ADD_SEND(ret, line, ID2SYM(id_core_hash_merge_ary), INT2FIX(1));
+ ADD_SEND(ret, line, id_core_hash_merge_ary, INT2FIX(1));
}
}
}
@@ -2531,7 +2511,7 @@ compile_array_(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE* node_root,
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_INSN(ret, line, swap);
APPEND_LIST(ret, anchor);
- ADD_SEND(ret, line, ID2SYM(id_core_hash_merge_ptr), INT2FIX(i + 1));
+ ADD_SEND(ret, line, id_core_hash_merge_ptr, INT2FIX(i + 1));
}
}
if (kw) {
@@ -2539,8 +2519,8 @@ compile_array_(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE* node_root,
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
if (i > 0 || !first) ADD_INSN(ret, line, swap);
COMPILE(ret, "keyword splat", kw);
- ADD_SEND(ret, line, ID2SYM(id_core_hash_merge_kwd), nhash);
- if (nhash == INT2FIX(1)) ADD_SEND(ret, line, ID2SYM(rb_intern("dup")), INT2FIX(0));
+ 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;
@@ -2847,6 +2827,8 @@ compile_cpath(LINK_ANCHOR *ret, rb_iseq_t *iseq, NODE *cpath)
}
}
+#define private_recv_p(node) (nd_type((node)->nd_recv) == NODE_SELF)
+
#define defined_expr defined_expr0
static int
defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
@@ -2950,17 +2932,10 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
case NODE_VCALL:
case NODE_FCALL:
case NODE_ATTRASGN:{
- int self = TRUE;
+ const int explicit_receiver =
+ (type == NODE_CALL ||
+ (type == NODE_ATTRASGN && !private_recv_p(node)));
- switch (type) {
- case NODE_ATTRASGN:
- if (node->nd_recv == (NODE *)1) break;
- case NODE_CALL:
- self = FALSE;
- break;
- default:
- /* through */;
- }
if (!lfinish[1]) {
lfinish[1] = NEW_LABEL(nd_line(node));
}
@@ -2968,7 +2943,7 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
defined_expr(iseq, ret, node->nd_args, lfinish, Qfalse);
ADD_INSNL(ret, nd_line(node), branchunless, lfinish[1]);
}
- if (!self) {
+ if (explicit_receiver) {
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);
@@ -3057,8 +3032,6 @@ defined_expr(rb_iseq_t *iseq, LINK_ANCHOR *ret,
return done;
}
-#define BUFSIZE 0x100
-
static VALUE
make_name_for_block(rb_iseq_t *iseq)
{
@@ -3147,7 +3120,7 @@ add_ensure_iseq(LINK_ANCHOR *ret, rb_iseq_t *iseq, int is_return)
}
static VALUE
-setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, VALUE *flag)
+setup_args(rb_iseq_t *iseq, LINK_ANCHOR *args, NODE *argn, unsigned int *flag)
{
VALUE argc = INT2FIX(0);
int nsplat = 0;
@@ -3237,7 +3210,7 @@ build_postexe_iseq(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE *body)
VALUE argc = INT2FIX(0);
VALUE block = NEW_CHILD_ISEQVAL(body, make_name_for_block(iseq->parent_iseq), ISEQ_TYPE_BLOCK, line);
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
- ADD_CALL_WITH_BLOCK(ret, line, ID2SYM(id_core_set_postexe), argc, block);
+ ADD_CALL_WITH_BLOCK(ret, line, id_core_set_postexe, argc, block);
iseq_set_local_table(iseq, 0);
return Qnil;
}
@@ -3522,7 +3495,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
}
else {
ADD_CALL_RECEIVER(ret, line);
- ADD_CALL(ret, line, ID2SYM(idGets), INT2FIX(0));
+ ADD_CALL(ret, line, idGets, INT2FIX(0));
ADD_INSNL(ret, line, branchif, redo_label);
/* opt_n */
}
@@ -3571,7 +3544,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq),
ISEQ_TYPE_BLOCK, line);
- ADD_SEND_R(ret, line, ID2SYM(idEach), INT2FIX(0),
+ ADD_SEND_R(ret, line, idEach, INT2FIX(0),
iseq->compile_data->current_block, INT2FIX(0));
}
else {
@@ -4043,7 +4016,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_OP_ASGN1: {
DECL_ANCHOR(args);
VALUE argc;
- VALUE flag = 0;
+ unsigned int flag = 0;
+ unsigned int asgnflag = 0;
ID id = node->nd_mid;
int boff = 0;
@@ -4073,7 +4047,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
if (!poped) {
ADD_INSN(ret, line, putnil);
}
- COMPILE(ret, "NODE_OP_ASGN1 recv", node->nd_recv);
+ asgnflag = COMPILE_RECV(ret, "NODE_OP_ASGN1 recv", node);
switch (nd_type(node->nd_args->nd_head)) {
case NODE_ZARRAY:
argc = INT2FIX(0);
@@ -4086,7 +4060,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_SEQ(ret, args);
}
ADD_INSN1(ret, line, dupn, FIXNUM_INC(argc, 1 + boff));
- ADD_SEND_R(ret, line, ID2SYM(idAREF), argc, Qfalse, LONG2FIX(flag));
+ flag |= asgnflag;
+ ADD_SEND_R(ret, line, idAREF, argc, Qfalse, INT2FIX(flag));
if (id == 0 || id == 1) {
/* 0: or, 1: and
@@ -4129,14 +4104,14 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN(ret, line, pop);
ADD_INSN(ret, line, pop);
}
- ADD_SEND_R(ret, line, ID2SYM(idASET),
- argc, Qfalse, LONG2FIX(flag));
+ ADD_SEND_R(ret, line, idASET,
+ argc, Qfalse, INT2FIX(flag));
}
else {
if (boff > 0)
ADD_INSN(ret, line, swap);
- ADD_SEND_R(ret, line, ID2SYM(idASET),
- FIXNUM_INC(argc, 1), Qfalse, LONG2FIX(flag));
+ ADD_SEND_R(ret, line, idASET,
+ FIXNUM_INC(argc, 1), Qfalse, INT2FIX(flag));
}
ADD_INSN(ret, line, pop);
ADD_INSNL(ret, line, jump, lfin);
@@ -4149,7 +4124,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
}
else {
COMPILE(ret, "NODE_OP_ASGN1 args->body: ", node->nd_args->nd_body);
- ADD_SEND(ret, line, ID2SYM(id), INT2FIX(1));
+ ADD_SEND(ret, line, id, INT2FIX(1));
if (!poped) {
ADD_INSN1(ret, line, setn, FIXNUM_INC(argc, 2+boff));
}
@@ -4166,14 +4141,14 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN(ret, line, pop);
ADD_INSN(ret, line, pop);
}
- ADD_SEND_R(ret, line, ID2SYM(idASET),
- argc, Qfalse, LONG2FIX(flag));
+ ADD_SEND_R(ret, line, idASET,
+ argc, Qfalse, INT2FIX(flag));
}
else {
if (boff > 0)
ADD_INSN(ret, line, swap);
- ADD_SEND_R(ret, line, ID2SYM(idASET),
- FIXNUM_INC(argc, 1), Qfalse, LONG2FIX(flag));
+ ADD_SEND_R(ret, line, idASET,
+ FIXNUM_INC(argc, 1), Qfalse, INT2FIX(flag));
}
ADD_INSN(ret, line, pop);
}
@@ -4182,6 +4157,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
}
case NODE_OP_ASGN2:{
ID atype = node->nd_next->nd_mid;
+ VALUE asgnflag;
LABEL *lfin = NEW_LABEL(line);
LABEL *lcfin = NEW_LABEL(line);
/*
@@ -4226,10 +4202,10 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
*/
- COMPILE(ret, "NODE_OP_ASGN2#recv", node->nd_recv);
+ asgnflag = COMPILE_RECV(ret, "NODE_OP_ASGN2#recv", node);
ADD_INSN(ret, line, dup);
- ADD_SEND(ret, line, ID2SYM(node->nd_next->nd_vid),
- INT2FIX(0));
+ ADD_SEND_R(ret, line, node->nd_next->nd_vid,
+ INT2FIX(0), Qfalse, INT2FIX(asgnflag));
if (atype == 0 || atype == 1) { /* 0: OR or 1: AND */
ADD_INSN(ret, line, dup);
@@ -4243,8 +4219,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
COMPILE(ret, "NODE_OP_ASGN2 val", node->nd_value);
ADD_INSN(ret, line, swap);
ADD_INSN1(ret, line, topn, INT2FIX(1));
- ADD_SEND(ret, line, ID2SYM(node->nd_next->nd_aid),
- INT2FIX(1));
+ ADD_SEND_R(ret, line, node->nd_next->nd_aid,
+ INT2FIX(1), Qfalse, INT2FIX(asgnflag));
ADD_INSNL(ret, line, jump, lfin);
ADD_LABEL(ret, lcfin);
@@ -4259,14 +4235,14 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
}
else {
COMPILE(ret, "NODE_OP_ASGN2 val", node->nd_value);
- ADD_SEND(ret, line, ID2SYM(node->nd_next->nd_mid),
+ ADD_SEND(ret, line, node->nd_next->nd_mid,
INT2FIX(1));
if (!poped) {
ADD_INSN(ret, line, swap);
ADD_INSN1(ret, line, topn, INT2FIX(1));
}
- ADD_SEND(ret, line, ID2SYM(node->nd_next->nd_aid),
- INT2FIX(1));
+ ADD_SEND_R(ret, line, node->nd_next->nd_aid,
+ INT2FIX(1), Qfalse, INT2FIX(asgnflag));
ADD_INSN(ret, line, pop);
}
break;
@@ -4328,7 +4304,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
else {
COMPILE(ret, "NODE_OP_CDECL#nd_value", node->nd_value);
/* cref obj value */
- ADD_CALL(ret, line, ID2SYM(node->nd_aid), INT2FIX(1));
+ ADD_CALL(ret, line, node->nd_aid, INT2FIX(1));
/* cref value */
ADD_INSN(ret, line, swap); /* value cref */
if (!poped) {
@@ -4381,6 +4357,9 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
break;
}
case NODE_CALL:
+ /* 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_args == NULL)
{
@@ -4392,6 +4371,23 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
}
break;
}
+ /* optimization shortcut
+ * obj["literal"] -> opt_aref_with(obj, "literal")
+ */
+ if (node->nd_mid == idAREF && !private_recv_p(node) && node->nd_args &&
+ nd_type(node->nd_args) == NODE_ARRAY && node->nd_args->nd_alen == 1 &&
+ nd_type(node->nd_args->nd_head) == NODE_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_INSN2(ret, line, opt_aref_with,
+ new_callinfo(iseq, idAREF, 1, 0, 0), str);
+ if (poped) {
+ ADD_INSN(ret, line, pop);
+ }
+ break;
+ }
case NODE_FCALL:
case NODE_VCALL:{ /* VCALL: variable or call */
/*
@@ -4403,7 +4399,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
DECL_ANCHOR(args);
ID mid = node->nd_mid;
VALUE argc;
- VALUE flag = 0;
+ unsigned int flag = 0;
VALUE parent_block = iseq->compile_data->current_block;
iseq->compile_data->current_block = Qfalse;
@@ -4503,8 +4499,8 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
flag |= VM_CALL_FCALL;
}
- ADD_SEND_R(ret, line, ID2SYM(mid),
- argc, parent_block, LONG2FIX(flag));
+ ADD_SEND_R(ret, line, mid,
+ argc, parent_block, INT2FIX(flag));
if (poped) {
ADD_INSN(ret, line, pop);
@@ -4515,7 +4511,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_ZSUPER:{
DECL_ANCHOR(args);
int argc;
- VALUE flag = 0;
+ unsigned int flag = 0;
VALUE parent_block = iseq->compile_data->current_block;
INIT_ANCHOR(args);
@@ -4589,14 +4585,14 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
argc++;
ADD_INSN1(args, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_INSN2(args, line, getlocal, INT2FIX(idx), INT2FIX(lvar_level));
- ADD_SEND (args, line, ID2SYM(rb_intern("dup")), INT2FIX(0));
+ ADD_SEND (args, line, rb_intern("dup"), INT2FIX(0));
for (i = 0; i < liseq->arg_keywords; ++i) {
ID id = liseq->arg_keyword_table[i];
idx = local_size - get_local_var_idx(liseq, id);
ADD_INSN1(args, line, putobject, ID2SYM(id));
ADD_INSN2(args, line, getlocal, INT2FIX(idx), INT2FIX(lvar_level));
}
- ADD_SEND(args, line, ID2SYM(id_core_hash_merge_ptr), INT2FIX(i * 2 + 1));
+ ADD_SEND(args, line, id_core_hash_merge_ptr, INT2FIX(i * 2 + 1));
if (liseq->arg_rest != -1) {
ADD_INSN1(args, line, newarray, INT2FIX(1));
ADD_INSN (args, line, concatarray);
@@ -4704,7 +4700,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_YIELD:{
DECL_ANCHOR(args);
VALUE argc;
- VALUE flag = 0;
+ unsigned int flag = 0;
INIT_ANCHOR(args);
if (iseq->type == ISEQ_TYPE_TOP) {
@@ -4849,7 +4845,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
else {
ADD_SEQ(ret, recv);
ADD_SEQ(ret, val);
- ADD_SEND(ret, line, ID2SYM(idEqTilde), INT2FIX(1));
+ ADD_SEND(ret, line, idEqTilde, INT2FIX(1));
}
if (poped) {
@@ -4884,7 +4880,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
node->nd_lit = rb_fstring(node->nd_lit);
ADD_CALL_RECEIVER(ret, line);
ADD_INSN1(ret, line, putobject, node->nd_lit);
- ADD_CALL(ret, line, ID2SYM(idBackquote), INT2FIX(1));
+ ADD_CALL(ret, line, idBackquote, INT2FIX(1));
if (poped) {
ADD_INSN(ret, line, pop);
@@ -4894,7 +4890,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_DXSTR:{
ADD_CALL_RECEIVER(ret, line);
compile_dstr(iseq, ret, node);
- ADD_CALL(ret, line, ID2SYM(idBackquote), INT2FIX(1));
+ ADD_CALL(ret, line, idBackquote, INT2FIX(1));
if (poped) {
ADD_INSN(ret, line, pop);
@@ -4984,7 +4980,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CBASE));
ADD_INSN1(ret, line, putobject, ID2SYM(node->nd_mid));
ADD_INSN1(ret, line, putiseq, iseqval);
- ADD_SEND (ret, line, ID2SYM(id_core_define_method), INT2FIX(3));
+ ADD_SEND (ret, line, id_core_define_method, INT2FIX(3));
if (poped) {
ADD_INSN(ret, line, pop);
@@ -5004,7 +5000,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
COMPILE(ret, "defs: recv", node->nd_recv);
ADD_INSN1(ret, line, putobject, ID2SYM(node->nd_mid));
ADD_INSN1(ret, line, putiseq, iseqval);
- ADD_SEND (ret, line, ID2SYM(id_core_define_singleton_method), INT2FIX(3));
+ ADD_SEND (ret, line, id_core_define_singleton_method, INT2FIX(3));
if (poped) {
ADD_INSN(ret, line, pop);
@@ -5016,7 +5012,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CBASE));
COMPILE(ret, "alias arg1", node->u1.node);
COMPILE(ret, "alias arg2", node->u2.node);
- ADD_SEND(ret, line, ID2SYM(id_core_set_method_alias), INT2FIX(3));
+ ADD_SEND(ret, line, id_core_set_method_alias, INT2FIX(3));
if (poped) {
ADD_INSN(ret, line, pop);
@@ -5027,7 +5023,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_INSN1(ret, line, putobject, ID2SYM(node->u1.id));
ADD_INSN1(ret, line, putobject, ID2SYM(node->u2.id));
- ADD_SEND(ret, line, ID2SYM(id_core_set_variable_alias), INT2FIX(2));
+ ADD_SEND(ret, line, id_core_set_variable_alias, INT2FIX(2));
if (poped) {
ADD_INSN(ret, line, pop);
@@ -5038,7 +5034,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_CBASE));
COMPILE(ret, "undef arg", node->u2.node);
- ADD_SEND(ret, line, ID2SYM(id_core_undef_method), INT2FIX(2));
+ ADD_SEND(ret, line, id_core_undef_method, INT2FIX(2));
if (poped) {
ADD_INSN(ret, line, pop);
@@ -5135,7 +5131,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
/* function call */
ADD_CALL_RECEIVER(ret, line);
COMPILE(ret, "colon2#nd_head", node->nd_head);
- ADD_CALL(ret, line, ID2SYM(node->nd_mid),
+ ADD_CALL(ret, line, node->nd_mid,
INT2FIX(1));
}
if (poped) {
@@ -5317,11 +5313,11 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN(ret, line, dup);
ADD_INSN1(ret, line, putobject, ID2SYM(id));
- ADD_SEND(ret, line, ID2SYM(rb_intern("key?")), INT2FIX(1));
+ ADD_SEND(ret, line, rb_intern("key?"), INT2FIX(1));
ADD_INSNL(ret, line, branchunless, default_label);
ADD_INSN(ret, line, dup);
ADD_INSN1(ret, line, putobject, ID2SYM(id));
- ADD_SEND(ret, line, ID2SYM(rb_intern("delete")), INT2FIX(1));
+ ADD_SEND(ret, line, rb_intern("delete"), INT2FIX(1));
switch (nd_type(node->nd_body)) {
case NODE_LASGN:
idx = iseq->local_iseq->local_size - get_local_var_idx(iseq, id);
@@ -5349,7 +5345,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_DSYM:{
compile_dstr(iseq, ret, node);
if (!poped) {
- ADD_SEND(ret, line, ID2SYM(idIntern), INT2FIX(0));
+ ADD_SEND(ret, line, idIntern, INT2FIX(0));
}
else {
ADD_INSN(ret, line, pop);
@@ -5359,20 +5355,37 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
case NODE_ATTRASGN:{
DECL_ANCHOR(recv);
DECL_ANCHOR(args);
- VALUE flag = 0;
+ unsigned int flag = 0;
VALUE argc;
+ int asgnflag;
+
+ /* optimization shortcut
+ * obj["literal"] = value -> opt_aset_with(obj, "literal", value)
+ */
+ if (node->nd_mid == idASET && !private_recv_p(node) && node->nd_args &&
+ nd_type(node->nd_args) == NODE_ARRAY && node->nd_args->nd_alen == 2 &&
+ nd_type(node->nd_args->nd_head) == NODE_STR)
+ {
+ 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_INSN2(ret, line, opt_aset_with,
+ new_callinfo(iseq, idASET, 2, 0, 0), str);
+ ADD_INSN(ret, line, pop);
+ break;
+ }
INIT_ANCHOR(recv);
INIT_ANCHOR(args);
argc = setup_args(iseq, args, node->nd_args, &flag);
- if (node->nd_recv == (NODE *) 1) {
- flag |= VM_CALL_FCALL;
- ADD_INSN(recv, line, putself);
- }
- else {
- COMPILE(recv, "recv", node->nd_recv);
- }
+ flag |= (asgnflag = COMPILE_RECV(recv, "recv", node));
debugp_param("argc", argc);
debugp_param("nd_mid", ID2SYM(node->nd_mid));
@@ -5386,7 +5399,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_INSN1(ret, line, topn, INT2FIX(1));
if (flag & VM_CALL_ARGS_SPLAT) {
ADD_INSN1(ret, line, putobject, INT2FIX(-1));
- ADD_SEND(ret, line, ID2SYM(idAREF), INT2FIX(1));
+ ADD_SEND_R(ret, line, idAREF, INT2FIX(1), Qfalse, INT2FIX(asgnflag));
}
ADD_INSN1(ret, line, setn, FIXNUM_INC(argc, 3));
ADD_INSN (ret, line, pop);
@@ -5394,7 +5407,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
else if (flag & VM_CALL_ARGS_SPLAT) {
ADD_INSN(ret, line, dup);
ADD_INSN1(ret, line, putobject, INT2FIX(-1));
- ADD_SEND(ret, line, ID2SYM(idAREF), INT2FIX(1));
+ ADD_SEND_R(ret, line, idAREF, INT2FIX(1), Qfalse, INT2FIX(asgnflag));
ADD_INSN1(ret, line, setn, FIXNUM_INC(argc, 2));
ADD_INSN (ret, line, pop);
}
@@ -5406,7 +5419,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
ADD_SEQ(ret, recv);
ADD_SEQ(ret, args);
}
- ADD_SEND_R(ret, line, ID2SYM(node->nd_mid), argc, 0, LONG2FIX(flag));
+ ADD_SEND_R(ret, line, node->nd_mid, argc, 0, INT2FIX(flag));
ADD_INSN(ret, line, pop);
break;
@@ -5421,7 +5434,7 @@ iseq_compile_each(rb_iseq_t *iseq, LINK_ANCHOR *ret, NODE * node, int poped)
VALUE block = NEW_CHILD_ISEQVAL(node->nd_body, make_name_for_block(iseq), ISEQ_TYPE_BLOCK, line);
VALUE argc = INT2FIX(0);
ADD_INSN1(ret, line, putspecialobject, INT2FIX(VM_SPECIAL_OBJECT_VMCORE));
- ADD_CALL_WITH_BLOCK(ret, line, ID2SYM(idLambda), argc, block);
+ ADD_CALL_WITH_BLOCK(ret, line, idLambda, argc, block);
if (poped) {
ADD_INSN(ret, line, pop);
@@ -5822,7 +5835,7 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *anchor,
ID mid = 0;
int orig_argc = 0;
VALUE block = 0;
- unsigned long flag = 0;
+ unsigned int flag = 0;
if (!NIL_P(op)) {
VALUE vmid = rb_hash_aref(op, ID2SYM(rb_intern("mid")));
@@ -5831,7 +5844,7 @@ iseq_build_from_ary_body(rb_iseq_t *iseq, LINK_ANCHOR *anchor,
VALUE vblock = rb_hash_aref(op, ID2SYM(rb_intern("blockptr")));
if (!NIL_P(vmid)) mid = SYM2ID(vmid);
- if (!NIL_P(vflag)) flag = NUM2ULONG(vflag);
+ if (!NIL_P(vflag)) flag = NUM2UINT(vflag);
if (!NIL_P(vorig_argc)) orig_argc = FIX2INT(vorig_argc);
if (!NIL_P(vblock)) block = iseq_build_load_iseq(iseq, vblock);
}
diff --git a/complex.c b/complex.c
index 67b45dd6ae..b65bc8a61c 100644
--- a/complex.c
+++ b/complex.c
@@ -20,8 +20,8 @@ VALUE rb_cComplex;
static ID id_abs, id_arg, id_convert,
id_denominator, id_eqeq_p, id_expt, id_fdiv,
- id_inspect, id_negate, id_numerator, id_quo,
- id_real_p, id_to_f, id_to_i, id_to_r, id_to_s,
+ 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)
@@ -130,7 +130,6 @@ f_sub(VALUE x, VALUE y)
fun1(abs)
fun1(arg)
fun1(denominator)
-fun1(inspect)
fun1(negate)
fun1(numerator)
fun1(real_p)
@@ -151,7 +150,6 @@ f_to_f(VALUE x)
}
fun1(to_r)
-fun1(to_s)
inline static VALUE
f_eqeq_p(VALUE x, VALUE y)
@@ -1243,7 +1241,7 @@ f_format(VALUE self, VALUE (*func)(VALUE))
static VALUE
nucomp_to_s(VALUE self)
{
- return f_format(self, f_to_s);
+ return f_format(self, rb_String);
}
/*
@@ -1264,7 +1262,7 @@ nucomp_inspect(VALUE self)
VALUE s;
s = rb_usascii_str_new2("(");
- rb_str_concat(s, f_format(self, f_inspect));
+ rb_str_concat(s, f_format(self, rb_inspect));
rb_str_cat2(s, ")");
return s;
@@ -1344,6 +1342,20 @@ rb_Complex(VALUE x, VALUE y)
return nucomp_s_convert(2, a, rb_cComplex);
}
+VALUE
+rb_complex_set_real(VALUE cmp, VALUE r)
+{
+ RCOMPLEX_SET_REAL(cmp, r);
+ return cmp;
+}
+
+VALUE
+rb_complex_set_imag(VALUE cmp, VALUE i)
+{
+ RCOMPLEX_SET_REAL(cmp, i);
+ return cmp;
+}
+
/*
* call-seq:
* cmp.to_i -> integer
@@ -1361,9 +1373,8 @@ nucomp_to_i(VALUE self)
get_dat1(self);
if (k_inexact_p(dat->imag) || f_nonzero_p(dat->imag)) {
- VALUE s = f_to_s(self);
- rb_raise(rb_eRangeError, "can't convert %s into Integer",
- StringValuePtr(s));
+ rb_raise(rb_eRangeError, "can't convert %"PRIsVALUE" into Integer",
+ self);
}
return f_to_i(dat->real);
}
@@ -1385,9 +1396,8 @@ nucomp_to_f(VALUE self)
get_dat1(self);
if (k_inexact_p(dat->imag) || f_nonzero_p(dat->imag)) {
- VALUE s = f_to_s(self);
- rb_raise(rb_eRangeError, "can't convert %s into Float",
- StringValuePtr(s));
+ rb_raise(rb_eRangeError, "can't convert %"PRIsVALUE" into Float",
+ self);
}
return f_to_f(dat->real);
}
@@ -1411,9 +1421,8 @@ nucomp_to_r(VALUE self)
get_dat1(self);
if (k_inexact_p(dat->imag) || f_nonzero_p(dat->imag)) {
- VALUE s = f_to_s(self);
- rb_raise(rb_eRangeError, "can't convert %s into Rational",
- StringValuePtr(s));
+ rb_raise(rb_eRangeError, "can't convert %"PRIsVALUE" into Rational",
+ self);
}
return f_to_r(dat->real);
}
@@ -1439,9 +1448,8 @@ nucomp_rationalize(int argc, VALUE *argv, VALUE self)
rb_scan_args(argc, argv, "01", NULL);
if (k_inexact_p(dat->imag) || f_nonzero_p(dat->imag)) {
- VALUE s = f_to_s(self);
- rb_raise(rb_eRangeError, "can't convert %s into Rational",
- StringValuePtr(s));
+ rb_raise(rb_eRangeError, "can't convert %"PRIsVALUE" into Rational",
+ self);
}
return rb_funcall2(dat->real, rb_intern("rationalize"), argc, argv);
}
@@ -1777,9 +1785,8 @@ string_to_c_strict(VALUE self)
s = (char *)"";
if (!parse_comp(s, 1, &num)) {
- VALUE ins = f_inspect(self);
- rb_raise(rb_eArgError, "invalid value for convert(): %s",
- StringValuePtr(ins));
+ rb_raise(rb_eArgError, "invalid value for convert(): %+"PRIsVALUE,
+ self);
}
return num;
@@ -2062,7 +2069,6 @@ Init_Complex(void)
id_eqeq_p = rb_intern("==");
id_expt = rb_intern("**");
id_fdiv = rb_intern("fdiv");
- id_inspect = rb_intern("inspect");
id_negate = rb_intern("-@");
id_numerator = rb_intern("numerator");
id_quo = rb_intern("quo");
@@ -2070,7 +2076,6 @@ Init_Complex(void)
id_to_f = rb_intern("to_f");
id_to_i = rb_intern("to_i");
id_to_r = rb_intern("to_r");
- id_to_s = rb_intern("to_s");
id_i_real = rb_intern("@real");
id_i_imag = rb_intern("@image"); /* @image, not @imag */
@@ -2162,7 +2167,7 @@ Init_Complex(void)
rb_define_method(rb_cComplex, "inspect", nucomp_inspect, 0);
rb_define_private_method(rb_cComplex, "marshal_dump", nucomp_marshal_dump, 0);
- 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);
@@ -2204,6 +2209,8 @@ Init_Complex(void)
*/
rb_define_const(rb_cComplex, "I",
f_complex_new_bang2(rb_cComplex, ZERO, ONE));
+
+ rb_provide("complex.so"); /* for backward compatibility */
}
/*
diff --git a/configure.in b/configure.in
index 73f96b682b..d2373ed2b6 100644
--- a/configure.in
+++ b/configure.in
@@ -197,8 +197,6 @@ 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_RELEASE_DATE=`sed -n 's/^#define RUBY_RELEASE_DATE "\(.*\)"/\1/p' $srcdir/version.h`
-AC_SUBST(RUBY_RELEASE_DATE)
RUBY_PATCHLEVEL=`sed -n 's/^#define RUBY_PATCHLEVEL //p' $srcdir/version.h`
AC_DEFINE(CANONICALIZATION_FOR_MATHN)
dnl checks for alternative programs
@@ -231,6 +229,9 @@ 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)
@@ -242,14 +243,21 @@ 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.
-AS_CASE($target_os,
- [darwin*], [os_version_style=major+0],
- [os_version_style=full])
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=$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], [],
@@ -423,7 +431,7 @@ fi
RUBY_NACL
AS_CASE(["$host_os:$build_os"],
[darwin*:darwin*], [
- AC_CHECK_TOOLS(CC, [clang gcc cc])
+ AC_CHECK_TOOLS(CC, [gcc-4.2 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)
@@ -453,9 +461,7 @@ 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=
@@ -686,16 +692,25 @@ RUBY_WERROR_FLAG([
]
)
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_DEFUN([RUBY_TRY_CFLAGS], [
AC_MSG_CHECKING([whether ]$1[ is accepted as CFLAGS])
RUBY_WERROR_FLAG([
CFLAGS="[$]CFLAGS $1"
@@ -707,7 +722,7 @@ AC_DEFUN(RUBY_TRY_CFLAGS, [
])
])
-AC_DEFUN(RUBY_TRY_LDFLAGS, [
+AC_DEFUN([RUBY_TRY_LDFLAGS], [
save_LDFLAGS="$LDFLAGS"
LDFLAGS="[$]LDFLAGS $1"
AC_MSG_CHECKING([whether $1 is accepted as LDFLAGS])
@@ -747,6 +762,8 @@ if test "$GCC:${warnflags+set}:no" = yes::no; then
-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
@@ -937,7 +954,8 @@ AS_CASE(["$target_os"],
[macosx_10_5=yes], [macosx_10_5=no])
AC_MSG_RESULT($macosx_10_5)
if test $macosx_10_5 = yes; then
- ac_cv_header_ucontext_h=no
+ ac_cv_func_getcontext=no
+ ac_cv_func_setcontext=no
else
AC_DEFINE(BROKEN_SETREUID, 1)
AC_DEFINE(BROKEN_SETREGID, 1)
@@ -945,9 +963,7 @@ AS_CASE(["$target_os"],
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()
- 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_cv_func_vfork=no
AC_CACHE_CHECK(for broken crypt with 8bit chars, rb_cv_broken_crypt,
[AC_TRY_RUN([
#include <stdio.h>
@@ -1041,7 +1057,7 @@ main()
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 <windows.h>
@%:@include <iphlpapi.h>])
if test x"$ac_cv_type_NET_LUID" = xyes; then
AC_DEFINE(HAVE_TYPE_NET_LUID, 1)
@@ -1061,6 +1077,8 @@ main()
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
@@ -1096,10 +1114,10 @@ AC_CHECK_HEADERS( \
sys/syscall.h \
fcntl.h \
sys/fcntl.h \
+ sys/param.h \
sys/select.h \
sys/time.h \
sys/times.h \
- sys/param.h \
syscall.h \
pwd.h \
grp.h \
@@ -1121,11 +1139,13 @@ AC_CHECK_HEADERS( \
sys/socket.h \
process.h \
sys/prctl.h \
+ sys/uio.h \
atomic.h \
malloc.h \
malloc_np.h \
malloc/malloc.h \
- setjmpex.h
+ setjmpex.h \
+ sys/id.h
)
AC_ARG_WITH([gmp],
@@ -1140,6 +1160,39 @@ AS_IF([test "x$with_gmp" != xno],
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=yes], [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
+ LIBS="-ljemalloc $LIBS"
+ ])
+ 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
@@ -1157,7 +1210,7 @@ AS_CASE(["$target_os"],
[
# AIX currently does not support a 32-bit call to posix_fadvise()
# if _LARGE_FILES is defined.
- ac_cv_func_posix_fadvise=no
+ ac_cv_posix_fadvise=no
])
])
@@ -1166,6 +1219,7 @@ 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)])
@@ -1272,6 +1326,24 @@ 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]
@@ -1476,11 +1548,16 @@ m4_ifval([$3], dnl
[AS_VAR_PUSHDEF([rbcv],[$3])], dnl
[AS_VAR_PUSHDEF([rbcv],[rb_cv_func_][$1])]dnl
)dnl
+m4_pushdef([attrib_code],[m4_bpatsubst([$1],["],[\\"])])
m4_ifval([$4], [rbcv_cond=["$4"]; test "$rbcv_cond" || unset rbcv_cond])
-AC_CACHE_CHECK(for [$1] function attribute, rbcv,
+AC_CACHE_CHECK(for m4_ifval([$2],[$2],[$1]) function attribute, rbcv,
[rbcv=x
RUBY_WERROR_FLAG([
-for mac in "__attribute__ (($1)) x" "x __attribute__ (($1))" "__declspec($1) x" x; do
+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})
@@ -1495,7 +1572,7 @@ done
if test "$rbcv" != x; then
RUBY_DEFINE_IF(m4_ifval([$4],[${rbcv_cond}]), attrib[(x)], $rbcv)
fi
-m4_ifval([$4], [unset rbcv_cond])dnl
+m4_ifval([$4], [unset rbcv_cond]) dnl
AS_VAR_POPDEF([attrib])dnl
AS_VAR_POPDEF([rbcv])dnl
])
@@ -1508,6 +1585,7 @@ 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("-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],
@@ -1643,6 +1721,7 @@ 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>
@@ -1842,10 +1921,28 @@ AS_CASE(["$target_os"],[freebsd*],[
AC_DEFINE(BROKEN_CLOSE)
AC_REPLACE_FUNCS(close)
])
-AC_REPLACE_FUNCS(dup2 memmove strerror\
- strchr strstr crypt flock\
- isnan finite isinf hypot acosh erf tgamma lgamma_r cbrt \
- strlcpy strlcat ffs setproctitle)
+
+AC_REPLACE_FUNCS(acosh)
+AC_REPLACE_FUNCS(cbrt)
+AC_REPLACE_FUNCS(crypt)
+AC_REPLACE_FUNCS(dup2)
+AC_REPLACE_FUNCS(erf)
+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"],
@@ -1867,17 +1964,22 @@ else
AC_LIBOBJ([signbit])
fi
+AC_FUNC_FORK
+
AC_CHECK_FUNCS(__syscall)
AC_CHECK_FUNCS(_longjmp) # used for AC_ARG_WITH(setjmp-type)
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)
@@ -1887,20 +1989,23 @@ AC_CHECK_FUNCS(fchown)
AC_CHECK_FUNCS(fcntl)
AC_CHECK_FUNCS(fdatasync)
AC_CHECK_FUNCS(fmod)
-AC_CHECK_FUNCS(fork)
AC_CHECK_FUNCS(fsync)
AC_CHECK_FUNCS(ftruncate)
AC_CHECK_FUNCS(ftruncate64) # used for Win32 platform
AC_CHECK_FUNCS(getcwd)
+AC_CHECK_FUNCS(getgidx)
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)
@@ -1918,7 +2023,9 @@ AC_CHECK_FUNCS(malloc_usable_size)
AC_CHECK_FUNCS(malloc_size)
AC_CHECK_FUNCS(mblen)
AC_CHECK_FUNCS(memalign)
+AC_CHECK_FUNCS(writev)
AC_CHECK_FUNCS(memrchr)
+AC_CHECK_FUNCS(memmem)
AC_CHECK_FUNCS(mktime)
AC_CHECK_FUNCS(pipe2)
AC_CHECK_FUNCS(poll)
@@ -1926,6 +2033,7 @@ 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(seekdir)
@@ -1968,6 +2076,37 @@ AC_CHECK_FUNCS(utimes)
AC_CHECK_FUNCS(wait4)
AC_CHECK_FUNCS(waitpid)
+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(
@@ -1986,6 +2125,61 @@ RUBY_CHECK_BUILTIN_FUNC(__builtin_clzll, [__builtin_clzll(0)])
RUBY_CHECK_BUILTIN_FUNC(__builtin_choose_expr, [__builtin_choose_expr(0, 0, 0)])
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)
+ ])
+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.
@@ -2015,7 +2209,7 @@ AC_CACHE_CHECK(for sigsetjmp as a macro or function, ac_cv_func_sigsetjmp,
ac_cv_func_sigsetjmp=yes,
ac_cv_func_sigsetjmp=no)])
-AC_DEFUN(RUBY_CHECK_BUILTIN_SETJMP, [
+AC_DEFUN([RUBY_CHECK_BUILTIN_SETJMP], [
if test x"${ac_cv_func___builtin_setjmp}" = xyes; then
unset ac_cv_func___builtin_setjmp
fi
@@ -2042,7 +2236,7 @@ AC_CACHE_CHECK(for __builtin_setjmp, ac_cv_func___builtin_setjmp,
# we don't use _setjmp if _longjmp doesn't exist.
test x$ac_cv_func__longjmp = xno && ac_cv_func__setjmp=no
-AC_DEFUN(RUBY_SETJMP_TYPE, [
+AC_DEFUN([RUBY_SETJMP_TYPE], [
RUBY_CHECK_BUILTIN_SETJMP
AC_MSG_CHECKING(for setjmp type)
setjmp_suffix=
@@ -2062,7 +2256,7 @@ 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
+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=
@@ -2311,64 +2505,6 @@ else
AC_DEFINE(RSHIFT(x,y), (((x)<0) ? ~((~(x))>>(int)(y)) : (x)>>(int)(y)))
fi
-# win32.c still use this. Don't remove it.
-test "$rb_cv_fcnt" = "not found" && rb_cv_fcnt="not found (OK if using GNU libc)"
-AC_CACHE_CHECK([read count field in FILE structures], rb_cv_fcnt,
-[rb_cv_fcnt="not found (OK if using GNU libc)"
-for fcnt in dnl
- _cnt dnl
- __cnt dnl
- _r dnl
- readCount dnl
- _rcount dnl for emx0.9c
-; do
- AC_TRY_COMPILE([#include <stdio.h>
-],
- [FILE *f = stdin; f->$fcnt = 0;],
- [rb_cv_fcnt="$fcnt"; break])
-done])
-AS_CASE("$rb_cv_fcnt",
- ["not found"*], [rb_cv_fcnt="not found"],
- [AC_DEFINE_UNQUOTED(FILE_COUNT, $rb_cv_fcnt)])
-
-# win32.c still use this. Don't remove it.
-AC_CACHE_CHECK([read buffer ptr field in FILE structures], rb_cv_frptr,
-[for frptr in dnl
- _IO_read_ptr dnl
- _ptr dnl
- __ptr dnl
- bufpos dnl
- _p dnl
- __bufpos dnl
-; do
- AC_TRY_COMPILE([#include <stdio.h>
-],
- [FILE *f = stdin; char buf[256]; f->$frptr = buf;],
- rb_cv_frptr="$frptr"; break,
- rb_cv_frptr="not found")
-done])
-if test "$rb_cv_frptr" != "not found"; then
- AC_DEFINE_UNQUOTED(FILE_READPTR, $rb_cv_frptr)
-
- if test "$rb_cv_fcnt" = "not found"; then
- AC_CACHE_CHECK([read buffer end field in FILE structures], rb_cv_frend,
- [for frend in dnl
- _IO_read_end dnl
- bufread dnl
- __bufread dnl
- ; do
- AC_TRY_COMPILE([#include <stdio.h>
- ],
- [FILE *f = stdin; char buf[256]; f->$frend = buf;],
- rb_cv_frend="$frend"; break,
- rb_cv_frend="not found")
- done])
- if test "$rb_cv_frend" != "not found"; then
- AC_DEFINE_UNQUOTED(FILE_READEND, $rb_cv_frend)
- fi
- fi
-fi
-
if test x"$ac_cv_func_gettimeofday" != xyes; then
AC_MSG_ERROR(gettimeofday() must exist)
fi
@@ -2391,7 +2527,7 @@ if test "$ac_cv_func_sysconf" = yes; then
RUBY_CHECK_SYSCONF(CLK_TCK)
fi
-AC_DEFUN(RUBY_STACK_GROW_DIRECTION, [
+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"],
@@ -2472,6 +2608,20 @@ if test x"$enable_pthread" = xyes; then
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_getattr_np pthread_attr_get_np pthread_attr_getstack\
pthread_get_stackaddr_np pthread_get_stacksize_np \
@@ -2520,7 +2670,7 @@ if test x"$ac_cv_header_ucontext_h" = xyes; then
fi
fi
-if test "$ac_cv_func_fork" = "yes" -a "$rb_with_pthread" = "yes"; then
+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>
@@ -2604,8 +2754,8 @@ AC_ARG_WITH(dln-a-out,
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])],
+AS_CASE(["`head -1 conftest$EXEEXT | cat -e`"],
+['^?ELF'*], [rb_cv_binary_elf=yes], [rb_cv_binary_elf=no])],
rb_cv_binary_elf=no)])
if test "$rb_cv_binary_elf" = yes; then
@@ -2673,9 +2823,6 @@ if test "$with_dln_a_out" != yes; then
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"])
- if test "$enable_rpath" = yes; then
- RPATHFLAG=" ${linker_flag}-R%1\$-s"
- fi
AS_CASE(["$target_os"],
[hpux*], [ DLDFLAGS="$DLDFLAGS -E"
@@ -2738,10 +2885,6 @@ if test "$with_dln_a_out" != yes; then
fi
rb_cv_dlopen=yes],
[darwin*], [ : ${LDSHARED='$(CC) -dynamic -bundle'}
- RUBY_APPEND_OPTIONS(DLDFLAGS, [ \
- "${linker_flag}-undefined${linker_flag:+,}dynamic_lookup" \
- "${linker_flag}-multiply_defined${linker_flag:+,}suppress" \
- ])
: ${LDFLAGS=""}
: ${LIBPATHENV=DYLD_LIBRARY_PATH}
# /usr/local/include is always searched for
@@ -2807,6 +2950,38 @@ if test "$with_dln_a_out" != yes; then
[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}${flag// /,}"
+ 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}"],
@@ -2845,6 +3020,10 @@ if test "x$OPT_DIR" != x; then
LDFLAGS_OPTDIR="$val"
fi
+AS_CASE(["$target_os"],
+[freebsd*], [
+ AC_CHECK_LIB([procstat], [procstat_open_sysctl])
+ ])
AS_CASE(["$target_cpu-$target_os"],
[*-darwin*], [
AC_CHECK_HEADERS([execinfo.h])
@@ -2967,7 +3146,6 @@ else
DLEXT=so])
fi
if test "$rb_cv_dlopen:$load_relative" = yes:yes; then
- AC_CHECK_FUNCS(dladdr)
if test "$ac_cv_func_dladdr" = yes; then
LOAD_RELATIVE=1
fi
@@ -3008,12 +3186,13 @@ 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])])
-if test x"$EXTSTATIC" = xstatic; then
+ [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)
-fi
+ AC_SUBST(ENCSTATIC, static)
+])
AC_SUBST(ENCOBJS)
AC_SUBST(EXTOBJS)
@@ -3270,7 +3449,9 @@ AS_CASE("$enable_shared", [yes], [
LIBRUBYARG_SHARED=
# enable PIE if possible
- pie=
+ AC_ARG_ENABLE(pie,
+ AS_HELP_STRING([--disable-pie], [disable PIE feature]),
+ [pie=$enableval], [pie=])
AS_CASE(["$target_os"],
[haiku], [
# gcc supports PIE, but doesn't work correctly in Haiku
@@ -3303,8 +3484,13 @@ AS_CASE("$enable_shared", [yes], [
])
if test "$enable_rpath" = yes; then
test -z "$LIBRUBY_RPATHFLAGS" || LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS "
- LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS${linker_flag}-R ${linker_flag}${libprefix}"
- test "x$cross_compiling" = xyes || LIBRUBY_RPATHFLAGS="$LIBRUBY_RPATHFLAGS -L${libprefix}"
+ 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
@@ -3381,7 +3567,7 @@ AC_ARG_ENABLE(install-rdoc,
[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=yes])
+ [install_capi=$enableval], [install_capi=no])
if test "$install_doc" != no; then
if test "$install_rdoc" != no; then
@@ -3592,9 +3778,13 @@ if test "${universal_binary-no}" = yes ; then
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
-AC_CHECK_FUNC(memmem, [
+if test "$ac_cv_func_memmem" = yes; then
AC_CACHE_CHECK(for broken memmem, rb_cv_broken_memmem, [
AC_TRY_RUN([
#include <string.h>
@@ -3624,10 +3814,8 @@ main()
rb_cv_broken_memmem=yes,
rb_cv_broken_memmem=yes)
])
- if test "$rb_cv_broken_memmem" = no; then
- AC_DEFINE(HAVE_MEMMEM, 1)
- fi
-])
+ test x"$rb_cv_broken_memmem" = xyes && ac_cv_func_memmem=no
+fi
CPPFLAGS="$CPPFLAGS "'$(DEFS)'
@@ -3811,9 +3999,6 @@ AC_SUBST(configure_args, "`echo "${ac_configure_args}" | sed 's/\\$/$$/g'`")dnl
if test "${universal_binary-no}" = yes ; then
arch="universal-${target_os}"
- AC_CACHE_CHECK(whether __ARCHITECTURE__ is available, rb_cv_architecture_available,
- AC_TRY_COMPILE([const char arch[] = __ARCHITECTURE__;], [puts(arch);],
- [rb_cv_architecture_available=yes], [rb_cv_architecture_available=no]))
if test "${rb_cv_architecture_available}" = yes; then
AC_DEFINE_UNQUOTED(RUBY_PLATFORM_CPU, __ARCHITECTURE__)
else
@@ -3975,6 +4160,7 @@ AC_CONFIG_FILES(Makefile, [
["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
@@ -4006,6 +4192,11 @@ AC_ARG_WITH([ruby-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 &&
diff --git a/constant.h b/constant.h
index 3dc9b8d4ef..8c854bfffa 100644
--- a/constant.h
+++ b/constant.h
@@ -18,13 +18,13 @@ typedef enum {
typedef struct rb_const_entry_struct {
rb_const_flag_t flag;
+ int line;
const VALUE value; /* should be mark */
const VALUE file; /* should be mark */
- int line;
} rb_const_entry_t;
-VALUE rb_mod_private_constant(int argc, VALUE *argv, VALUE obj);
-VALUE rb_mod_public_constant(int argc, VALUE *argv, VALUE obj);
+VALUE rb_mod_private_constant(int argc, const VALUE *argv, VALUE obj);
+VALUE rb_mod_public_constant(int argc, const VALUE *argv, VALUE obj);
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);
@@ -32,5 +32,6 @@ VALUE rb_public_const_get_from(VALUE klass, ID id);
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);
#endif /* CONSTANT_H */
diff --git a/cont.c b/cont.c
index 3b05f995d4..2ff2cbb98c 100644
--- a/cont.c
+++ b/cont.c
@@ -89,8 +89,8 @@ enum context_type {
typedef struct rb_context_struct {
enum context_type type;
- VALUE self;
int argc;
+ VALUE self;
VALUE value;
VALUE *vm_stack;
#ifdef CAPTURE_JUST_VALID_VM_STACK
@@ -134,19 +134,25 @@ typedef struct rb_fiber_struct {
rb_context_t cont;
VALUE prev;
enum fiber_status status;
- struct rb_fiber_struct *prev_fiber;
- struct rb_fiber_struct *next_fiber;
/* If a fiber invokes "transfer",
* then this fiber can't "resume" any more after that.
* You shouldn't mix "transfer" and "resume".
*/
int transfered;
+ struct rb_fiber_struct *prev_fiber;
+ struct rb_fiber_struct *next_fiber;
#if FIBER_USE_NATIVE
#ifdef _WIN32
void *fib_handle;
#else
ucontext_t context;
+ /* Because context.uc_stack.ss_sp and context.uc_stack.ss_size
+ * are not necessarily valid after makecontext() or swapcontext(),
+ * they are saved in these variables for later use.
+ */
+ void *ss_sp;
+ size_t ss_size;
#endif
#endif
} rb_fiber_t;
@@ -185,7 +191,7 @@ cont_mark(void *ptr)
rb_gc_mark_locations(cont->vm_stack,
cont->vm_stack + cont->vm_stack_slen + cont->vm_stack_clen);
#else
- rb_gc_mark_localtion(cont->vm_stack,
+ rb_gc_mark_locations(cont->vm_stack,
cont->vm_stack, cont->saved_thread.stack_size);
#endif
}
@@ -243,11 +249,11 @@ cont_free(void *ptr)
#else /* not WIN32 */
if (GET_THREAD()->fiber != cont->self) {
rb_fiber_t *fib = (rb_fiber_t*)cont;
- if (fib->context.uc_stack.ss_sp) {
+ if (fib->ss_sp) {
if (cont->type == ROOT_FIBER_CONTEXT) {
rb_bug("Illegal root fiber parameter");
}
- munmap((void*)fib->context.uc_stack.ss_sp, fib->context.uc_stack.ss_size);
+ munmap((void*)fib->ss_sp, fib->ss_size);
}
}
else {
@@ -510,6 +516,7 @@ cont_capture(volatile int *stat)
if (ruby_setjmp(cont->jmpbuf)) {
volatile VALUE value;
+ VAR_INITIALIZED(cont);
value = cont->value;
if (cont->argc == -1) rb_exc_raise(value);
cont->value = Qnil;
@@ -667,6 +674,8 @@ fiber_initialize_machine_stack_context(rb_fiber_t *fib, size_t 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;
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;
@@ -929,7 +938,7 @@ rb_callcc(VALUE self)
}
static VALUE
-make_passing_arg(int argc, VALUE *argv)
+make_passing_arg(int argc, const VALUE *argv)
{
switch (argc) {
case 0:
@@ -1153,8 +1162,7 @@ fiber_t_alloc(VALUE fibval)
}
THREAD_MUST_BE_RUNNING(th);
- fib = ALLOC(rb_fiber_t);
- memset(fib, 0, sizeof(rb_fiber_t));
+ fib = ZALLOC(rb_fiber_t);
fib->cont.self = fibval;
fib->cont.type = FIBER_CONTEXT;
cont_init(&fib->cont, th);
@@ -1248,7 +1256,7 @@ return_fiber(void)
}
}
-VALUE rb_fiber_transfer(VALUE fib, int argc, VALUE *argv);
+VALUE rb_fiber_transfer(VALUE fib, int argc, const VALUE *argv);
static void
rb_fiber_terminate(rb_fiber_t *fib)
@@ -1257,8 +1265,9 @@ rb_fiber_terminate(rb_fiber_t *fib)
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->context.uc_stack.ss_sp;
- terminated_machine_stack.size = fib->context.uc_stack.ss_size / sizeof(VALUE);
+ 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;
@@ -1271,15 +1280,14 @@ rb_fiber_start(void)
{
rb_thread_t *th = GET_THREAD();
rb_fiber_t *fib;
- rb_context_t *cont;
rb_proc_t *proc;
int state;
GetFiberPtr(th->fiber, fib);
- cont = &fib->cont;
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(cont->saved_thread.first_proc, proc);
@@ -1396,7 +1404,7 @@ fiber_store(rb_fiber_t *next_fib)
}
static inline VALUE
-fiber_switch(VALUE fibval, int argc, VALUE *argv, int is_resume)
+fiber_switch(VALUE fibval, int argc, const VALUE *argv, int is_resume)
{
VALUE value;
rb_fiber_t *fib;
@@ -1471,13 +1479,13 @@ fiber_switch(VALUE fibval, int argc, VALUE *argv, int is_resume)
}
VALUE
-rb_fiber_transfer(VALUE fib, int argc, VALUE *argv)
+rb_fiber_transfer(VALUE fib, int argc, const VALUE *argv)
{
return fiber_switch(fib, argc, argv, 0);
}
VALUE
-rb_fiber_resume(VALUE fibval, int argc, VALUE *argv)
+rb_fiber_resume(VALUE fibval, int argc, const VALUE *argv)
{
rb_fiber_t *fib;
GetFiberPtr(fibval, fib);
@@ -1493,7 +1501,7 @@ rb_fiber_resume(VALUE fibval, int argc, VALUE *argv)
}
VALUE
-rb_fiber_yield(int argc, VALUE *argv)
+rb_fiber_yield(int argc, const VALUE *argv)
{
return rb_fiber_transfer(return_fiber(), argc, argv);
}
@@ -1587,7 +1595,7 @@ rb_fiber_m_resume(int argc, VALUE *argv, VALUE fib)
* fiber2.resume
* fiber3.resume
*
- * <em>produces</em>
+ * <em>produces</em>
*
* In fiber 2
* In fiber 1
diff --git a/coverage/README b/coverage/README
new file mode 100644
index 0000000000..7e4ff59e2a
--- /dev/null
+++ b/coverage/README
@@ -0,0 +1,17 @@
+Usage
+
+The make task `update-coverage' retrieves simplecov for coverage report.
+
+COVERAGE=1 make test-all TESTS=test/cgi
+
+it generate test coverage to coverage directory.
+
+Limitation
+
+ * test_coverage.rb and test_process.rb broke test suit with SimpleCov
+ * some tests failed randomly.
+
+TODO
+
+ * more reduce bundled simplecov(additional configuration, formatter, etc)
+ * measure rubyspec coverage
diff --git a/debug.c b/debug.c
index 2f1e03cc3a..15c1ea8b9e 100644
--- a/debug.c
+++ b/debug.c
@@ -33,8 +33,9 @@ const union {
RUBY_ENC_CODERANGE_7BIT = ENC_CODERANGE_7BIT,
RUBY_ENC_CODERANGE_VALID = ENC_CODERANGE_VALID,
RUBY_ENC_CODERANGE_BROKEN = ENC_CODERANGE_BROKEN,
- RUBY_FL_WB_PROTECTED = FL_WB_PROTECTED,
- RUBY_FL_PROMOTED = FL_PROMOTED,
+ RUBY_FL_PROMOTED0 = FL_PROMOTED0,
+ RUBY_FL_PROMOTED1 = FL_PROMOTED1,
+ RUBY_FL_PROMOTED = FL_PROMOTED0|FL_PROMOTED1,
RUBY_FL_FINALIZE = FL_FINALIZE,
RUBY_FL_TAINT = FL_TAINT,
RUBY_FL_EXIVAR = FL_EXIVAR,
diff --git a/defs/default_gems b/defs/default_gems
index e73e383b26..ce9010910a 100644
--- a/defs/default_gems
+++ b/defs/default_gems
@@ -1,5 +1,4 @@
# gem base directory versioning file [executable files under bin]
-rake lib/rake lib/rake/version.rb [rake]
+rake lib/rake lib/rake.rb [rake]
rdoc lib/rdoc lib/rdoc.rb [rdoc ri]
-minitest lib/minitest lib/minitest/unit.rb
json ext/json ext/json/lib/json/version.rb
diff --git a/defs/gmake.mk b/defs/gmake.mk
index 0acb88ef57..f5033b2245 100644
--- a/defs/gmake.mk
+++ b/defs/gmake.mk
@@ -1,19 +1,45 @@
# -*- makefile-gmake -*-
+gnumake = yes
+
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 += $(TEST_DEPENDS) $(if $(filter check%,$(MAKECMDGOALS)),main)
+TEST_DEPENDS += $(if $(filter all,$(INSTALLDOC)),docs)
+
+ifneq ($(filter -O0 -Od,$(optflags)),)
+override XCFLAGS := $(filter-out -D_FORTIFY_SOURCE=%,$(XCFLAGS))
+endif
+
+ifneq ($(filter universal-%,$(arch)),)
+define archcmd
+%.$(1).S: %.c
+ @$$(ECHO) translating $$< with $(2)
+ $$(Q) $$(CC) $$(CFLAGS_NO_ARCH) $(2) $$(XCFLAGS) $$(CPPFLAGS) $$(COUTFLAG)$$@ -S $$<
+
+%.S: %.$(1).S
+
+%.$(1).i: %.c
+ @$$(ECHO) preprocessing $$< with $(2)
+ $$(Q) $$(CPP) $$(warnflags) $(2) $$(XCFLAGS) $$(CPPFLAGS) $$(COUTFLAG)$$@ -E $$< > $$@
-ifneq ($(filter check% test,$(MAKECMDGOALS)),)
+%.i: %.$(1).i
+endef
+
+$(foreach arch,$(filter -arch=%,$(subst -arch ,-arch=,$(ARCH_FLAG))),\
+ $(eval $(call archcmd,$(patsubst -arch=%,%,$(value arch)),$(patsubst -arch=%,-arch %,$(value arch)))))
+endif
+
+ifneq ($(filter love check% 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%,$(MAKECMDGOALS)) $(filter test-all,$(TEST_TARGETS)),)
+ifneq ($(filter love check%,$(MAKECMDGOALS)) $(filter test-all,$(TEST_TARGETS)),)
yes-test-all yes-test-ruby: $(filter-out %test-all %test-ruby check%,$(TEST_TARGETS))
endif
-ifneq ($(filter check%,$(MAKECMDGOALS))$(if $(filter test-all,$(MAKECMDGOALS)),$(filter test-knownbug,$(MAKECMDGOALS))),)
+ifneq ($(filter love check%,$(MAKECMDGOALS))$(if $(filter test-all,$(MAKECMDGOALS)),$(filter test-knownbug,$(MAKECMDGOALS))),)
yes-test-all yes-test-ruby: yes-test-knownbug
endif
@@ -25,5 +51,13 @@ $(word 1,$(install-targets)): $(word 0,$(install-targets))
endif
ifneq ($(filter reinstall,$(MAKECMDGOALS)),)
-install: uninstall
+install-prereq: uninstall
+uninstall sudo-precheck: all $(if $(filter all,$(INSTALLDOC)),docs)
+endif
+
+ifneq ($(filter love,$(MAKECMDGOALS)),)
+showflags: up
+sudo-precheck: test
+install-prereq: sudo-precheck
+yes-test-all no-test-all: install
endif
diff --git a/defs/id.def b/defs/id.def
index 53ed3775ad..f7fffbde3c 100644
--- a/defs/id.def
+++ b/defs/id.def
@@ -26,6 +26,19 @@ firstline, predefined = __LINE__+1, %[\
initialize_copy
initialize_clone
initialize_dup
+ to_int
+ to_ary
+ to_str
+ to_sym
+ to_hash
+ to_proc
+ to_io
+ to_a
+ to_s
+ to_i
+ bt
+ bt_locations
+
_ UScore
"/*NULL*/" NULL
empty?
diff --git a/defs/opt_operand.def b/defs/opt_operand.def
index ab7103a421..887e3da49a 100644
--- a/defs/opt_operand.def
+++ b/defs/opt_operand.def
@@ -1,5 +1,5 @@
#
-# configration file for operand union optimization
+# configuration file for operand union optimization
#
# format:
# [insn name] op1, op2 ...
diff --git a/dir.c b/dir.c
index 3188a9eb38..09b78c6b4b 100644
--- a/dir.c
+++ b/dir.c
@@ -539,6 +539,37 @@ dir_inspect(VALUE dir)
return rb_funcall(dir, rb_intern("to_s"), 0, 0);
}
+#ifdef HAVE_DIRFD
+/*
+ * call-seq:
+ * dir.fileno -> integer
+ *
+ * Returns the file descriptor used in <em>dir</em>.
+ *
+ * d = Dir.new("..")
+ * d.fileno #=> 8
+ *
+ * This method uses dirfd() function defined by POSIX 2008.
+ * NotImplementedError is raised on other platforms, such as Windows,
+ * which doesn't provide the function.
+ *
+ */
+static VALUE
+dir_fileno(VALUE dir)
+{
+ struct dir_data *dirp;
+ int fd;
+
+ GetDIR(dir, dirp);
+ fd = dirfd(dirp->dir);
+ if (fd == -1)
+ rb_sys_fail("dirfd");
+ return INT2NUM(fd);
+}
+#else
+#define dir_fileno rb_f_notimplement
+#endif
+
/*
* call-seq:
* dir.path -> string or nil
@@ -906,6 +937,7 @@ rb_dir_getwd(void)
*
* Dir.chdir("/tmp") #=> 0
* Dir.getwd #=> "/tmp"
+ * Dir.pwd #=> "/tmp"
*/
static VALUE
dir_s_getwd(VALUE dir)
@@ -1085,12 +1117,15 @@ do_opendir(const char *path, int flags, rb_encoding *enc)
return dirp;
}
+/* Globing pattern */
+enum glob_pattern_type { PLAIN, ALPHA, MAGICAL, RECURSIVE, MATCH_ALL, MATCH_DIR };
+
/* Return nonzero if S has any special globbing chars in it. */
-static int
+static enum glob_pattern_type
has_magic(const char *p, const char *pend, int flags, rb_encoding *enc)
{
const int escape = !(flags & FNM_NOESCAPE);
- const int nocase = flags & FNM_CASEFOLD;
+ int hasalpha = 0;
register char c;
@@ -1099,22 +1134,23 @@ has_magic(const char *p, const char *pend, int flags, rb_encoding *enc)
case '*':
case '?':
case '[':
- return 1;
+ return MAGICAL;
case '\\':
if (escape && !(c = *p++))
- return 0;
+ return PLAIN;
continue;
default:
- if (!FNM_SYSCASE && ISALPHA(c) && nocase)
- return 1;
+ if (ISALPHA(c)) {
+ hasalpha = 1;
+ }
}
p = Next(p-1, pend, enc);
}
- return 0;
+ return hasalpha ? ALPHA : PLAIN;
}
/* Find separator in globbing pattern. */
@@ -1178,9 +1214,6 @@ remove_backslashes(char *p, register const char *pend, rb_encoding *enc)
return p;
}
-/* Globing pattern */
-enum glob_pattern_type { PLAIN, MAGICAL, RECURSIVE, MATCH_ALL, MATCH_DIR };
-
struct glob_pattern {
char *str;
enum glob_pattern_type type;
@@ -1199,7 +1232,7 @@ glob_make_pattern(const char *p, const char *e, int flags, rb_encoding *enc)
while (p < e && *p) {
tmp = GLOB_ALLOC(struct glob_pattern);
if (!tmp) goto error;
- if (p[0] == '*' && p[1] == '*' && p[2] == '/') {
+ if (p + 2 < e && p[0] == '*' && p[1] == '*' && p[2] == '/') {
/* fold continuous RECURSIVEs (needed in glob_helper) */
do { p += 3; while (*p == '/') p++; } while (p[0] == '*' && p[1] == '*' && p[2] == '/');
tmp->type = RECURSIVE;
@@ -1209,12 +1242,13 @@ glob_make_pattern(const char *p, const char *e, int flags, rb_encoding *enc)
}
else {
const char *m = find_dirsep(p, e, flags, enc);
- int magic = has_magic(p, m, flags, enc);
+ const enum glob_pattern_type magic = has_magic(p, m, flags, enc);
+ const enum glob_pattern_type non_magic = (HAVE_HFS || FNM_SYSCASE) ? PLAIN : ALPHA;
char *buf;
- if (!magic && !recursive && *m) {
+ if (!(FNM_SYSCASE || magic > non_magic) && !recursive && *m) {
const char *m2;
- while (!has_magic(m+1, m2 = find_dirsep(m+1, e, flags, enc), flags, enc) &&
+ while (has_magic(m+1, m2 = find_dirsep(m+1, e, flags, enc), flags, enc) <= non_magic &&
*m2) {
m = m2;
}
@@ -1226,7 +1260,7 @@ glob_make_pattern(const char *p, const char *e, int flags, rb_encoding *enc)
}
memcpy(buf, p, m-p);
buf[m-p] = '\0';
- tmp->type = magic ? MAGICAL : PLAIN;
+ tmp->type = magic > MAGICAL ? MAGICAL : magic > non_magic ? magic : PLAIN;
tmp->str = buf;
if (*m) {
dirsep = 1;
@@ -1304,17 +1338,17 @@ struct glob_args {
rb_encoding *enc;
};
+#define glob_call_func(func, path, arg, enc) (*(func))((path), (arg), (void *)(enc))
+
static VALUE
glob_func_caller(VALUE val)
{
struct glob_args *args = (struct glob_args *)val;
- (*args->func)(args->path, args->value, args->enc);
+ glob_call_func(args->func, args->path, args->value, args->enc);
return Qnil;
}
-#define glob_call_func(func, path, arg, enc) (*(func))((path), (arg), (enc))
-
static int
glob_helper(
const char *path,
@@ -1345,9 +1379,12 @@ glob_helper(
case PLAIN:
plain = 1;
break;
- case MAGICAL:
+ case ALPHA:
magical = 1;
break;
+ case MAGICAL:
+ magical = 2;
+ break;
case MATCH_ALL:
match_all = 1;
break;
@@ -1399,11 +1436,38 @@ glob_helper(
if (magical || recursive) {
struct dirent *dp;
DIR *dirp;
+# ifdef DOSISH
+ char *plainname = 0;
+# endif
IF_HAVE_HFS(int hfs_p);
+# ifdef DOSISH
+ 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(plainname, flags, enc);
+ GLOB_FREE(plainname);
+ }
+ else
+# endif
dirp = do_opendir(*path ? path : ".", flags, enc);
- if (dirp == NULL) return 0;
+ if (dirp == NULL) {
+# if FNM_SYSCASE || HAVE_HFS
+ if ((magical < 2) && !recursive && (errno == EACCES)) {
+ /* no read permission, fallback */
+ goto literally;
+ }
+# endif
+ return 0;
+ }
IF_HAVE_HFS(hfs_p = is_hfs(dirp));
+# if HAVE_HFS
+ if (!(hfs_p || magical || recursive)) {
+ closedir(dirp);
+ goto literally;
+ }
+ flags |= FNM_CASEFOLD;
+# endif
while ((dp = READDIR(dirp, enc)) != NULL) {
char *buf;
enum answer new_isdir = UNKNOWN;
@@ -1467,9 +1531,20 @@ glob_helper(
*new_end++ = p; /* append recursive pattern */
p = p->next; /* 0 times recursion */
}
- if (p->type == PLAIN || p->type == MAGICAL) {
+ switch (p->type) {
+ case ALPHA:
+# ifdef DOSISH
+ if (plainname) {
+ *new_end++ = p->next;
+ break;
+ }
+# endif
+ case PLAIN:
+ case MAGICAL:
if (fnmatch(p->str, enc, name, flags) == 0)
*new_end++ = p->next;
+ default:
+ break;
}
}
@@ -1485,10 +1560,13 @@ glob_helper(
else if (plain) {
struct glob_pattern **copy_beg, **copy_end, **cur2;
+# if FNM_SYSCASE || HAVE_HFS
+ literally:
+# endif
copy_beg = copy_end = GLOB_ALLOC_N(struct glob_pattern *, end - beg);
if (!copy_beg) return -1;
for (cur = beg; cur < end; ++cur)
- *copy_end++ = (*cur)->type == PLAIN ? *cur : 0;
+ *copy_end++ = (*cur)->type <= ALPHA ? *cur : 0;
for (cur = copy_beg; cur < copy_end; ++cur) {
if (*cur) {
@@ -1677,7 +1755,7 @@ ruby_brace_expand(const char *str, int flags, ruby_glob_func *func, VALUE arg,
GLOB_FREE(buf);
}
else if (!lbrace && !rbrace) {
- status = (*func)(s, arg, enc);
+ status = glob_call_func(func, s, arg, enc);
}
return status;
@@ -1726,9 +1804,16 @@ static int
push_glob(VALUE ary, VALUE str, int flags)
{
struct glob_args args;
+#ifdef __APPLE__
+ rb_encoding *enc = rb_utf8_encoding();
+
+ str = rb_str_encode_ospath(str);
+#else
rb_encoding *enc = rb_enc_get(str);
if (enc == rb_usascii_encoding()) enc = rb_filesystem_encoding();
+ if (enc == rb_usascii_encoding()) enc = rb_ascii8bit_encoding();
+#endif
args.func = push_pattern;
args.value = ary;
args.enc = enc;
@@ -1784,9 +1869,11 @@ dir_globs(long argc, const VALUE *argv, int flags)
/*
* call-seq:
+ * Dir[ array ] -> array
* Dir[ string [, string ...] ] -> array
*
* Equivalent to calling
+ * <code>Dir.glob(</code><i>array,</i><code>0)</code> and
* <code>Dir.glob([</code><i>string,...</i><code>],0)</code>.
*
*/
@@ -1890,8 +1977,9 @@ dir_s_glob(int argc, VALUE *argv, VALUE obj)
ary = rb_push_glob(str, flags);
}
else {
- volatile VALUE v = ary;
+ VALUE v = ary;
ary = dir_globs(RARRAY_LEN(v), RARRAY_CONST_PTR(v), flags);
+ RB_GC_GUARD(v);
}
if (rb_block_given_p()) {
@@ -2154,7 +2242,6 @@ dir_s_home(int argc, VALUE *argv, VALUE obj)
/*
* call-seq:
* Dir.exist?(file_name) -> true or false
- * Dir.exists?(file_name) -> true or false
*
* Returns <code>true</code> if the named file is a directory,
* <code>false</code> otherwise.
@@ -2166,6 +2253,12 @@ rb_file_directory_p()
}
#endif
+/*
+ * call-seq:
+ * Dir.exists?(file_name) -> true or false
+ *
+ * Deprecated method. Don't use.
+ */
static VALUE
rb_dir_exists_p(VALUE obj, VALUE fname)
{
@@ -2197,6 +2290,7 @@ Init_Dir(void)
rb_define_singleton_method(rb_cDir, "entries", dir_entries, -1);
rb_define_method(rb_cDir,"initialize", dir_initialize, -1);
+ rb_define_method(rb_cDir,"fileno", dir_fileno, 0);
rb_define_method(rb_cDir,"path", dir_path, 0);
rb_define_method(rb_cDir,"to_path", dir_path, 0);
rb_define_method(rb_cDir,"inspect", dir_inspect, 0);
@@ -2259,5 +2353,11 @@ Init_Dir(void)
* Allows file globbing through "{a,b}" in File.fnmatch patterns.
*/
rb_file_const("FNM_EXTGLOB", INT2FIX(FNM_EXTGLOB));
+
+ /* Document-const: File::Constants::FNM_SYSCASE
+ *
+ * System default case insensitiveness, equals to FNM_CASEFOLD or
+ * 0.
+ */
rb_file_const("FNM_SYSCASE", INT2FIX(FNM_SYSCASE));
}
diff --git a/dln.c b/dln.c
index 85ebe27cae..2b6a82f063 100644
--- a/dln.c
+++ b/dln.c
@@ -47,6 +47,7 @@ void *xcalloc();
void *xrealloc();
#endif
+#undef free
#define free(x) xfree(x)
#include <stdio.h>
@@ -1178,25 +1179,26 @@ dln_strerror(void)
static void
aix_loaderror(const char *pathname)
{
- char *message[1024], errbuf[1024];
- int i;
-#define ERRBUF_APPEND(s) strncat(errbuf, (s), sizeof(errbuf)-strlen(errbuf)-1)
- snprintf(errbuf, sizeof(errbuf), "load failed - %s. ", pathname);
-
- if (loadquery(L_GETMESSAGES, &message[0], sizeof(message)) != -1) {
- ERRBUF_APPEND("Please issue below command for detailed reasons:\n\t");
- ERRBUF_APPEND("/usr/sbin/execerror ruby ");
- for (i=0; message[i]; i++) {
- ERRBUF_APPEND("\"");
- ERRBUF_APPEND(message[i]);
- ERRBUF_APPEND("\" ");
+ char *message[1024], errbuf[1024];
+ int i;
+#define ERRBUF_APPEND(s) strlcat(errbuf, (s), sizeof(errbuf))
+ snprintf(errbuf, sizeof(errbuf), "load failed - %s. ", pathname);
+
+ if (loadquery(L_GETMESSAGES, &message[0], sizeof(message)) != -1) {
+ ERRBUF_APPEND("Please issue below command for detailed reasons:\n\t");
+ ERRBUF_APPEND("/usr/sbin/execerror ruby ");
+ for (i=0; message[i]; i++) {
+ ERRBUF_APPEND("\"");
+ ERRBUF_APPEND(message[i]);
+ ERRBUF_APPEND("\" ");
+ }
+ ERRBUF_APPEND("\n");
+ }
+ else {
+ ERRBUF_APPEND(strerror(errno));
+ ERRBUF_APPEND("[loadquery failed]");
}
- ERRBUF_APPEND("\n");
- } else {
- ERRBUF_APPEND(strerror(errno));
- ERRBUF_APPEND("[loadquery failed]");
- }
- dln_loaderror("%s", errbuf);
+ dln_loaderror("%s", errbuf);
}
#endif
@@ -1345,11 +1347,6 @@ dln_load(const char *file)
strcpy(file, orig);
free(orig);
#endif
-#if defined __SYMBIAN32__
- if (init_fct == NULL) {
- init_fct = (void(*)())dlsym(handle, "1"); /* Some Symbian versions do not support symbol table in DLL, ordinal numbers only */
- }
-#endif
if (init_fct == NULL) {
error = DLN_ERROR();
dlclose(handle);
diff --git a/dln_find.c b/dln_find.c
index f41ceb051d..56a19818cf 100644
--- a/dln_find.c
+++ b/dln_find.c
@@ -78,11 +78,12 @@ dln_find_exe_r(const char *fname, const char *path, char *buf, size_t size
}
if (!path) {
-#if defined(_WIN32)
- path = "/usr/local/bin;/usr/ucb;/usr/bin;/bin;.";
-#else
- path = "/usr/local/bin:/usr/ucb:/usr/bin:/bin:.";
-#endif
+ path =
+ "/usr/local/bin" PATH_SEP
+ "/usr/ucb" PATH_SEP
+ "/usr/bin" PATH_SEP
+ "/bin" PATH_SEP
+ ".";
}
buf = dln_find_1(fname, path, buf, size, 1 DLN_FIND_EXTRA_ARG);
if (envpath) free(envpath);
diff --git a/doc/ChangeLog-1.9.3 b/doc/ChangeLog-1.9.3
index b8e3162511..e9ede641f5 100644
--- a/doc/ChangeLog-1.9.3
+++ b/doc/ChangeLog-1.9.3
@@ -86877,7 +86877,7 @@ Sun Feb 1 18:21:00 2004 Gavin Sinclair <gsinclair@soyabean.com.au>
Sun Feb 1 05:30:06 2004 Tanaka Akira <akr@m17n.org>
* lib/open-uri.rb (URI::Generic#find_proxy): warn HTTP_PROXY.
- raise an errror on non-http proxy URI.
+ raise an error on non-http proxy URI.
(OpenURI::Buffer#<<): make a tempfile binmode. [ruby-talk:90793]
Sun Feb 1 00:57:41 2004 Kouhei Sutou <kou@cozmixng.org>
diff --git a/doc/ChangeLog-2.1.0 b/doc/ChangeLog-2.1.0
new file mode 100644
index 0000000000..f80b2d6bd1
--- /dev/null
+++ b/doc/ChangeLog-2.1.0
@@ -0,0 +1,18060 @@
+Fri Dec 20 17:52:50 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c: check definition of
+ GLOBAL_METHOD_CACHE_SIZE and GLOBAL_METHOD_CACHE_MASK.
+
+Fri Dec 20 17:03:10 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: rename OBJ_WRITE and OBJ_WRITTEN into
+ RB_OBJ_WRITE and RB_OBJ_WRITTEN.
+
+ * array.c, class.c, compile.c, hash.c, internal.h, iseq.c,
+ proc.c, process.c, re.c, string.c, variable.c, vm.c,
+ vm_eval.c, vm_insnhelper.c, vm_insnhelper.h,
+ vm_method.c: catch up this change.
+
+Fri Dec 20 16:01:35 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: add a comment for WB interfaces.
+
+Fri Dec 20 16:00:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: DLDFLAGS is defined in --with-opt-dir handler, so
+ ${DLDFLAGS=} does not work now. use RUBY_APPEND_OPTIONS instead.
+ [ruby-dev:47855] [Bug #9256]
+
+Fri Dec 20 14:19:12 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * configure.in (AC_ARG_WITH): use withval directly.
+ fix failure on FreeBSD.
+ http://fb32.rubyci.org/~chkbuild/ruby-trunk/log/20131217T070301Z.diff.html.gz
+
+Fri Dec 20 14:00:01 2013 Aman Gupta <ruby@tmm1.net>
+
+ * include/ruby/ruby.h (struct RClass): add super, remove iv_index_tbl.
+ since RCLASS_SUPER() is commonly used inside while loops, we move it
+ back inside struct RClass to improve cache hits. this provides a
+ small improvement (1%) in hotspots like rb_obj_is_kind_of()
+ * internal.h (struct rb_classext_struct): remove super, add
+ iv_index_table
+ * internal.h (RCLASS_SUPER): update for new location
+ * internal.h (RCLASS_SET_SUPER): ditto
+ * internal.h (RCLASS_IV_INDEX_TBL): ditto
+ * object.c (rb_class_get_superclass): ditto
+ * include/ruby/backward/classext.h (RCLASS_SUPER): ditto
+
+Fri Dec 20 07:07:35 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 03d6ae7. Changes include:
+
+ * Fixed typos.
+
+ * Relaxed Gem.ruby test for ruby packagers that do not use `ruby`.
+
+ * test/rubygems: ditto.
+
+Thu Dec 19 14:03:04 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (heap_get_freeobj): improve hot path performance.
+
+ * gc.c (heap_get_freeobj_from_next_freepage): replace with
+ heap_get_freepage(). It returns freeobj instead of freepage.
+ This is not on hot path.
+
+Thu Dec 19 12:05:17 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master af60443. Changes include:
+
+ * Improved speed of `gem install --ignore-dependencies`.
+
+ * Open read-write for exclusive flock. [ruby-trunk - Bug #9257]
+
+ * Remove specification before install to prevent infinite loop.
+
+Thu Dec 19 11:23:49 2013 Aman Gupta <ruby@tmm1.net>
+
+ * vm_insnhelper.c (vm_call_iseq_setup_normal): simple for loop
+ condition optimization. this area shows up as a hotspot in VM
+ profiles.
+
+Thu Dec 19 10:50:13 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (newobj_of): don't need to RBASIC_SET_CLASS() which includes WB
+ here because created obj is always YOUNG/INFANT.
+
+Thu Dec 19 10:48:37 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc/gcbench.rb: check GC::OPTS availability
+ for not MRI 2.1.0.
+
+Thu Dec 19 03:10:30 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (heap_get_freeobj): remove redundant assignment. heap->freelist
+ is set after the while() loop already.
+
+Thu Dec 19 01:54:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/runner.rb: fix commit miss on r44278.
+
+Thu Dec 19 00:26:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (garbage_collect_body): lazy_sweep setting should work
+ without USE_RGENGC.
+
+Wed Dec 18 23:31:04 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_profile_dump_major_reason): fix this function because major_reason
+ can be OR of multiple reasons.
+
+ * gc.c (gc_profile_dump_on): ditto.
+
+Wed Dec 18 17:03:00 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_profile_record_get): should return an empty array
+ when profiling is active.
+
+Wed Dec 18 16:49:40 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_profile_clear, gc_profile_enable): remove rest_sweep().
+
+ * gc.c: check objspace->profile.current_record before inserting
+ profiling record by new macro gc_prof_enabled().
+
+Wed Dec 18 14:32:06 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_exec.h (VM_DEBUG_STACKOVERFLOW): added.
+ disable stack overflow check for every stack pushing as default.
+
+ * vm_exec.c (vm_stack_overflow_for_insn): ditto.
+
+Wed Dec 18 10:00:22 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master d8f12e2. This increases the
+ speed of `gem install --ignore-dependencies` which helps bundler
+ tests.
+ * test/rubygems: ditto.
+
+Wed Dec 18 09:00:17 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/ruby/test_gc.rb (test_expand_heap): allow +/-1 diff.
+
+Tue Dec 17 23:44:15 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * test/ruby/test_io.rb: fix duplicated test name.
+
+Tue Dec 17 20:15:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_reject): revert to deprecated behavior, with
+ warnings, due to compatibility for HashWithDifferentAccess.
+ [ruby-core:59154] [Bug #9223]
+
+Tue Dec 17 17:30:56 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el: Import version 2.1.1 from
+ https://github.com/knu/ruby-electric.el.
+
+ * ruby-electric-delete-backward-char: Enable support for number
+ prefix.
+
+ * ruby-electric-curlies: Fix electric operation after an open
+ curly.
+
+Tue Dec 17 16:19:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_trace.c (rb_postponed_job_flush): isolate exceptions in
+ postponed jobs and restore outer ones. based on a patch by
+ tarui. [ruby-core:58652] [Bug #9168]
+
+Tue Dec 17 10:48:04 2013 Aman Gupta <ruby@tmm1.net>
+
+ * configure.in (RUBY_DTRACE_POSTPROCESS): Fix compatibility with
+ systemtap on linux. stap requires `dtrace -G` post-processing, but
+ the dtrace compatibility wrapper is very strict about probes.d
+ syntax.
+
+Tue Dec 17 05:18:17 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 1c5f4b3. Allows rubygems
+ repackagers to disable backward-compatible shared gem directory
+ behavior.
+ * test/rubygems: ditto.
+
+Tue Dec 17 05:14:35 2013 Eric Hodel <drbrain@segment7.net>
+
+ * NEWS (RDoc): Update version number so I don't have to change it
+ for the final release.
+
+Mon Dec 16 19:19:19 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_objspace_markable_object_p): should check special_const_p
+ first (by is_markable_object()).
+
+Mon Dec 16 19:12:54 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/objspace.c (reachable_object_from_root_i): use
+ compare_by_identity hash to avoid hash modify problem
+ during iteration.
+ [Bug #9252]
+
+ * ext/objspace/objspace.c (reachable_objects_from_root): ditto.
+
+Mon Dec 16 18:16:28 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_verify_internal_consistency): should not use
+ rb_objspace_each_objects() because it call rest_sweep().
+
+Mon Dec 16 18:07:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_objspace_markable_object_p): fix last commit (build error).
+
+Mon Dec 16 18:04:28 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_objspace_markable_object_p): it should be live objects.
+
+Mon Dec 16 18:00:51 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_objspace_each_objects): should not clear dont_lazy_sweep
+ flag in nested case.
+
+Mon Dec 16 16:40:35 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (rb_method_entry_make): fix WB miss.
+ Note that rb_method_entry_t::klass is not constified.
+ We may constify this field.
+
+ * test/ruby/test_alias.rb: add a test.
+
+Mon Dec 16 14:14:22 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: use gc_verify_internal_consistency() instead of
+ gc_check_before_marks_i() for check consistency
+ on RGENGC_CHECK_MODE >= 2.
+
+Mon Dec 16 14:01:48 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * process.c (make_clock_result): add :second as a unit for
+ Process.clock_gettime.
+
+Mon Dec 16 13:10:54 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: introduce GC.verify_internal_consistency method to verify GC
+ internal data structure.
+
+ Now this method only checks generation (old/young) consistency.
+
+Mon Dec 16 11:49:26 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (gc_info_decode): Fix build errors when compiled with
+ RGENGC_ESTIMATE_OLDMALLOC=0
+ * gc.c (objspace_malloc_increase): ditto
+
+Sun Dec 15 13:38:29 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/objspace.c (reachable_object_from_root_i):
+ reachable objects should not include categories and
+ category_objects because it is noisy information.
+
+ In fact, objects created after calling
+ ObjectSpace.reachable_objects_from_root should not be included
+ as a returning hash objects. Currently, mswin64 platform has a
+ problem because of this behavior. Should we trace new objects?
+
+Sun Dec 15 07:09:28 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rdoc: Update to RDoc master 263a9e5. This improves the
+ accessibility of the search box.
+
+Sat Dec 14 17:39:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_callee_setup_arg_complex): count post
+ arguments as mandatory arguments. [ruby-core:57706] [Bug #8993]
+
+ * vm_insnhelper.c (vm_yield_setup_block_args): ditto.
+
+Sat Dec 14 16:26:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (rubylibprefix): replace exec_prefix as well as
+ bindir and libdir. a patch by kimuraw (Wataru Kimura) at
+ [ruby-dev:47852]. [Bug #9160]
+
+Sat Dec 14 14:42:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/logger.rb (lock_shift_log): no need to rotate the log file
+ if it has been rotated by another process. based on the patch
+ by no6v (Nobuhiro IMAI) in [ruby-core:58620]. [Bug #9133]
+
+Sat Dec 14 13:01:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (mnew_from_me): method by respond_to_missing? should be
+ owned by the original class.
+
+Sat Dec 14 11:55:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/scanf.rb (IO#scanf): fix mistaken use of rescue modifier.
+ a patch by Mon_Ouie at [ruby-core:52813]. [Bug #7940]
+
+Sat Dec 14 11:44:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * util.c (ruby_qsort): fix potential stack overflow on a large
+ machine. based on the patch by Conrad Irwin <conrad.irwin AT
+ gmail.com> at [ruby-core:51816]. [Bug #7772]
+
+Sat Dec 14 11:25:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (rb_mod_const_defined): support nested class path as
+ well as const_get. [Feature #7414]
+
+Sat Dec 14 01:31:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval.c (rb_rescue2): reuse tags pushed for body proc to protect
+ rescue proc too.
+
+Sat Dec 14 01:15:51 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (wmap_final_func): Bugfix. Should update *value to new pointer.
+
+Sat Dec 14 01:05:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/lib/socket.rb: Don't test $! in "ensure" clause because
+ it may be set before the body.
+ Reported by ko1 and mrkn. [ruby-core:59088] [Bug #9247]
+
+ * lib/cgi/core.rb: Ditto.
+
+ * lib/drb/ssl.rb: Ditto.
+
+Sat Dec 14 00:34:31 2013 Naohisa Goto <ngotogenome@gmail.com>
+
+ * internal.h (ruby_sized_xrealloc2): fix typo introduced in r44117,
+ which cause compile error on Solaris.
+
+Sat Dec 14 00:22:16 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c: (exec_recursive): use rb_catch_protect() instead of
+ rb_catch_obj() and PUSH_TAG(), and reduce pushing tags and
+ machine stack usage.
+
+Sat Dec 14 00:18:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (mnew_from_me): achieve the original defined_class from
+ prepended iclass, to fix inherited owner.
+
+ * proc.c (method_owner): return the defined class, but not the
+ class which the method object is created from.
+
+Fri Dec 13 22:29:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (method_owner): return the class where alias is defined, not
+ the class original method is defined.
+
+ * vm_method.c (rb_method_entry_make, rb_alias): store the originally
+ defined class in me. [Bug #7993] [Bug #7842] [Bug #9236]
+
+ * vm_method.c (rb_method_entry_get_without_cache): cache included
+ module but not iclass.
+
+Fri Dec 13 16:27:17 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (gc_info_decode): Use :major_by=>:nofree as fallback reason
+ when other trigger conditions are present.
+
+Fri Dec 13 13:25:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * error.c: add Exception#backtrace_locations.
+ Now, there are no setter and independent from Exception#backtrace.
+ [Feature #8960]
+
+ * eval.c (setup_exception): set backtrace locations for `bt_location'
+ special attribute.
+
+ * vm_backtrace.c (rb_backtrace_to_location_ary): added.
+
+ * internal.h: ditto.
+
+ * test/ruby/test_backtrace.rb: add a test for
+ Exception#backtrace_locations.
+
+Fri Dec 13 12:01:07 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (garbage_collect_body): use rb_bug() and explicit error message
+ instead of using assert().
+ [Bug #9222]
+
+Fri Dec 13 11:52:41 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c: fix comment to remove the word "shady".
+
+ * variable.c: ditto.
+
+Fri Dec 13 11:33:55 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: rename *shady* func/macros.
+ * RVALUE_RAW_SHADY() -> RVALUE_WB_PROTECTED_RAW()
+ * RVALUE_SHADY() -> RVALUE_RAW_SHADY()
+ * rgengc_check_shady() -> rgengc_check_relation().
+ And fix some messages using "shady" to "non-WB-protected".
+
+Fri Dec 13 10:04:23 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/request_set/lockfile.rb: Import RubyGems master a8d0669
+ with a 1.8.7 compatibility fix.
+ * test/rubygems/test_gem_request_set_lockfile.rb: ditto.
+
+Fri Dec 13 09:50:49 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master ddac51f. Changes:
+
+ * Allow override for the shared gem installation directory for
+ rubygems packagers.
+
+ * Lock gem cache files for read and write to improve thread safety.
+
+ * Use io/console when available.
+
+ * Minor cleanup.
+
+ * test/rubygems: ditto.
+
+Fri Dec 13 08:15:31 2013 Aman Gupta <ruby@tmm1.net>
+
+ * class.c (include_modules_at): use RCLASS_M_TBL_WRAPPER for
+ equality checks. this avoids an unnecessary deference inside a tight
+ loop, fixing a performance regression from r43973.
+ * object.c (rb_obj_is_kind_of): ditto.
+ * object.c (rb_class_inherited_p): ditto.
+
+Wed Dec 13 02:00:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (VpSetPTR): fix for limitation of the resulting
+ precision.
+ [ruby-core:50269] [Bug #7458]
+
+ * test/bigdecimal/test_bigdecimal.rb (test_limit): add tests for the above
+ change.
+
+Wed Dec 13 01:56:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (VpAddAbs): put out a conditional branch from
+ the inside of while-loop.
+
+ * ext/bigdecimal/bigdecimal.c (VpSubAbs): ditto.
+
+Wed Dec 13 01:53:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (VPrint): be a static function, support another
+ dump formats, and add more information of the given bigdecimal.
+
+ * ext/bigdecimal/bigdecimal.h: ditto.
+
+Wed Dec 11 16:45:58 2013 Koichi Sasada <ko1@atdot.net>
+
+ * eval.c (rb_raise_jump): call c_return hook immediately after
+ popping `raise' frame.
+ Patches by deivid (David Rodriguez). [Bug #8886]
+
+ * test/ruby/test_settracefunc.rb: catch up this fix.
+
+Wed Dec 11 16:01:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_reject): return a plain hash, without copying
+ the class, default value, instance variables, and taintedness.
+ they had been copied just by accident.
+ [ruby-core:59045] [Bug #9223]
+
+Wed Dec 11 15:36:15 2013 Aman Gupta <ruby@tmm1.net>
+
+ * compile.c (iseq_specialized_instruction): emit opt_aset instruction
+ to optimize Hash#[]= and Array#[]= when called with Fixnum argument.
+ [Bug #9227] [ruby-core:58956]
+
+Wed Dec 11 04:54:03 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master ec8ed22. Notable changes
+ include:
+
+ * Renamed extension_install_dir to extension_dir (backwards
+ compatible).
+
+ * Fixed creation of gem.deps.rb.lock file from
+ TestGemRequestSet#test_install_from_gemdeps_install_dir
+
+ * Fixed a typo and some documentation.
+
+ * test/rubygems: ditto.
+
+Wed Dec 11 03:18:08 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * insns.def: Fix optimization bug of Float#/ [Bug #9238]
+
+Tue Dec 10 23:58:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/date/date_strptime.c (date__strptime_internal): unset
+ case-insensitive flag for [:alpha:], which already implies both
+ cases, to get rid of backtrack explosion. [ruby-core:58984]
+ [Bug #9221]
+
+Tue Dec 10 23:44:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_hash): add salt to differentiate false and empty
+ array. [ruby-core:58993] [Bug #9231]
+
+ * hash.c (rb_any_hash, rb_hash_hash): ditto.
+
+Tue Dec 10 18:16:09 2013 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * man/ruby.1: [DOC] Use www.ruby-toolbox.com instead of RAA.
+
+Tue Dec 10 17:21:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (wmap_finalize, wmap_aset_update): use simple malloced array
+ instead of T_ARRAY, to reduce GC pressure.
+
+Tue Dec 10 15:56:48 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (reflist_add): revert changes from r44109. it is unnecessary
+ after r44113
+ * gc.c (allrefs_i): fix whitespace
+ * gc.c (allrefs_roots_i): fix whitespace
+
+Tue Dec 10 15:46:03 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (allrefs_add): push obj only if allrefs table doesn't have
+ obj.
+
+ * gc.c (allrefs_roots_i): ditto.
+
+Tue Dec 10 15:28:10 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (RGENGC_CHECK_MODE): separate checkers to different modes.
+ * 2: enable generational bits check (for debugging)
+ * 3: enable livness check
+ * 4: show all references
+
+Tue Dec 10 15:15:37 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_marks_check): disable GC during checking and
+ restore malloc_increase info.
+
+Tue Dec 10 14:41:53 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (reflist_add): return 0 if reference already exists
+ * gc.c (allrefs_add): return 1 on newly added references
+ * gc.c (allrefs_i): follow references to construct complete object
+ graph. before this patch, RGENGC_CHECK could fail to verify some WB
+ miss issues. [Bug #9226] [ruby-core:58959]
+
+Tue Dec 10 11:20:56 2013 Aman Gupta <ruby@tmm1.net>
+
+ * ext/objspace/objspace_dump.c (dump_object): include fstring flag on
+ strings. include gc flags (old, remembered, wb_protected) on all objects.
+ * ext/objspace/objspace_dump.c (Init_objspace_dump): initialize lazy
+ IDs before first use.
+ * gc.c (rb_obj_gc_flags): new function to retrieve object flags
+ * internal.h (RB_OBJ_GC_FLAGS_MAX): maximum flags allowed for one obj
+ * test/objspace/test_objspace.rb (test_dump_flags): test for above
+ * test/objspace/test_objspace.rb (test_trace_object_allocations):
+ resolve name before dump (for rb_class_path_cached)
+
+Tue Dec 10 07:48:29 2013 Aman Gupta <ruby@tmm1.net>
+
+ * vm_method.c (rb_clear_method_cache_by_class): fire
+ ruby::method-cache-clear probe on global or klass-level method cache
+ clear [Bug #9190]
+ * probes.d (provider ruby): new dtrace probe
+ * doc/dtrace_probes.rdoc: docs for new probe
+ * test/dtrace/test_method_cache.rb: test for new probe
+
+Tue Dec 10 06:14:11 2013 Eric Hodel <drbrain@segment7.net>
+
+ * ext/.document: Remove curses from documentable directories.
+
+Tue Dec 10 04:55:36 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/lib/openssl/digest.rb: Deprecate OpenSSL::Digest::Digest
+ [Fixes GH-446] https://github.com/ruby/ruby/pull/446
+
+Tue Dec 10 00:41:42 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * ext/thread/thread.c: [DOC] add call-seq alias for Queue#enq, #<<, etc.
+
+ * ext/thread/thread.c (Init_thread): use rb_define_alias instead of
+ rb_alias to document alias.
+
+Mon Dec 9 20:00:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * internal.h (RCLASS_SERIAL): Add RCLASS_SERIAL as a convenience
+ accessor for RCLASS_EXT(klass)->class_serial.
+
+ * class.c, vm_insnhelper.c, vm_method.c: Use RCLASS_SERIAL
+
+Mon Dec 9 19:50:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * compile.c, insns.def, test/ruby/test_rubyvm.rb, vm.c, vm_core.h,
+ vm_insnhelper.c, vm_insnhelper.h, vm_method.c: Rename method_serial
+ to global_method_state and constant_serial to global_constant_state
+ after discussion with ko1.
+
+Mon Dec 9 18:50:43 2013 Aman Gupta <ruby@tmm1.net>
+
+ * hash.c (rb_hash_replace): fix segv on `{}.replace({})` introduced
+ in r44060 [Bug #9230] [ruby-core:58991]
+ * test/ruby/test_hash.rb: regression test for above
+
+Mon Dec 9 18:10:10 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (vm_stat): renamed from ruby_vm_stat.
+ Should not use ruby_ prefix here.
+
+Mon Dec 9 16:13:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (wmap_size): add ObjectSpace::WeakMap#size and #length.
+
+Mon Dec 9 15:26:17 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * test/test_curses.rb: removed.
+
+Mon Dec 9 13:36:55 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * ext/curses, sample/curses: removed curses.
+
+ * NEWS: added an entry for the above change.
+
+Mon Dec 9 12:26:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/objspace/object_tracing.c (newobj_i): use cached class path
+ only to get rid object allocation during NEWOBJ hook.
+ [ruby-core:58853] [Bug #9212]
+
+ * variable.c (rb_class_path_cached): returns cached class path
+ only, without searching and allocating new class path string.
+
+Mon Dec 9 11:14:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/date/date_parse.c (parse_time): unset case-insensitive flag
+ for [:alpha:], which already implies both cases, to get rid of
+ backtrack explosion. [ruby-core:58876] [Bug #9221]
+
+Mon Dec 9 08:40:40 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master bf37240. Fixes useless
+ error message with `gem install -g` with no gem dependencies file.
+ * test/rubygems: ditto.
+
+Mon Dec 9 04:52:25 2013 Eric Hodel <drbrain@segment7.net>
+
+ * NEWS: Update RubyGems entry with notable features.
+
+Mon Dec 9 04:43:54 2013 Eric Hodel <drbrain@segment7.net>
+
+ * ext/.document: Add syslog/lib and thread/thread.c to documentable
+ items. [ruby-trunk - Bug #9228]
+
+Mon Dec 9 04:28:50 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 096db36. Changes include
+ support for PATH in Gemfile.lock and a typo fix from Akira Matsuda.
+ * test/rubygems: ditto.
+
+Mon Dec 9 02:10:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/net/http/responses.rb:
+ Add `HTTPIMUsed`, as it is also supported by rack/rails.
+ RFC - http://tools.ietf.org/html/rfc3229
+ by Vipul A M <vipulnsward@gmail.com>
+ https://github.com/ruby/ruby/pull/447 fix GH-447
+
+Sun Dec 8 20:47:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rb_get_kwargs): when values is non-null, remove
+ extracted keywords from the rest keyword argument.
+
+Sun Dec 8 20:26:54 2013 Yutaka Kanemoto <kanemoto@ruby-lang.org>
+
+ * common.mk (ruby.imp): avoid circular dependency on AIX
+
+Sun Dec 8 20:21:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * bigdecimal.c (BigDecimal_coerce): convert a Float to a BigDecimal instead
+ of converting the receiver to a Float. The reason is there are BigDecimal
+ instances with precisions that is smaller than the Float's precision.
+ [ruby-core:58756] [Bug #9192]
+
+ * test/bigdecimal/test_bigdecimal.rb: add tests for the above change.
+
+Sun Dec 8 18:28:20 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * NEWS: [DOC] update NEWS about GC.
+
+Sun Dec 8 17:52:24 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * object.c: [DOC] document Module#singleton_class?.
+
+Sun Dec 8 16:19:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rb_get_kwargs): if optional is negative, unknown
+ keywords are allowed.
+
+ * vm_insnhelper.c (vm_callee_setup_keyword_arg): check unknown
+ keywords.
+
+Sun Dec 8 14:55:12 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * array.c (rb_ary_shuffle_bang, rb_ary_sample): rename local variables.
+
+Sun Dec 8 13:59:38 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * array.c (rb_ary_shuffle_bang, rb_ary_sample): check
+ unknown keywords.
+
+ * test/ruby/test_array.rb (test_shuffle, test_sample): tests for
+ the above.
+
+Sun Dec 8 13:01:11 2013 Aman Gupta <ruby@tmm1.net>
+
+ * vm.c (ruby_vm_stat): add RubyVM.stat() for access to internal cache
+ counters. this methods behaves like GC.stat, accepting an optional
+ hash or symbol argument. [Bug #9190] [ruby-core:58750]
+ * test/ruby/test_rubyvm.rb: test for new method
+
+Sun Dec 8 11:59:40 2013 Aman Gupta <ruby@tmm1.net>
+
+ * hash.c (rb_hash_replace): add a write barrier to fix GC mark miss on
+ hashes using Hash#replace [Bug #9226] [ruby-core:58948]
+
+Sun Dec 8 11:21:00 2013 Aman Gupta <ruby@tmm1.net>
+
+ * include/ruby/ruby.h: add RGENGC_WB_PROTECTED_NODE_CREF setting
+ In a large app, this reduces the size of
+ remembered_shady_object_count by 80%. [Bug #9225] [ruby-core:58947]
+ * gc.c (rb_node_newnode): add FL_WB_PROTECTED flag to NODE_CREF
+ * class.c (rewrite_cref_stack): insert OBJ_WRITE for NODE_CREF
+ * iseq.c (set_relation): ditto
+ * iseq.c (rb_iseq_clone): ditto
+ * vm_eval.c (rb_yield_refine_block): ditto
+ * vm_insnhelper.c (vm_cref_push): ditto
+ * vm_insnhelper.h (COPY_CREF): ditto
+
+Sun Dec 8 10:45:05 2013 Aman Gupta <ruby@tmm1.net>
+
+ * hash.c (hash_aset_str): revert r43870 due to performance issue
+ [Bug #9188] [ruby-core:58730]
+ * parse.y (assoc): convert literal string hash keys to fstrings
+ * test/ruby/test_hash.rb (class TestHash): expand test
+
+Sun Dec 8 10:22:38 2013 Aman Gupta <ruby@tmm1.net>
+
+ * parse.y (register_symid_str): use fstrings in symbol table
+ [Bug #9171] [ruby-core:58656]
+ * parse.y (rb_id2str): ditto
+ * string.c (rb_fstring): create frozen_strings on first usage. this
+ allows rb_fstring() calls from the parser (before cString is created)
+ * string.c (fstring_set_class_i): set klass on fstrings generated
+ before cString was defined
+ * string.c (Init_String): convert frozen_strings table to String
+ objects after boot
+ * ext/-test-/symbol/type.c (bug_sym_id2str): expose rb_id2str()
+ * test/-ext-/symbol/test_type.rb (module Test_Symbol): verify symbol
+ table entries are fstrings
+
+Sun Dec 8 10:24:20 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems.rb: Update version for upcoming ruby 2.1.0 RC.
+
+Sun Dec 8 10:21:36 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 14749ce. This fixes bugs
+ handling of gem dependencies lockfiles (Gemfile.lock).
+
+ * test/rubygems: ditto.
+
+Sun Dec 8 09:40:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * array.c (rb_ary_or): use RHASH_TBL_RAW instead of RHASH_TBL
+
+ * process.c (rb_execarg_fixup): use RHASH_TBL_RAW and insert write
+ barriers where appropriate
+
+ * vm.c (kwmerge_i): use RHASH_TBL_RAW
+
+ * vm.c (HASH_ASET): use rb_hash_aset instead of calling directly into
+ st_insert
+
+Sat Dec 7 11:15:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_reject): copy unrejected elements only to new hash,
+ so that the change on the original receiver can affect.
+ [ruby-core:58914] [Bug #9223]
+
+Sat Dec 7 08:25:00 2013 Richo Healey <richo@psych0tik.net>
+
+ * test/ruby/test_struct.rb: Add regression test for question marks and
+ bangs in struct members. [Closes GH-468]
+
+Fri Dec 6 19:33:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rb_extract_keywords, rb_get_kwargs): move from
+ vm_insnhelper.c.
+
+Fri Dec 6 19:18:02 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: change oldmalloc meaning.
+ Increase oldmalloc_increase with malloc_increase
+ instead of using obj_memsize_of().
+
+ This change will avoid the danger of memory full without major GC.
+
+Fri Dec 6 19:08:48 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (atomic_sub_nounderflow): not 0 but val itself.
+
+Fri Dec 6 18:37:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_objspace_alloc, Init_heap): initialize
+ oldmalloc_increase_limit at Init_heap.
+
+ rb_objspace_alloc() is not called on some platforms.
+
+Fri Dec 6 18:33:39 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (garbage_collect_body): bug fix.
+ initialize after recording.
+
+Fri Dec 6 17:49:46 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (atomic_sub_nounderflow): added to simplify atomic sub with
+ care about underflow.
+
+ * gc.c (objspace_malloc_increase): use it.
+
+Fri Dec 6 17:10:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_insnhelper.c (rb_get_kwargs): get keyword argument values from an
+ option hash, not only checking keys.
+
+ * dir.c (dir_initialize): use rb_get_kwargs.
+
+ * gc.c (gc_start_internal): ditto.
+
+Fri Dec 6 16:47:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * misc/ruby-mode.el (ruby-brace-to-do-end): split single line block.
+
+ * misc/ruby-mode.el (ruby-do-end-to-brace): shrink single line block
+ to one line.
+
+Fri Dec 6 16:16:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_start_internal): do not use rb_gc_start() and rb_gc().
+
+Fri Dec 6 15:24:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_start_internal, rb_gc): do not need
+ heap_pages_free_unused_pages() here.
+ It was done in after_sweep().
+
+ * gc.c (rb_gc): The reason is now GPR_FLAG_CAPI.
+
+Fri Dec 6 14:05:19 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (gc_start_internal): GC.start() now accepts two optional
+ keyword arguments. These can be used to disable full_mark (minor
+ mark only) or disable immediate_sweep (use lazy sweep). These new
+ options are useful for benchmarking GC behavior, or performing minor
+ GC out-of-band.
+ * test/ruby/test_gc.rb (class TestGc): tests for new options.
+
+Fri Dec 6 11:51:28 2013 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/erb.rb: [DOC] fix broken link, Use rubygems.org and www.ruby-toolbox.com instead of RAA.
+ [Bug #9197]
+
+Fri Dec 6 10:50:54 2013 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * lib/webrick/httprequest.rb: [DOC] Fix broken link of CGI specification by @udzura [fix GH-466]
+
+Thu Dec 6 01:27:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (GetVpValueWithPrec):
+ treat 0.0 and -0.0 of floating-point numbers specially for an optimization
+ and to correctly propagate its signbit to the result.
+ [Bug #9214] [ruby-core:58858]
+
+ * test/bigdecimal/test_bigdecimal.rb: add tests case for the above change.
+
+ * test/bigdecimal/test_bigdecimal_util.rb: ditto.
+
+Thu Dec 5 22:18:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (configuration): strip destdir part from prefix to get
+ rid of duplication. a patch by arton at [ruby-core:58859].
+ [ruby-core:58856] [Bug #9213]
+
+Thu Dec 5 21:53:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_or): lhs elements are preferred, so should not
+ replace with rhs elements.
+
+ * test/ruby/test_array.rb (test_OR_in_order): import the test failed
+ by r43969 from rubyspec/core/array/union_spec.rb.
+
+Thu Dec 5 21:05:42 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_info_decode): fix to avoid syntax error on VS2012.
+
+Thu Dec 5 19:35:35 2013 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * st.c: tweaked comment
+
+Thu Dec 5 19:21:10 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (struct rb_objspace): rename internal last_collection_flags to
+ latest_gc_info
+ * gc.c (gc_latest_collection_info): add GC.latest_gc_info() with similar
+ behavior to GC.stat()
+ * gc.c (rb_gc_latest_gc_info): new c-api for above
+ * gc.c (gc_stat_internal): remove :last_collection_flags from GC.stat
+ * gc.c (gc_profile_decode_flags): remove GC::Profiler.decode_flags
+ * include/ruby/intern.h (rb_gc_latest_gc_info): export new c-api
+ * test/ruby/test_gc.rb (class TestGc): test for new behavior
+ * NEWS: note about new api
+
+ * gc.c (gc_stat_internal): raise TypeError on wrong type
+ * gc.c (gc_stat): fix error message
+
+Thu Dec 5 18:18:08 2013 Aman Gupta <ruby@tmm1.net>
+
+ * ext/objspace/gc_hook.c: remove this file
+ * ext/-test-/tracepoint/gc_hook.c: new filename for above
+ * ext/objspace/objspace.c: remove ObjectSpace.after_gc_start_hook=
+ * test/objspace/test_objspace.rb: remove test
+ * test/-ext-/tracepoint/test_tracepoint.rb: add above test for
+ tracepoint re-entry
+
+Thu Dec 5 17:44:53 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: change function names vm_ prefix to objspace_ prefix.
+ They are objspace_ functionality.
+
+Thu Dec 5 16:11:04 2013 Aman Gupta <ruby@tmm1.net>
+
+ * include/ruby/intern.h: add rb_gc_stat() for access to GC.stat
+ variables from c-api
+ * gc.c (rb_gc_stat): new c-api method. accepts either VALUE hash like
+ GC.stat, or VALUE symbol key and returns size_t directly. the second
+ form is useful to avoid allocations, i.e. for usage inside
+ INTERNAL_EVENT_GC tracepoints.
+ * gc.c (gc_stat): add GC.stat(:key) to return single value instead of hash
+ * gc.c (gc_stat_internal): helper method to retrieve single or all stat values
+ * test/ruby/test_gc.rb (class TestGc): test for new behavior
+ * NEWS: note about this new api
+
+Thu Dec 5 14:40:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash): revert r43981 and bail out to the outermost frame
+ when recursion is detected.
+
+Thu Dec 5 13:47:15 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (vm_malloc_size): added.
+ return malloc_usable_size() if possible.
+
+ * gc.c (MALLOC_ALLOCATED_SIZE): add new setting macro to enable
+ GC.allocated_size.
+ If platform supports `malloc_usable_size()' (or similar one),
+ GC.allocated_size can be implemented with this function.
+ Default is 0.
+
+ * gc.c (vm_xmalloc, vm_xrealloc, vm_xfree): use vm_malloc_size()
+ to detect collect allocated size.
+
+ * gc.c (vm_malloc_increase): refactoring.
+
+Thu Dec 5 13:19:03 2013 Aman Gupta <ruby@tmm1.net>
+
+ * include/ruby/ruby.h: remove INTERNAL_EVENT_GC_END and replace with
+ two new events: GC_END_MARK and GC_END_SWEEP
+ * gc.c (gc_after_sweep): emit GC_END_SWEEP after lazy sweep is done
+ * gc.c (gc_marks_body): emit GC_END_MARK at end of minor/major mark
+ * ext/-test-/tracepoint/tracepoint.c (struct tracepoint_track): tests
+ for new events.
+ * test/-ext-/tracepoint/test_tracepoint.rb (class TestTracepointObj):
+ ditto.
+ * NEWS: remove ObjectSpace.after_gc_*_hook. These are only a sample,
+ and will be removed before ruby 2.1.
+ * ext/objspace/gc_hook.c: remove ObjectSpace.after_gc_end_hook=
+
+Thu Dec 5 10:47:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby_atomic.h (ATOMIC_PTR_EXCHANGE): atomic exchange function for
+ a generic pointer.
+
+Thu Dec 5 10:47:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (finalize_deferred): flush all deferred finalizers while other
+ finalizers can get ready to run newly by lazy sweep.
+ [ruby-core:58833] [Bug #9205]
+
+Thu Dec 5 09:07:59 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (ruby_gc_set_params): Accept safe_level argument so GC tuning
+ settings can be applied before rb_safe_level() is available.
+ * internal.h (rb_gc_set_params): ditto.
+ * ruby.c (process_options): Apply GC tuning early during boot process
+ so boot-time allocations can benefit. This also benefits any code
+ loaded in via `ruby -r`.
+
+Wed Dec 4 13:02:13 2013 Aman Gupta <ruby@tmm1.net>
+
+ * vm_trace.c (rb_suppress_tracing): Fix initialization of stack
+ allocated rb_trace_arg_t structure. Without this patch, sometimes
+ INTERNAL_EVENT_GC would be skipped accidentally inside
+ rb_threadptr_exec_event_hooks_orig().
+
+Wed Dec 4 12:57:24 2013 Aman Gupta <ruby@tmm1.net>
+
+ * string.c (fstr_update_callback): Improve implementation in r43968
+ based on feedback from @nagachika. In the existing case, we can
+ return ST_STOP to prevent any hash modification. In the !existing
+ case, set both key and value to the fstr.
+
+Wed Dec 4 12:47:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/delegate.rb (Delegator#method_missing): ignore the target if not
+ set, and delegate to global methods. [ruby-core:58572] [Bug #9155]
+
+ * lib/delegate.rb (Delegator#respond_to_missing): ditto.
+
+ * lib/delegate.rb (SimpleDelegator#__getobj__): yield and return if
+ not delegated but a block is given, like as Hash#fetch.
+
+ * lib/delegate.rb (DelegateClass#__getobj__): ditto.
+
+Tue Dec 3 23:48:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: check malloc_size() availability.
+
+ * gc.c: use malloc_size() with malloc/malloc.h if available.
+
+Tue Dec 3 23:06:20 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * object.c (rb_obj_clone): don't copy FL_WB_PROTECTED of a
+ original object.
+
+Tue Dec 3 22:32:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_recursive): make similar (recursive) constructs
+ return same hash value. execute recursively, and rewind to the
+ topmost frame with an object which .eql? to the recursive
+ object, if recursion is detected.
+
+ * hash.c (rb_hash): detect recursion for all `hash' methods. each
+ `hash' methods no longer need to use rb_exec_recursive().
+
+Tue Dec 3 21:53:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_catch_protect): new function similar to
+ rb_catch_obj(), but protect from all global jumps like as
+ rb_load_protect(), rb_protect(), etc.
+
+Tue Dec 3 20:18:46 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * object.c (rb_obj_clone): Protect FL_PROMOTED and FL_WB_PROTECTED
+ flags of a destination object.
+
+Tue Dec 3 20:16:38 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_hash_rehash): use hash_alloc() instead of rb_hash_new(),
+ to hide temporary object from ObjectSpace. [Bug #9187]
+
+Tue Dec 3 17:11:47 2013 Aman Gupta <ruby@tmm1.net>
+
+ * load.c (features_index_add_single): Move loaded_features_index array values off
+ the ruby heap. [Bug #9201] [ruby-core:58805]
+ * load.c (loaded_features_index_clear_i): Clean up off-heap array structure.
+ * vm.c (rb_vm_mark): Remove unnecessary mark_tbl for loaded_features_index.
+ This improves minor GC time by 15% in a large application.
+
+Tue Dec 3 17:01:45 2013 Aman Gupta <ruby@tmm1.net>
+
+ * include/ruby/ruby.h (struct RClass): Add wrapper struct around
+ RClass->m_tbl with serial. This prevents double marking method
+ tables, since many classes/modules can share the same method table.
+ This improves minor mark time in a large application by 30%.
+ * internal.h (struct method_table_wrapper): Define new
+ wrapper struct with additional serial.
+ * internal.h (RCLASS_M_TBL_INIT): New macro for initializing method
+ table wrapper and st_table.
+ * method.h (void rb_sweep_method_entry): Rename rb_free_m_table to
+ rb_free_m_tbl for consistency
+ * .gdbinit (define rb_method_entry): Update rb_method_entry gdb helper
+ for new method table structure.
+ * class.c: Use RCLASS_M_TBL_WRAPPER and
+ RCLASS_M_TBL_INIT macros.
+ * class.c (rb_include_class_new): Share WRAPPER between module and
+ iclass, so serial can prevent double marking.
+ * eval.c (rb_prepend_module): ditto.
+ * eval.c (rb_using_refinement): ditto.
+ * gc.c: Mark and free new wrapper struct.
+ * gc.c (obj_memsize_of): Count size of additional wrapper struct.
+
+Tue Dec 3 14:05:49 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_uniq_bang): remove duplicate code.
+
+Tue Dec 3 13:40:42 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (ary_add_hash): set and return values because string keys
+ will be frozen. [ruby-core:58809] [Bug #9202]
+
+ * array.c (rb_ary_uniq_bang): ditto.
+
+ * array.c (rb_ary_or): ditto.
+
+ * array.c (rb_ary_uniq): ditto.
+
+ * test/ruby/test_array.rb: tests for above.
+
+ The patch is from normalperson (Eric Wong).
+
+Tue Dec 3 12:20:21 2013 Aman Gupta <ruby@tmm1.net>
+
+ * string.c (rb_fstring): Use st_update instead of st_lookup +
+ st_insert.
+ * string.c (fstr_update_callback): New callback for st_update.
+
+Tue Dec 3 12:17:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rdoc/constant.rb (RDoc::Constant#documented?): workaround for
+ NoMethodError when the original of alias is not found.
+
+Tue Dec 3 10:43:58 2013 Eric Hodel <drbrain@segment7.net>
+
+ * ext/openssl/lib/openssl/buffering.rb: Return ASCII-8BIT strings from
+ SSLSocket methods. [ruby-trunk - Bug #9028]
+ * test/openssl/test_ssl.rb: Test for the above.
+
+Tue Dec 3 09:42:27 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rdoc: Update to RDoc master 900de99. Changes include:
+
+ Fixed documentation display of constants
+
+ Fixed handling of unknown parsers
+
+ * test/rdoc: ditto.
+
+Mon Dec 2 22:30:10 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * hash.c (getenv): fixed test failures introduced by r43950.
+ [ruby-core:58774] [Bug #9195] reported by phasis68 (Heesob Park).
+
+Mon Dec 2 21:49:19 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_rehash): make temporary st_table under the control
+ of GC. [Bug #9187]
+
+ * test/ruby/test_hash.rb: add a test for above.
+
+Mon Dec 2 17:23:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * variable.c (rb_mod_constants): when calling Module#constants with
+ inherit=false, there is no need to use a hashtable to deduplicate
+ constant names. [Feature #9196] [ruby-core:58786]
+
+Mon Dec 2 14:16:52 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/net/smtp.rb (Net::SMTP#critical): Always return a
+ Net::SMTP::Response. Patch by Pawel Veselov.
+ [ruby-trunk - Bug #9125]
+ * test/net/smtp/test_smtp.rb: Test for the above.
+
+Mon Dec 2 05:52:33 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master baa965b. Notable changes:
+
+ Copy directories to lib/ when installing extensions. This completes
+ the fix for [ruby-trunk - Bug #9106]
+
+ * test/rubygems: ditto.
+
+Mon Dec 2 02:03:47 2013 Shota Fukumori <her@sorah.jp>
+
+ * test/ruby/test_case.rb (test_nomethoderror):
+ Add test related to r43913, r43914
+
+Mon Dec 2 00:53:01 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * hash.c (getenv): use ANSI codepage version of getenv() for miniruby
+ on Windows.
+ [ruby-core:58732] [Bug #9189] reported by phasis68 (Heesob Park).
+
+Sun Dec 1 22:14:27 2013 Zachary Scott <e@zzak.io>
+
+ * doc/contributors.rdoc: [DOC] Import contributors from redmine wiki
+ Many wiki pages have become outdated and spam-ridden, we will import
+ these to trunk and begin maintaining them in ruby-trunk. This will
+ also allow new contributors to easily contribute patches to update
+ these pages, where previously a redmine account with wiki access was
+ required. Another bonus is having a contributors file to show thanks
+ to all of the people who have submitted a patch to Ruby.
+
+Sun Dec 1 18:03:26 2013 Zachary Scott <e@zzak.io>
+
+ * doc/maintainers.rdoc: [DOC] Current maintainers of Ruby
+
+Sun Dec 1 17:17:36 2013 Zachary Scott <e@zzak.io>
+
+ * doc/contributing.rdoc: [DOC] Current branch maintainers
+
+Sun Dec 1 17:16:36 2013 Zachary Scott <e@zzak.io>
+
+ * doc/contributing.rdoc: [DOC] Reporting other (ruby-lang.org) issues
+
+Sun Dec 1 17:15:51 2013 Zachary Scott <e@zzak.io>
+
+ * doc/contributing.rdoc: [DOC] Current platform maintainers
+
+Sun Dec 1 17:14:55 2013 Zachary Scott <e@zzak.io>
+
+ * doc/contributing.rdoc: [DOC] Reporting downstream distro issues
+
+Sun Dec 1 14:37:20 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_to_a): specify array capa.
+
+Sun Dec 1 14:15:36 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_rehash): fix to free new st_table when exception
+ is raised in do_hash(). [Bug #9187]
+
+Sun Dec 1 11:57:59 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/lib/openssl/buffering.rb: Fix warning in copyright
+
+Sun Dec 1 08:27:28 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 66e5c39. Notable changes:
+
+ Implement gem.deps.rb (Gemfile) .lock support
+
+ Fixed `gem uninstall` for a relative directory in GEM_HOME.
+
+ * test/rubygems: ditto.
+
+Sun Dec 1 06:00:49 2013 Aman Gupta <ruby@tmm1.net>
+
+ * test/ruby/test_gc.rb (test_gc_reason): Force minor GC by consuming
+ free slots to fix test.
+
+Sat Nov 30 21:22:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (dir_initialize): check unknown keywords. [ruby-dev:47152]
+ [Bug #8060]
+
+Sat Nov 30 18:05:38 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32ole/win32ole.c (hash2named_arg): correct declaration to fix
+ build failure. a patch by phasis68 (Heesob Park) at
+ [ruby-core:58710]. [Bug #9184]
+
+Sat Nov 30 17:46:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval.c (ruby_cleanup): determine exit status and signal to terminate
+ before finalization, to get rid of access destroyed T_DATA exception
+ object. [ruby-core:58643] [Bug #9167]
+
+Sat Nov 30 16:25:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enumerator.c (enumerator_with_index): should not store local variable
+ address to memoize the arguments. it is invalidated after the return.
+ [ruby-core:58692] [Bug #9178]
+
+Sat Nov 30 13:28:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * siphash.c (sip_hash24): fix for aligned word access little endian
+ platforms. [ruby-core:58658] [Bug #9172]
+
+Sat Nov 30 13:21:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_yield_block): implement non-nil block argument.
+
+Fri Nov 29 20:59:39 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * vm_dump.c (rb_vmdebug_debug_print_pre): Bugfix. Get PC directly.
+ PC is cached into local stack and cfp->pc is incorrect at next of
+ branch or jump.
+ * vm_exec.h (DEBUG_ENTER_INSN): catch up this change.
+ * vm_core.h: update signature of rb_vmdebug_debug_print_pre.
+
+Fri Nov 29 20:43:57 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * compile.c: Bugsfix for dump_disasm_list.
+ rb_inspect denies a hidden object. So, insert wrapper that creates
+ the unhidden one.
+ adjust->label is null sometimes.
+ insn_data_line_no makes no sense at all.
+
+Fri Nov 29 18:06:45 2013 Shota Fukumori <her@sorah.jp>
+
+ * test/ruby/test_case.rb (test_method_missing): Test for r43913.
+
+Fri Nov 29 17:53:22 2013 Shota Fukumori <her@sorah.jp>
+
+ * vm_insnhelper.c (check_match): Fix SEGV with VM_CHECKMATCH_TYPE_CASE
+ and class of `pattern` has `method_missing`
+ [Bug #8872] [ruby-core:58606]
+
+Fri Nov 29 17:06:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_yield_block): yield block with rb_block_call_func
+ arguments.
+
+ * range.c (range_each): use rb_yield_block.
+
+ * include/ruby/ruby.h (RB_BLOCK_CALL_FUNC_ARGLIST): constify argv.
+
+ * enum.c (rb_enum_values_pack): ditto.
+
+ * vm_eval.c (rb_block_call, rb_check_block_call): ditto.
+
+ * include/ruby/ruby.h (RB_BLOCK_CALL_FUNC_ARGLIST): for declaration
+ argument list of rb_block_call_func.
+
+Fri Nov 29 11:26:43 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (rb_block_call_func): add blockarg. block
+ function can take block argument, e.g., proc {|&blockarg| ...}.
+
+Thu Nov 28 21:43:48 2013 Zachary Scott <e@zzak.io>
+
+ * doc/dtrace_probes.rdoc: [DOC] Import dtrace probes doc from wiki
+
+Thu Nov 28 21:17:32 2013 Zachary Scott <e@zzak.io>
+
+ * doc/contributing.rdoc: [DOC] Add heading above ChangeLog tips to
+ setup entry for commits, its not required. Actually easier if
+ contributors don't include a ChangeLog entry.
+
+Thu Nov 28 21:16:18 2013 Zachary Scott <e@zzak.io>
+
+ * doc/contributing.rdoc: [DOC] Add coding style heading for patch
+ rules
+
+Thu Nov 28 21:15:45 2013 Zachary Scott <e@zzak.io>
+
+ * doc/contributing.rdoc: [DOC] Add notes about deciding what to patch
+
+Thu Nov 28 19:43:45 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * benchmark/bm_hash_flatten.rb: added. r43896 is about 4 times faster
+ than 2.0.0p353.
+
+ * benchmark/bm_hash_keys.rb: added. r43896 is about 5 times faster
+ than 2.0.0p353.
+
+ * benchmark/bm_hash_values.rb: added. r43896 is about 5 times faster
+ than 2.0.0p353.
+
+Thu Nov 28 19:29:04 2013 Zachary Scott <e@zzak.io>
+
+ * doc/contributing.rdoc: [DOC] Add notes about slideshow proposals
+ from wiki page: HowToRequestFeatures
+
+Thu Nov 28 17:34:42 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * st.c: add st_values() and st_values_check().
+
+ * include/ruby/st.h: add prototypes for above.
+
+ * hash.c (rb_hash_values): use st_values_check() for performance
+ improvement if VALUE and st_data_t are compatible.
+
+Thu Nov 28 17:14:14 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * st.c (st_keys): fix not to use Qundef in st.c.
+
+ * include/ruby/st.h: define modified prototype.
+
+ * hash.c (rb_hash_keys): use modified st_keys().
+
+Thu Nov 28 16:34:43 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c: Expose details about last garbage collection via GC.stat.
+ * gc.c (gc_stat): Add :last_collection_flags for reason/trigger/type of
+ last GC run.
+ * gc.c (gc_prof_sweep_timer_stop): Record HAVE_FINALIZE GPR even
+ without GC_PROFILE_MORE_DETAIL.
+ * gc.c (gc_profile_flags): Add GC::Profiler.decode_flags to make sense
+ of GC.stat[:last_collection_flags]
+ * test/ruby/test_gc.rb (class TestGc): Test for above.
+
+Thu Nov 28 16:15:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_dup2): extract from rb_cloexec_dup2() and
+ redirect_dup2().
+
+Tue Nov 28 14:40:00 2013 Akira Matsuda <ronnie@dio.jp>
+
+ * lib/drb/ssl.rb: [Doc] Fix typo
+
+Thu Nov 28 13:56:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * common.mk (Doxyfile): tool/file2lastrev.rb needs running with
+ BASERUBY since r43617. [ruby-dev:47823] [Bug #9169]
+
+Thu Nov 28 09:18:39 2013 Koichi Sasada <ko1@atdot.net>
+
+ * string.c (rb_fstring): fstrings should be ELTS_SHARED.
+ If we resurrect dying objects (non-marked, but not swept yet),
+ pointing shared string can be collected.
+ To avoid such issue, fstrings (recorded to fstring_table)
+ should not be ELTS_SHARED (should not have a shared string).
+
+Thu Nov 28 01:35:08 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * st.c (st_keys): fix to use st_index_t for size of hash.
+
+Thu Nov 28 00:36:52 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * st.c (st_keys): define st_keys(). it writes each key to buffer.
+
+ * hash.c (rb_hash_keys): use st_keys() for performance improvement
+ if st_data_t and VALUE are compatible.
+
+ * include/ruby/st.h: define macro ST_DATA_COMPATIBLE_P() to predicate
+ whether st_data_t and passed type are compatible.
+
+ * configure.in: check existence of builtin function to use in
+ ST_DATA_COMPATIBLE_P().
+
+Thu Nov 28 00:07:28 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * ruby_atomic.h: remove duplicate definitions between ATOMIC_XXX
+ and ATOMIC_SIZE_XXX.
+
+Wed Nov 27 23:55:50 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * ruby_atomic.h: define ATOMIC_SIZE_CAS() with
+ __atomic_compare_exchange_n() and refactoring.
+
+Tue Nov 27 21:43:00 2013 Akira Matsuda <ronnie@dio.jp>
+
+ * lib/irb/notifier.rb: [Doc] Fix typo
+ * ext/json/lib/json/common.rb: Ditto.
+
+Tue Nov 27 18:04:57 2013 Akira Matsuda <ronnie@dio.jp>
+
+ * lib/irb/notifier.rb: Fix typo
+
+Wed Nov 27 17:54:57 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_stacked_objects): check only when check_mode > 0.
+
+Wed Nov 27 16:07:19 2013 Aman Gupta <ruby@tmm1.net>
+
+ * test/ruby/test_gc.rb (class TestGc): Fix warning in
+ test_expand_heap.
+
+Wed Nov 27 15:55:52 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (Init_GC): Add new GC::INTERNAL_CONSTANTS for information about
+ GC heap/page/slot sizing.
+ * test/ruby/test_gc.rb (class TestGc): test for above.
+
+Wed Nov 27 15:21:17 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (gc_page_sweep): Fix compile warning from last commit.
+ * hash.c (hash_aset_str): Re-use existing variable to avoid
+ unnecessary pointer dereferencing.
+
+Wed Nov 27 15:12:55 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_page_sweep): disable debug print.
+
+Wed Nov 27 15:05:59 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_stat): add new information heap_eden_page_length and
+ heap_tomb_page_length.
+
+ * test/ruby/test_gc.rb: fix to use GC.stat[:heap_eden_page_length]
+ instead of GC.stat[:heap_length].
+ This test expects `heap_eden_page_length' (used pages size).
+
+Wed Nov 27 15:02:53 2013 Aman Gupta <ruby@tmm1.net>
+
+ * test/ruby/test_eval.rb (class TestEval): Use assert_same instead of
+ assert_equal.
+ * test/ruby/test_hash.rb (class TestHash): ditto.
+ * test/ruby/test_iseq.rb (class TestISeq): ditto.
+
+Wed Nov 27 14:50:02 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rinda/ring.rb: Announce RingServer for the same process.
+ [ruby-trunk - Bug #9163]
+ * test/rinda/test_rinda.rb: Tests for the above.
+
+Wed Nov 27 14:37:33 2013 Aman Gupta <ruby@tmm1.net>
+
+ * test/ruby/test_eval.rb (class TestEval): Add test for shared eval
+ filenames via rb_fstring().
+ * test/ruby/test_iseq.rb (class TestISeq): Add test for shared
+ iseq labels via rb_fstring(). [Bug #9159]
+
+Wed Nov 27 14:24:55 2013 Aman Gupta <ruby@tmm1.net>
+
+ * hash.c (hash_aset_str): Use rb_fstring() to de-duplicate hash string
+ keys. Patch by Eric Wong. [Bug #8998] [ruby-core:57727]
+ * test/ruby/test_hash.rb (class TestHash): test for above.
+
+Wed Nov 27 10:39:39 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c: Rename rb_heap_t members:
+ used -> page_length
+ limit -> total_slots
+
+Wed Nov 27 08:24:49 2013 Aman Gupta <ruby@tmm1.net>
+
+ * compile.c: Use rb_fstring() to de-duplicate string literals in code.
+ [ruby-core:58599] [Bug #9159] [ruby-core:54405]
+ * iseq.c (prepare_iseq_build): De-duplicate iseq labels and source
+ locations.
+ * re.c (rb_reg_initialize): Use rb_fstring() for regex string.
+ * string.c (rb_fstring): Handle non-string and already-fstr arguments.
+ * vm_eval.c (eval_string_with_cref): De-duplicate eval source
+ filename.
+
+Wed Nov 27 07:13:54 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych.rb: psych version 2.0.2
+ * ext/psych/psych.gemspec: ditto
+
+Wed Nov 27 06:40:18 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/scalar_scanner.rb: fix support for negative
+ years.
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: ditto
+ * test/psych/test_date_time.rb: test for change.
+ Fixes: https://github.com/tenderlove/psych/issues/168
+
+Wed Nov 27 04:46:55 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/scalar_scanner.rb: fix regexp for matching TIME
+ strings.
+ * test/psych/test_date_time.rb: test for change.
+ Fixes: https://github.com/tenderlove/psych/issues/171
+
+Wed Nov 27 02:26:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (str_new4): copy the original capacity so that memsize of
+ frozen shared string returns correct size.
+
+Wed Nov 27 02:20:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_hash): should not ignore the rest of recursive
+ constructs.
+
+ * hash.c (rb_hash_hash): ditto.
+
+ * range.c (range_hash): ditto.
+
+ * struct.c (rb_struct_hash): ditto.
+
+ * test/-ext-/test_recursion.rb (TestRecursion): separate from
+ test/ruby/test_thread.rb.
+
+Tue Nov 26 22:43:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash): cut off if recursion detected to get rid of stack
+ overflow. [ruby-core:58567] [Bug #9151]
+
+Tue Nov 26 20:02:39 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/ruby/test_settracefunc.rb: add tests for a_call/a_return
+ by Brandur <brandur@mutelight.org> [Feature #9120]
+
+Tue Nov 26 19:29:52 2013 Koichi Sasada <ko1@atdot.net>
+
+ * common.mk: add useful config "set breakpoint pending on"
+ for run.gdb.
+
+Tue Nov 26 19:17:47 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/object_tracing.c (newobj_i): skip class_path if class
+ is frozen.
+
+ rb_class_path() can modify frozen classes (and causes errors).
+ This patch is temporary. We need no-modification/no-allocation
+ class path function.
+
+Tue Nov 26 18:12:13 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c: skip "exception check" and "reentrant check (only normal
+ events) for internal events.
+
+ Reentrant check for internal events are remaining.
+
+Tue Nov 26 17:38:16 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c: prohibit to specify normal events and internal events
+ simultaneously.
+ I will introduce special care for internal events later.
+
+ * ext/-test-/tracepoint/tracepoint.c: test this behavior.
+
+ * test/-ext-/tracepoint/test_tracepoint.rb: ditto.
+
+Tue Nov 26 16:30:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_readlink): fix buffer overflow on a long symlink. since
+ rb_str_modify_expand() expands from its length but not its capacity,
+ need to set the length properly for each expansion.
+ [ruby-core:58592] [Bug #9157]
+
+Tue Nov 26 14:23:17 2013 Aman Gupta <ruby@tmm1.net>
+
+ * ext/objspace/objspace_dump.c (dump_append_string_value): Escape
+ control characters for strict json parsers.
+ * ext/objspace/objspace_dump.c (objspace_dump): Document File/IO
+ output option.
+
+Tue Nov 26 11:43:19 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * ruby_atomic.h: use __atomic builtin functions supported by GCC.
+ __sync family are legacy functions now and it is recommended
+ that new code use the __atomic functions.
+ http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
+
+ * configure.in: check existence of __atomic functions.
+
+Tue Nov 26 10:57:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/bigdecimal/bigdecimal.gemspec: revert Gem::Specification#date
+ for snapshot/release tarballs.
+
+Tue Nov 26 06:42:50 2013 Aman Gupta <ruby@tmm1.net>
+
+ * NEWS: Add ObjectSpace.after_gc_{start,end}_hook=
+ * ext/objspace/objspace_dump.c: [DOC] catch up dump/dump_all to r43679
+
+Tue Nov 26 04:12:10 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 612f85a. Notable changes:
+
+ Fixed installation and activation of git: and path: gems via
+ Gem.use_gemdeps
+
+ Improved documentation coverage
+
+ * test/rubygems: ditto.
+
+Mon Nov 25 22:23:03 2013 Zachary Scott <e@zzak.io>
+
+ * lib/xmlrpc.rb: [DOC] Fix link to xmlrpc4r site [Bug #9148]
+ Patch by Giorgos Tsiftsis
+
+Mon Nov 25 19:48:10 2013 Zachary Scott <e@zzak.io>
+
+ * lib/uri/common.rb: [DOC] typo fixes by @vipulnsward [Fixes GH-456]
+ https://github.com/ruby/ruby/pull/456
+ * lib/uri/generic.rb: [DOC] ditto.
+
+Mon Nov 25 14:34:42 2013 Zachary Scott <e@zzak.io>
+
+ * ext/bigdecimal/bigdecimal.gemspec: bump BigDecimal to 1.2.3 for
+ proper release date in RubyGems
+
+Mon Nov 25 14:25:08 2013 Zachary Scott <e@zzak.io>
+
+ * ext/bigdecimal/bigdecimal.gemspec: Remove Gem::Specification#date
+ We should rely on rubygems to create the date the gem was released
+ for each version.
+
+Mon Nov 25 06:53:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h: do not use ruby_sized_xrealloc() and ruby_sized_xfree()
+ if HAVE_MALLOC_USABLE_SIZE (or _WIN32) is defined.
+
+ We don't need these function if malloc_usable_size() is available.
+
+ * gc.c: catch up this change.
+
+ * gc.c: define HAVE_MALLOC_USABLE_SIZE on _WIN32.
+
+ * array.c (ary_resize_capa): do not use ruby_sized_xfree() with
+ local variable to avoid "unused local variable" warning.
+ This change only has few impact.
+
+ * string.c (rb_str_resize): ditto.
+
+Mon Nov 25 05:05:04 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/-ext-/tracepoint/test_tracepoint.rb: catch up GC.stat changes
+ at r43835.
+
+Mon Nov 25 04:45:59 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: continue to change OLDSPACE -> OLDMALLOC.
+ RGENGC_ESTIMATE_OLDSPACE -> RGENGC_ESTIMATE_OLDMALLOC.
+
+ * gc.c: add a new major GC reason GPR_FLAG_MAJOR_BY_OLDMALLOC.
+
+Mon Nov 25 04:16:09 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: change terminology "..._num" to "..._slots" about slot operation.
+ * final_num -> final_slots
+ * objspace_live_num() -> objspace_live_slots()
+ * objspace_limit_num() -> objspace_limit_slots()
+ * objspace_free_num() -> objspace_free_slots()
+
+Mon Nov 25 04:03:12 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_stat): add internal information.
+ * heap_swept_slot
+ * malloc_increase
+ * malloc_limit
+ * remembered_shady_object
+ * remembered_shady_object_limit
+ * old_object
+ * old_object_limit
+ * oldmalloc_increase
+ * oldmalloc_limit
+
+ * gc.c (gc_stat): rename names.
+ * heap_live_num -> heap_live_slot
+ * heap_free_num -> heap_free_slot
+ * heap_final_slot -> heap_final_slot
+
+ Quote from RDoc of GC.stat():
+ "The contents of the hash are implementation specific and may
+ be changed in the future."
+
+ * test/ruby/test_gc.rb: catch up this change.
+
+Mon Nov 25 03:59:45 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/ruby/test_gc.rb: catch up last commit.
+ Now RUBY_GC_OLDSPACE_LIMIT(...) is RUBY_GC_OLDMALLOC_LIMIT(...).
+
+Mon Nov 25 03:10:46 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: change terminology OLDSPACE -> OLDMALLOC.
+ (oldspace -> oldmalloc for variable names)
+
+ OLDSPACE is confusing because it is not includes slots.
+ To more clearly, rename such as (oldspace_limit -> oldmalloc_limit).
+ It is clear that it measures (estimates) malloc()'ed size.
+
+Mon Nov 25 00:50:03 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * internal.h: use __builtin_bswap16() if possible.
+
+ * configure.in: check existence of __builtin_bswap16().
+
+Sun Nov 24 22:24:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigxor_int): Apply BIGLO for long in a BDIGIT expression.
+ (bigor_int): Ditto.
+ (bigand_int): Ditto.
+
+Sun Nov 24 18:13:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/defines.h (SIZEOF_ACTUAL_BDIGIT): Defined.
+
+ * include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): Use
+ SIZEOF_ACTUAL_BDIGIT instead of SIZEOF_BDIGITS.
+ SIZEOF_BDIGITS can be different to sizeof(BDIGIT).
+
+Sun Nov 24 13:49:08 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/defines.h: Don't use int128_t for Bignum.
+ It's not always faster.
+
+ * bignum.c: Ditto.
+
+Sun Nov 24 10:18:15 2013 Aman Gupta <ruby@tmm1.net>
+
+ * NEWS: Add details about new debugging features and APIs.
+
+Sun Nov 24 09:37:20 2013 Andrew Vit <andrew@avit.ca>
+
+ * lib/csv.rb: Optimize header hashes by freezing string keys.
+ [ruby-core:58510]
+
+Sun Nov 24 09:18:06 2013 Aman Gupta <ruby@tmm1.net>
+
+ * ext/objspace/objspace_dump.c (dump_object): Use PRIuSIZE to print
+ size_t for better win32 compatibility.
+ * test/objspace/test_objspace.rb (test_dump_all): Hold reference to
+ test string to avoid failure due to GC. Reduce size of failure message
+ using grep(/TEST STRING/).
+
+Sun Nov 24 08:38:00 2013 Kyle Stevens <kstevens715@gmail.com>
+
+ * lib/csv.rb: If skip_lines is set to a String, convert it to a Regexp
+ to prevent the alternative, which is that each line in the CSV gets
+ converted to a Regexp when calling skip_lines#match.
+
+Sun Nov 24 01:03:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_power): Use FIX2LONG instead
+ of FIX2INT to avoid conversion error.
+
+Sun Nov 24 00:44:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): define by macros
+ defined in defines.h, instead of complex and repeated expression.
+
+Sat Nov 23 22:22:26 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): Limit the value to
+ less than 8.
+
+Sat Nov 23 19:52:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/lib/bigdecimal/math.rb (BigMath.E): Use BigMath.exp.
+ [Feature #6857] [ruby-core:47130]
+
+Sat Nov 23 19:46:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Optimize the
+ calculation algorithm to reduce the number of divisions.
+ This optimization was proposed by Rafal Michalski.
+ [Feature #6857] [ruby-core:47130]
+
+Sat Nov 23 19:20:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_div2): The signature was
+ changed to allow us to pass arguments directly.
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_div3): Added for the role of
+ the old BigDecimal_div2.
+
+Sat Nov 23 12:31:00 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: fix global variable name.
+ Now we have following environments (and related variable names).
+
+ * RUBY_GC_HEAP_INIT_SLOTS
+ * RUBY_GC_HEAP_FREE_SLOTS
+ * RUBY_GC_HEAP_GROWTH_FACTOR (new from 2.1)
+ * RUBY_GC_HEAP_GROWTH_MAX_SLOTS (new from 2.1)
+
+ * obsolete
+ * RUBY_FREE_MIN -> RUBY_GC_HEAP_FREE_SLOTS (from 2.1)
+ * RUBY_HEAP_MIN_SLOTS -> RUBY_GC_HEAP_INIT_SLOTS (from 2.1)
+
+ * RUBY_GC_MALLOC_LIMIT
+ * RUBY_GC_MALLOC_LIMIT_MAX (new from 2.1)
+ * RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR (new from 2.1)
+
+ * RUBY_GC_OLDSPACE_LIMIT (new from 2.1)
+ * RUBY_GC_OLDSPACE_LIMIT_MAX (new from 2.1)
+ * RUBY_GC_OLDSPACE_LIMIT_GROWTH_FACTOR (new from 2.1)
+
+ * test/ruby/test_gc.rb: catch up this change.
+
+Sat Nov 23 09:45:49 2013 Aman Gupta <ruby@tmm1.net>
+
+ * marshal.c (w_object): Use HASH_PROC_DEFAULT directly from internal.h
+
+Sat Nov 23 08:43:23 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c: Rename heap_pages_swept_num to heap_pages_swept_slots to
+ clarify meaning (number of slots, not pages).
+
+Sat Nov 23 08:23:23 2013 Aman Gupta <ruby@tmm1.net>
+
+ * lib/set.rb (class SortedSet): Fix source_location for methods
+ defined via eval.
+
+Sat Nov 23 03:44:03 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master dcce4ff. Important changes
+ in this commit:
+
+ Remove automatic detection of gem dependencies files. This prevents a
+ security hole as described in [ruby-core:58490]
+
+ Fixed bugs for installing git gems.
+
+ * test/rubygems: ditto.
+
+Fri Nov 22 22:30:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_power):
+ Round the result value only if the precision is given.
+
+Fri Nov 22 17:20:50 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * transcode.c (str_transcode0): don't scrub invalid chars if
+ str.encode doesn't have explicit invalid: :replace.
+ workaround fix for see #8995
+
+Fri Nov 22 17:11:26 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * include/ruby/intern.h, internal.h: Expose rb_gc_count().
+
+Fri Nov 22 17:07:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.gemspec: version 1.2.2.
+
+Fri Nov 22 17:04:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_data_type):
+ Use RUBY_TYPED_FREE_IMMEDIATELY only if it is available.
+
+Fri Nov 22 16:49:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_power): Round the result value.
+ [Bug #8818] [ruby-core:56802]
+
+ * test/bigdecimal/test_bigdecimal.rb: Add a test for the above fix.
+
+Fri Nov 22 16:25:43 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (heap_set_increment): accept minimum additional page number.
+
+ * gc.c (gc_after_sweep): allocate pages to allocate at least
+ RUBY_HEAP_MIN_SLOTS.
+ [Bug #9137]
+
+Fri Nov 22 16:19:52 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * include/ruby/intern.h (rb_gc_set_params): Deprecate
+ rb_gc_set_params because it's only used in ruby internal.
+
+ * internal.h (ruby_gc_set_params): Declare rb_gc_set_params's
+ alias function.
+
+ * gc.c: ditto.
+
+ * ruby.c: use ruby_gc_set_params.
+
+Fri Nov 22 14:55:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Insert rb_thread_check_ints.
+
+Fri Nov 22 14:35:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Fix the inserting points
+ of RB_GC_GUARDs.
+
+Fri Nov 22 14:31:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c: Fix indentation.
+
+Fri Nov 22 14:03:00 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/nkf: merge nkf 2.1.3 2a2f2c5.
+
+Fri Nov 22 12:43:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * util.c (ruby_strtod): ignore too long fraction part, which does not
+ affect the result.
+
+Fri Nov 22 12:17:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/buffering.rb (OpenSSL::Buffering#initialize):
+ initialize of a module should pass arguments to super.
+
+Fri Nov 22 12:02:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_settracefunc.rb: Ignore events from other threads.
+
+Fri Nov 22 10:35:57 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (ruby_vm_destruct): do not use ruby_xfree() after freeing
+ objspace.
+
+ * gc.c (ruby_mimfree): added. It is similar to ruby_mimmalloc().
+
+ * internal.h: ditto.
+
+Fri Nov 22 09:42:35 2013 Zachary Scott <e@zzak.io>
+
+ * test/digest/test_digest.rb: Reverse order of assert_equal
+ Reported by @splattael
+
+Fri Nov 22 09:03:16 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * gc.c: fix build failure on FreeBSD introduced by r43763.
+ malloc_usable_size() is defined by malloc_np.h on FreeBSD.
+
+ * configure.in: check malloc.h and malloc_np.h.
+
+Fri Nov 22 08:27:13 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 50a8210. Important changes
+ in this commit:
+
+ RubyGems now automatically checks for gem.deps.rb or Gemfile when
+ running ruby executables. This behavior is similar to `bundle exec
+ rake`. This change may be reverted before Ruby 2.1.0 if too many bugs
+ are found.
+
+ * test/rubygems: ditto.
+
+Thu Nov 21 22:33:59 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: RGENGC_CHECK_MODE should be 0.
+
+Thu Nov 21 21:40:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (VpAlloc): Fix the expr to adjust the size
+ of the digit array.
+
+Thu Nov 21 21:36:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_sqrt): Fix the precision of
+ the result BigDecimal of sqrt.
+ [Bug #5266] [ruby-dev:44450]
+
+ * test/bigdecimal/test_bigdecimal.rb: add tests for the above changes.
+
+Thu Nov 21 18:49:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (vm_xrealloc, vm_xfree): use malloc_usable_size() to obtain old
+ size if available.
+
+Thu Nov 21 18:47:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/delegate.rb (SimpleDelegator#__getobj__): target object must be set.
+
+ * lib/delegate.rb (DelegateClass#__getobj__): ditto.
+
+Thu Nov 21 18:28:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/tempfile.rb (Tempfile#initialize): use class method to get rid
+ of warnings when $VERBOSE.
+
+Thu Nov 21 17:43:29 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: rename initial_xxx variables to gc_params.xxx.
+ They are not only used initial values.
+
+ Chikanaga-san: Congratulations on RubyPrize!
+
+Thu Nov 21 17:16:00 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: enable "RGENGC_ESTIMATE_OLDSPACE" option as default.
+ Without this option, some application consumes huge memory.
+ (and there are only a few performance down)
+
+ Introduced new environment variables:
+ * RUBY_GC_HEAP_OLDSPACE (default 16MB)
+ * RUBY_GC_HEAP_OLDSPACE_MAX (default 128 MB)
+ * RUBY_GC_HEAP_OLDSPACE_GROWTH_FACTOR (default 1.2)
+
+ * gc.c (initial_malloc_limit): rename to initial_malloc_limit_min.
+
+Thu Nov 21 16:51:34 2013 Zachary Scott <e@zzak.io>
+
+ * ext/digest/bubblebabble/bubblebabble.c: Teach RDoc digest/bubblebabble
+
+Thu Nov 21 16:50:16 2013 Zachary Scott <e@zzak.io>
+
+ * test/digest/test_digest.rb: Add more tests for digest/bubblebabble
+
+Thu Nov 21 16:32:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/delegate.rb (Delegator#method_missing): try private methods defined in
+ Kernel after the target. [Fixes GH-449]
+
+Thu Nov 21 16:25:08 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * test/uri/test_generic.rb (URI#test_merge): Test uri + URI(path)
+ in addition to uri + path.
+
+Thu Nov 21 15:36:08 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/lib/openssl/buffering.rb: [DOC] Fix HEREDOC comment for
+ OpenSSL::Buffering which breaks overview because of RDoc bug
+
+Thu Nov 21 14:46:57 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * eval_intern.h (SAVE_ROOT_JMPBUF): workaround for the failure of
+ test/ruby/test_exception.rb on Windows.
+ wrap by __try and __exception statements on mswin to raise SIGSEGV
+ when EXCEPTION_STACK_OVERFLOW is occurred, because MSVCRT doesn't
+ handle the exception.
+ however, (1) mingw-gcc doesn't support __try and __exception
+ statements, and (2) we cannot retry SystemStackError after this
+ change yet (maybe crashed) because SEH and longjmp() are too
+ uncongenial.
+
+ * signal.c (check_stack_overflow, CHECK_STACK_OVERFLOW): now defined on
+ Windows, too.
+
+ * thread_win32.c (ruby_stack_overflowed_p): ditto.
+
+Thu Nov 21 14:18:24 2013 Zachary Scott <e@zzak.io>
+
+ * object.c: [DOC] Clarify Object#dup vs #clone [Bug #9128]
+ Moving existing doc for this comparison to separate section of #dup
+ Adding examples to document behavior of #dup with Module#extend.
+ Based on a patch by stevegoobermanhill
+
+Thu Nov 21 14:06:02 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_marks_check): do not dump all refs.
+
+ * gc.c (allrefs_dump_i): fix output format.
+
+Thu Nov 21 13:43:07 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: change RGENGC_CHECK_MODE (>= 2) logic.
+ Basically, make an object graph of all of living objects before and
+ after marking and check status.
+
+ [Before marking: check WB sanity]
+ If there is a non-old object `obj' pointed from old object
+ (`parent') then `parent' or `obj' should be remembered.
+
+ [After marking: check marking miss]
+ Traversible objects with the object graph should be marked.
+ (However, this alert about objects pointed by machine context
+ can be false positive. We only display alert.)
+
+ [Implementation memo]
+ objspace_allrefs() creates an object graph.
+ The object graph is represented by st_table, key is object (VALUE)
+ and value is referring objects. Referring objects are stored by
+ "struct reflist".
+
+ * gc.c (init_mark_stack): do not use push_mark_stack_chunk() at init.
+ This pre-allocation causes failure on is_mark_stack_empty()
+ without any pushing.
+
+Thu Nov 21 13:40:20 2013 Zachary Scott <e@zzak.io>
+
+ * lib/observer.rb: [DOC] Clarify default observer method.
+ By @edward [Fixes GH-450] https://github.com/ruby/ruby/pull/450
+
+Thu Nov 21 13:32:53 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/ossl_engine.c: [DOC] Documentation for OpenSSL::Engine
+ This patch is based off work by @vbatts in GH-436 completing the
+ documentation for this class and its methods.
+ https://github.com/ruby/ruby/pull/436
+
+Thu Nov 21 10:45:22 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/lib/openssl/buffering.rb: Remove unused arguments from
+ OpenSSL::Buffering.new [Fixes GH-445]
+
+Thu Nov 21 10:30:47 2013 Zachary Scott <e@zzak.io>
+
+ * test/digest/test_digest.rb: Add test for Digest::SHA256.bubblebabble
+
+Wed Nov 20 20:54:01 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * tool/instruction.rb : fix typo.
+
+Wed Nov 20 19:45:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (rand_init): Make it possible to specify arbitrary array
+ for init_genrand().
+
+Wed Nov 20 17:34:13 2013 Koichi Sasada <ko1@atdot.net>
+
+ * parse.y (rb_gc_mark_symbols): set global_symbols.minor_marked only
+ when full_mark is 0.
+ rb_gc_mark_symbols() (with full_mark == 1) can be called by other
+ than GC (such as rb_objspace_reachable_objects_from_root()).
+
+Wed Nov 20 11:46:38 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/json: merge JSON 1.8.1.
+ https://github.com/nurse/json/compare/002ac2771ce32776b32ccd2d06e5604de6c36dcd...e09ffc0d7da25d0393873936c118c188c78dbac3
+ * Remove Rubinius exception since transcoding should be working now.
+ * Fix https://github.com/flori/json/issues/162 reported by Marc-Andre
+ Lafortune <github_rocks@marc-andre.ca>. Thanks!
+ * Applied patches by Yui NARUSE <naruse@airemix.jp> to suppress
+ warning with -Wchar-subscripts and better validate UTF-8 strings.
+ * Applied patch by ginriki@github to remove unnecessary if.
+ * Add load/dump interface to JSON::GenericObject to make
+ serialize :some_attribute, JSON::GenericObject
+ work in Rails active models for convenient
+ SomeModel#some_attribute.foo.bar access to serialised JSON data.
+
+Wed Nov 20 01:39:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rdoc/constant.rb (RDoc::Constant#documented?): workaround for
+ NoMethodError when the original of alias is not found.
+
+Tue Nov 19 23:38:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (--with-os-version-style): option to transform target
+ OS version string.
+
+Tue Nov 19 21:27:33 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/net/http/utils.rb (spawn_server): Specify zero for port to
+ avoid reusing an allocated port.
+
+ * test/net/http/test_http.rb: Don't specify port here.
+
+ * test/net/http/test_https.rb: Ditto.
+
+Tue Nov 19 18:52:10 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (heap_is_swept_object): use heap_page::before_sweep flag.
+
+Tue Nov 19 18:49:32 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_objspace_reachable_objects_from_root): do major marking.
+
+Tue Nov 19 18:45:40 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_gc_resurrect): added.
+ rb_fstring() used rb_gc_mark() to avoid freeing used string.
+ However, rb_gc_mark() set mark bit *and* pushes mark_stack.
+ rb_gc_resurrect() does only set mark bit if it is before sweeping.
+
+ * string.c (rb_fstring): use rb_gc_resurrect.
+
+ * internal.h: add decl.
+
+Tue Nov 19 09:47:02 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rdoc: Update to RDoc master a1195ce. Changes include:
+
+ Improved accessibility of the main sidebar navigation.
+
+ Fixed handling of regexp options in HTML source highlighting.
+
+ * test/rdoc: ditto.
+
+Tue Nov 19 09:33:52 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 6a3d9f9. Changes include:
+
+ Compatibly renamed Gem::DependencyResolver to Gem::Resolver.
+
+ Added support for git gems in gem.deps.rb and Gemfile.
+
+ Fixed resolver bugs.
+
+ * test/rubygems: ditto.
+
+ * lib/rubygems/LICENSE.txt: Updated to license from RubyGems trunk.
+ [ruby-trunk - Bug #9086]
+
+ * lib/rubygems/commands/which_command.rb: RubyGems now indicates
+ failure when any file is missing. [ruby-trunk - Bug #9004]
+
+ * lib/rubygems/ext/builder: Extensions are now installed into the
+ extension install directory and the first directory in the require
+ path from the gem. This allows backwards compatibility with msgpack
+ and other gems that calculate full require paths.
+ [ruby-trunk - Bug #9106]
+
+
+Tue Nov 19 07:21:56 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in (LOCALTIME_OVERFLOW_PROBLEM): Define it for cross
+ compiling.
+ [ruby-core:58391] [Bug #9119] Reported by Luis Lavena.
+ Analyzed by Heesob Park.
+
+Tue Nov 19 05:55:05 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rdoc/rubygems_hook.rb: Remove debugging puts committed by
+ accident.
+
+Mon Nov 18 22:47:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval_intern.h (TH_PUSH_TAG, TH_EXEC_TAG): refine stack overflow
+ detection. chain local tag after setjmp() successed on it, because
+ calling setjmp() also can overflow the stack.
+ [ruby-dev:47804] [Bug #9109]
+
+ * vm_eval.c (rb_catch_obj): now th->tag points previous tag until
+ TH_EXEC_TAG().
+
+ * thread_pthread.c (ruby_init_stack): set stack_start properly by
+ get_main_stack() if possible.
+
+Mon Nov 18 22:45:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval_jump.c (rb_exec_end_proc): unlink and free procs data before
+ calling for each procs. [Bug #9110]
+
+Sun Nov 17 06:33:32 2013 Shota Fukumori <her@sorah.jp>
+
+ * configure.in: Use $LIBS for base of $SOLIBS, also in darwin.
+ By this fix, environment that libgmp is located in $LIBS can build
+ ruby.
+
+Sun Nov 17 01:56:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * thread_pthread.c (rb_thread_create_timer_thread): Show error
+ message instead of error number.
+ (thread_create_core): Ditto.
+
+ * cont.c (fiber_machine_stack_alloc): Ditto.
+
+Sat Nov 16 18:28:08 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/ultralightparser.rb
+ (REXML::Parsers::UltraLightParser#parse): Fix wrong :start_doctype
+ position.
+ [Bug #9061] [ruby-dev:47778]
+ Patch by Ippei Obayashi. Thanks!!!
+
+ * test/rexml/parser/test_ultra_light.rb: Add a test for this case.
+
+Sat Nov 16 02:13:56 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * cont.c : Introduce ensure rollback mechanism. Please see below.
+
+ * internal.h (ruby_register_rollback_func_for_ensure): catch up above change.
+ Add rollback mechanism API.
+
+ * vm_core.h (typedef struct rb_vm_struct): catch up above change.
+ Introduce ensure-rollback relation table.
+
+ * vm_core.h (typedef struct rb_thread_struct): catch up above change.
+ Introduce ensure stack.
+
+ * eval.c (rb_ensure): catch up above change.
+ Introduce ensure stack.
+
+ * hash.c : New function for rollback ensure, and register it to
+ ensure-rollback relation table. [ruby-dev:47803] [Bug #9105]
+
+ Ensure Rollback Mechanism:
+ A rollback's function is a function to rollback a state before ensure's
+ function execution.
+ When the jump of callcc is across the scope of rb_ensure,
+ ensure's functions and rollback's functions are executed appropriately
+ for keeping consistency.
+
+ Current API is unstable, and only internal use.
+
+ ruby_register_rollback_func_for_ensure(ensure_func,rollback_func)
+ This API create relation ensure's function to rollback's function.
+ By registered rollback's function, it is executed When jumping into
+ corresponding rb_ensure scope.
+
+Sat Nov 16 00:18:36 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * eval_jump.c (rb_exec_end_proc): fix double free or corruption error
+ when reentering by callcc. [ruby-core:58329] [Bug #9110]
+
+ * test/ruby/test_beginendblock.rb: test for above.
+
+Fri Nov 15 01:06:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/objspace/objspace_dump.c (dump_output): allow IO object as
+ output, and use Tempfile.create and return open file instead of
+ mkstemp() and path name for :file output.
+ [ruby-core:58266] [Bug #9102]
+
+ * test/objspace/test_objspace.rb (TestObjSpace#dump_my_heap_please):
+ remove temporary output file.
+
+Thu Nov 14 23:39:00 2013 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+
+ * ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] remove example of
+ Rational#to_d without argument. [Bug #8958]
+
+Thu Nov 14 20:24:15 2013 Naohisa Goto <ngotogenome@gmail.com>
+
+ * ruby_atomic.h (ATOMIC_SIZE_CAS): fix compile error on Solaris
+ since r43460.
+
+Thu Nov 14 19:53:00 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/openssl/test_cipher.rb (test_aes_gcm_wrong_tag): Don't use
+ String#succ because it can make modified (wrong) auth_tag longer
+ than 16 bytes. The longer auth_tag makes that
+ EVP_CIPHER_CTX_ctrl (and internally aes_gcm_ctrl) fail.
+ [ruby-core:55143] [Bug #8439] reported by Vit Ondruch.
+
+Thu Nov 14 11:33:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (foreach_safe_i, hash_foreach_iter): deal with error detected
+ by ST_CHECK.
+
+ * st.c (st_foreach_check): call with non-error argument in normal case.
+
+Thu Nov 14 02:37:14 2013 Zachary Scott <e@zzak.io>
+
+ * ext/thread/thread.c: [DOC] This patch accomplishes the following:
+
+ - Teach RDoc about ConditionVariable
+ - Teach RDoc about Queue
+ - Teach RDoc about SizedQueue
+ - Use fully-qualified namespace for Document-method
+ This is necessary to separate definitions between classes
+ - Fix rdoc bug in call_seq vs. call-seq
+ - Correct doc for SizedQueue#pop patch by @jackdanger [Bug #8988]
+
+Thu Nov 14 01:11:54 2013 Zachary Scott <e@zzak.io>
+
+ * ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] +precision+ is required
+
+Wed Nov 13 19:21:36 2013 Zachary Scott <e@zzak.io>
+
+ * ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] Document the required
+ +precision+ argument for Rational#to_d [Bug #8958]
+
+Wed Nov 13 19:02:05 2013 Zachary Scott <e@zzak.io>
+
+ * ext/digest/*: [DOC] Fix several typos and broken http links.
+ Improved examples for Digest overview and fixed a broken example in
+ Digest::HMAC overview. This patch also adds a description of
+ Digest::SHA256.bubblebabble to the Digest overview.
+
+ Patched by @stomar [Bug #9027]
+
+Wed Nov 13 18:32:12 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/ossl_config.c: [DOC] Document the following:
+
+ - OpenSSL::ConfigError
+ - OpenSSL::Config::DEFAULT_CONFIG_FILE
+
+ Patched by @vbatts via GH-436
+ https://github.com/ruby/ruby/pull/436
+
+Wed Nov 13 18:03:00 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/ossl_asn1.c: [DOC] Document parts of
+ OpenSSL::ASN1::ObjectId included a fix for the class overview, which
+ previously showed the documentation for Constructive due to missing
+ ObjectId overview. This patch also includes a note for Primitive.
+
+ Based on a patch by @vbatts via GH-436
+ https://github.com/ruby/ruby/pull/436
+
+Wed Nov 13 17:19:36 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/lib/openssl/config.rb: In #parse use +string+ for +str+
+
+Wed Nov 13 17:09:45 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/lib/openssl/*.rb: [DOC] Document the following:
+
+ - Integer#to_bn
+ - OpenSSL::Buffering module
+ - Deprecated OpenSSL::Digest::Digest compatibility class
+ - OpenSSL::Config
+
+ These changes were based on a patch by @vbatts via GH-436
+ https://github.com/ruby/ruby/pull/436
+
+Wed Nov 13 10:55:43 2013 Zachary Scott <e@zzak.io>
+
+ * doc/regexp.rdoc: [DOC] Fix typo in Special global variables section.
+ Reported by Alex Johnson on ruby-doc.org
+
+Wed Nov 13 10:43:19 2013 Zachary Scott <e@zzak.io>
+
+ * hash.c: [DOC] Adds an example for Hash#store
+
+Wed Nov 13 09:03:40 2013 Zachary Scott <e@zzak.io>
+
+ * doc/regexp.rdoc: [DOC] add note about Bug #4044 as suggested by
+ duerst-san in [ruby-core:43612] [Fixes GH-443] Patched by @rosenfeld
+ https://github.com/ruby/ruby/pull/443
+
+Tue Nov 12 10:15:14 2013 Eric Hodel <drbrain@segment7.net>
+
+ * test/rubygems/insure_session.rb: Remove unused test file.
+
+Tue Nov 12 09:16:24 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master b9213d7. Changes include:
+
+ Fixed tests on Windows (I hope) by forcing platform for
+ platform-dependent tests.
+
+ Fixed File.exists? warnings.
+
+ Improved testing infrastructure.
+
+ * test/rubygems: ditto.
+
+ * test/rdoc/test_rdoc_rubygems_hook.rb: Switch to util_spec like
+ RubyGems.
+
+Mon Nov 11 18:31:12 2013 Aman Gupta <ruby@tmm1.net>
+
+ * internal.h: move common string/hash flags to include file.
+ * ext/objspace/objspace_dump.c: remove flags shared above.
+ * hash.c: ditto.
+ * string.c: ditto.
+
+Mon Nov 11 04:36:14 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/specification.rb: Include 2.2.0.preview.2 when checking
+ if extensions should be built. Fixes a ruby-ci failure.
+ * test/rubygems/test_gem_specification.rb: Test for the above.
+
+Mon Nov 11 03:15:56 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (symbol2event_flag): add secret feature.
+ add a_call/a_return events.
+ a_call is call | b_call | c_call, and same as a_return.
+
+Mon Nov 11 02:51:17 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 4bdc4f2. Important changes
+ in this commit:
+
+ RubyGems now chooses the test server port reliably. Patch by akr.
+
+ Partial implementation of bundler's Gemfile format.
+
+ Refactorings to improve the new resolver.
+
+ Fixes bugs in the resolver.
+
+ * test/rubygems: Tests for the above.
+
+Mon Nov 11 01:02:06 2013 Zachary Scott <e@zzak.io>
+
+ * lib/timeout.rb: [DOC] Add note about change from #8730 [Fixes GH-440]
+ * NEWS: [DOC] Improve grammar on change to Timeout
+ Patched by @srawlins in https://github.com/ruby/ruby/pull/440
+
+Sun Nov 10 23:47:05 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * gc.c (rb_gcdebug_print_obj_condition): catch up recent changes
+ to compile on GC_DEBUG.
+
+Sun Nov 10 22:16:19 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (exc_cause): captured previous exception.
+
+ * eval.c (make_exception): capture previous exception automagically.
+ [Feature #8257]
+
+Sun Nov 10 08:37:20 2013 Zachary Scott <e@zzak.io>
+
+ * thread.c: [DOC] Remove duplicate reference
+
+Sun Nov 10 08:09:29 2013 Zachary Scott <e@zzak.io>
+
+ * lib/drb/drb.rb: [DOC] promote better windows-safe filename regular
+ expression in DRb Logger example. Reported by Chris Pheonix
+ [Bug #9074]
+
+Sun Nov 10 08:03:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (rb_define_finalizer, rb_undefine_finalizer): rename and export
+ finalizer functions.
+
+Sun Nov 10 07:41:22 2013 Zachary Scott <e@zzak.io>
+
+ * lib/weakref.rb: [DOC] fix typos by @xaviershay [Fixes GH-439]
+ https://github.com/ruby/ruby/pull/439
+
+Sun Nov 10 06:14:39 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): emit opt_str_freeze if the #freeze
+ method is called on a static string literal with no arguments.
+
+ * defs/id.def (firstline): add freeze so idFreeze is available
+
+ * insns.def (opt_str_freeze): add opt_str_freeze instruction which
+ pushes a frozen string literal without allocating a new object if
+ String#freeze is not overridden
+
+ * string.c (Init_String): define String#freeze
+
+ * vm.c (vm_init_redefined_flag): define BOP_FREEZE on String class as
+ a basic operation
+
+ * vm_insnhelper.h: ditto
+
+ [Feature #8992] [ruby-core:57705]
+
+Sun Nov 10 01:34:14 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (vm_malloc_increase): sweep immediately on GC due to malloc().
+ To reduce memory usage, sweep as soon as possible.
+ This behavior is same as Ruby 2.0.0 and before.
+
+Sun Nov 10 00:39:26 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc/gcbench.rb: output version description and GC::OPTS.
+
+Sun Nov 10 00:36:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (should_be_callable): allow private call since rb_eval_cmd
+ calls even private methods.
+
+Sun Nov 10 00:33:17 2013 Zachary Scott <e@zzak.io>
+
+ * lib/racc/rdoc/grammar.en.rdoc: [DOC] fix typo by Tsuyoshi Sawada
+ [Bug #9077]
+
+Sat Nov 9 22:35:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/rbinstall.rb (Gem::Specification.load): obtain spec date from
+ VCS for the case using git, RUBY_RELEASE_DATE is the last resort.
+ probably fixes [Bug #9085].
+
+Sat Nov 9 20:56:12 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * ext/objspace/object_tracing.c: use declarations in internal.h.
+
+ * ext/objspace/objspace.c: ditto
+
+Sat Nov 9 20:32:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/objspace/test_objspace.rb (test_dump_all): Make the test string
+ shorter to be an embedded string on 32bit environment as well as
+ 64bit environment.
+
+Sat Nov 9 15:00:16 2013 Zachary Scott <e@zzak.io>
+
+ * io.c: [DOC] ARGF.gets may return nil [Bug #9029] patch by znz
+
+Sat Nov 9 14:54:52 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rss/*: [DOC] document various constants @steveklabnik [Bug #8812]
+
+Sat Nov 9 14:50:09 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rss/rss.rb: [DOC] document Time#w3cdtf by @steveklabnik
+ [Bug #8821]
+
+Sat Nov 9 14:29:04 2013 Zachary Scott <e@zzak.io>
+
+ * ext/dl/cfunc.c: [DOC] fix typo in example [Bug #8944]
+ Patched by Heesob Park
+
+Sat Nov 9 13:59:58 2013 Zachary Scott <e@zzak.io>
+
+ * lib/test/unit/assertions.rb: [DOC] better example for assert_send()
+ Patch by Andrew Grimm [Bug #8975]
+
+Sat Nov 9 12:45:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * insns.def: unify ic_constant_serial and ic_class_serial into one field
+ ic_serial. This is possible because these fields are only ever used
+ exclusively with each other.
+
+ * insns.def: ditto
+ * vm_core.h: ditto
+ * vm_insnhelper.c: ditto
+
+Sat Nov 9 12:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * class.c: unify names of vm state version counters to 'serial'.
+ This includes renaming 'vm_state_version_t' to 'rb_serial_t',
+ 'method_state' to 'method_serial', 'seq' to 'class_serial',
+ 'vmstat' to 'constant_serial', etc.
+
+ * insns.def: ditto
+ * internal.h: ditto
+ * vm.c: ditto
+ * vm_core.h: ditto
+ * vm_insnhelper.c: ditto
+ * vm_insnhelper.h: ditto
+ * vm_method.c: ditto
+
+Sat Nov 9 09:22:29 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (gc_page_sweep, rgengc_rememberset_mark): Refactoring.
+ Get bitmaps directly.
+
+Sat Nov 9 09:16:36 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (RVALUE_PROMOTE_INFANT): Refactoring. Remove duplicated nonsense
+ code.
+
+Sat Nov 9 09:04:48 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (gc_marks_test): Bugfix. Fix a struct member name for build
+ with RGENGC_CHECK_MODE.
+
+Sat Nov 9 08:58:23 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c : Add GC_PROFILE_DETAIL_MEMORY option.
+ If GC_PROFILE_MORE_DETAIL && GC_PROFILE_DETAIL_MEMORY,
+ maxrss, minflt and majflt are added to each profile record.
+
+Sat Nov 9 07:41:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * internal.h (rb_vm_backtrace_object, rb_gc_count): make prototype
+ declarations, not old-K&R style.
+
+Sat Nov 9 06:11:14 2013 vo.x (Vit Ondruch) <vondruch@redhat.com>
+
+ * tool/rbinstall.rb (Gem::Specification#collect): make stable
+ Gem::Specification.files in default .gemspecs the different order of
+ "files" in .gemspec files makes them different therefore possibly
+ conflicting in multilib scenario. patch by vo.x (Vit Ondruch) at
+ [ruby-core:57544] [Bug #8623].
+
+Sat Nov 9 01:59:18 2013 Aman Gupta <ruby@tmm1.net>
+
+ * ext/objspace/objspace_dump.c: Add experimental methods to
+ dump objectspace as json: ObjectSpace.dump_all and
+ ObjectSpace.dump(obj). These methods are useful for debugging
+ reference leaks and memory growth in large ruby applications.
+ [Bug #9026] [ruby-core:57893] [Fixes GH-423]
+ * test/objspace/test_objspace.rb: tests for above.
+
+Sat Nov 9 00:26:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (GetLastError): already defined in windows.h on nowadays
+ cygwin, and caused the confliction with the system provided
+ definition on cygwin64. by @kou1okada [Fixes GH-433].
+
+Fri Nov 8 18:35:31 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * lib/open3.rb: receive arguments as keyword arguments.
+
+Fri Nov 8 13:19:26 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * io.c (rb_io_open_with_args): use RARRAY_CONST_PTR().
+
+ * io.c (rb_scan_open_args): use const qualifier for above.
+
+ * io.c (rb_open_file): ditto.
+
+ * io.c (rb_io_open_with_args): ditto.
+
+Fri Nov 8 11:35:06 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * dir.c, pack.c, ruby.c, struct.c, vm_eval.c: use RARRAY_CONST_PTR().
+
+Fri Nov 8 10:58:02 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * compile.c (iseq_build_from_ary_exception): use RARRAY_CONST_PTR().
+
+ * compile.c (iseq_build_from_ary_body): ditto.
+
+Fri Nov 8 10:49:34 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * enumerator.c (append_method): use RARRAY_CONST_PTR().
+
+ * enumerator.c (lazy_init_iterator): ditto.
+
+Fri Nov 8 02:44:29 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (vm_malloc_increase): check GVL before gc_rest_sweep().
+ vm_malloc_increase() can be called without GVL.
+ However, gc_rest_sweep() assumes acquiring GVL.
+ To avoid this problem, check GVL before gc_rest_sweep().
+ [Bug #9090]
+
+ This workaround introduces possibility to set malloc_limit as
+ wrong value (*1). However, this may be rare case. So I commit it.
+
+ *1: Without rest_sweep() here, gc_rest_sweep() can decrease
+ malloc_increase due to ruby_sized_xfree().
+
+Fri Nov 8 02:50:25 2013 Zachary Scott <e@zzak.io>
+
+ * lib/securerandom.rb: [DOC] specify arguments passed to ::random_bytes
+ By @chastell [Fixes GH-412] https://github.com/ruby/ruby/pull/412
+
+Fri Nov 8 02:43:01 2013 Zachary Scott <e@zzak.io>
+
+ * ext/objspace/object_tracing.c: [DOC] trace_object_allocations_stop
+ By @srawlins [Fixes GH-421] https://github.com/ruby/ruby/pull/421
+
+Fri Nov 8 02:34:20 2013 Zachary Scott <e@zzak.io>
+
+ * lib/net/ftp.rb: [DOC] Document Net::FTP.mdtm and .set_socket and fix
+ spelling typo, based on patch by @artfuldodger [Fixes GH-426]
+ https://github.com/ruby/ruby/pull/426
+
+Fri Nov 8 02:14:37 2013 Zachary Scott <e@zzak.io>
+
+ * array.c: [DOC] Add note about negative indices in Array overview
+ By @ckaenzig [Fixes GH-427] https://github.com/ruby/ruby/pull/427
+
+Fri Nov 8 02:09:12 2013 Zachary Scott <e@zzak.io>
+
+ * lib/csv.rb: [DOC] Fix typo in CSV.parse_line by @funky-bibimbap
+ [Fixes GH-430] https://github.com/ruby/ruby/pull/430
+
+Fri Nov 8 01:01:54 2013 Zachary Scott <e@zzak.io>
+
+ * golf_prelude.rb: syntax formatting for whitespace [Fixes GH-425]
+ Patch by @edward https://github.com/ruby/ruby/pull/425
+
+Thu Nov 7 19:36:09 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: modify malloc_limit strategy.
+
+ * fix default values:
+ GC_MALLOC_LIMIT_GROWTH_FACTOR
+ GC_MALLOC_LIMIT: 8MB -> 16MB
+ GC_MALLOC_LIMIT_MAX: 384MB -> 32MB
+
+ * algorithm of malloc_limit increment.
+ if (malloc_increase < malloc_limit) {
+ next_malloc_limit = malloc_limit * factor
+ if (malloc_limit > malloc_limit_max) {
+ malloc_limit = malloc_increase
+ }
+ }
+ This algorithm change malloc_limit from
+ 16MB -> 32MB slowly.
+ If malloc_limit exceeds malloc_limit_max, then
+ increase with malloc_increase.
+
+Thu Nov 7 11:06:05 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_shuffle_bang): use RARRAY_PTR_USE() without WB
+ because there are not new relations.
+
+Thu Nov 7 10:34:12 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_sample): use rb_ary_dup().
+
+Thu Nov 7 09:39:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_trace.c (rb_threadptr_exec_event_hooks_orig): errinfo should not
+ be propagated to trace blocks so that no argument raise does not
+ throw internal objects. [ruby-dev:47793] [Bug #9088]
+
+Wed Nov 6 21:30:55 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (gc_before_sweep): Change algorithm of malloc_limit to
+ conservative for closing to memory consumption of ruby 2.0.
+
+ * gc.c (GC_MALLOC_LIMIT, GC_MALLOC_LIMIT_GROWTH_FACTOR):
+ Adjust parameters for new algorithm.
+
+Wed Nov 6 21:16:51 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_shift_m): use RARRAY_PTR_USE() without WB because
+ there are not new relations.
+
+Wed Nov 6 21:05:20 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_reverse): use RARRAY_PTR_USE().
+
+Wed Nov 6 19:30:44 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * common.mk (help): add texts about gcbench.
+
+Wed Nov 6 16:32:32 2013 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * lib/open3.rb: tweaked grammar in comments
+
+Wed Nov 6 11:46:36 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_sample): use RARRAY_AREF() and RARRAY_PTR_USE()
+ instead of RARRAY_PTR().
+
+Wed Nov 6 10:37:07 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_and): defer hash creation and some refactoring.
+
+Wed Nov 6 09:14:31 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/bm_vm1_gc_short_lived.rb: added.
+ These GC benchmarks do not reflect practical applications.
+ They are only for tuning.
+
+ * benchmark/bm_vm1_gc_short_with_complex_long.rb: added.
+
+ * benchmark/bm_vm1_gc_short_with_long.rb: added.
+
+ * benchmark/bm_vm1_gc_short_with_symbol.rb: added.
+
+ * benchmark/bm_vm1_gc_wb_ary.rb: added.
+
+ * benchmark/bm_vm1_gc_wb_obj.rb: added.
+
+ * benchmark/bm_vm_thread_queue.rb: added.
+ This benchmark is added to know how fast C version of thread.so.
+
+Wed Nov 6 09:13:32 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: define RGENGC_ESTIMATE_OLDSPACE == 0 if USE_RGENGC is 0.
+
+Wed Nov 6 07:13:18 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (Init_GC): add GC::OPTS to show options.
+
+Wed Nov 6 07:12:17 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc/gcbench.rb: add some options to make quiet.
+
+Wed Nov 6 04:14:25 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/to_ruby.rb: process merge keys before
+ reviving objects. Fixes GH psych #168
+ * test/psych/test_merge_keys.rb: test for change
+ https://github.com/tenderlove/psych/issues/168
+
+Tue Nov 5 21:21:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_thread.rb (test_thread_join_in_trap):
+ Run the test in a different process.
+
+Tue Nov 5 20:14:32 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (is_live_object): A hidden object may be a live object.
+ [ruby-dev:47788] [Bug #9072]
+
+Tue Nov 5 13:37:19 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: add support to estimate increase of oldspace memory usage.
+ This is another approach to solve an issue discussed at r43530.
+ This feature is disabled as default.
+
+ This feature measures an increment of memory consumption by oldgen
+ objects. It measures memory consumption for each objects when
+ the object is promoted. However, measurement of memory consumption
+ is not accurate now. So that this measurement is `estimation'.
+
+ To implement this feature, move memsize_of() function from
+ ext/objspace/objspace.c and expose rb_obj_memsize_of().
+
+ Some memsize() functions for T_DATA (T_TYPEDDATA) have problem to
+ measure memory size, so that we ignores T_DATA objects now.
+ For example, some functions skip NULL check for pointer.
+
+ The macro RGENGC_ESTIMATE_OLDSPACE enables/disables this feature,
+ and turned off as default.
+
+ We need to compare 3gen GC and this feature carefully.
+ (it is possible to enable both feature)
+ We need a help to compare them.
+
+ * internal.h: expose rb_obj_memsize_of().
+
+ * ext/objspace/objspace.c: use rb_obj_memsize_of() function.
+
+ * cont.c (fiber_memsize): fix to check NULL.
+
+ * variable.c (autoload_memsize): ditto.
+
+ * vm.c (vm_memsize): ditto.
+
+Tue Nov 5 04:03:07 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (GC_MALLOC_LIMIT_MAX): fix default value 512MB -> 384MB.
+ 512MB is huge.
+
+Tue Nov 5 03:31:23 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: add 3gen GC patch, but disabled as default.
+
+ RGenGC is designed as 2 generational GC, young and old generation.
+ Young objects will be promoted to old objects after one GC.
+ Old objects are not collect until major (full) GC.
+
+ The issue of this approach is some objects can promoted as old
+ objects accidentally and not freed until major GC.
+ Major GC is not frequently so short-lived but accidentally becoming
+ old objects are not freed.
+
+ For example, the program "loop{Array.new(1_000_000)}" consumes huge
+ memories because short lived objects (an array which has 1M
+ elements) are promoted while GC and they are not freed before major
+ GC.
+
+ To solve this problem, generational GC with more generations
+ technique is known. This patch implements three generations gen GC.
+
+ At first, newly created objects are "Infant" objects.
+ After surviving one GC, "Infant" objects are promoted to "Young"
+ objects.
+ "Young" objects are promoted to "Old" objects after surviving
+ next GC.
+ "Infant" and "Young" objects are collected if it is not marked
+ while minor GC. So that this technique solves this problem.
+
+ Representation of generations:
+ * Infant: !FL_PROMOTED and !oldgen_bitmap [00]
+ * Young : FL_PROMOTED and !oldgen_bitmap [10]
+ * Old : FL_PROMOTED and oldgen_bitmap [11]
+
+ The macro "RGENGC_THREEGEN" enables/disables this feature, and
+ turned off as default because there are several problems.
+ (1) Failed sometimes (Heisenbugs).
+ (2) Performance down.
+ Especially on write barriers. We need to detect Young or Old
+ object by oldgen_bitmap. It is slower than checking flags.
+
+ To evaluate this feature on more applications, I commit this patch.
+ Reports are very welcome.
+
+ This patch includes some refactoring (renaming names, etc).
+
+ * include/ruby/ruby.h: catch up 3gen GC.
+
+ * .gdbinit: fix to show a prompt "[PROMOTED]" for promoted objects.
+
+Tue Nov 5 00:05:51 2013 Koichi Sasada <ko1@atdot.net>
+
+ * node.h: catch up comments for last commit.
+
+Tue Nov 5 00:02:00 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: rename FL_OLDGEN to FL_PROMOTED.
+ This flag represents that "this object is promoted at least once."
+
+ * gc.c, debug.c, object.c: catch up this change.
+
+Mon Nov 4 22:20:16 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/xmlrpc: Don't use fixed ports: 8070 and 8071.
+
+Mon Nov 4 15:25:52 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/xmlrpc/webrick_testing.rb (start_server): Initialize the server
+ at main thread to fail early.
+
+Mon Nov 4 10:08:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval_intern.h (TH_EXEC_TAG, TH_JUMP_TAG): get rid of undefined
+ behavior of setjmp() in rhs of assignment expression.
+ [ISO/IEC 9899:1999] 7.13.1.1
+
+Sun Nov 3 23:06:51 2013 Tanaka Akira <akr@fsij.org>
+
+ * sample/test.rb: Make temporary file names unique.
+
+Sun Nov 3 20:41:17 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/xmlrpc: Wrap definitions by TestXMLRPC module.
+
+Sun Nov 3 20:23:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/xmlrpc/webrick_testing.rb (stop_server): Don't try to shutdown
+ the server if the server is not started.
+
+Sun Nov 3 09:35:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (rb_feature_p): deal with default loadable suffixes.
+
+ * load.c (load_lock): initialize statically linked extensions.
+
+ * load.c (search_required, rb_require_safe): deal with statically
+ linked extensions.
+
+ * load.c (ruby_init_ext): defer initialization of statically linked
+ extensions until required actually. [Bug #8883]
+
+Sat Nov 2 15:14:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/logger.rb (Logger::LogDevice::LogDeviceMutex#lock_shift_log):
+ open file can't be removed or renamed on Windows. [ruby-dev:47790]
+ [Bug #9046]
+
+ * test/logger/test_logger.rb (TestLogDevice#run_children): don't use
+ fork.
+
+Sat Nov 2 07:08:43 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/logger.rb: Inter-process locking for log rotation
+ Current implementation fails log rotation on multi process env.
+ by sonots <sonots@gmail.com>
+ https://github.com/ruby/ruby/pull/428 fix GH-428 [Bug #9046]
+
+Fri Nov 1 23:24:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (wmap_mark_map): mark live objects only, but delete zombies.
+ [ruby-dev:47787] [Bug #9069]
+
+Fri Nov 1 22:45:54 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (struct heap_page, gc_page_sweep, gc_sweep): Refactoring for
+ performance. Add before_sweep condition to heap_page structure.
+
+ * gc.c (rb_gc_force_recycle): Use before_sweep member.
+
+ * gc.c (heap_is_before_sweep, is_before_sweep): Remove. They have not
+ already been used.
+
+Fri Nov 1 22:20:28 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (make_deferred): Refactoring. Collect codes which should be
+ atomic.
+
+ * gc.c (make_io_deferred, obj_free, rb_objspace_call_finalizer,
+ gc_page_sweep): Correspond to the above.
+
+Fri Nov 1 21:40:35 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (typedef struct rb_objspace): Refactoring. Move some members
+ into profile member.
+
+ * gc.c (newobj_of): Correspond to the above.
+
+ * gc.c (finalize_list): Ditto.
+
+ * gc.c (objspace_live_num): Ditto.
+
+ * gc.c (gc_page_sweep): Ditto.
+
+ * gc.c (rb_gc_force_recycle): Ditto.
+
+ * gc.c (garbage_collect_body): Ditto.
+
+ * gc.c (rb_gc_count): Ditto.
+
+ * gc.c (gc_stat): Ditto.
+
+ * gc.c (gc_prof_set_heap_info): Ditto.
+
+ * gc.c (gc_profile_dump_on): Ditto.
+
+Fri Nov 1 20:53:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_scrub): fix typo, should yield invalid byte
+ sequence to be scrubbed. reported by znz at IRC.
+
+Fri Nov 1 17:25:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (is_live_object): finalizer may not run because of lazy-sweep.
+ [ruby-dev:47786] [Bug #9069]
+
+Fri Nov 1 16:55:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_scrub): export with fixed length arguments, and
+ allow nil as replacement string instead of omitting.
+
+Fri Nov 1 06:20:44 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread.c (rb_mutex_struct): reduce rb_mutex_t size by 8 bytes
+ on 64bit platform. Patch by Eric Wong. [Feature #9068][ruby-core:58114]
+
+Fri Nov 1 01:08:33 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc/gcbench.rb: print HWM (high water mark) if possible.
+
+Thu Oct 31 21:48:31 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/streamparser.rb: Add dependency file require.
+ [Bug #9062] [ruby-dev:47779]
+ Reported by Ippei Obayashi. Thanks!!!
+
+Thu Oct 31 14:09:32 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (rb_method_entry_make): fix to pass an ISeq value.
+ OBJ_WRITTEN() accepts only VALUE.
+
+Wed Oct 30 19:07:57 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-additional.el (ruby-brace-to-do-end)
+ (ruby-do-end-to-brace, ruby-toggle-block): Remove functions that
+ are already in the latest released version of Emacs (24.3).
+ [Bug #7565]
+
+Wed Oct 30 12:44:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/Makefile.sub (config.status): add missing variables,
+ PLATFORM_DIR and THREAD_MODEL.
+
+Wed Oct 30 12:20:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * time.c (v2w): Normalize a rational value to an integer if possible.
+ [ruby-core:58070] [Bug #9059] reported by Isaac Schwabacher.
+
+Wed Oct 30 12:08:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_uniq_bang): use rb_ary_modify_check() instead of
+ rb_ary_modify() because the array will be unshared soon.
+
+Wed Oct 30 03:25:10 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: make less garbage when
+ testing if a string is binary.
+
+Wed Oct 30 03:08:24 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: string subclasses should
+ not be considered to be binary. Fixes Psych / GH 166
+ https://github.com/tenderlove/psych/issues/166
+
+ * test/psych/test_string.rb: test for fix
+
+Tue Oct 29 23:01:18 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_zip): some refactoring.
+
+Tue Oct 29 22:11:37 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_uniq_bang): use st_foreach() instead of for loop.
+
+Tue Oct 29 20:01:58 2013 Koichi Sasada <ko1@atdot.net>
+
+ * add RUBY_TYPED_FREE_IMMEDIATELY to data types which only use
+ safe functions during garbage collection such as xfree().
+
+ On default, T_DATA objects are freed at same points as finalizers.
+ This approach protects issues such as reported by [ruby-dev:35578].
+ However, freeing T_DATA objects immediately helps heap usage.
+
+ Most of T_DATA (in other words, most of dfree functions) are safe.
+ However, we turned off RUBY_TYPED_FREE_IMMEDIATELY by default
+ for safety.
+
+ * cont.c: ditto.
+
+ * dir.c: ditto.
+
+ * encoding.c: ditto.
+
+ * enumerator.c: ditto.
+
+ * error.c: ditto.
+
+ * file.c: ditto.
+
+ * gc.c: ditto.
+
+ * io.c: ditto.
+
+ * iseq.c: ditto.
+
+ * marshal.c: ditto.
+
+ * parse.y: ditto.
+
+ * proc.c: ditto.
+
+ * process.c: ditto.
+
+ * random.c: ditto.
+
+ * thread.c: ditto.
+
+ * time.c: ditto.
+
+ * transcode.c: ditto.
+
+ * variable.c: ditto.
+
+ * vm.c: ditto.
+
+ * vm_backtrace.c: ditto.
+
+ * vm_trace.c: ditto.
+
+ * ext/bigdecimal/bigdecimal.c: ditto.
+
+ * ext/objspace/objspace.c: ditto.
+
+ * ext/stringio/stringio.c: ditto.
+
+ * ext/strscan/strscan.c: ditto.
+
+Tue Oct 29 19:48:33 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: fix typo (FL_WB_PROTECT -> FL_WB_PROTECTED).
+
+Tue Oct 29 18:45:08 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (tp_free): removed because empty free function.
+ Use RUBY_TYPED_NEVER_FREE instead.
+
+Tue Oct 29 18:37:33 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: introduce new flags for T_TYPEDDATA.
+ * RUBY_TYPED_FREE_IMMEDIATELY: free the data given by DATA_PTR()
+ with dfree function immediately. Otherwise (default), the data
+ freed at finalization point.
+ * RUBY_TYPED_WB_PROTECTED: make this object with FL_WB_PROTECT
+ (not shady).
+
+ * gc.c (obj_free): support RUBY_TYPED_FREE_IMMEDIATELY.
+
+Tue Oct 29 16:49:03 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (vm_malloc_increase): decrease it more carefully.
+
+Tue Oct 29 16:24:52 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (heap_page_resurrect): return a page in tomb heap even if
+ freelist is NULL.
+
+Tue Oct 29 15:46:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby_atomic.h (ATOMIC_SIZE_CAS): new macro, compare and swap size_t.
+
+Tue Oct 29 12:08:05 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/readline/readline.c (readline_getc): Consider
+ NULL as input.
+
+Tue Oct 29 11:10:08 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (gc_profile_total_time): fix off-by-one error in
+ GC::Profiler.total_time.
+ * test/ruby/test_gc.rb (class TestGc): test for above.
+
+Tue Oct 29 09:53:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * insns.def, vm.c, vm_insnhelper.c, vm_insnhelper.h, vm_method.c: split
+ ruby_vm_global_state_version into two separate counters - one for the
+ global method state and one for the global constant state. This means
+ changes to constants do not affect method caches, and changes to
+ methods do not affect constant caches. In particular, this means
+ inclusions of modules containing constants no longer globally
+ invalidate the method cache.
+
+ * class.c, eval.c, include/ruby/intern.h, insns.def, vm.c, vm_method.c:
+ rename rb_clear_cache_by_class to rb_clear_method_cache_by_class
+
+ * class.c, include/ruby/intern.h, variable.c, vm_method.c: add
+ rb_clear_constant_cache
+
+ * compile.c, vm_core.h, vm_insnhelper.c: rename vmstat field in
+ rb_call_info_struct to method_state
+
+ * vm_method.c: rename vmstat field in struct cache_entry to method_state
+
+Mon Oct 28 23:26:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/readline/test_readline.rb (teardown): Clear Readline.input and
+ Readline.output.
+
+Mon Oct 28 21:35:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/-test-/file/depend, ext/-test-/postponed_job/depend,
+ ext/-test-/tracepoint/depend: New files for dependencies.
+
+Mon Oct 28 15:32:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/openssl/depend (ossl.o): work around of dependency of
+ thread_native.h, which depends on headers by THREAD_MODEL.
+ [ruby-dev:47777]
+
+ * ext/openssl/extconf.rb: need THREAD_MODEL.
+
+Mon Oct 28 14:57:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (ruby_init_ext): share feature names between frame name and
+ provided features.
+
+Mon Oct 28 14:41:27 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el: Import ruby-electric.el 2.1 from
+ https://github.com/knu/ruby-electric.el.
+
+ * Hitting the newline-and-indent key within a comment fires
+ comment-indent-new-line.
+
+ * Introduce a new feature
+ `ruby-electric-autoindent-on-closing-char`.
+
+ * Fix fallback behavior of ruby-electric-space/return that
+ caused error with auto-complete.
+
+Mon Oct 28 13:17:17 2013 Or Cohen <orc@fewbytes.com>
+
+ * error.c (name_err_to_s): remove no longer needed overriding, since
+ r30455 which made exc_to_s almost same. Fixes [GH-413].
+
+Mon Oct 28 12:42:11 2013 Tanaka Akira <akr@fsij.org>
+
+ * common.mk, ext/objspace/depend, ext/coverage/depend,
+ ext/-test-/debug/depend, ext/date/depend: Update dependencies.
+
+Mon Oct 28 09:29:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * vm.c: vm_clear_all_cache is not necessary now we use a 64 bit counter
+ for global state version.
+
+ * vm_insnhelper.h: ruby_vm_global_state_version overflow is unnecessary
+
+Mon Oct 28 07:47:32 2013 Aman Gupta <ruby@tmm1.net>
+
+ * vm_backtrace.c (rb_profile_frame_classpath): do not use rb_inspect
+ directly, since it might have a custom implementation or show ivars.
+
+Mon Oct 28 04:10:41 2013 Aman Gupta <ruby@tmm1.net>
+
+ * vm_backtrace.c (rb_profile_frame_classpath): handle singleton
+ methods defined directly on an object.
+ * test/-ext-/debug/test_profile_frames.rb: test for above.
+
+Mon Oct 28 00:52:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * struct.c (new_struct): fix warning message, class name and encoding.
+
+Sun Oct 27 20:53:08 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/readline/readline.c: Include ruby/thread.h for
+ rb_thread_call_without_gvl2.
+ (readline_rl_instream, readline_rl_outstream): Record FILE
+ structures allocated by this extension.
+ (getc_body): New function extracted from readline_getc.
+ (getc_func): New function.
+ (readline_getc): Use rb_thread_call_without_gvl2 to invoke getc_func.
+ [ruby-dev:47033] [Bug #8749]
+ (clear_rl_instream, clear_rl_outstream): Close FILE structure
+ allocated by this extension reliably. [ruby-core:57951] [Bug #9040]
+ (readline_readline): Use clear_rl_instream and clear_rl_outstream.
+ (readline_s_set_input): Set readline_rl_instream.
+ (readline_s_set_output): Set readline_rl_outstream.
+ (Init_readline): Don't call readline_s_set_input because
+ readline_getc doesn't block other threads for any FILE structure now.
+
+ [ruby-dev:47033] [Bug #8749] reported by Nobuhiro IMAI.
+ [ruby-core:57951] [Bug #9040] reported by Eamonn Webster.
+
+Sat Oct 26 19:31:28 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * gc.c: catch up recent changes to compile on GC_DEBUG,
+ RGENGC_CHECK_MODE.
+
+Sat Oct 26 19:08:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * range.c (range_initialize_copy): disallow to modify after
+ initialized.
+
+Sat Oct 26 17:48:54 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/open-uri.rb (meta_add_field): : Re-implemented.
+ [ruby-core:58017] [Bug #9051] patch by Eamonn Webster.
+
+Sat Oct 26 14:35:09 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_profile_dump_on): use "Page" terminology.
+
+Sat Oct 26 13:25:45 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_sweep, gc_heap_lazy_sweep): fix measurement code.
+ We only need one sweep time measurement without lazy sweep.
+
+Sat Oct 26 11:59:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * addr2line.c: Include ELF header after system headers (especially
+ sys/types.h) to avoid compilation failure,
+ "usr/include/sh3/elf_machdep.h:4:2: error: #error Define _BYTE_ORDER!",
+ on NetBSD/sh3 (dreamcast, hpcsh, landisk, mmeye).
+
+Sat Oct 26 11:35:22 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: tuning parameters.
+
+ * gc.c (GC_MALLOC_LIMIT): change default value to 16MB.
+
+ * gc.c (GC_MALLOC_LIMIT_GROWTH_FACTOR): change default value to 2.0.
+
+ * gc.c (gc_before_sweep): change decrease ratio of `malloc_limit'
+ from 1/4 to 1/10.
+
+Sat Oct 26 11:30:07 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (vm_malloc_increase): do gc_rest_sweep() before GC.
+ gc_rest_sweep() can reduce malloc_increase, so try it before GC.
+ Otherwise, malloc_increase can be less than malloc_limit at
+ gc_before_sweep(). This means that re-calculation of malloc_limit
+ may be wrong value.
+
+Sat Oct 26 06:35:41 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (gc_before_heap_sweep): Restructure code to mean clearly.
+ heap->freelist is connected to end of list.
+
+Sat Oct 26 04:01:35 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_before_heap_sweep): fix freelist management.
+ After rb_gc_force_recycle() for a object belonging to heap->freelist,
+ `heap->using_page->freelist' is not null.
+
+Thu Oct 24 21:57:24 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * parse.y: Remove +(binary) and -(binary) special cases
+ [Feature #9048]
+
+Thu Oct 24 12:45:53 2013 Zachary Scott <e@zzak.io>
+
+ * object.c: [DOC] Document first argument also takes string for:
+
+ rb_mod_const_get, rb_mod_const_set, rb_mod_const_defined
+
+ Also added note about NameError exception for invalid constant name
+
+Thu Oct 24 12:23:58 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread.c (rb_thread_terminate_all): add a comment why we need
+ state check and call terminate_i again.
+
+Thu Oct 24 12:15:02 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread.c (rb_thread_terminate_all): add a comment why infinite
+ sleep is safe.
+
+Thu Oct 24 07:41:42 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c: add new initial_growth_max tuning parameter.
+ [ruby-core:57928] [Bug #9035]
+ * gc.c (heap_set_increment): when initial_growth_max is set,
+ do not grow number of slots by more than growth_max at a time.
+ * gc.c (rb_gc_set_params): load optional new tuning value from
+ RUBY_HEAP_SLOTS_GROWTH_MAX environment variable.
+ * test/ruby/test_gc.rb (class TestGc): test for above.
+
+Thu Oct 24 01:34:12 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/win32.h (rb_infinity_float): suppress overflow in
+ constant arithmetic warnings. [ruby-core:57981] [Bug #9044]
+
+Thu Oct 24 00:11:24 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/ostruct.rb: raise NoMethodError with a #name and #args.
+ Raise RuntimeError when modifying frozen instances
+ instead of TypeError.
+ (OpenStruct#each_pair): Return an enumerator with size
+ (OpenStruct#delete): Use the converted argument.
+ Patches by Kenichi Kamiya. [Fixes GH-383]
+
+ * test/ostruct/test_ostruct.rb: Added tests for above.
+
+Thu Oct 24 00:10:22 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * array.c: Add Array#to_h [Feature #7292]
+
+ * enum.c: Add Enumerable#to_h
+
+Wed Oct 23 23:48:28 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c: Rename free_min to min_free_slots and free_min_page to
+ max_free_slots. The algorithm for heap growth is:
+ if (swept_slots < min_free_slots) pages++
+ if (swept_slots > max_free_slots) pages--
+
+Wed Oct 23 22:51:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/Makefile.sub (config.h): VC 2013 supports C99 mathematics
+ functions. [ruby-core:57981] [Bug #9044]
+
+Wed Oct 23 19:13:18 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: move increment from heap to heap_pages.
+ Share `increment' information with heaps.
+
+ * gc.c: change ratio of heap_pages_free_min_page
+ to 0.80.
+ This change means slow down page freeing speed.
+
+Wed Oct 23 17:52:03 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (heap_pages_free_unused_pages): cast to (int) for size_t
+ variable `i'.
+
+Wed Oct 23 17:39:35 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: introduce tomb heap.
+ Tomb heap is where zombie objects and ghost (freed slot) lived in.
+ Separate from other heaps (now there is only eden heap) at sweeping
+ helps freeing pages more efficiently.
+ Before this patch, even if there is an empty page at former phase
+ of sweeping, we can't free it.
+
+ Algorithm:
+ (1) Sweeping all pages in a heap and move empty pages from the
+ heap to tomb_heap.
+ (2) Check all existing pages and free a page
+ if all slots of this page are empty and
+ there is enough empty slots (checking by swept_num)
+
+ To introduce this patch, there are several tuning of GC parameters.
+
+Wed Oct 23 14:20:56 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_prof_sweep_timer_stop): catch up recent changes
+ to compile on GC_PROFILE_MORE_DETAIL=1.
+
+Wed Oct 23 11:43:27 2013 Zachary Scott <e@zzak.io>
+
+ * file.c: [DOC] fix rdoc format of File#expand_path from r43386
+
+Tue Oct 22 21:58:28 2013 URABE Shyouhei <shyouhei@ruby-lang.org>
+
+ * vm_core.h (enum): avoid syntax error.
+
+ * method.h: ditto.
+
+ * internal.h: ditto.
+
+Tue Oct 22 19:53:16 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (Init_heap): move logics from heap_pages_init() and remove
+ heap_pages_init().
+
+Tue Oct 22 19:19:05 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: allow multiple heaps.
+ Now, objects are managed by page. And a set of pages is called heap.
+ This commit supports multiple heaps in the object space.
+
+ * Functions heap_* and rb_heap_t manages heap data structure.
+ * Functions heap_page_* and struct heap_page manage page data
+ structure.
+ * Functions heap_pages_* and struct rb_objspace_t::heap_pages
+ maintains all pages.
+ For example, pages are allocated from the heap_pages.
+
+ See https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/GC_design
+ and https://bugs.ruby-lang.org/attachments/4015/data-heap_structure_with_multiple_heaps.png
+ for more details.
+
+ Now, there is only one heap called `eden', which is a space for all
+ new generated objects.
+
+Tue Oct 22 18:26:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/pp.rb (object_address_group): Use Kernel#to_s to obtain the class
+ name and object address.
+ This fix a problem caused by %p in C generates variable length
+ address.
+ Reported by ko1 via IRC.
+
+Tue Oct 22 16:57:48 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * file.c (File#expand_path): [DOC] improve documentation of File#expand_path.
+ Based on patch by Prathamesh Sonpatki. [ruby-core:57734] [Bug #9002]
+
+Tue Oct 22 15:59:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (glob_helper): don't skip current directories if FNM_DOTMATCH
+ is given. [ruby-core:53108] [Bug #8006]
+
+Tue Oct 22 14:53:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c: exterminate Zombies.
+ There is a bug that T_ZOMBIE objects are not collected.
+ Because there is a pass to miss finalizer postponed job
+ with multi-threading. This patch solve this issue.
+
+ * vm_trace.c (rb_postponed_job_register_one): set
+ RUBY_VM_SET_POSTPONED_JOB_INTERRUPT(th) if another same job
+ is registered.
+ There is a possibility to remain a postponed job without
+ interrupt flag.
+
+ * vm_trace.c (rb_postponed_job_register_one): check interrupt
+ carefully.
+
+ * vm_trace.c (rb_postponed_job_register_one): use additional space
+ to avoid buffer full.
+
+ * gc.c (gc_finalize_deferred_register): check failure.
+
+ * thread.c (rb_threadptr_execute_interrupts): check
+ `postponed_job_interrupt' immediately. There is a possibility
+ to miss this flag.
+
+Tue Oct 22 12:11:16 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: check if the given CFLAGS and LDFLAGS are working, and
+ bail out early if not.
+
+Tue Oct 22 00:06:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_exists_p): warn deprecated name. [Bug #9041]
+
+Mon Oct 21 23:57:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (load_encoding): should preserve outer errinfo, so that
+ expected exception may not be lost. [ruby-core:57949] [Bug #9038]
+
+Sun Oct 20 15:41:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_reopen): create a new, temporary FD via rb_sysopen and
+ call rb_cloexec_dup2 on it to atomically replace the file fptr->fd
+ points to. This leaves no possible window where fptr->fd is invalid
+ to userspace (even for any threads running w/o GVL). based on the
+ patch by Eric Wong <normalperson@yhbt.net> at [ruby-core:57943].
+ [Bug #9036]
+
+Sun Oct 20 15:29:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (rb_syserr_fail_path_in): new function split from
+ rb_sys_fail_path_in to raise SystemCallError without errno.
+
+ * internal.h (rb_syserr_fail_path): like rb_sys_fail_path but without
+ errno.
+
+Sun Oct 20 13:58:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (rb_obj_wb_unprotect, rb_obj_written),
+ (rb_obj_write): suppress unused-parameter warnings.
+
+Sun Oct 20 10:32:48 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update RubyGems to master 0886307. This commit
+ improves documentation and should bring ruby above 75% documented on
+ rubyci.
+
+Sun Oct 20 09:30:56 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 3de7e0f. Changes:
+
+ Only attempt to build extensions for newly-installed gems. This
+ prevents compilation attempts at gem activation time for gems that
+ already have extensions built.
+
+ Fix crash in the dependency resolver for dependencies that cannot be
+ resolved.
+
+ * test/rubygems: ditto.
+
+Sun Oct 20 05:24:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * variable.c (rb_class2name): should return real class name, not
+ singleton class or iclass.
+
+Sun Oct 20 04:18:48 2013 Aman Gupta <ruby@tmm1.net>
+
+ * variable.c (rb_class2name): call rb_tmp_class_path() directly to
+ avoid extra rb_str_dup() from rb_class_name().
+
+Sat Oct 19 19:59:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/file.c (code_page): use simple array instead of st_table.
+
+ * encoding.c (rb_locale_encindex): defer initialization of win32 code
+ page table until encoding db loaded.
+
+Sat Oct 19 08:25:05 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: fix rb_objspace_t.
+ * make "struct heap" and move most of variables
+ in rb_objspace_t::heap.
+ * rename rb_objspace_t::heap::sorted to
+ rb_objspace_t::heap_sorted_pages
+ and make a macro heap_sorted_pages.
+ * rename rb_objspace_t::heap::range to
+ rb_objspace_t::heap_range and rename macros
+ lomem/himem to heap_lomem/heap_himem.
+
+Sat Oct 19 07:14:40 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 42543b6. Changes:
+
+ Fix `gem update` for gems with multiple platforms.
+
+ * test/rubygems: ditto.
+
+Sat Oct 19 06:55:52 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 0a3814b. Changes:
+
+ Fixed extension directory in Gem::Specification#require_paths.
+
+ Allow installation of gems when $HOME is nonexistent or unwritable.
+
+ Use proper API in InstallCommand.
+
+ Improve support for path option in gem dependency files.
+
+ Remove warnings.
+
+ * test/rubygems: ditto.
+
+Fri Oct 18 15:23:34 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: change terminology of heap.
+ Change "slot" to "page". "Slot" is a space of RVALUE.
+ 1. "Heap" consists of a set of "heap_page"s (pages).
+ 2. Each "heap_page" has "heap_page_body".
+ 3. "heap_page_body" has RVALUE (a.k.a. "slot") spaces.
+ 4. "sorted" is a sorted array of "heap_page"s, sorted
+ by address of heap_page_body (for "is_pointer_to_heap").
+
+ See https://bugs.ruby-lang.org/attachments/4008/data-heap_structure.png.
+
+Fri Oct 18 09:40:43 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master cee6788. Changes:
+
+ Fix test failure on vc10-x64 Server on rubyci.org due to attempting
+ to File.chmod where it is not supported.
+
+ Continuing work on improved gem dependencies file (Gemfile) support.
+
+ * test: ditto.
+
+Fri Oct 18 06:02:49 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master f738c67. Changes:
+
+ Fixed test bug for ruby with ENABLE_SHARED = no
+
+ * test/rubygems: ditto.
+
+Fri Oct 18 00:57:07 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/tsort.rb (TSort.tsort): Extracted from TSort#tsort.
+ (TSort.tsort_each): Extracted from TSort#tsort_each.
+ (TSort.strongly_connected_components): Extracted from
+ TSort#strongly_connected_components.
+ (TSort.each_strongly_connected_component): Extracted from
+ TSort#each_strongly_connected_component.
+
+Thu Oct 17 18:50:08 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (CALC_EXACT_MALLOC_SIZE_CHECK_OLD_SIZE): introduced.
+ This macro enable checker compare with allocated memory and
+ declared old_size of sized_xfree and sized_xrealloc.
+
+Thu Oct 17 18:45:41 2013 Koichi Sasada <ko1@atdot.net>
+
+ * string.c (STR_HEAP_SIZE): includes TERM_LEN(str).
+
+ * string.c (rb_str_memsize): use STR_HEAP_SIZE().
+
+Thu Oct 17 17:43:00 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_call_method): set ci->me to 0 when the
+ original method of a refined method is undef to avoid SEGV.
+
+ * vm_method.c (rb_method_entry_without_refinements): return 0 when
+ the original method of a refined method is undef to avoid SEGV.
+
+ * test/ruby/test_refinement.rb: related test.
+
+Thu Oct 17 17:38:36 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c, internal.h: rename ruby_xsizefree/realloc to
+ rb_sized_free/realloc.
+
+ * array.c: catch up these changes.
+
+ * string.c: ditto.
+
+Thu Oct 17 17:32:51 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c, string.c: use ruby_xsizedfree() and ruby_xsizedrealloc().
+
+ * internal.h (SIZED_REALLOC_N): define a macro as REALLOC_N().
+
+Thu Oct 17 17:11:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (console_emulator_p): check by comparison between
+ module handle of WriteConsoleW and kernel32.dll.
+
+ * configure.in, win32/Makefile.sub, win32/setup.mak: no longer need
+ psapi.lib.
+
+Thu Oct 17 16:53:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c, internal.h: add new internal memory management functions.
+ * void *ruby_xsizedrealloc(void *ptr, size_t new_size, size_t old_size)
+ * void ruby_xsizedfree(void *x, size_t size)
+ These functions accept additional size parameter to calculate more
+ accurate malloc_increase parameter which control GC timing.
+ [Feature #8985]
+
+Thu Oct 17 14:21:34 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/file.c (rb_file_expand_path_internal): fix memory leaks at
+ a non-absolute home exception.
+
+Thu Oct 17 14:06:39 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/object_tracing.c (newobj_i): fix memory leak.
+ There is possibility to remain info due to missing FREEOBJ event.
+ FREEOBJ events are skipped while suppress_tracing state, for example,
+ during trace events are invoking.
+
+Thu Oct 17 12:30:16 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/tsort.rb (TSort.each_strongly_connected_component_from):
+ Extracted from TSort#each_strongly_connected_component_from.
+
+Thu Oct 17 11:07:06 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 941c21a. Changes:
+
+ Restored method bundler wants to remove for compatibility.
+
+ Improvements to Gemfile compatibility.
+
+ * test/rubygems: ditto.
+
+Thu Oct 17 08:08:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/object_tracing.c (newobj_i): add workaround.
+ some bugs hits this check.
+
+ * ext/objspace/object_tracing.c (object_allocations_reporter_i): cast as pointer.
+
+Thu Oct 17 07:36:53 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 2abce58. Changes:
+
+ Fixed documentation generation when sdoc and json are installed as
+ gems.
+
+ Added some missing documentation.
+
+Thu Oct 17 07:10:26 2013 Zachary Scott <e@zzak.io>
+
+ * ext/curses/curses.c: [DOC] Cleaned up formatting consistency of rdoc
+ comments for Curses, including period spacing and column width.
+
+ This patch also fixed some typos. Thanks to @postmodern for the patch!
+ [Fixes GH-420] https://github.com/ruby/ruby/pull/420
+
+Thu Oct 17 06:58:42 2013 Zachary Scott <e@zzak.io>
+
+ * ext/date/date_core.c: [DOC] plural grammar fixed by @scott113341
+ Contributed via documenting-ruby.org: documenting-ruby/ruby#16
+ https://github.com/documenting-ruby/ruby/pull/16
+
+Thu Oct 17 05:52:31 2013 Zachary Scott <e@zzak.io>
+
+ * ext/io/nonblock/nonblock.c: [DOC] Document io/nonblock by reprah
+ [Fixes GH-418] https://github.com/ruby/ruby/pull/418 based on the
+ original discussion from documenting-ruby/ruby#18
+
+Thu Oct 17 05:40:33 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (objspace_each_objects): do not skip empty RVALUEs.
+
+Thu Oct 17 05:31:31 2013 Koichi Sasada <ko1@atdot.net>
+
+ * error.c (rb_bug_reporter_add): return simply 0 if failed.
+ Please check return value.
+
+Thu Oct 17 05:17:33 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/object_tracing.c: add new method
+ ObjectSpace.trace_object_allocations_debug_start for GC debugging.
+ If you encounter the BUG "... is T_NONE" (and so on) on your
+ application, please try this method at the beginning of your app.
+
+Wed Oct 16 22:35:27 2013 Zachary Scott <e@zzak.io>
+
+ * ext/io/nonblock/nonblock.c: use rb_cIO instead of VALUE
+
+Wed Oct 16 17:45:13 2013 Koichi Sasada <ko1@atdot.net>
+
+ * bootstraptest/runner.rb: check nil before calling `signal?'
+ for a process status.
+
+Wed Oct 16 17:37:17 2013 Koichi Sasada <ko1@atdot.net>
+
+ * error.c, internal.h (rb_bug_reporter_add): add a new C-API.
+ rb_bug_reporter_add() allows to register a function which
+ is called at rb_bug() called.
+
+ * ext/-test-/bug_reporter/bug_reporter.c: add a test for this C-API.
+
+ * ext/-test-/bug_reporter/extconf.rb: ditto.
+
+ * test/-ext-/bug_reporter/test_bug_reporter.rb: ditto.
+
+Wed Oct 16 15:14:21 2013 Koichi Sasada <ko1@atdot.net>
+
+ * NEWS: add a line into NEWS for last commit.
+
+Wed Oct 16 15:09:14 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/objspace.c: add a new method `reachable_objects_from_root'.
+ ObjectSpace.reachable_objects_from_root returns all objects referred
+ from root (called "root objects").
+ This feature is for deep object analysis.
+
+ * test/objspace/test_objspace.rb: add a test.
+
+Wed Oct 16 15:00:21 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master b955554. Changes:
+
+ Fixed NameError for Gem::Ext due to re-entering file lookup in
+ RubyGems' overridden require. Bug by Koichi Sasada.
+
+ Fixed possible circular require warning in tests.
+
+ Used existing constant for `gem install -g` dependency file list.
+
+ * test/rubygems: ditto.
+
+Wed Oct 16 09:42:42 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master 278d00d. Changes:
+
+ Fixes building extensions without a "clean" make rule
+
+ Adds gem dependency file autodetection to "gem install -g"
+
+ * test/rubygems: Tests for the above.
+
+Wed Oct 16 09:12:23 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems master commit 2a74263. This fixes
+ several bugs in RubyGems 2.2.0.preview.1.
+
+ * test/rubygems: ditto.
+
+Wed Oct 16 07:25:02 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (gc_mark_roots): rename roots to be categories
+ instead of function names.
+
+Tue Oct 15 19:18:13 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.h (rb_objspace_reachable_objects_from_root): added.
+ This API provides information which objects are root objects.
+ `category' shows what kind of root objects.
+
+ * gc.c (gc_mark_roots): separate from gc_marks_body().
+
+Tue Oct 15 17:47:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c: Fix a typo. MacOS X doesn't have ENOTSUPP.
+
+Mon Oct 14 12:32:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby.c (process_options): load statically linked extensions before
+ rubygems, because of ext/thread.
+
+ * ruby.c (process_options): use gem_prelude instead of requiring
+ rubygems directly when --enable=gems is given.
+
+ * Makefile.in (DEFAULT_PRELUDES): always use gem_prelude regardless of
+ --disable-rubygems.
+
+Mon Oct 14 11:07:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (have_framework): should append framework options to
+ $LIBS, not $LDFLAGS. The former is propagated to exts.mk when
+ enable-static-linked-ext.
+
+ * lib/mkmf.rb (create_makefile): ranlib on static library, not DLLIB.
+
+Sun Oct 13 23:53:40 2013 Andrew Grimm <andrew.j.grimm@gmail.com>
+
+ * vsnprintf.c: Fix spelling from compliment to complement.
+ Patch by @agrimm.
+
+ * include/ruby/ruby.h: ditto
+
+Sun Oct 13 20:59:27 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm.c (Init_BareVM): initialize defined_module_hash here,
+ Init_top_self() is too late to register core classes/modules.
+
+ * compile.c (compile_array_): no hash to merge if it is empty.
+
+ * vm.c (m_core_hash_merge_kwd): just check keys if only one argument
+ is given, without merging.
+
+Sat Oct 12 06:35:01 2013-10-11 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rake: Update to rake 10.1.0
+ * bin/rake: ditto.
+ * test/rake: ditto.
+
+ * NEWS: Update NEWS to include rake 10.1.0 and links to release notes.
+
+Sat Oct 12 03:26:04 2013 Koichi Sasada <ko1@atdot.net>
+
+ * class.c, variable.c, gc.c (rb_class_tbl): removed.
+
+ * vm.c, vm_core.h (rb_vm_add_root_module): added to register as a
+ defined root module or class.
+ This guard helps mark miss from defined classes/modules they are
+ only referred from C's global variables in C-exts.
+ Basically, it is extension's bug.
+ Register to hash object VM has.
+ Marking a hash objects allows generational GC supports.
+
+ * gc.c (RGENGC_PRINT_TICK): disable (revert).
+
+Sat Oct 12 03:24:49 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_method.c (rb_gc_mark_unlinked_live_method_entries):
+ revert last commit to introduce debug prints.
+
+Fri Oct 11 21:05:19 2013 Koichi Sasada <ko1@atdot.net>
+
+ * internal.h, parse.y: use `full_mark' instead of `full_marking'.
+
+Fri Oct 11 20:58:16 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: use terminology `full_mark' instead of `minor_gc'
+ in mark functions.
+
+Fri Oct 11 20:46:09 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: use __GNUC__ instead of __GCC__.
+
+Fri Oct 11 20:35:59 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c, parse.y: support generational Symbol related marking.
+ Each symbols has String objects respectively to represent
+ Symbols.
+ These objects are marked only when:
+ * full marking
+ * new symbols are added
+ This hack reduce symbols (related strings) marking time.
+ For example, on my Linux environment, the following code
+ "20_000_000.times{''}"
+ with 40k symbols (similar symbol number on Rails 3.2.14 app,
+ @jugyo tells me) boosts, from 7.3sec to 4.2sec.
+
+ * internal.h: change prototype of rb_gc_mark_symbols().
+
+Fri Oct 11 19:27:22 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el: Import ruby-electric.el 2.0.1 which fixes
+ a bug and a flaw with auto-end introduced in the revamp.
+
+ * ruby-forward-sexp is inappropriate here because it moves the
+ cursor past the keyword.
+
+ * Fix a reversed looking-back check in
+ ruby-electric--block-beg-keyword-at-point-p.
+
+ * Do not add end again if space or return is hit repeatedly
+ after a block beginning keyword.
+
+Fri Oct 11 18:12:47 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/gc_hook.c: prohibit reentrant.
+
+Fri Oct 11 18:11:34 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (rb_postponed_job_flush): fix bit operation.
+
+Fri Oct 11 17:33:24 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el: Import ruby-electric.el 2.0 from
+ https://github.com/knu/ruby-electric.el which integrates changes
+ from another fork by @qoobaa.
+
+ * Allow ruby-electric-mode to be disabled by introducing a
+ dedicated key map. Electric key bindings are now defined in
+ ruby-electric-mode-map instead of overwriting ruby-mode-map.
+
+ * Add ruby-electric-mode-hook.
+
+ * Use a remap in binding ruby-electric-delete-backward-char.
+
+ * Totally revamp electric keywords and then introduce electric
+ return. Modifier keywords are now properly detected making
+ use of ruby-mode's indentation level calculator, and
+
+ * block-mid keywords (then, else, elsif, when, rescue and
+ ensure) also become electric with automatic reindentation.
+
+ * Add standardized comments for ELPA integration.
+
+ * Fix interaction with smartparens-mode by disabling its end
+ keyword completion, since ruby-electric has become more clever
+ at it.
+
+ * The custom variable `ruby-electric-keywords` is changed to
+ `ruby-electric-keywords-alist`, allowing user to fine-grained
+ configuration.
+
+Fri Oct 11 16:53:28 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (rb_postponed_job_flush): simplify.
+
+Fri Oct 11 03:36:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (rb_threadptr_execute_interrupts): flush postponed job only
+ once at last.
+
+ * vm_trace.c (rb_postponed_job_flush): defer calling postponed jobs
+ registered while flushing to get rid of infinite reentrance of
+ ObjectSpace.after_gc_start_hook. [ruby-dev:47400] [Bug #8492]
+
+Thu Oct 10 23:04:00 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_or): remove unused variables.
+
+Thu Oct 10 23:01:16 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_or): use rb_hash_keys().
+
+Thu Oct 10 21:36:16 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_compact_bang): use ary_resize_smaller().
+
+Thu Oct 10 17:25:28 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (vm_exec): support :b_return event for "lambda{return}.call".
+ [Bug #8622]
+
+ * test/ruby/test_settracefunc.rb: add a test.
+
+Thu Oct 10 13:52:37 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (postponed_job): use preallocated buffer.
+ Pre-allocate MAX_POSTPONED_JOB (1024) sized buffer
+ and use it.
+ If rb_postponed_job_register() cause overflow, simply it
+ fails and returns 0.
+ And maybe rb_postponed_job_register() is signal safe.
+
+ * vm_core.h: change data structure.
+
+Thu Oct 10 11:11:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm.c (Init_VM): hide also the singleton class of frozen-core, not
+ only frozen-core itself.
+
+Thu Oct 10 06:02:08 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/ruby/test_rand.rb: fix r43224. local variable `e' is
+ no longer available.
+
+Thu Oct 10 00:02:35 2013 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * numeric.c (fix_aref): avoid a possible undefined behavior.
+ 1L << 63 on 64-bit platform is undefined, at least, according to
+ ISO/IEC 9899 (C99) 6.5.7.
+
+Wed Oct 9 23:57:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (id_for_attr): avoid inadvertent symbol creation.
+
+Wed Oct 9 18:03:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c (rb_attr): preserve encoding of the attribute ID in
+ error message.
+
+Wed Oct 9 17:40:16 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_fstring): because of lazy sweep, str may be unmarked
+ already and swept at next time, so mark it for the time being.
+ [ruby-core:57756]
+
+Wed Oct 9 13:53:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compar.c (cmp_eq): fail if recursion. [ruby-core:57736] [Bug #9003]
+
+ * thread.c (rb_exec_recursive_paired_outer): new function which is
+ combination of paired and outer variants.
+
+Wed Oct 9 09:18:14 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/debug.h,
+ vm_backtrace.c (rb_profile_frame_full_label): add new C API
+ rb_profile_frame_full_label() which returns label with
+ qualified method name.
+ Note that in future version of Ruby label() may return
+ same return value of full_label().
+
+ * ext/-test-/debug/profile_frames.c,
+ test/-ext-/debug/test_profile_frames.rb: fix a test for this change.
+
+
+Wed Oct 9 00:55:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (load_lock): display backtrace to $stderr at circular
+ require.
+
+ * vm_backtrace.c (rb_backtrace_print_to): new function to print
+ backtrace to the given output.
+
+Tue Oct 8 21:03:35 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_backtrace.c, include/ruby/debug.h: add new APIs
+ * VALUE rb_profile_frame_method_name(VALUE frame)
+ * VALUE rb_profile_frame_qualified_method_name(VALUE frame)
+
+ * iseq.c (rb_iseq_klass), internal.h: add new internal function
+ rb_iseq_method_name().
+
+ * ext/-test-/debug/profile_frames.c (profile_frames),
+ test/-ext-/debug/test_profile_frames.rb: add a test.
+
+Tue Oct 8 16:11:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_uniq): use rb_hash_values(), as well as the case no
+ block is given.
+
+ * internal.h: define rb_hash_values() as internal API.
+
+Tue Oct 8 13:53:21 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_uniq): use rb_hash_keys().
+
+ * internal.h: define rb_hash_keys() as internal API.
+
+ * hash.c (rb_hash_keys): ditto.
+
+Tue Oct 8 10:56:39 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * cont.c: disable FIBER_USE_NATIVE on GNU/Hurd because it doesn't
+ support a combination getcontext() and threads. Patch by
+ Gabriele Giacone (1o5g4r8o@gmail.com). [Bug #8990][ruby-core:57685]
+
+Tue Oct 8 05:58:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/time.rb (Time.strptime): Time.strptime('0', '%s') returns local
+ time Time object as Ruby 2.0 and before.
+
+Tue Oct 8 05:40:37 2013 Eric Hodel <drbrain@segment7.net>
+
+ * .travis.yml: Rebuild Travis CI's "ruby-head" version on successful
+ build. Patch by Konstantin Haase. [Fixes GH-417]
+ https://github.com/ruby/ruby/pull/417
+
+Tue Oct 8 04:28:25 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-mode.el: Use preceding-char/following-char
+ (returning 0 at BOF/EOF) instead of char-before/char-after
+ (returning nil at BOF/EOF) to avoid error from char-syntax when
+ at BOF/EOF.
+
+Tue Oct 8 04:12:45 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-additional.el (ruby-mode-set-encoding): Add a missing
+ else clause to unbreak with `cp932`, etc.
+
+ * misc/ruby-mode.el (ruby-mode-set-encoding): Ditto.
+
+Tue Oct 8 03:57:34 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-additional.el (ruby-mode-set-encoding): Use
+ `default-buffer-file-coding-system` if the :prefer-utf-8
+ property is not available.
+
+ * misc/ruby-mode.el (ruby-mode-set-encoding): Ditto.
+
+ * misc/ruby-additional.el (ruby-encoding-map): Override the
+ default value.
+
+Tue Oct 8 03:19:19 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-additional.el (ruby-mode-set-encoding): Add support
+ for `prefer-utf-8` which was introduced in Emacs trunk.
+
+ * misc/ruby-additional.el (ruby-encoding-map): Add a mapping from
+ `japanese-cp932` to `cp932` to fix the problem where saving a
+ source file written in Shift_JIS twice would end up having
+ `coding: japanese-cp932` which Ruby could not recognize.
+
+ * misc/ruby-additional.el (ruby-mode-set-encoding): Add support
+ for encodings mapped to nil in `ruby-encoding-map`.
+
+ * misc/ruby-additional.el (ruby-encoding-map): Map `us-ascii` and
+ `utf-8` to nil by default, meaning they need not be explicitly
+ declared in magic comment.
+
+ * misc/ruby-additional.el (ruby-encoding-map): Add type
+ declaration for better customize UI.
+
+ * misc/ruby-mode.el: Ditto for the above.
+
+Tue Oct 8 00:14:53 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-additional.el: Add a standard header and footer,
+ including (provide 'ruby-additional).
+
+Mon Oct 7 22:52:45 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el (ruby-electric-space-can-be-expanded-p):
+ Return nil to avoid "end" insertion when in smartparens-mode
+ that is configured to insert "end" for the same keyword.
+
+ * misc/ruby-electric.el (ruby-electric-keywords): New custom
+ variable to replace `ruby-electric-simple-keywords-re` with.
+
+Mon Oct 7 22:52:16 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-additional.el: Use preceding-char/following-char
+ (returning 0 at BOF/EOF) instead of char-before/char-after
+ (returning nil at BOF/EOF) to avoid error from char-syntax when
+ at BOF/EOF.
+
+Mon Oct 7 22:45:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * cont.c (FIBER_USE_NATIVE): split long conditions.
+
+Mon Oct 7 20:29:31 2013 Zachary Scott <e@zzak.io>
+
+ * lib/time.rb: [DOC] typo in Time.rb overview by @srt32 [Fixes GH-416]
+ https://github.com/ruby/ruby/pull/416
+
+Mon Oct 7 20:07:20 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/time.rb (Time.strptime): Use :offset.
+ Patch by Felipe Contreras. [ruby-core:57694]
+
+Mon Oct 7 16:47:27 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/-ext-/debug/test_profile_frames.rb: rename class C to
+ something long name because one test depends on absence of
+ class ::C.
+
+Mon Oct 7 16:33:10 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/-test-/debug/profile_frames.c:
+ test/-ext-/debug/test_profile_frames.rb: add a test for new C-APIs.
+
+Mon Oct 7 16:12:36 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/debug.h: add backtrace collecting APIs for profiler.
+ * int rb_profile_frames(int start, int limit, VALUE *buff, int *lines);
+ Collect information of frame information.
+
+ * VALUE rb_profile_frame_path(VALUE frame);
+ * VALUE rb_profile_frame_absolute_path(VALUE frame);
+ * VALUE rb_profile_frame_label(VALUE frame);
+ * VALUE rb_profile_frame_base_label(VALUE frame);
+ * VALUE rb_profile_frame_first_lineno(VALUE frame);
+ * VALUE rb_profile_frame_classpath(VALUE frame);
+ * VALUE rb_profile_frame_singleton_method_p(VALUE frame);
+ Get information about each frame.
+
+ These APIs are designed for profilers, for example, no object allocation,
+ and enough information for profilers.
+ In this version, this API collects only Ruby level frames.
+ This issue will be fixed after Ruby 2.1.
+
+ * vm_backtrace.c: implement above APIs.
+
+ * iseq.c (rb_iseq_klass): return local_iseq's class.
+
+Mon Oct 7 14:26:01 2013 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c: catch up last commit.
+ Type of return value of rb_iseq_first_lineno() is now VALUE.
+
+ * vm_insnhelper.c (argument_error): ditto.
+
+ * vm_method.c (rb_method_entry_make): ditto.
+
+Mon Oct 7 14:07:45 2013 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c, internal.h: change to public (but internal) functions
+ * VALUE rb_iseq_path(VALUE iseqval);
+ * VALUE rb_iseq_absolute_path(VALUE iseqval);
+ * VALUE rb_iseq_label(VALUE iseqval);
+ * VALUE rb_iseq_base_label(VALUE iseqval);
+ * VALUE rb_iseq_first_lineno(VALUE iseqval);
+ And new (temporary) function:
+ * VALUE rb_iseq_klass(VALUE iseqval);
+
+ * iseq.c. vm_core.h (int rb_iseq_first_lineno): remove
+ function `int rb_iseq_first_lineno(const rb_iseq_t *iseq)'.
+ Use `VALUE rb_iseq_first_lineno(VALUE iseqval)' instead.
+
+ * proc.c. vm_insnhelper.c, vm_method.c: catch up this change.
+
+Sun Oct 6 08:37:39 2013 Zachary Scott <e@zzak.io>
+
+ * lib/webrick.rb: [DOC] fix grammar in WEBrick overview [Fixes GH-413]
+ Based on patch by @chastell https://github.com/ruby/ruby/pull/413
+
+Sat Oct 5 11:21:01 2013 Aaron Pfeifer <aaron.pfeifer@gmail.com>
+
+ * thread.c (terminate_atfork_i): fix locking mutexes not unlocked in
+ forks when not tracked in thread. [ruby-core:55102] [Bug #8433]
+
+Fri Oct 4 19:54:09 2013 Zachary Scott <e@zzak.io>
+
+ * ext/dbm/dbm.c: [DOC] Fix wrong constant name in DBM by @edward
+ [Fixes GH-409] https://github.com/ruby/ruby/pull/409
+
+Fri Oct 4 19:49:42 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c: rename heap.free_num as heap.swept_num to clarify meaning and
+ avoid confusion with objspace_free_num().
+
+Fri Oct 4 19:02:01 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c (objspace_free_num): new method for available/free slots on
+ heap. [ruby-core:57633] [Bug #8983]
+ * gc.c (gc_stat): change heap_free_num definition to use new method.
+ * test/ruby/test_gc.rb: test for above.
+
+Fri Oct 4 18:53:42 2013 Aman Gupta <ruby@tmm1.net>
+
+ * gc.c: add rb_objspace.limit to keep accurate count of total heap
+ slots [ruby-core:57633] [Bug #8983]
+
+Fri Oct 4 09:32:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/csv.rb (CSV.foreach): support enumerator. based on a patch by
+ Hanmac (Hans Mackowiak) at [ruby-core:57643]. [ruby-core:57283]
+ [Feature #8929]
+
+Thu Oct 3 18:20:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (console_emulator_p, constat_handle): disable built-in
+ console colorizing when console-emulator-like DLL is injected.
+ [Feature #8201]
+
+Thu Oct 3 18:01:44 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: define gc_profile_record::allocated_size if
+ CALC_EXACT_MALLOC_SIZE is true.
+
+Thu Oct 3 13:42:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * common.mk (yes-test-sample): use RUNRUBY instead of MINIRUBY to set
+ runtime library path and run the built ruby. [Bug #8971]
+
+Thu Oct 3 00:17:15 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-additional.el: Properly quote the body. An unquoted
+ body given to eval-after-load is evaluated immediately!
+
+Wed Oct 2 21:38:30 2013 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * ext/socket/ifaddr.c (rsock_getifaddrs): fix possible memory leak.
+ When a system had no interface, this function used xmalloc for root
+ but did not return any reference to it. This patch fixes it by
+ immediately returning an empty array if no interface is found.
+ Coverity Scan found this bug.
+
+Wed Oct 2 21:37:04 2013 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * random.c (make_seed_value): a local array declaration was accessed
+ out of scope. Coverity Scan found this bug.
+
+Wed Oct 2 18:52:40 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: relax GC condition due to malloc_limit.
+
+ * gc.c (GC_MALLOC_LIMIT_MAX): change default value
+ (256MB -> 512MB) and permit zero to ignore max value.
+
+ * gc.c (vm_malloc_increase, vm_xrealloc): do not cause GC on realloc.
+
+ * gc.c (gc_before_sweep): change debug messages.
+
+Wed Oct 2 16:26:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_close_read): duplex IO should wait its child process
+ even after close_read.
+
+Wed Oct 2 15:39:13 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_core.h: use __has_attribute() instead of __clang__major__ because
+ clang says "Note that marketing version numbers should not be used
+ to check for language features, as different vendors use different
+ numbering schemes. Instead, use the Feature Checking Macros."
+ http://clang.llvm.org/docs/LanguageExtensions.html
+
+Wed Oct 2 14:19:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_close_write): detach tied IO for writing before closing
+ to get rid of race condition. [ruby-list:49598]
+
+ * io.c (rb_io_close_read): keep fptr in write_io to be discarded, to
+ fix freed pointer access when it is in use by other threads, and get
+ rid of potential memory/fd leak.
+
+Tue Oct 1 23:44:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * vm_core.h: use __attribute__((unused)) in UNINITIALIZED_VAR on clang
+ 4.0+ instead of just on 4.2. Clang has supported the unused attribute
+ since before version 4, so this should be safe.
+
+Tue Oct 1 22:03:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/tempfile.rb (Tempfile#unlink): finalizer is no longer needed
+ after unlinking. patched by by normalperson (Eric Wong) at
+ [ruby-core:56521] [Bug #8768]
+
+Tue Oct 1 20:54:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (stat_new_0): constify.
+
+ * file.c (rb_stat_new): constify and export. based on a patch by
+ Hanmac (Hans Mackowiak) at [ruby-core:53225]. [Feature #8050]
+
+Tue Oct 1 16:03:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (ruby_safe_level_4_warning): needed by extension
+ libraries which check safe level 4. [ruby-dev:47517] [Bug #8652]
+
+Mon Sep 30 23:14:36 2013 Zachary Scott <e@zzak.io>
+
+ * ext/objspace/objspace.c: [DOC] Cleaned up many rdoc formatting
+ issues and several duplicate grammar bugs.
+
+Mon Sep 30 23:01:01 2013 Zachary Scott <e@zzak.io>
+
+ * ext/objspace/object_tracing.c: [DOC] Adjust rdoc formatting and fix
+ small grammar typo
+
+Mon Sep 30 17:28:39 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/object_tracing.c: [DOC] add some notes for
+ ObjectSpace::trace_object_allocations.
+
+Mon Sep 30 16:46:58 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/object_tracing.c: add new 3 methods to control tracing.
+ * ObjectSpace::trace_object_allocations_start
+ * ObjectSpace::trace_object_allocations_stop
+ * ObjectSpace::trace_object_allocations_clear
+ And some refactoring.
+
+ * test/objspace/test_objspace.rb: add a test for new methods.
+
+ * NEWS: add a description for new methods.
+
+Mon Sep 30 11:18:04 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_gc_disable): do rest_sweep() before disable GC.
+ This fix may solve a failure of
+ TestTracepointObj#test_tracks_objspace_events
+ [test/-ext-/tracepoint/test_tracepoint.rb:43].
+
+Mon Sep 30 10:40:20 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_method.c (rb_undef): raise a NameError if the original method
+ of a refined method is not defined.
+
+ * vm_insnhelper.c (rb_method_entry_eq): added NULL check to avoid SEGV.
+
+ * test/ruby/test_refinement.rb: related test.
+
+Sun Sep 29 23:45:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (rb_id_attrset, intern_str): allow junk attrset ID for
+ Struct.
+
+ * parse.y (rb_id_attrset): fix inconsistency with literals, allow
+ ID_ATTRSET and return it itself, but ID_JUNK cannot make ID_ATTRSET.
+ and raise a NameError instead of rb_bug() for invalid argument.
+
+Sun Sep 29 18:45:05 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * vm_insnhelper.c (vm_callee_setup_arg_complex, vm_yield_setup_block_args):
+ clear keyword arguments to prevent GC bug which occurs
+ while marking VM stack.
+ [ruby-dev:47729] [Bug #8964]
+
+ * test/ruby/test_keyword.rb: tests for the above.
+
+Sat Sep 28 23:25:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * math.c (math_log, math_log2, math_log10): fix for Bignum argument.
+ numbits should be add only when right shifted.
+
+Sat Sep 28 14:30:29 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * test/dl/test_base.rb: {libc, libm} detection now handle GNU/Hurd
+ correctly. Patch by Gabriele Giacone (1o5g4r8o@gmail.com).
+ [Bug #8937][ruby-core:57311]
+ * test/fiddle/helper.rb: ditto.
+
+Sat Sep 28 00:19:41 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * ext/curses/extconf.rb: check the size of chtype.
+
+ * ext/curses/curses.c (NUM2CH, CH2NUM): use proper macros for
+ the size of chtype.
+
+ [ruby-core:56090] [Bug #8659]
+
+Fri Sep 27 18:33:23 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: add two GC tuning environment variables.
+ RUBY_GC_MALLOC_LIMIT_MAX and RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR.
+ See r43067 for details.
+
+ * gc.c (rb_gc_set_params): refactoring. And change verbose notation.
+ Mostly duplicated functions get_envparam_int/double is not cool.
+ Please rewrite it.
+
+ * test/ruby/test_gc.rb: fix a test for this change.
+
+Fri Sep 27 17:44:41 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (GC_MALLOC_LIMIT): 8,000,000 -> 8 * 1,024 * 1,024.
+
+Fri Sep 27 17:19:39 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_before_sweep): cast to size_t to suppress warnings.
+
+Fri Sep 27 17:07:55 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: add some fine-grained profiling codes to tuning marking phase.
+ If you enable RGENGC_PRINT_TICK to 1, then profiling results by RDTSC
+ (on x86/amd64 environment) are printed at last.
+ Thanks Yoshii-san.
+
+Fri Sep 27 16:32:27 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: simplify threshold of GC caused by malloc_increase.
+ Now, malloc_limit is increased/decreased by mysterious logic.
+ This fix simplify malloc_limit increase/decrease logic such as:
+ if (malloc_increase > malloc_limit) /* so many malloc */
+ malloc_limit += malloc_limit * (GC_MALLOC_LIMIT_FACTOR-1);
+ else
+ malloc_limit -= malloc_limit * (GC_MALLOC_LIMIT_FACTOR-1)/4;
+ Default value of GC_MALLOC_LIMIT_FACTOR is 1.8.
+ malloc_limit is bounded by GC_MALLOC_LIMIT_MAX (256MB by default).
+ This logic runs at gc_before_sweep(). So there are no effect from
+ caused by lazy sweep. And we can remove malloc_increase2.
+
+ * gc.c (HEAP_MIN_SLOTS, FREE_MIN, HEAP_GROWTH_FACTOR): rename to
+ GC_HEAP_MIN_SLOTS, GC_FREE_MIN, GC_HEAP_GROWTH_FACTOR respectively.
+ Check them by `#ifndef' so you can specify these values outside gc.c.
+
+ * gc.c (ruby_gc_params_t): add initial_malloc_limit_factor and
+ initial_malloc_limit_max.
+
+ * gc.c (vm_malloc_prepare, vm_xrealloc): use vm_malloc_increase to
+ add and check malloc_increase.
+
+Fri Sep 27 01:05:00 2013 Zachary Scott <e@zzak.io>
+
+ * re.c: [DOC] arguments of Regexp::union receive #to_regexp [Bug #8205]
+
+Fri Sep 27 00:39:27 2013 Zachary Scott <e@zzak.io>
+
+ * struct.c: [DOC] grammar of ArgumentError in Struct.new [Bug #8936]
+ Patch by Prathamesh Sonpatki
+
+Thu Sep 26 22:11:56 2013 Zachary Scott <e@zzak.io>
+
+ * ext/bigdecimal/bigdecimal.c: [DOC] several fixes by @chastell
+ This includes fixing the capitalization of Infinity, return value of
+ example "BigDecimal.new('NaN') == 0.0", and code style in example.
+ [Fixes GH-398] https://github.com/ruby/ruby/pull/398
+
+Thu Sep 26 22:08:11 2013 Zachary Scott <e@zzak.io>
+
+ * lib/observer.rb: [DOC] syntax improvement in example by @chastell
+ [Fixes GH-400] https://github.com/ruby/ruby/pull/400
+
+Thu Sep 26 22:03:15 2013 Zachary Scott <e@zzak.io>
+
+ * ext/digest/digest.c: [DOC] typo in overview by @chastell
+ [Fixes GH-399] https://github.com/ruby/ruby/pull/399
+
+Thu Sep 26 22:00:42 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/ossl.c: [DOC] typo in example by @zoranzaric
+ [Fixes GH-401] https://github.com/ruby/ruby/pull/401
+
+Thu Sep 26 21:07:49 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el (ruby-electric-delete-backward-char): Add
+ support for smartparens-mode.
+
+ * misc/ruby-electric.el (ruby-electric-cua-replace-region-maybe)
+ (ruby-electric-cua-delete-region-maybe): New functions that
+ combine `ruby-electric-cua-*-region` with
+ `ruby-electric-cua-*-region-p`, using a slightly better way to
+ detect if it is in cua-mode.
+
+Thu Sep 26 16:51:00 2013 Shota Fukumori <her@sorah.jp>
+
+ * insns.def (opt_regexpmatch2): Check String#=~ hasn't overridden
+ before calling rb_reg_match().
+
+ * test/ruby/test_string.rb: Test for above.
+
+ * vm.c (vm_init_redefined_flag): Add BOP flag for String#=~
+
+ [ruby-core:57385] [Bug #8953]
+
+Thu Sep 26 16:43:42 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el: Avoid use of the interactive function
+ `self-insert-command` which fires `post-self-insert-hook` and
+ `post-command-hook`, to make the ruby-electric commands work
+ nicely with those minor modes that make use of them to do
+ similar input assistance, such as electric-pair-mode,
+ autopair-mode and smartparens-mode.
+
+Thu Sep 26 16:24:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * insns.def (opt_regexpmatch1): check Regexp#=~ is not defined before
+ calling rb_reg_match()
+
+ * test/ruby/test_regexp.rb: add test
+
+ * vm.c (ruby_vm_redefined_flag): change type to short[]
+
+ * vm.c (vm_redefinition_check_flag): return REGEXP_REDEFINED_OP_FLAG if
+ klass == rb_cRegexp
+
+ * vm.c (vm_init_redefined_flag): setup BOP flag for Regexp#=~
+
+ * vm_insnhelper.h: add REGEXP_REDEFINED_OP_FLAG
+
+ [ruby-core:57385] [Bug #8953]
+
+Thu Sep 26 14:46:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (mark_locations_array): disable AddressSanitizer. based on a
+ patch by halfie (Ruby Guy) at [ruby-core:57372].
+ [ruby-core:56155] [Bug #8680]
+
+Wed Sep 25 17:41:29 2013 Koichi Sasada <ko1@atdot.net>
+
+ * README.EXT, README.EXT.ja: remove description of RARRAY_PTR()
+ and add a caution of accessing internal data structure directly.
+ Also add a description of rb_ary_store().
+ [Bug #8399]
+
+Wed Sep 25 17:12:08 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: rename RARRAY_RAWPTR() to RARRAY_CONST_PTR().
+ RARRAY_RAWPTR(ary) returns (const VALUE *) type pointer and
+ usecase of this macro is not acquire raw pointer, but acquire
+ read-only pointer. So we rename to better name.
+ RSTRUCT_RAWPTR() is also renamed to RSTRUCT_CONST_PTR()
+ (I expect that nobody use it).
+
+ * array.c, compile.c, cont.c, enumerator.c, gc.c, proc.c, random.c,
+ string.c, struct.c, thread.c, vm_eval.c, vm_insnhelper.c:
+ catch up this change.
+
+Wed Sep 25 16:58:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * internal.h (rb_float_value, rb_float_new): move inline functions
+ from ruby/ruby.h.
+
+ * numeric.c (rb_float_value, rb_float_new): define external functions
+ for extension libraries.
+
+Wed Sep 25 15:37:02 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/rdoc/test_rdoc_generator_darkfish.rb: add a guard for windows.
+
+Wed Sep 25 09:53:11 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Fix CVE-2013-4363. Miscellaneous minor improvements.
+
+ * test/rubygems: Tests for the above.
+
+Tue Sep 24 17:38:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_inspect): get rid of out-of-bound access.
+
+ * string.c (rb_str_inspect): when a UTF-16/32 string doesn't have a
+ BOM, inspect as a dummy encoding string.
+
+Tue Sep 24 17:15:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enc/encdb.c (ENC_DUMMY_UNICODE): make BOM-encodings dummy.
+
+ * encoding.c (enc_autoload): keep dummy encodings dummy.
+
+Tue Sep 24 16:41:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32/lib/win32/registry.rb (Win32::Registry#write): data size
+ is in bytes, not chars. terminators should be placed automatically.
+
+Tue Sep 24 16:39:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32/lib/win32/registry.rb (Win32::Registry#each_value): encode
+ name.
+
+ * ext/win32/lib/win32/registry.rb (Win32::Registry#each_key): ditto.
+
+ * ext/win32/lib/win32/registry.rb (Win32::Registry#export_string):
+ encode to locale encoding if default internal is not set.
+
+Tue Sep 24 16:35:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32/lib/win32/registry.rb (Win32::Registry::API#EnumKey):
+ size of the name is in WCHARs, not in bytes.
+
+Tue Sep 24 14:07:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * gc.c (free_method_cache_entry_i): unused function
+
+ * gc.c (rb_free_mc_table): ditto
+
+ * internal.h (method_cache_entry_t): unused struct
+
+ * vm_method.c (verify_method_cache): remove unused variable
+
+ * vm_method.c (rb_method_entry): ditto
+
+Tue Sep 24 14:01:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * class.c (class_alloc): remove mc_tbl
+
+ * gc.c (obj_free): ditto
+
+ * internal.h (struct rb_classext_struct): ditto
+
+ * method.h (rb_method_entry): remove ent param
+
+ * vm_method.c: restore the global method cache. Per class cache tables
+ turned out to be far too slow.
+
+ [ruby-core:57289] [Bug #8930]
+
+Tue Sep 24 12:51:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32/lib/win32/registry.rb (Win32::Registry::API): need
+ Constants.
+
+ * ext/win32/lib/win32/registry.rb (Win32::Registry::API#EnumValue):
+ size of the name is in WCHARs, not in bytes.
+
+Mon Sep 23 22:16:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enc/encdb.c, enc/utf_16_32.h (ENC_DUMMY_UNICODE): Unicode with BOM
+ must be based on big endian variants, so that actual encodings would
+ work. [ruby-core:57318] [Bug #8940]
+
+Mon Sep 23 12:11:26 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (env_each_pair): do not call rb_assoc_new() if
+ it isn't needed.
+
+Mon Sep 23 10:42:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/ruby/test_module.rb (TestModule#test_include_toplevel): test
+ for top level main.include. based on a part of the patch by
+ kyrylo at [GH-395].
+
+Mon Sep 23 05:07:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/intern.h (rb_ary_cat): move from internal.h, since it
+ is described in README.EXT.
+
+Sun Sep 22 20:55:20 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * vm_insnhelper.c (vm_make_proc_with_iseq): fix bug message.
+ This is follow up to changes in r42637.
+
+Sun Sep 22 20:35:38 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * ext/-test-/tracepoint/tracepoint.c (Init_tracepoint): prevent from GC.
+
+Sun Sep 22 19:00:28 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * benchmark/bm_app_answer.rb: revert r42990, benchmark scripts should
+ be self-contained and avoid dependencies, especially such small one.
+ See https://github.com/ruby/ruby/pull/393#issuecomment-24861301.
+
+Sat Sep 21 20:11:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (rb_fork_internal): remove cloexec setting on pipes
+ created by rb_cloexec_pipe. patch by normalperson (Eric Wong) at
+ [ruby-core:56523]. [Bug #8769]
+
+Sat Sep 21 01:04:25 2013 Zachary Scott <e@zzak.io>
+
+ * lib/benchmark.rb: [DOC] grammar of Benchmark#bm [Bug #8888]
+ Patch by Prathamesh Sonpatki
+
+Sat Sep 21 00:50:02 2013 Zachary Scott <e@zzak.io>
+
+ * enumerator.c: [DOC] Enumerator#each arguments documentation [GH-388]
+ Patch by @kachick https://github.com/ruby/ruby/pull/388
+
+Sat Sep 21 00:49:16 2013 Zachary Scott <e@zzak.io>
+
+ * enum.c: [DOC] Enumerable#to_a accepts arguments [GH-388]
+ Patch by @kachick https://github.com/ruby/ruby/pull/388
+
+Sat Sep 21 00:47:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_conv_enc_opts): make sure to scan coderange to get
+ rid of unnecessary conversion.
+
+Sat Sep 21 00:21:08 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/lib/openssl/ssl.rb: [DOC] Document OpenSSL::SSLServer
+ Based on a patch by Rafal Lisowski [Bug #8758]
+
+Fri Sep 20 23:54:03 2013 Zachary Scott <e@zzak.io>
+
+ * lib/gserver.rb: [DOC] correct gserver.rb license [Bug #8913]
+
+Fri Sep 20 23:48:34 2013 Zachary Scott <e@zzak.io>
+
+ * ext/psych/yaml/yaml.h: [DOC] merge upstream typo fix by @GreenGeorge
+ https://github.com/tenderlove/psych/pull/161
+
+Fri Sep 20 23:37:40 2013 Zachary Scott <e@zzak.io>
+
+ * lib/securerandom.rb: [DOC] SecureRandom.hex length argument
+ [Fixes GH-394] Patch by @avdi https://github.com/ruby/ruby/pull/394
+
+Fri Sep 20 23:34:48 2013 Zachary Scott <e@zzak.io>
+
+ * benchmark/bm_app_answer.rb: removed duplicate code [Fixes GH-393]
+ Patch by @gouravtiwari https://github.com/ruby/ruby/pull/393
+
+Fri Sep 20 23:24:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * common.mk (btest, btest-ruby, test-knownbug): add $(RUN_OPTS) to
+ ruby to be run, so that tests are runnable before making exts.
+
+ * common.mk (test-sample): ditto, and use $(MINIRUBY) as rubytest.rb
+ does not need extension libraries.
+
+ * tool/rubytest.rb: pass $(RUN_OPTS) to testing ruby using --run-opt.
+
+Fri Sep 20 15:01:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (intern_str): sigil only names are junk, at least one
+ identifier character is needed. [ruby-dev:47723] [Bug #8928]
+
+ * parse.y (rb_enc_symname_type): fix out of bound access.
+
+Fri Sep 20 14:14:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/-test-/printf/printf.c (printf_test_call): Fix an end of buffer
+ argument.
+
+Thu Sep 19 16:59:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (lambda): adjust position to the beginning of the block.
+
+Thu Sep 19 16:25:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vsnprintf.c (BSD_vfprintf): initialize cp so that size is 0 in the
+ commented case. fix an accidental bug at r16716.
+
+Thu Sep 19 14:33:14 2013 Koichi Sasada <ko1@atdot.net>
+
+ * NEWS: add a news for r42974.
+
+Thu Sep 19 14:12:02 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: make Symbol objects frozen.
+ [Feature #8906]
+ I want to freeze this good day, too.
+
+ * test/ruby/test_eval.rb: catch up this change.
+
+ * test/ruby/test_symbol.rb: add a test to check frozen symbols.
+
+Thu Sep 19 09:11:33 2013 Eric Hodel <drbrain@segment7.net>
+
+ * NEWS: Update for RDoc 4.1.0.preview.1 and RubyGems 2.2.0.preview.1
+
+Thu Sep 19 08:59:41 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rdoc/markdown/literals_1_9.rb: Fix trailing whitespace.
+
+ Previously kpeg (which generates this file) added trailing
+ whitespace, but this bug is now fixed.
+
+ * lib/rdoc/markdown.rb: ditto.
+
+Thu Sep 19 08:33:14 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rdoc: Update to RDoc 4.1.0.preview.1
+
+ RDoc 4.1.0 contains a number of enhancements including a new default
+ style and accessibility support. You can see the changelog here:
+
+ https://github.com/rdoc/rdoc/blob/v4.1.0.preview.1/History.rdoc
+
+ * test/rdoc: ditto.
+
+Thu Sep 19 07:16:26 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych.rb: updating Psych version
+
+ * ext/psych/psych.gemspec: ditto
+
+Thu Sep 19 06:39:40 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/dependency_resolver.rb: Switch the iterative resolver
+ algorithm from recursive to iterative to avoid possible
+ SystemStackError.
+
+Thu Sep 19 06:29:30 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems 2.2.0.preview.1
+
+ This brings several new features to RubyGems summarized here:
+
+ https://github.com/rubygems/rubygems/blob/v2.2.0.preview.1/History.txt
+
+ * test/rubygems: ditto.
+
+Wed Sep 18 23:14:58 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * string.c (rb_str_enumerate_lines): make String#each_line and
+ #lines not raise invalid byte sequence error when it is called
+ with an argument. The patch also causes performance improvement.
+ [ruby-dev:47549] [Bug #8698]
+
+ * test/ruby/test_m17n_comb.rb (test_str_each_line): remove
+ assertions which check that String#each_line and #lines will
+ raise an error if the receiver includes invalid byte sequence.
+
+Wed Sep 18 16:32:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (mnew_from_me): allocate structs after allocated wrapper
+ object successfully, to get rid of potential memory leak.
+
+Tue Sep 17 15:54:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/shell/command-processor.rb (Shell::CommandProcessor#find_system_command):
+ return executable file only, should ignore directories and
+ unexecutable files. [ruby-core:57235] [Bug #8918]
+
+ * lib/test/unit/assertions.rb (Test::Unit::Assertions#assert_throw):
+ assertion for throw. MiniTest::Assertions#assert_throws discards
+ the caught value.
+
+ * lib/test/unit/assertions.rb (Test::Unit::Assertions#assert_nothing_thrown):
+ returns the result of the given block.
+
+Tue Sep 17 12:55:58 2013 Eric Hodel <drbrain@segment7.net>
+
+ * doc/regexp.rdoc: [DOC] Replace paragraphs in verbatim sections with
+ plain paragraphs to improve readability as ri and HTML.
+
+Mon Sep 16 07:32:35 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * complex.c: removed meaningless lines.
+ * rational.c: ditto.
+
+Mon Sep 16 00:44:23 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * ext/socket/mkconstants.rb: define MSG_FASTOPEN.
+ [ruby-core:57138] [Feature #8897]
+
+Sun Sep 15 13:31:23 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * rational.c (nurat_div): reverted r28844, r28886 and r28887.
+ REASON: Nobuyoshi Nakada <nobu@ruby-lang.org>'s commits are buggy.
+ So Rational#/ may produce exact number with inexact number.
+ Moreover, without reducing.
+ REALLY NONSENSE COMMITS.
+ A bug report by me [ruby-dev:44710] is also caused by this behavior.
+ Kenta Murata <mrkn@mrkn.jp> patched it up.
+ But he did not fix the origin.
+ Today, the bug is still alive in ruby 1.9.3 and 2.0.0.
+
+Sat Sep 14 06:08:10 2013 Eric Hodel <drbrain@segment7.net>
+
+ * dir.c (dir_s_glob): [DOC] Improve wording and layout.
+
+ * dir.c (file_s_fnmatch): ditto.
+
+ * dir.c (Init_Dir): [DOC] Document File::Constants::FNM_XXX
+ constants. (These won't show up in RDoc until a new RDoc is
+ imported.)
+
+Thu Sep 12 14:58:58 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/uri/generic.rb (URI::Generic.find_proxy): return nil if
+ http_proxy environment variable is empty string.
+ [ruby-core:57140] [Bug #8898]
+
+Fri Sep 13 10:40:28 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems 2.1.3
+
+ Fixed installing platform gems
+
+ Restored concurrent requires
+
+ Fixed installing gems with extensions with --install-dir
+
+ Fixed `gem fetch -v` to install the latest version
+
+ Fixed installing gems with "./" in their files entries
+
+ * test/rubygems/test_gem_package.rb: Tests for the above.
+
+ * NEWS: Updated for RubyGems 2.1.3
+
+Thu Sep 12 22:40:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (RUBY_CHECK_SIGNEDNESS): macro to check signedness of a
+ type.
+
+ * configure.in (size_t): must be unsigned.
+ [ruby-core:57149] [Feature #8890]
+
+Thu Sep 12 22:37:08 2013 Anton Ovchinnikov <revolver112@gmail.com>
+
+ * ext/bigdecimal/bigdecimal.c, ext/digest/md5/md5.c,
+ ext/json/fbuffer/fbuffer.h, ext/json/generator/generator.c:
+ Eliminate less-than-zero checks for unsigned variables.
+ According to section 4.1.5 of C89 standard, size_t is an unsigned
+ type. These checks were found with 'cppcheck' static analysis tool.
+ [ruby-core:57117] [Feature #8890]
+
+Thu Sep 12 21:35:46 2013 Naohisa Goto <ngotogenome@gmail.com>
+
+ * Makefile.in (libruby-static.a): change LDFLAGS order. LDFLAGS may
+ include library path that should be specified before LIBS.
+ [ruby-dev:47707] [Bug #8901]
+
+Thu Sep 12 20:07:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vsnprintf.c (MAXEXP, MAXFRACT): calculate depending on constants in
+ float.h.
+
+ * vsnprintf.c (BSD_vfprintf): limit length for cvt() to get rid of
+ buffer overflow. [ruby-core:57023] [Bug #8864]
+
+ * vsnprintf.c (exponent): make expbuf size more precise.
+
+Wed Sep 11 17:30:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (RUNRUBY): append -- only after runruby.rb, not
+ cross-compiling baseruby, so that $(RUN_OPT) can be command line
+ options. [ruby-dev:47703] [Bug #8893]
+
+Wed Sep 11 07:55:17 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread.c (rb_mutex_unlock): Mutex#unlock no longer raise
+ an exception even if uses on trap. [Bug #8891]
+
+Tue Sep 10 14:37:01 2013 Shota Fukumori <sorah@tubusu.net>
+
+ * vm_backtrace.c (vm_backtrace_to_ary): Ignore the second argument if
+ it is nil. [Bug #8884] [ruby-core:57094]
+
+ * test/ruby/test_backtrace.rb (test_caller_with_nil_length):
+ Test for above.
+
+Tue Sep 10 12:39:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (method_entry_i): should exclude refined methods from
+ instance method list. [ruby-core:57080] [Bug #8881]
+
+Tue Sep 10 12:05:04 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * io.c (rb_f_printf): [DOC] add missing parenthesis in rdoc.
+
+Tue Sep 10 10:08:00 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * NEWS: Update RubyGems note.
+
+Tue Sep 10 09:51:22 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems 2.1.0. Fixes CVE-2013-4287.
+
+ See http://rubygems.rubyforge.org/rubygems-update/CVE-2013-4287_txt.html
+ for CVE information.
+
+ See http://rubygems.rubyforge.org/rubygems-update/History_txt.html#label-2.1.0+%2F+2013-09-09
+ for release notes.
+
+ * test/rubygems: Tests for the above.
+
+Mon Sep 9 21:31:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c: Remove spaces between SI prefix and unit to follow
+ SI brochure.
+ http://www.bipm.org/en/si/si_brochure/
+ https://www.nmij.jp/library/units/si/
+
+ * time.c: Ditto.
+
+ * ext/socket/ancdata.c: Ditto.
+
+Mon Sep 9 16:55:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c (rb_add_refined_method_entry): clear cache in the
+ refined class since refining a method entry is modifying the class.
+ [ruby-core:57079] [Bug #8880]
+
+Mon Sep 9 09:14:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/rbinstall.rb (Gem::Specification#initialize): default date to
+ RUBY_RELEASE_DATE. [ruby-core:57072] [Bug #8878]
+
+ * tool/rbinstall.rb (Gem::Specification#to_ruby): add date.
+
+Sun Sep 8 16:01:54 2013 Tanaka Akira <akr@fsij.org>
+
+ * rational.c (f_gcd): Relax the condition to use GMP.
+
+Sun Sep 8 13:56:38 2013 Masaki Suketa <masaki.suketa@nifty.ne.jp>
+
+ * ext/win32ole/win32ole.c (folevariant_initialize): check type of
+ element of array.
+
+ * test/win32ole/test_win32ole_variant.rb (test_s_new_ary): ditto.
+
+Sat Sep 7 21:33:10 2013 Tanaka Akira <akr@fsij.org>
+
+ * math.c (math_log): Test the sign for bignums.
+ (math_log2): Ditto.
+ (math_log10): Ditto.
+
+Sat Sep 7 20:25:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * math.c (math_log): Support bignums bigger than 2**1024.
+ (math_log2): Ditto.
+ (math_log10): Ditto.
+
+Sat Sep 7 15:36:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * vm_eval.c (vm_call0): fix prototype, the id parameter should be of
+ type ID, not VALUE
+
+ * vm_insnhelper.c (check_match): the rb_funcall family of functions
+ does not care about refinements. We need to use
+ rb_method_entry_with_refinements instead to call === with
+ refinements. Thanks to Jon Conley for reporting this bug.
+ [ruby-core:57051] [Bug #8872]
+
+ * test/ruby/test_refinement.rb: add test
+
+Sat Sep 7 13:49:40 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * variable.c (classname): the name of class that has
+ non class id should not be nil. This bug was introduced
+ in r36577.
+
+ * test/thread/test_cv.rb: test for change.
+
+Sat Sep 7 13:29:22 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * lib/find.rb (Find.find): respect the encodings of arguments.
+ [ruby-dev:47530] [Feature #8657]
+
+ * test/test_find.rb: add tests.
+
+Sat Sep 7 10:40:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/mkconstants.rb (TCP_FASTOPEN): Defined for TCP fast open.
+ [ruby-core:57048] [Feature #8871] patch by Masaki Matsushita.
+
+Fri Sep 6 23:53:31 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * common.mk: use RUNRUBY instead of MINIRUBY because MINIRUBY can't
+ require extension libraries. The patch is from nobu
+ (Nobuyoshi Nakada).
+
+ * ext/thread/extconf.rb: for build ext/thread/thread.c.
+
+ * include/ruby/intern.h: ditto.
+
+ * thread.c: ditto.
+
+ * lib/thread.rb: removed and replaced by ext/thread/thread.c.
+
+ * ext/thread/thread.c: Queue, SizedQueue and ConditionVariable
+ implementations in C. This patch is based on patches from panaggio
+ (Ricardo Panaggio) and funny_falcon (Yura Sokolov) and ko1
+ (Koichi Sasada). [ruby-core:31513] [Feature #3620]
+
+ * test/thread/test_queue.rb (test_queue_thread_raise): add a test for
+ ensuring that killed thread should be removed from waiting threads.
+ It is based on a code by ko1 (Koichi Sasada). [ruby-core:45950]
+
+Fri Sep 6 22:47:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Define ac_cv_func_clock_getres to yes for mingw*.
+
+Fri Sep 6 21:04:10 2013 Tanaka Akira <akr@fsij.org>
+
+ * rational.c: Include gmp.h if GMP is used.
+ (GMP_GCD_DIGITS): New macro.
+ (rb_gcd_gmp): New function.
+ (f_gcd_normal): Renamed from f_gcd.
+ (rb_gcd_normal): New function.
+ (f_gcd): Invoke rb_gcd_gmp or f_gcd_normal.
+
+ * internal.h (rb_gcd_normal): Declared.
+ (rb_gcd_gmp): Ditto.
+
+ * ext/-test-/rational: New directory.
+
+ * test/-ext-/rational: New directory.
+
+Fri Sep 6 14:23:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (clock_getres): required as well as clock_gettime().
+ [ruby-dev:47699] [Bug #8869]
+
+Fri Sep 6 11:45:27 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * transcode.c (rb_econv_append): new function to append a string data
+ with converting its encoding. split from rb_econv_substr_append.
+
+Fri Sep 6 02:37:22 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: use double quotes when
+ strings start with special characters.
+ https://github.com/tenderlove/psych/issues/157
+
+ * test/psych/test_string.rb: test for change.
+
+Fri Sep 6 00:05:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rewrite_cref_stack): remove recursion.
+
+Thu Sep 5 18:05:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * string.c (fstring_cmp): take string encoding into account when
+ comparing fstrings [ruby-core:57037] [Bug #8866]
+
+ * test/ruby/test_string.rb: add test
+
+Thu Sep 5 17:25:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_fstring, rb_str_free): use st_data_t instead of VALUE.
+
+ * string.c (rb_fstring): get rid of duplicating already frozen object.
+
+Thu Sep 5 14:01:22 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/optparse.rb: The Integer acceptable now allows binary and
+ hexadecimal numbers per the documentation. [ruby-trunk - Bug #8865]
+
+ DecimalInteger, OctalInteger, DecimalNumeric now validate their input
+ before converting to a number. [ruby-trunk - Bug #8865]
+
+ * test/optparse/test_acceptable.rb: Tests for the above, tests for all
+ numeric acceptables for existing behavior.
+
+Thu Sep 5 13:49:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * include/ruby/ruby.h: add RSTRING_FSTR flag
+
+ * internal.h: add rb_fstring() prototype
+
+ * string.c (rb_fstring): deduplicate frozen string literals
+
+ * string.c (rb_str_free): delete fstrings from frozen_strings table when
+ they are GC'd
+
+ * string.c (Init_String): initialize frozen_strings table
+
+Thu Sep 5 12:48:00 2013 Kenta Murata <mrkn@cookpad.com>
+
+ * configure.in (with_gmp): set with_gmp no if it is empty.
+
+Thu Sep 5 10:41:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_getivar): use class sequence to check class
+ identity, instead of pointer + vm state
+
+ * vm_insnhelper.c (vm_setivar): ditto
+
+Thu Sep 5 08:20:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (GMP_DIV_DIGITS): New macro.
+ (bary_divmod_gmp): New function.
+ (rb_big_divrem_gmp): Ditto.
+ (bary_divmod_branch): Ditto.
+ (bary_divmod): Use bary_divmod_branch.
+ (bigdivrem): Ditto.
+
+ * internal.h (rb_big_divrem_gmp): Declared.
+
+Thu Sep 5 06:22:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_divmod_normal): Reduce temporary array allocations.
+
+Thu Sep 5 02:17:06 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_divrem_normal): Add GC guards.
+
+Thu Sep 5 00:38:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_divrem_normal): New function.
+
+ * internal.h (rb_big_divrem_normal): Declared.
+
+ * ext/-test-/bignum/div.c: New file.
+
+ * test/-ext-/bignum/test_div.rb: New file.
+
+Thu Sep 5 00:08:44 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem_normal): Removed.
+ (bary_divmod_normal): New function.
+ (bary_divmod): Use bary_divmod_normal.
+ (bigdivrem): Use bary_divmod_normal.
+
+Wed Sep 4 23:02:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem): Useless declaration removed.
+
+Wed Sep 4 22:56:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * numeric.c (NUM_STEP_GET_INF): split from NUM_STEP_SCAN_ARGS(), since
+ inf is not used in num_step_size().
+
+Wed Sep 4 20:22:43 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem_normal): Add assertions.
+
+Wed Sep 4 19:18:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * internal.h (vm_state_version_t): prefer LONG_LONG to uint64_t.
+
+Wed Sep 4 16:28:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * internal.h (vm_state_version_t): use uint64_t when it is larger than
+ LONG_LONG, and fallback to unsigned long.
+
+Wed Sep 4 15:37:05 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * enc/trans/utf8_mac-tbl.rb: fix r42789.
+ Fix conversion table and logic. [ruby-dev:47680]
+
+Wed Sep 4 14:08:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * class.c, compile.c, eval.c, gc.h, insns.def, internal.h, method.h,
+ variable.c, vm.c, vm_core.c, vm_insnhelper.c, vm_insnhelper.h,
+ vm_method.c: Implement class hierarchy method cache invalidation.
+
+ [ruby-core:55053] [Feature #8426] [GH-387]
+
+Wed Sep 4 11:13:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (str_gsub): use BEG(0) for whole matched position not
+ return value from rb_reg_search(), for \K matching.
+ [ruby-dev:47694] [Bug #8856]
+
+Wed Sep 4 11:11:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (SOLIBS): LIBRUBY_SO also needs linking with gmp, to
+ run worker processes in test-all on non-ELF platforms.
+
+Tue Sep 3 23:01:41 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/parser/test_tree.rb
+ (TestTreeParser::TestInvalid#test_unmatched_close_tag):
+ Compute expected value from test value.
+
+Tue Sep 3 22:59:58 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/treeparser.rb (REXML::Parsers::TreeParser#parse):
+ Add source information to parse exception on no close tag error.
+ [Bug #8844] [ruby-dev:47672]
+ Patch by Ippei Obayashi. Thanks!!!
+ * test/rexml/parser/test_tree.rb: Add a test for the above case.
+
+Tue Sep 3 22:57:57 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/parser/test_tree.rb: Fix test name to describe test
+ content.
+
+Tue Sep 3 22:54:46 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/treeparser.rb (REXML::Parsers::TreeParser#parse):
+ Remove needless nested parse exception information.
+ [Bug #8844] [ruby-dev:47672]
+ Reported by Ippei Obayashi. Thanks!!!
+ * test/rexml/parser/test_tree.rb: Add a test for the above case.
+
+Tue Sep 3 22:03:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_enc_str_new_cstr): new function to create a string from
+ the C-string pointer with the specified encoding.
+
+Tue Sep 3 21:41:37 2013 Akira Matsuda <ronnie@dio.jp>
+
+ * eval.c (Init_eval): Make Module#include and Module#prepend public
+ [Feature #8846]
+
+ * test/ruby/test_module.rb (class TestModule): Test for above
+
+Tue Sep 3 21:35:19 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread_pthread.c (sys/dyntune.h): for gettune().
+
+ * thread_pthread.c (hpux_attr_getstackaddr): fix missing *.
+ [ruby-core:56983] [Feature #8793]
+
+Tue Sep 3 20:12:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (GMP_STR2BIG_DIGITS): New macro.
+ (str2big_gmp): New function.
+ (rb_cstr_to_inum): Use str2big_gmp for big bignums.
+ (rb_str2big_gmp): New function.
+
+ * internal.h (rb_str2big_gmp): Declared.
+
+Tue Sep 3 19:44:40 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/win32/lib/win32/registry.rb (Win32::Registry#values): added.
+ [Feature #7763] [ruby-core:51783]
+
+Tue Sep 3 18:26:00 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/inf-ruby.el (inf-ruby-keys, run-ruby): Add magic autoload
+ comments.
+
+ * misc/rdoc-mode.el (rdoc-mode): Ditto.
+
+ * misc/ruby-electric.el (ruby-electric-mode): Ditto.
+
+ * misc/ruby-style.el (ruby-style-c-mode): Ditto.
+
+Tue Sep 3 17:06:15 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/ruby/test_rubyoptions.rb
+ (TestRubyOptions::SEGVTest::ExpectedStderr): the URL was changed at
+ r42800.
+
+Tue Sep 3 14:48:25 2013 Zachary Scott <e@zzak.io>
+
+ * lib/thread.rb: [DOC] CV#wait typo by @avdi [Fixes GH-386]
+ https://github.com/ruby/ruby/pull/386
+
+Tue Sep 3 14:37:53 2013 Zachary Scott <e@zzak.io>
+
+ * error.c: [DOC] Update bug tracker url by @ScotterC [Fixes GH-390]
+ https://github.com/ruby/ruby/pull/390
+
+Tue Sep 3 12:45:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_str2big_poweroftwo): New function.
+ (rb_str2big_normal): Ditto.
+ (rb_str2big_karatsuba): Ditto.
+
+ * internal.h (rb_str2big_poweroftwo): Declared.
+ (rb_str2big_normal): Ditto.
+ (rb_str2big_karatsuba): Ditto.
+
+ * ext/-test-/bignum/str2big.c: New file.
+
+ * test/-ext-/bignum/test_str2big.rb: New file.
+
+ * ext/-test-/bignum/depend: Add the dependency for str2big.c.
+
+Tue Sep 3 12:09:08 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_gettime): Support times() based monotonic clock.
+ (rb_clock_getres): Ditto.
+
+Tue Sep 3 12:03:02 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (str2big_scan_digits): Extracted from rb_cstr_to_inum.
+
+Tue Sep 3 11:23:57 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_select_with_thread): rounding up the fraction of
+ tv_usec instead of rounding down.
+ this change is an experiment to get rid of failures on vc10-x64 CI.
+
+Tue Sep 3 11:00:28 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (do_select): constify timeout.
+
+ * win32/win32.c (rb_w32_select_with_thread): constify 10ms wait and
+ 0ms wait structs.
+
+Tue Sep 3 10:03:42 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/openssl/test_pair.rb
+ (OpenSSL::TestPair#test_write_nonblock_no_exceptions): on some CIs
+ such as Debian 6.0, Ubuntu 10.04, CentOS and vc10-x64 (maybe depend
+ on OpenSSL version), writing to SSLSocket after SSL_ERROR_WANT_WRITE
+ causes SSL_ERROR_SSL "bad write retry".
+
+Tue Sep 3 08:20:46 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * enc/trans/utf8_mac-tbl.rb: update conversion table to recent OS X.
+ Previous table is used on Mac OS X 10.1 or prior.
+ This table is used on 10.2 or later. [ruby-dev:47680]
+
+Tue Sep 3 07:49:25 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * numeric.c (NUM_STEP_SCAN_ARGS): On second thought, keep
+ Numeric#step backward compatible in that it raises TypeError
+ when nil is given as second argument.
+
+ * test/ruby/test_float.rb (TestFloat#test_num2dbl): Revert.
+
+ * test/ruby/test_numeric.rb (TestNumeric#test_step): Fix test
+ cases for the above change.
+
+Tue Sep 3 07:39:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bytes_2comp): Define it only for little endian
+ environment.
+
+Tue Sep 3 07:31:29 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * numeric.c (NUM_STEP_SCAN_ARGS): Numeric#step should raise
+ TypeError if a non-numeric parameter is given.
+
+ * test/ruby/test_float.rb (TestFloat#test_num2dbl): Allow nil as
+ step, as with the keyword argument.
+
+ * test/ruby/test_numeric.rb (TestNumeric#test_step): Add tests for
+ nil as step or limit.
+
+Tue Sep 3 07:28:49 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (bit_length): Add casts to fix compilation error with
+ clang 3.0 -Werror,-Wshorten-64-to-32.
+ [ruby-dev:47687] reported by SASADA Koichi.
+
+Tue Sep 3 03:17:26 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_search_super_method): use ci->argc instead of
+ ci->orig_argc. ci->argc can be changed by splat arguments.
+ [ruby-list:49575]
+ This fix should be applied to Ruby 2.0.0 series.
+
+ * test/ruby/test_super.rb: add a test for above.
+
+Mon Sep 2 23:46:29 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * numeric.c (num_step): Default the limit argument to infinity and
+ allow it to be omitted. Keyword arguments (by: and to:) are
+ introduced for ease of use. [Feature #8838] [ruby-dev:47662]
+ [ruby-dev:42194]
+
+ * numeric.c (num_step): Optimize for infinite loop.
+
+Mon Sep 2 22:55:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (ISDIGIT): Unused macro removed.
+
+Mon Sep 2 22:49:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (str2big_poweroftwo): Extracted from rb_cstr_to_inum.
+ (str2big_normal): Ditto.
+ (str2big_karatsuba): Ditto.
+
+Mon Sep 2 14:39:29 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * ruby.c (Process#setproctitle): [DOC] Fix and improve rdoc.
+
+ * ruby.c (Process#argv0): [DOC] Improve rdoc.
+
+Mon Sep 2 14:15:00 2013 Kenta Murata <mrkn@cookpad.com>
+
+ * NEWS: fix description of number literal suffixes.
+
+Mon Sep 2 14:01:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * test/rake/test_rake_rules.rb: add space after string literal to
+ prevent conflict with string options syntax "foo"opts
+
+ * test/rss/rss-assertions.rb: ditto
+
+Mon Sep 2 12:28:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_bignum.rb (test_interrupt_during_to_s): Disable it
+ when GMP is used.
+
+Mon Sep 2 07:02:10 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (Init_Bignum): Define Bignum::GMP_VERSION when GMP is used.
+
+Mon Sep 2 01:46:14 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_generic): Reduce arguments.
+ (big2str_gmp): Ditto.
+ (rb_big2str1): Follow the above change.
+
+Mon Sep 2 00:08:08 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (get_mach_timebase_info): Extracted from rb_clock_gettime.
+ (rb_clock_gettime): Use get_mach_timebase_info.
+ (rb_clock_getres): Support MACH_ABSOLUTE_TIME_BASED_CLOCK_MONOTONIC.
+
+Sun Sep 1 23:30:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (GMP_BIG2STR_DIGITS): New constant.
+ (big2str_gmp): New function.
+ (rb_big2str1): Use big2str_gmp for big bignums.
+
+ * internal.h (rb_big2str_gmp): Declared.
+
+ * ext/-test-/bignum/big2str.c (big2str_gmp): New method.
+
+Sun Sep 1 22:37:51 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul_gmp): Use mpz_init and mpz_clear instead of
+ mpz_inits and mpz_clears.
+ Older GMP don't have them.
+
+Sun Sep 1 21:17:54 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/net/http/test_http.rb (test_bind_to_local_port): Choose an open
+ port more reliably.
+
+Sun Sep 1 20:32:40 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_base_poweroftwo): Renamed from
+ big2str_base_powerof2.
+ (rb_big2str_poweroftwo): New function for test.
+ (big2str_generic): Extracted from rb_big2str1.
+ (rb_big2str_generic): New function for test.
+
+ * internal.h (rb_big2str_poweroftwo): Declared.
+ (rb_big2str_generic): Ditto.
+
+ * ext/-test-/bignum/big2str.c: New file.
+
+ * test/-ext-/bignum/test_big2str.rb: New file.
+
+Sun Sep 1 15:21:21 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_2bdigits): Renamed from big2str_orig.
+
+Sun Sep 1 13:02:24 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Remove BITSPERDIG >= INT_MAX test. The static assertion,
+ SIZEOF_BDIGITS <= sizeof(BDIGIT) is enough.
+
+Sun Sep 1 11:38:26 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (maxpow_in_bdigit): Removed.
+
+Sun Sep 1 10:30:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * numeric.c (rb_fix_bit_length): Moved from bignum.c.
+
+Sun Sep 1 09:55:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (bit_length): Moved from bignum.c.
+ (nlz_int): Ditto.
+ (nlz_long): Ditto.
+ (nlz_long_long): Ditto.
+ (nlz_int128): Ditto.
+
+Sun Sep 1 03:32:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bit_length): Renamed from bitsize.
+
+Sun Sep 1 00:07:09 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_bit_length): New method.
+ (rb_fix_bit_length): Ditto.
+ [ruby-core:56247] [Feature #8700]
+
+Sat Aug 31 22:18:29 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_getres): New method.
+ (timetick2dblnum_reciprocal): New function.
+
+ * configure.in: Check clock_getres.
+
+ [ruby-core:56780] [Feature #8809] accepted as a CRuby feature at
+ DevelopersMeeting20130831Japan
+ https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20130831Japan
+
+Sat Aug 31 21:02:07 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Use GMP to accelerate big Bignum multiplication.
+ (bary_mul_gmp): New function.
+ (bary_mul): Use bary_mul_gmp.
+ (bigsq): Use different threshold with GMP.
+
+ * configure.in: Detect GMP.
+
+ [ruby-core:56658] [Feature #8796]
+
+Sat Aug 31 15:03:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * compile.c (NODE_MATCH3): pass CALL_INFO to opt_regexpmatch2
+
+ * insns.def (opt_regexpmatch2): use CALL_SIMPLE_METHOD to call =~ if
+ the receiver is not a T_STRING [Bug #8847] [ruby-core:56916]
+
+Sat Aug 31 14:07:11 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/securerandom.rb (random_bytes): Use Process.clock_gettime.
+
+Sat Aug 31 00:25:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/encoding.h (rb_{ascii8bit,utf8,usascii}_encindex): get
+ rid of conflict with macros defined in internal.h.
+
+Fri Aug 30 22:37:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread_pthread.c (native_thread_init_stack): wait the creator thread
+ to fill machine stack info, if get_stack_of() is available.
+
+ * thread_pthread.c (native_thread_create): fill the created thread
+ stack info after starting, if get_stack_of() is available.
+
+ * thread_pthread.c (native_thread_create): define attr only if it is
+ used, and merge pthread_create() calls.
+
+ * thread_pthread.c (get_main_stack): separate function to get stack of
+ main thread.
+
+Thu Aug 29 18:05:33 2013 Koichi Sasada <ko1@atdot.net>
+
+ * struct.c (rb_struct_define_without_accessor_under): added.
+ This function is similar to rb_define_class_under() against
+ rb_define_class().
+
+ * include/ruby/intern.h: add a declaration of this function.
+
+Thu Aug 29 17:03:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_call_method): a method entry refers the based
+ class/module, so should search superclass from the origin i-class
+ where the entry belongs to, to get rid of infinite loop when zsuper
+ in a prepended class/module. [ruby-core:54105] [Bug #8238]
+
+Thu Aug 29 05:35:58 2013 Eric Hodel <drbrain@segment7.net>
+
+ * ext/zlib/zlib.c (zstream_run): Fix handling of deflate streams that
+ need a dictionary but are being decompressed by Zlib::Inflate.inflate
+ (which has no option to set a dictionary). Now Zlib::NeedDict is
+ raised instead of crashing. [ruby-trunk - Bug #8829]
+ * test/zlib/test_zlib.rb (TestZlibInflate): Test for the above.
+
+Thu Aug 29 02:40:45 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/scalar_scanner.rb: invalid floats should be
+ treated as strings.
+ https://github.com/tenderlove/psych/issues/156
+
+ * test/psych/test_string.rb: test for change
+
+Wed Aug 28 17:20:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread_pthread.c (hpux_attr_getstackaddr): basic support for the
+ get_stack() under HP-UX. based on the patch by michal@rokos.cz
+ (Michal Rokos) at [ruby-core:56645]. [Feature #8793]
+
+Wed Aug 28 11:24:20 2013 Michal Rokos <michal@rokos.cz>
+
+ * configure.in (sys/pstat.h): fix missing header check for
+ missing/setproctitle.c on HP-UX. [ruby-core:56644] [Bug #8792]
+
+Wed Aug 28 04:54:33 2013 Eric Hodel <drbrain@segment7.net>
+
+ * ext/openssl/ossl_ssl.c (ossl_ssl_read): Replace duplicate
+ wait_writable with wait_readable.
+
+Tue Aug 27 17:18:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/timeout.rb (Timeout#timeout): skip rescue clause only when no
+ exception class is given.
+
+Tue Aug 27 17:02:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (copy_stream_body): should write in binary mode. based on a
+ patch by godfat (Lin Jen-Shin) at [ruby-core:56556].
+ [ruby-core:56518] [Bug #8767]
+
+Tue Aug 27 17:02:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (copy_stream_body): move common open flags.
+
+Tue Aug 27 16:56:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enumerator.c (enumerator_size): use rb_check_funcall() instead of
+ respond_to? and call.
+
+ * enumerator.c (enumerator_each): ensure that argument array size
+ does not overflow at appending.
+
+Tue Aug 27 16:46:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_index, rb_ary_rindex): use optimized equality to
+ improve performance. [Feature #8820]
+
+ * vm_insnhelper.c (rb_equal_opt): optimized equality function.
+
+Tue Aug 27 16:11:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_insnhelper.c (opt_eq_func): use RBASIC_CLASS() instead of HEAP_CLASS_OF().
+
+ * insns.def (opt_plus, opt_minus, opt_mult, opt_div, opt_mod, opt_lt),
+ (opt_gt, opt_ltlt, opt_aref, opt_aset, opt_length, opt_size),
+ (opt_empty_p, opt_succ): ditto.
+
+Tue Aug 27 16:08:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_check_funcall, rb_check_funcall_with_hook): constify
+ argv.
+
+Tue Aug 27 13:03:33 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/stringio/stringio.c (strio_read_nonblock): declare local
+ variables at the first of function.
+
+Tue Aug 27 11:51:37 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * enumerator.c: Allow Enumerator size argument to be any callable.
+ Patch by Avdi Grimm. [bug #8641] [ruby-core:56032] [fix GH-362]
+
+ * test/ruby/test_enumerator.rb: Test for above
+
+Tue Aug 27 11:46:31 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_profile_clear): do rest_sweep() before clearing
+ profile.current_record.
+
+Tue Aug 27 07:35:05 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * io.c (io_read_nonblock): support non-blocking reads without raising
+ exceptions. As in: `io.read_nonblock(size, exception: false)`
+ [ruby-core:38666] [Feature #5138]
+ * ext/openssl/ossl_ssl.c (ossl_ssl_read_internal): ditto
+ * ext/stringio/stringio.c (strio_sysread): ditto
+ * io.c (rb_io_write_nonblock): support non-blocking writes without
+ raising an exception.
+ * ext/openssl/ossl_ssl.c (ossl_ssl_write_internal): ditto
+ * test/openssl/test_pair.rb (class OpenSSL): tests
+ * test/ruby/test_io.rb (class TestIO): ditto
+ * test/socket/test_nonblock.rb (class TestSocketNonblock): ditto
+ * test/stringio/test_stringio.rb (class TestStringIO): ditto
+
+Tue Aug 27 05:24:34 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Import RubyGems 2.1.0 Release Candidate
+ * test/rubygems: ditto.
+
+Mon Aug 26 16:24:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_nextc): warn carriage return in middle of line.
+ [ruby-core:56240] [Feature #8699]
+
+Mon Aug 26 15:27:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/timeout.rb (Timeout#timeout): should not be caught by rescue
+ clause. [Bug #8730]
+
+Mon Aug 26 14:44:26 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (rb_ary_splice): use RARRAY_PTR_USE() without WB because
+ there are not new relations.
+
+ * enum.c (enum_sort_by): ditto.
+
+ * struct.c (setup_struct): use RARRAY_RAWPTR().
+
+ * vm_eval.c (yield_under): ditto.
+
+ * ext/pathname/pathname.c (path_entries): use RARRAY_AREF().
+
+ * ext/pathname/pathname.c (path_s_glob): ditto.
+
+Mon Aug 26 13:11:10 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * array.c (ary_ensure_room_for_push): fix typo in r42658.
+
+Mon Aug 26 12:37:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * template/sizes.c.tmpl: generate automatically by extracting
+ RUBY_CHECK_SIZEOF from configure.in.
+
+Mon Aug 26 10:16:59 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * process.c (gcd_timetick_int): Renamed from gcd_timtick_int.
+
+Sun Aug 25 21:02:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * sizes.c (Init_sizes): Define the size of clock_t.
+
+Sun Aug 25 01:47:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (BARY_SHORT_MUL): Renamed from BARY_MUL1.
+ (bary_short_mul): Renamed from bary_mul1.
+
+Sat Aug 24 10:35:09 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_gettime): The emulated clock names changed.
+
+Fri Aug 23 22:22:07 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_gettime): Add a cast to fix compile error by
+ -Werror,-Wshorten-64-to-32.
+
+Fri Aug 23 22:12:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (rb_intern): no symbol cache while initialization.
+
+Fri Aug 23 22:07:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (clock_t): needs time.h.
+
+Fri Aug 23 21:37:28 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (reduce_factors): New function.
+ (timetick2dblnum): Use reduce_factors.
+ (timetick2integer): Ditto.
+ (make_clock_result): Follow the above change.
+ (rb_clock_gettime): Ditto.
+
+Fri Aug 23 21:00:55 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (timetick_int_t): Renamed from timetick_giga_count_t.
+ (gcd_timtick_int): Renamed from gcd_ul and make the arguments
+ timetick_giga_count_t.
+ (reduce_fraction): Make the arguments timetick_int_t.
+ (timetick2integer): Ditto.
+ (make_clock_result): Ditto.
+ (timetick2dblnum): Fix the return type.
+ (rb_clock_gettime): Use timetick_int_t.
+
+Fri Aug 23 20:50:40 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (gcd_ul): New function.
+ (reduce_fraction): Ditto.
+ (reduce_fraction): Ditto.
+ (timetick2dblnum): Ditto.
+ (timetick2integer): Ditto.
+ (make_clock_result): Use timetick2dblnum and timetick2integer.
+ (rb_clock_gettime): Follow the make_clock_result change.
+
+Fri Aug 23 18:39:04 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_make_shared): shared ary as shady. Need more effort to
+ make it normal object.
+
+ * array.c (rb_ary_modify): use RARRAY_PTR_USE() without WB because
+ there are not new relations.
+
+ * array.c (ary_ensure_room_for_unshift): use RARRAY_RAWPTR() because
+ there are not new relations.
+
+Fri Aug 23 11:25:57 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c: introduce ARY_SHARED_OCCUPIED(shared).
+
+Fri Aug 23 11:07:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/Makefile.sub (config.h): now SIZEOF_CLOCK_T is needed for
+ unsigned_clock_t.
+
+Thu Aug 22 22:01:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_gettime): Strip "s" from unit names.
+
+Thu Aug 22 20:14:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (unsigned_clock_t): Defined.
+ (rb_clock_gettime): Consider clock_t overflow for
+ ISO_C_CLOCK_BASED_CLOCK_PROCESS_CPUTIME_ID.
+
+ * configure.in: Check the size of clock_t.
+
+Thu Aug 22 16:22:48 2013 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (build_postexe_iseq): fix to setup the local table.
+
+Thu Aug 22 15:42:43 2013 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (rb_iseq_compile_node): accept NODE_IFUNC to support
+ custom compilation.
+
+ * compile.c (NODE_POSTEXE): compile to
+ "ONCE{ VMFrozenCore::core#set_postexe{...} }" with a new custom
+ compiler `build_postexe_iseq()'.
+
+ * vm.c (m_core_set_postexe): remove parameters (passed by a block).
+
+Thu Aug 22 06:54:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_gettime): Change emulation symbols for
+ Process.clock_gettime.
+
+Thu Aug 22 06:24:54 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (make_clock_result): Extracted from rb_clock_gettime.
+
+Wed Aug 21 22:30:51 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_gettime): clock() based CLOCK_PROCESS_CPUTIME_ID
+ emulation implemented.
+
+Wed Aug 21 21:02:37 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_proc_times): Use RB_GC_GUARD to guard objects from GC.
+
+Wed Aug 21 20:33:01 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (get_clk_tck): Extracted from rb_proc_times.
+ (rb_clock_gettime): times() based CLOCK_PROCESS_CPUTIME_ID emulation
+ is implemented.
+
+Wed Aug 21 19:31:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c: POSIX_GETTIMEOFDAY_CLOCK_REALTIME is renamed to
+ SUS_GETTIMEOFDAY_CLOCK_REALTIME.
+
+Wed Aug 21 19:17:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_gettime): CLOCK_PROCESS_CPUTIME_ID emulation
+ using getrusage is implemented.
+
+Wed Aug 21 17:34:27 2013 Tanaka Akira <akr@fsij.org>
+
+ * gc.c (getrusage_time): Fallback clock_gettime to getrusage when
+ clock_gettime fails.
+ Reported by Eric Saxby. [ruby-core:56762] [Bug #8805]
+
+Wed Aug 21 02:32:32 2013 Koichi Sasada <ko1@atdot.net>
+
+ * insns.def: fix regexp's once option behavior.
+ fix [ruby-trunk - Bug #6701]
+
+ * insns.def: remove `onceinlinecache' and introduce `once' instruction.
+ `once' doesn't use `setinlinecache' insn any more.
+
+ * vm_core.h: `union iseq_inline_storage_entry' to store once data.
+
+ * compile.c: catch up above changes.
+
+ * iseq.c: ditto.
+
+ * vm.c, vm_insnhelper.c: ditto. fix `m_core_set_postexe()' which
+ is depend on `onceinlinecache' insn.
+
+ * test/ruby/test_regexp.rb: add tests.
+
+ * iseq.c: ISEQ_MINOR_VERSION to 1 (should increment major?)
+
+Wed Aug 21 02:30:15 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_gcdebug_print_obj_condition): add printing information.
+
+Tue Aug 20 13:38:00 2013 Naohisa Goto <ngotogenome@gmail.com>
+
+ * test/gdbm/test_gdbm.rb: skip TestGDBM#test_s_open_lock on Solaris.
+ On Solaris (and platforms which do not have flock and have lockf),
+ with GDBM 1.10, gdbm_open(3) blocks when opening already locked
+ gdbm file. [Bug #8790] [ruby-dev:47631]
+
+Tue Aug 20 02:32:52 2013 Zachary Scott <e@zzak.io>
+
+ * lib/test/: [DOC] Document Test::Unit, hide most submodules and
+ classes from rdoc. Since lib/test is only present as a compatibility
+ layer with the legacy test suite many test/unit users will be using
+ minitest or the test/unit gem instead. It is recommended to use one
+ of these alternatives for writing new tests.
+
+ This patch was based on a patch submitted by Steve Klabnik.
+ [ruby-core:56694] [Bug #8778]
+
+Tue Aug 20 02:10:19 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rss/rss.rb: [DOC] Document for constants by Steve Klabnik
+ [ruby-core:56705] [Bug #8798]
+
+Tue Aug 20 02:01:10 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rss/xmlparser.rb: [DOC] Hide legacy constant from rdoc
+ Patch by Steve Klabnik [ruby-core:56708] [Bug #8799]
+
+Tue Aug 20 01:52:05 2013 Zachary Scott <e@zzak.io>
+
+ * ext/socket/unixserver.c: [DOC] Document #accept
+ * ext/socket/tcpserver.c: ditto
+ * ext/socket/udpsocket.c: [DOC] Fix indentation of documentation
+ * ext/socket/socket.c: ditto
+ Patches by David Rodr'iguez [ruby-core:56734] [Bug #8802]
+
+Tue Aug 20 01:19:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Define ac_cv_func_clock_gettime to yes for mingw*.
+
+Mon Aug 19 21:31:35 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/defines.h: Fix a compilation error with
+ i586-mingw32msvc-gcc of gcc-mingw32 package on Debian squeeze.
+ ruby/missing.h should be included before include/ruby/win32.h
+ because struct timespec, used in the clock_gettime declaration in
+ include/ruby/win32.h, is defined in ruby/missing.h instead of
+ system headers.
+
+Mon Aug 19 20:55:12 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: fix around GC_DEBUG.
+
+ * gc.c (RVALUE::line): should be VALUE. On some environment
+ (such as mswin64), `int' introduces alignment mismatch.
+
+ * gc.c (newobj_of): add an assertion to check VALUE alignment.
+
+ * gc.c (aligned_malloc): `&' is low priority than `=='.
+
+ * gc.c: define GC_DEBUG everytime and use it as value 0 or 1.
+
+Mon Aug 19 17:43:44 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/ruby/test_fiber.rb: collect garbage fibers immediately.
+
+Mon Aug 19 17:41:49 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/profile_test_all.rb: add `failed?' information.
+
+Mon Aug 19 17:00:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (retry_fork): retry with GC if ENOMEM occurred, to free
+ swap/kernel space.
+
+Mon Aug 19 13:28:47 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * include/ruby/win32.h (CLOCK_MONOTONIC): typo.
+
+ * win32/win32.c: removed duplicated declarations.
+
+Mon Aug 19 13:03:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (clock_gettime): should not overwrite cache variable
+ with different condition. otherwise -lrt is not linked and the link
+ fails, after reconfig.
+
+Mon Aug 19 12:56:49 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (Init_process): Add constants: CLOCK_REALTIME_ALARM and
+ CLOCK_BOOTTIME_ALARM.
+
+Sun Aug 18 20:17:41 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * variable.c, vm_method.c: remove dead code.
+
+ * test/ruby/test_fiber.rb, test/ruby/test_thread.rb:
+ change accordingly.
+
+Sun Aug 18 19:32:26 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * error.c, file.c, gc.c, hash.c, thread.c, variable.c, vm_eval.c, bin/erb:
+ $SAFE=4 is obsolete.
+
+Sun Aug 18 14:30:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_gettime): Rename POSIX_TIME_CLOCK_REALTIME to
+ ISO_C_TIME_CLOCK_REALTIME.
+
+Sun Aug 18 14:22:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Revert r42604. It causes linking librt on systems
+ with newer glibc uselessly.
+
+Sun Aug 18 13:18:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (Init_process): Add constants: CLOCK_REALTIME_COARSE,
+ CLOCK_MONOTONIC_COARSE and CLOCK_BOOTTIME.
+
+Sun Aug 18 12:41:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (clock_gettime): need to check with -lrt prior to check
+ for the function only. otherwise -lrt is not linked and the link
+ fails, when ac_cv_func_clock_gettime is cached as yes.
+
+Sun Aug 18 10:05:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big2str1): Make an expression more explicit.
+
+Sun Aug 18 03:18:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big2str1): Use power_level instead of bitsize(xn).
+
+Sun Aug 18 00:44:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (BIGDIVREM_EXTRA_WORDS): Redefine to 1.
+ (bigdivrem_num_extra_words): Removed.
+ (bigdivrem_normal): Simplified.
+ (big2str_karatsuba): Ditto.
+
+Sat Aug 17 23:25:19 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * test/ruby/test_time.rb: use the in_timezone() helper
+ and define it at the top with other helpers.
+
+Sat Aug 17 22:20:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * time.c (time_mload): ignore auxiliary data, offset and zone, if
+ invalid. [ruby-core:56648] [Bug #8795]
+
+Sat Aug 17 20:11:49 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * process.c: [DOC] MACH_ABSOLUTE_TIME_CLOCK_MONOTONIC is an
+ available emulation for a monotonic clock on Darwin.
+ https://developer.apple.com/library/mac/qa/qa1398/_index.html
+
+Fri Aug 16 18:12:05 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/profile_test_all.rb: fix typo.
+
+Fri Aug 16 18:09:20 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/profile_test_all.rb: remove space characters from test names.
+
+Fri Aug 16 17:32:02 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/profile_test_all.rb: refactoring memory profiling tool for
+ test-all.
+ Add profiling targets /proc/meminfo and /proc/self/status.
+
+ * test/runner.rb: accept other than 'true'.
+
+Fri Aug 16 11:23:35 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * file.c (rb_file_size, rb_file_flock): improve performance of Windows.
+
+ * file.c (rb_file_truncate): removed unnecessary #ifdef.
+
+ * test/test_file.rb (TestFile#test_truncate_size): added an assertion
+ for File#size.
+
+Fri Aug 16 10:07:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem_single1): Renamed from bigdivrem_single. Add
+ x_higher_bdigit argument.
+ (bigdivrem_single): Just call bigdivrem_single1.
+ (bigdivrem_restoring): Use bigdivrem_single1 to avoid memmove.
+
+Fri Aug 16 09:17:00 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_small_rshift): Specify the higher BDIGIT instead of
+ sign bit.
+ (big_shift3): Follow the above change.
+
+Fri Aug 16 02:20:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul_toom3): Reduce a branch.
+
+Fri Aug 16 02:14:09 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * process.c (rb_clock_gettime): add CLOCK_MONOTONIC support on OS X.
+ http://developer.apple.com/library/mac/qa/qa1398/_index.html
+ [Feature #8658]
+
+Fri Aug 16 01:37:43 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem_single): Use shift when y is a power of two.
+
+Fri Aug 16 01:09:33 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem_restoring): Use bigdivrem_single if non-topmost
+ BDIGITs of y are zero.
+
+Fri Aug 16 00:33:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big2str1): Truncate topmost zeros of x.
+
+Fri Aug 16 00:00:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_divmod): Simplify an expression.
+
+Thu Aug 15 23:26:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem_normal): Remove a local variable.
+
+Thu Aug 15 23:08:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_karatsuba): Use bigdivrem_restoring directly to
+ reduce working buffer and memory copy.
+ (rb_big2str1): Allocate working buffer for big2str_karatsuba here.
+
+Thu Aug 15 20:51:29 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * io.c, internal.h (rb_io_flush_raw): new function to select calling
+ fsync() (on Windows).
+
+ * io.c (rb_io_flush_raw): use above function.
+
+ * file.c (rb_file_truncate): use above function.
+
+ * test/ruby/test_file.rb (TestFile#test_truncate_size): test for
+ above changes.
+
+Thu Aug 15 18:39:31 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (clock_gettime): improve precision when freq is less
+ than and nearly equals 10**9.
+
+Thu Aug 15 17:43:15 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_lazy_sweep): remove heap_increment() here because heap_inc
+ may be 0.
+
+Thu Aug 15 16:59:56 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * io.c (rb_io_rewind): remove fsync() for Windows to improve the
+ performance.
+
+Thu Aug 15 16:30:23 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/fileutils/test_fileutils.rb (TestFileUtils#test_rmdir):
+ FileUtils.rmdir ignores Errno::ENOTEMPTY, so, in such cases, this
+ assertion is nonsense.
+
+Thu Aug 15 15:49:35 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_gettime): [DOC] FreeBSD 7.1 supports
+ CLOCK_THREAD_CPUTIME_ID.
+ http://www.freebsd.org/releases/7.1R/relnotes.html
+
+Thu Aug 15 14:30:23 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * include/ruby/win32.h, win32/Makefile.sub, win32/win32.c
+ (clock_gettime): [experimental] emulates clock_gettime(2) of posix.
+
+Thu Aug 15 02:32:40 2013 Zachary Scott <e@zzak.io>
+
+ * hash.c (rb_hash_aset): [DOC] Document key dup patch by @kachick
+ [Fixes GH-382] https://github.com/ruby/ruby/pull/382
+
+Wed Aug 14 14:28:39 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * proc.c (rb_mod_define_method): now they return the symbols of the
+ defined methods, not the methods/procs themselves.
+ [ruby-dev:42151] [Feature #3753]
+
+ * NEWS: documents about above change and def-expr (see r42337).
+
+ * test/ruby/test_module.rb: tests about above change.
+
+Wed Aug 14 00:51:14 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem_restoring): xn argument removed.
+ (bigdivrem_normal): Follow the above change.
+
+Wed Aug 14 00:18:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big_div_struct): Remove xn and j field. Add zn field.
+ (bigdivrem1): Follow the above change.
+ (bigdivrem_restoring): Ditto.
+
+Tue Aug 13 23:38:17 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big_div_struct): ynzero field removed.
+ (bigdivrem1): Follow the above change.
+ (bigdivrem_restoring): Ditto.
+
+Tue Aug 13 23:01:16 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem_restoring): Extracted from bigdivrem_normal.
+
+Tue Aug 13 22:12:59 2013 Kenichi Kamiya <kachick1@gmail.com>
+
+ * random.c (rb_random_ulong_limited): coerce before check negative.
+ [Fixes GH-379]
+
+Tue Aug 13 21:52:15 2013 Kenichi Kamiya <kachick1@gmail.com>
+
+ * object.c (Init_Object): undef Module#prepend_features on Class, as
+ well as Module#append_features. [Fixes GH-376]
+
+ * test_class.rb: Added test for above. And ensure type checking
+ on similar methods as module_function.
+
+Tue Aug 13 08:52:18 2013 Zachary Scott <e@zzak.io>
+
+ * doc/syntax/literals.rdoc: [DOC] String literal concat by @cknadler
+ [Fixes GH-380] https://github.com/ruby/ruby/pull/380
+
+Mon Aug 12 23:07:21 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (gc_marks_test): inhibit gc for st's operation.
+
+Mon Aug 12 15:59:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_whole_match_p): treat CR in middle of a line as a
+ mere whitespace.
+
+Mon Aug 12 15:16:58 2013 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (rb_prepend_module): make T_ICLASS object shady because
+ this T_ICLASS object seems to share method table with other class
+ objects. It was causes WB miss.
+ TODO: need to know the data structure.
+
+ * test/ruby/test_module.rb: add a test for WB miss.
+
+Mon Aug 12 13:47:54 2013 Zachary Scott <e@zzak.io>
+
+ * process.c: [DOC] RDoc formatting of Process.clock_gettime
+
+Mon Aug 12 13:29:09 2013 Zachary Scott <e@zzak.io>
+
+ * lib/yaml/dbm.rb: [DOC] Document call-seq for YAML::DBM
+
+Mon Aug 12 12:57:26 2013 Zachary Scott <e@zzak.io>
+
+ * ext/dbm/extconf.rb: [DOC] Hide from RDoc
+ Some libraries might want to document extconf.rb so RDoc treats it
+ like any other ruby program. However, DBM users shouldn't care about
+ these methods.
+
+Mon Aug 12 12:53:39 2013 Zachary Scott <e@zzak.io>
+
+ * ext/dbm/dbm.c: [DOC] Reformat headings of DBM class
+
+Mon Aug 12 12:46:31 2013 Zachary Scott <e@zzak.io>
+
+ * lib/yaml.rb, lib/yaml/: [DOC] Document YAML::DBM#key and add
+ references to similar methods with more detail. This patch brings
+ lib/yaml to 100% documentation coverage.
+
+Mon Aug 12 02:51:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/readline/readline.c (readline_s_set_input): on OS X with editline,
+ Readline.readline doesn't work because readline_get doesn't use
+ rl_getc. The difference is introduced by r42402 [ruby-dev:47509]
+ [Bug #8644]. Before it rb_io_stdio_file set ifp->stdio_file.
+ Therefore add manually setting the value.
+
+ * ext/readline/readline.c (readline_s_set_output): ditto.
+
+Sun Aug 11 23:27:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_str_encode_ospath): OS path encoding on Mac OS X is also
+ fixed.
+
+Sun Aug 11 22:57:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/ruby/test_require.rb (assert_require_nonascii_path): OS path
+ encoding on Windows is fixed, so encoding of __FILE__ should be it.
+ [ruby-core:56498] [Bug #8764]
+
+Sun Aug 11 19:11:45 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/parser/test_sax2.rb: Expand abbreviated class name.
+
+Sun Aug 11 19:06:03 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/sax2listener.rb (REXML::SAX2Listener#notationdecl): Fix
+ wrong number of arguments in the template listener.
+ [Bug #8731] [ruby-dev:47582]
+ Reported by Ippei Obayashi.
+ * test/rexml/parser/test_sax2.rb: Add tests for parsing notation
+ declarations with SAX2 API.
+
+Sun Aug 11 18:44:04 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/sax2listener.rb (REXML::SAX2Listener#elementdecl): Fix wrong
+ examples. [Bug #8731] [ruby-dev:47582]
+ Reported by Ippei Obayashi.
+
+Sun Aug 11 18:42:13 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/sax2parser.rb
+ (REXML::Parsers::SAX2Parser#handle_entitydecl): Extract.
+
+Sun Aug 11 18:40:25 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse):
+ Fix wrong "%" position in parameter entity declaration event argument.
+ * test/rexml/parser/test_sax2.rb: Add tests for the above case.
+
+Sun Aug 11 18:08:40 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse):
+ Support NDATA in external ID entity declaration.
+ * test/rexml/parser/test_sax2.rb: Add tests for the above case.
+
+Sun Aug 11 18:07:39 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/baseparser.rb
+ (REXML::Parsers::BaseParser#pull_event): Support optional NDATA
+ in external ID entity declaration.
+
+Sun Aug 11 17:54:07 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * NEWS (REXML::Parsers::SAX2Parser): Add about this change.
+ * lib/rexml/parsers/sax2parser.rb (REXML::Parsers::SAX2Parser#parse):
+ Fix wrong number of arguments. Document says "an array of the
+ entity declaration" but it passes two or more arguments.
+ This is a bug but it break backward compatibility.
+ Reported by Ippei Obayashi. [Bug #8731] [ruby-dev:47582]
+ * lib/rexml/sax2listener.rb (REXML::SAX2Listener#entitydecl): ditto.
+ The listener template accepted two arguments.
+ * test/rexml/parser/test_sax2.rb: Add tests for external ID case.
+
+Sun Aug 11 17:41:41 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/parser/test_sax2.rb: Add SAX2 API test.
+
+Sun Aug 11 15:10:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (rb_enc_symname_type): allow ID_ATTRSET for ID_INSTANCE,
+ ID_GLOBAL, ID_CLASS, ID_JUNK too. [Bug #8756]
+
+Sun Aug 11 13:17:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * include/ruby/encoding.h: Reduce ENCODING_INLINE_MAX to 127 as this
+ should be sufficient to represent all the encodings Ruby supports.
+
+Sun Aug 11 11:54:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (rb_clock_gettime): New method.
+ This is accepted in the meeting:
+ https://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20130809
+ This method is accepted as a CRuby feature.
+ I.e. Other Ruby implementations don't need to implement it.
+ [ruby-core:56087] [Feature #8658]
+
+Sun Aug 11 10:40:48 2013 Zachary Scott <e@zzak.io>
+
+ * lib/time.rb: [DOC] Correcting rdoc visibility of time.rb constants
+ Reported by Tanaka Akira [ruby-core:56517]
+
+Sun Aug 11 04:48:14 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * file.c (rb_str_normalize_ospath):
+ HFS Plus (Mac OS Extended) uses a variant of Normal Form D in which
+ U+2000 through U+2FFF, U+F900 through U+FAFF, and U+2F800 through
+ U+2FAFF are not decomposed (this avoids problems with round trip
+ conversions from old Mac text encodings).
+ http://developer.apple.com/library/mac/qa/qa1173/_index.html
+ Therefore fix r42457 to exclude the range.
+
+Sun Aug 11 03:26:07 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bitsize): Fix a conditional expression.
+
+Sun Aug 11 02:44:03 2013 Zachary Scott <e@zzak.io>
+
+ * lib/time.rb: [DOC] Document constants by @markijbema [Fixes GH-377]
+ https://github.com/ruby/ruby/pull/377
+
+Sun Aug 11 01:28:52 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Revert r42458.
+ It removes the HAVE_CLOCK_GETTIME from config.h.
+ http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130809T044800Z.diff.html.gz
+
+Sat Aug 10 13:53:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (rb_id_attrset): allow other than ID_ATTRSET.
+
+ * parse.y (intern_str): ditto. try stem ID for ID_INSTANCE,
+ ID_GLOBAL, ID_CLASS, ID_JUNK too. [Bug #8756]
+
+Sat Aug 10 12:49:50 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/baseparser.rb
+ (REXML::Parsers::BaseParser::CDATA_END): Use "\A" instead of "^".
+ It is not an used constant but I fix it. (Or should I remove it?)
+
+Sat Aug 10 12:47:19 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser):
+ Fix wrong constant name. "]>" pattern match is the same but
+ it is used for "<!DOCTYPE" end mark not "<![CDATA[" end mark.
+
+Sat Aug 10 12:43:15 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser):
+ Use "\A" instead of "^" in document type declaration patterns
+ because they are used as the head match in content not the head
+ match in line. They don't cause any problems in the current code
+ but it should be fixed.
+
+Sat Aug 10 12:39:00 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/parse/test_document_type_declaration.rb: Add tests for
+ parsing document type declaration.
+
+Sat Aug 10 12:00:45 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser::SYSTEM):
+ Fix loose "head" match regular expression. It doesn't cause any
+ problem in the current code but it should be fixed because readers
+ may confuse it.
+ Patch by Ippei Obayashi. Thanks!!!
+
+Sat Aug 10 11:58:24 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/parse/test_notation_declaration.rb (#test_system_public):
+ Add a test for PUBLIC notation and SYSTEM notation order case.
+
+Sat Aug 10 11:31:35 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/baseparser.rb (REXML::Parsers::BaseParser::PUBLIC):
+ Fix loose "head" match regular expression.
+ [Bug #8701] [ruby-dev:47551]
+ Patch by Ippei Obayashi. Thanks!!!
+ * test/rexml/parse/test_notation_declaration.rb (#test_system_public):
+ Add a test for the above case.
+
+Sat Aug 10 09:20:21 2013 Zachary Scott <e@zzak.io>
+
+ * NEWS: [DOC] typo in example reported by @moretea
+ https://github.com/ruby/ruby/commit/a39e724#commitcomment-3831489
+
+Sat Aug 10 09:19:04 2013 Zachary Scott <e@zzak.io>
+
+ * proc.c: [DOC] rdoc code formatting
+
+Sat Aug 10 09:12:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (rb_id_attrset): check if the argument is valid type as an
+ attribute.
+
+Sat Aug 10 05:44:08 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rss/trackback.rb: [DOC] Hide RSS::Trackback from rdoc
+ Patch by Steve Klabnik [Bug #8755] [ruby-core:56456]
+
+Sat Aug 10 04:52:21 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big_div_struct): Use size_t.
+ (bigdivrem1): Ditto.
+ (bigdivrem_num_extra_words): Ditto.
+ (bigdivrem_single): Ditto.
+ (bigdivrem_normal): Ditto.
+ (bary_divmod): Ditto.
+
+Fri Aug 9 23:47:15 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rss/rexmlparser.rb: Remove needless REXML version check.
+ Both RSS Parser and REXML are bundled in Ruby. RSS Parser can
+ always use the latest REXML. [Bug #8754] [ruby-core:56454]
+ Patch by Steve Klabnik. Thanks!!!
+
+Fri Aug 9 22:51:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (XLDFLAGS, LIBRUBYARG_STATIC): CoreFoundation framework
+ option is now needed always, regardless enable-shared.
+ [ruby-core:56467] [Bug #8759]
+
+Fri Aug 9 22:20:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby.c (load_file_internal): use rb_parser_compile_string_path and
+ rb_parser_compile_file_path, String path name versions. [Bug #8753]
+
+Fri Aug 9 07:16:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * ext/io/console/console.c: delete redefinition of rb_cloexec_open.
+ drop support for 1.8 and 1.9 from the next release of io-console gem.
+
+Fri Aug 9 19:13:54 2013 Koichi Sasada <ko1@atdot.net>
+
+ * NEWS: update about new methods for Binding.
+
+Fri Aug 9 18:48:09 2013 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c: add Binding#local_variable_get/set/defined?
+ to access local variables which a binding contains.
+ Most part of implementation by nobu.
+
+ * test/ruby/test_proc.rb: add a tests for above.
+
+ * vm.c, vm_core.h (rb_binding_add_dynavars): add a new function
+ to add a new environment to create space for new local variables.
+
+Fri Aug 9 14:02:01 2013 SHIBATA Hiroshi <shibata.hiroshi@gmail.com>
+
+ * tool/make-snapshot: Fix order of priority for option parameter.
+
+Fri Aug 9 12:06:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_str_normalize_ospath): normalize to Normalization Form C
+ using CFString.
+
+Fri Aug 9 10:53:57 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * time.c (get_timeval, get_new_timeval): use rb_obj_class()
+ instead of CLASS_OF() because CLASS_OF() may return
+ a singleton class.
+
+Fri Aug 9 10:42:11 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * vm_insnhelper.c (vm_invoke_block): returning from lambda proc
+ now always exits from the Proc. [ruby-core:56193] [Feature #8693]
+
+ * NEWS, test/ruby/test_lambda.rb: ditto. Patch by nobu.
+
+Fri Aug 9 00:10:32 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enumerator.c (lazy_zip_func): fix non-single argument. fix
+ out-of-bound access and pack multiple yielded values.
+ [ruby-core:56383] [Bug #8735]
+
+Thu Aug 8 23:01:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (rb_mod_singleton_p): new method Module#singleton_class? to
+ return whether the receiver is a singleton class or not.
+ [ruby-core:51087] [Feature #7609]
+
+Thu Aug 8 21:56:44 2013 Tanaka Akira <akr@fsij.org>
+
+ * time.c (time_overflow_p): Avoid signed integer overflow.
+ (rb_time_new): Fix overflow condition.
+
+Thu Aug 8 19:58:02 2013 Koichi Sasada <ko1@atdot.net>
+
+ * thread.c (rb_threadptr_pending_interrupt_check_mask):
+ use RARRAY_RAWPTR() instead of RARRAY_PTR() because
+ there is no new reference.
+
+Thu Aug 8 19:56:52 2013 Koichi Sasada <ko1@atdot.net>
+
+ * string.c (rb_str_format_m): use RARRAY_RAWPTR() instead of
+ RARRAY_PTR() because there is no new reference.
+
+Thu Aug 8 19:55:51 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: define USE_RGENGC_LOGGING_WB_UNPROTECT.
+
+Thu Aug 8 16:44:25 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: add old macro name `RUBY_EVENT_SWITCH'.
+ This macro name is obsolete because it is renamed to
+ RUBY_INTERNAL_EVENT_SWITCH, but it has compatibility problem
+ using this macro name like ruby-prof.
+ I want to remove this macro after ruby 2.1.
+
+Thu Aug 8 15:37:53 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/coverage/test_coverage.rb (TestCoverage#test_big_code): use `1'
+ instead of `p' to get rid of a side effect.
+ Kernel#p without any argument seems to do nothing, but flushes stdout.
+ and, if stdout is redirected to file, fsync() will be called on
+ Windows. so, when running test-all on Windows with redirection, such
+ as CI environment, this test took a lot of time.
+
+Thu Aug 8 14:54:18 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * NEWS: add description of incompatibility introduced by r42396.
+ [ruby-core:56329] [Bug #8722]
+
+Thu Aug 8 14:50:36 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * common.mk (mini): portable target to build miniruby
+
+ * common.mk (bisect): run git-bisect with miniruby
+
+ * common.mk (bisect-ruby): run git-bisect with ruby
+
+ * tool/bisect.sh: script for git-bisect
+
+Thu Aug 8 12:11:43 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/webrick/test_httpresponse.rb (test_send_body_*_chunked): these
+ expectations assumes that the IOs are binmode. fixed test failures
+ introduced at r42427 on Windows.
+
+Thu Aug 8 10:27:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * range.c (range_last): revert r42400. [Bug #8739]
+
+Thu Aug 8 10:26:25 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_str_normalize_ospath): extract and move from dir.c.
+
+Thu Aug 8 05:59:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * test/openssl/test_ssl.rb: Fix test for CVE-2013-4073.
+ Patch by Antonio Terceiro. [Bug #8750] [ruby-core:56437]
+
+Thu Aug 8 03:37:38 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/webrick/httpresponse.rb: Allow #body to be an IO-like object
+ that responds to #readpartial and #read.
+ [ruby-trunk - Feature #8155]
+ * NEWS: NEWS for above
+ * test/webrick/test_httpresponse.rb: Tests for above.
+
+Wed Aug 7 23:06:26 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * ruby.c (Process.argv0): New method to return the original value
+ of $0. [Feature #8696]
+
+Wed Aug 7 23:05:55 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * ruby.c (Process.setproctitle): New method to change the title of
+ the running process that is shown in ps(1). [Feature #8696]
+
+Wed Aug 7 20:05:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_odd_p): Check the bignum length.
+ (rb_big_even_p): Ditto.
+
+Wed Aug 7 19:29:26 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (dbl2big): A condition simplified.
+
+Wed Aug 7 16:34:30 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/webrick/test_cgi.rb (TestWEBrickCGI#{start_cgi_server,test_cgi}):
+ mswin is not only mswin32 but also mswin64. [Bug #8746]
+
+Wed Aug 7 16:19:12 2013 Koichi Sasada <ko1@atdot.net>
+
+ * cont.c (rb_fiber_start): use RARRAY_RAWPTR() instead of
+ RARRAY_PTR() because there is no new reference.
+
+ * proc.c (curry): ditto.
+
+ * proc.c (rb_proc_call): remove line break.
+
+Wed Aug 7 13:20:12 2013 Koichi Sasada <ko1@atdot.net>
+
+ * random.c (random_load): use RARRAY_RAWPTR() instead of
+ RARRAY_PTR() because there is no new reference.
+
+Wed Aug 7 12:58:23 2013 Koichi Sasada <ko1@atdot.net>
+
+ * thread.c (thread_start_func_2): use RARRAY_RAWPTR() instead of
+ RARRAY_PTR() because there is no new reference.
+
+Wed Aug 7 09:00:24 2013 Zachary Scott <e@zzak.io>
+
+ * string.c: [DOC] Description of rb_str_equal [Fixes GH-375]
+ Based on a patch by @markijbema
+ https://github.com/ruby/ruby/pull/375
+
+Wed Aug 7 08:30:38 2013 Zachary Scott <e@zzak.io>
+
+ * ext/openssl/ossl_hmac.c: [DOC] Documentation for OpenSSL::HMAC
+ based on a patch by @repah documenting-ruby/ruby#14
+ https://github.com/documenting-ruby/ruby/pull/14
+
+Wed Aug 7 07:46:23 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rss/utils.rb: [DOC] RSS::Utils by Steve Klabnik [Bug #8745]
+
+Wed Aug 7 07:38:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (nlz16): Removed.
+ (nlz32): Ditto.
+ (nlz64): Ditto.
+ (nlz128): Ditto.
+ (nlz_int): New function.
+ (nlz_long): New function.
+ (nlz_long_long): New function.
+ (nlz_int128): New function.
+ (nlz): Follow above changes.
+ (bitsize): Follow above changes.
+
+Tue Aug 6 22:38:15 2013 Zachary Scott <e@zzak.io>
+
+ * time.c: [DOC] Typo in Time overview by @sparr [Fixes GH-374]
+ https://github.com/ruby/ruby/pull/374
+
+Tue Aug 6 22:35:32 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rss/1.0.rb: [DOC] Document RSS10 by Steve Klabnik [Bug #8740]
+
+Tue Aug 6 22:14:11 2013 Kouji Takao <kouji.takao@gmail.com>
+
+ * ext/readline/readline.c (readline_s_delete_text): remove
+ checking "$SAFE == 4".
+
+ * ext/readline/readline.c: fix rdoc, remove "Raises SecurityError"
+ and add "Raises NotImplementedError".
+
+Tue Aug 6 22:04:38 2013 Kouji Takao <kouji.takao@gmail.com>
+
+ * ext/readline/readline.c, test/readline/test_readline.rb: fix
+ indent.
+
+Tue Aug 6 21:59:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * range.c (range_last): return nil for empty range, or in the case the
+ predecessor is smaller than the begin. [Bug #8739]
+
+Tue Aug 6 21:48:31 2013 Kouji Takao <kouji.takao@gmail.com>
+
+ * ext/readline/readline.c (readline_s_set_point, Init_readline):
+ add Readline.point=(pos). Patched by naruse. [ruby-dev:47535]
+ [Feature #8675]
+
+Tue Aug 6 21:14:11 2013 Kouji Takao <kouji.takao@gmail.com>
+
+ * ext/readline/readline.c (Init_readline, readline_s_set_output)
+ (clear_rl_outstream, readline_s_set_input, clear_rl_instream)
+ (readline_readline): fix causing SEGV if closed IO object that is
+ set Readline.input or Readline.output. Patched by akr
+ [ruby-dev:47509] [Bug #8644]
+
+Tue Aug 6 17:56:40 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_push_frame): change type of stack_max to size_t.
+
+Tue Aug 6 17:42:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * range.c (range_last): exclude the last number of the exclusive range
+ if the end is Numeric. [ruby-dev:47587] [Bug #8739]
+
+Tue Aug 6 17:42:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_conv_from_wchar): converted string to CP_UTF8
+ should have UTF-8 encoding. otherwise no conversion takes place
+ later.
+
+Tue Aug 6 17:21:38 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_push_frame): fix stack overflow check codes.
+ Stack overflow check should be done *after* pushing a stack frame.
+ However, some stack overflow checking codes checked *before*
+ pushing a stack frame with iseq->stack_max.
+ To solve this problem, add a new parameter `stack_max' to specify
+ a possible consuming stack size.
+
+ * vm_core.h (CHECK_VM_STACK_OVERFLOW0): add to share the stack overflow
+ checking code.
+
+ * insns.def: catch up this change.
+
+ * vm.c, vm_eval.c: ditto.
+
+ * test/ruby/test_exception.rb: add a stack overflow test.
+ This code is reported by nobu.
+
+Tue Aug 6 17:02:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_conv_from_wchar): use WideCharToMultiByte(),
+ as like as mbstr_to_wstr(), in the first step of the conversion from
+ WCHAR.
+
+Tue Aug 6 16:14:32 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * vm_eval.c (eval_string_with_cref): copy cref to limit the scope of
+ refinements in the eval string. [ruby-core:56329] [Bug #8722]
+
+ * test/ruby/test_refinement.rb: related test.
+
+Tue Aug 6 12:23:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_realloc): Use VALGRIND_MAKE_MEM_UNDEFINED to
+ declare undefined memory area.
+ (bignew_1): Ditto.
+
+ * internal.h (VALGRIND_MAKE_MEM_DEFINED): Moved from gc.c
+ (VALGRIND_MAKE_MEM_UNDEFINED): Ditto.
+
+Tue Aug 6 01:40:37 2013 Zachary Scott <e@zzak.io>
+
+ * process.c: [DOC] Document caveats of command form of Process.spawn
+ with regard to the shell and OS. Patched by Steve Klabnik [Bug #8550]
+
+Tue Aug 6 01:28:35 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rss/0.9.rb: [DOC] Typo in example [Bug #8732]
+
+Tue Aug 6 01:22:37 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rss/2.0.rb: [DOC] Document RSS::Rss by Steve Klabnik #8740
+ * lib/rss/atom.rb: [DOC] Typo in rdoc by Steve Klabnik
+
+Mon Aug 5 23:47:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Rename local variables.
+
+Mon Aug 5 22:23:59 2013 Zachary Scott <e@zzak.io>
+
+ * vm_trace.c: [DOC] Fix TracePoint return values in examples
+ Based on a patch by @sho-h [Fixes GH-373]
+ https://github.com/ruby/ruby/pull/373
+
+Mon Aug 5 17:38:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_write_console): use MultiByteToWideChar() for
+ the last step of conversion to WCHAR, to get rid of warnings from
+ rb_enc_find() in miniruby. [ruby-dev:47584] [Bug #8733]
+
+ * win32/win32.c (wstr_to_mbstr, mbstr_to_wstr): fix wrong trimming.
+ WideCharToMultiByte() and MultiByteToWideChar() do not count
+ NUL-terminator in the size for conversion result, unless the input
+ length is -1.
+
+Mon Aug 5 11:51:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * include/ruby/encoding.h: document which user flags are used by
+ ENCODING_MASK for better greppability
+
+Mon Aug 5 10:01:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * object.c (rb_class_inherited_p): allow iclasses to be tested for
+ inheritance. [Bug #8686] [ruby-core:56174]
+
+ * test/ruby/test_method.rb: add test
+
+Mon Aug 5 06:13:48 2013 Zachary Scott <e@zzak.io>
+
+ * enumerator.c: [DOC] Remove reference to Enumerator::Lazy#cycle
+ Patch by @kachick [Fixes GH-372]
+ https://github.com/ruby/ruby/pull/372
+
+Mon Aug 5 03:57:16 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rss/0.9.rb: [DOC] Document RSS09 by Steve Klabnik [Bug #8732]
+
+Mon Aug 5 03:35:11 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rexml/attribute.rb: [DOC] Update example for #namespace
+ Patch by Ippei Obayashi [Bug #8685] [ruby-core:56173]
+
+Sun Aug 4 21:08:29 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_zip): performance implement by using
+ ALLOCA_N() to allocate tmp buffer.
+
+Sun Aug 4 07:14:49 2013 Tanaka Akira <akr@fsij.org>
+
+ * README.EXT, README.EXT.ja: Mention rb_integer_pack and
+ rb_integer_unpack.
+
+Sun Aug 4 01:54:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (BARY_TRUNC): New macro.
+ (bary_cmp): Use BARY_TRUNC.
+ (bary_mul_toom3): Ditto.
+ (bary_divmod): Ditto.
+ (abs2twocomp): Ditto.
+ (bigfixize): Ditto.
+ (rb_cstr_to_inum): Ditto.
+ (big2str_karatsuba): Ditto.
+ (bigdivrem): Ditto.
+
+Sun Aug 4 00:57:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_karatsuba): Don't allocate new temporary buffer
+ if the buffer is enough for current invocation.
+
+Sun Aug 4 00:22:34 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary2bdigitdbl): New function.
+ (bdigitdbl2bary): Ditto.
+ (bary_mul_single): Use bdigitdbl2bary.
+ (power_cache_get_power): Ditto.
+ (bary_divmod): Use bary2bdigitdbl.
+ (big2str_orig): Ditto.
+ (bigdivrem): Ditto.
+
+Sat Aug 3 22:47:11 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: The branch condition of selecting multiplication
+ algorithms should check smaller argument because Karatsuba and Toom3
+ is effective only if both arguments are big.
+ (bary_mul_toom3_branch): Compare the smaller argument to
+ TOOM3_MUL_DIGITS.
+ (bary_mul): Compare the smaller argument to KARATSUBA_MUL_DIGITS.
+
+Sat Aug 3 22:23:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_orig): Receive the number to stringize as
+ BDIGIT array and size.
+ (big2str_karatsuba): Receive the number to stringize as BDIGIT array
+ and size. Use an temporary array of BDIGIT.
+ (rb_big2str1): Follow the above change.
+
+Sat Aug 3 13:30:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (MAX_BASE36_POWER_TABLE_ENTRIES): Renamed from
+ MAX_BIG2STR_TABLE_ENTRIES.
+ (base36_power_cache): Renamed from big2str_power_cache.
+ (base36_numdigits_cache): Renamed from big2str_numdigits_cache.
+
+Sat Aug 3 10:33:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_set_integer_literal): use rb_rational_raw1() for
+ integral rational because no reduction is needed with 1.
+
+Sat Aug 3 09:46:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/etc/etc.c (setup_passwd, setup_group): set proper encodings to
+ string members.
+
+Sat Aug 3 09:30:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * struct.c (rb_struct_define_under): new function to define Struct
+ under the given namespace, not under Struct. [Feature #8264]
+
+ * ext/etc/etc.c: use rb_struct_define_under.
+
+Sat Aug 3 06:55:29 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * parse.y (value_expr_gen): now NODE_DEFN and NODE_DEFS are not void
+ value expressions. get rid of wrong warning with -w, and make to
+ pass tests with chkbuild. ref. [Feature #3753]
+
+Sat Aug 3 04:23:48 2013 Eric Hodel <drbrain@segment7.net>
+
+ * doc/syntax/refinements.rdoc: Remove mention of instance_eval and
+ module_eval from scope section per:
+ http://twitter.com/shugomaeda/status/363219951336693761
+
+Sat Aug 3 02:22:05 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_orig): Refactored.
+
+Sat Aug 3 01:20:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigadd_core): Removed.
+ (bigadd): Use bary_add instead of bigadd_core.
+
+Sat Aug 3 00:52:43 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big2str1): Simplify power_level calculation.
+
+Sat Aug 3 00:34:20 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_zip): use rb_ary_new2() to create buffer
+ if rb_block_arity() > 1.
+
+Sat Aug 3 00:12:00 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * NEWS: Add the description that IO#seek supports SEEK_DATA
+ and SEEK_HOLE.
+
+Fri Aug 2 23:57:57 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * vm.c (m_core_define_method, m_core_define_singleton_method): now
+ the value of def-expr is the Symbol of the name of the method, not
+ nil.
+ ref. [ruby-dev:42151] [Feature #3753]
+
+ * test/ruby/test_syntax.rb (TestSyntax#test_value_of_def): test for
+ above changes.
+
+Fri Aug 2 23:54:11 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_zip): performance improvement by avoiding
+ array creation if rb_block_arity() > 1.
+
+Fri Aug 2 23:50:53 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (power_cache_get_power): Apply bigtrunc to the result of
+ bigsq.
+ (big2str_karatsuba): Fix number of leading zero characters.
+
+Fri Aug 2 23:48:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_yylex): calculate denominator directly as powers of
+ ten, not parsing string.
+
+ * parse.y (parser_number_literal_suffix): return bit set of found
+ suffixes.
+
+ * parse.y (parser_set_number_literal, parser_set_integer_literal):
+ split from parser_number_literal_suffix to set yylval.
+
+ * parse.y (parser_yylex): parse rational number literal with decimal
+ point precisely.
+
+ * parse.y (simple_numeric): integrate numeric literals and simplify
+ numeric rules.
+
+ * ext/ripper/eventids2.c (ripper_init_eventids2): ripper support for
+ new literals, tRATIONAL and tIMAGINARY.
+
+Fri Aug 2 18:33:28 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_karatsuba): Reduce power_level more than one at
+ recursion, if possible.
+ (rb_big2str1): Follow the above change.
+
+Fri Aug 2 12:25:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul): Swap x and y for bary_mul1 if x is longer than y.
+ [ruby-dev:47565] [Bug #8719] Reported by Narihiro Nakamura.
+
+Fri Aug 2 10:39:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * parse.y (negate_lit): add T_RATIONAL and T_COMPLEX to the switch
+ statement, and call rb_bug() if an unknown type is passed to
+ negate_lit(). [ruby-core:56316] [Bug #8717]
+
+ * bootstraptest/test_literal_suffix.rb (assert_equal): add test
+
+Fri Aug 2 09:14:47 2013 Eric Hodel <drbrain@segment7.net>
+
+ * doc/syntax/refinements.rdoc: Improve description of where you may
+ activate refinements.
+
+Fri Aug 2 07:45:55 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_orig): Remove len argument.
+ (big2str_karatsuba): Ditto.
+ (rb_big2str1): Follow above change.
+
+Thu Aug 2 02:32:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * NEWS: Add the description of number literal suffixes.
+
+Thu Aug 2 00:02:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * bootstraptest/test_literal_suffix.rb: add two test cases to
+ examine that "1if true" and "1rescue nil" are recognized as 1.
+
+Thu Aug 1 23:45:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * rational.c (rb_flt_rationalize_with_prec): new public C function
+ to rationalize a Float instance with a precision.
+
+ * rational.c (rb_flt_rationalize): new public C function to
+ rationalize a Float instance. A precision is calculated from
+ the given float number.
+
+ * include/ruby/intern.h: Add rb_flt_rationalize_with_prec and
+ rb_flt_rationalize.
+
+ * parse.y: implement number literal suffixes, 'r' and 'i'.
+ [ruby-core:55096] [Feature #8430]
+
+ * bootstraptest/test_literal_suffix.rb: add tests for parser to scan
+ number literals with the above tsuffixes.
+
+Thu Aug 1 23:55:08 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big2str1): Remove a local variable.
+
+Thu Aug 1 23:33:01 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_cstr_to_inum): Use power_cache_get_power.
+
+Thu Aug 1 21:02:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big2str1): Raise an error for too big number.
+
+Thu Aug 1 20:46:29 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (power_cache_get_power): Hide cached Bignum objects.
+
+Thu Aug 1 19:15:05 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big2str1): Remove non-trim mode.
+ (rb_big2str0): Non-trim mode implemented here.
+ (big2str_find_n1): Change the result type to long again.
+ (big2str_base_powerof2): Don't take arguments: len and trim.
+ (rb_big2str): Follow above change.
+
+Thu Aug 1 12:37:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_alloc): New function to allocate the result string.
+ It is called after actual length is calculated.
+ (big2str_struct): Add fields: negative, result and ptr.
+ (big2str_orig): Write out the result via b2s->ptr.
+ (big2str_orig): Ditto.
+ (rb_big2str1): Don't allocate the result string at beginning.
+
+Thu Aug 1 07:36:27 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_orig): Use temporary buffer when trim mode.
+
+Thu Aug 1 06:28:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_orig): Simplified because RBIGNUM_LEN(x) <= 2 now.
+ (big2str_struct): Two fields added: hbase2, hbase2_numdigits.
+ (rb_big2str1): Initialize above fields.
+
+Thu Aug 1 04:06:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rdoc/options.rb (RDoc#finish): include root path in include
+ paths, to work in another directory than the source directory.
+ [ruby-core:56282] [Bug #8712]
+
+ * test/test_rdoc_markup_pre_process.rb (TestRDocMarkupPreProcess#setup):
+ fix input_file_name, as the test script is not pre-processed.
+
+Thu Aug 1 01:45:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_karatsuba): Fix a condition of power_level.
+
+Thu Aug 1 01:09:02 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (LOG2_KARATSUBA_BIG2STR_DIGITS): Removed.
+ (KARATSUBA_BIG2STR_DIGITS): Removed.
+ (big2str_numdigits_cache): New variable.
+ (power_cache_get_power): Merged with power_cache_get_power0.
+ This function returns maxpow_in_bdigit_dbl(base)**(2**power_level).
+ (rb_big2str1): use power_cache_get_power.
+
+Wed Jul 31 23:59:28 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_find_n1): Change the return type to size_t.
+ (big2str_orig): Ditto.
+ (big2str_karatsuba): Ditto.
+ (rb_big2str1): Follow the above changes.
+
+Wed Jul 31 23:19:06 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (power_cache_get_power): Change numdigits_ret to size_t *.
+ (big2str_orig): Change len argument to size_t.
+ (big2str_karatsuba): Ditto.
+ (rb_big2str1): Follow the above changes.
+
+Wed Jul 31 22:59:47 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/parse/test_notation_declaration.rb: Change class
+ name to follow file name change.
+
+Wed Jul 31 22:57:50 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_parsetest.rb: Rename to ...
+ * test/rexml/parse/test_notation_declaration.rb: ... this.
+
+Wed Jul 31 22:54:39 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_mixin.rb: Remove duplicated tests.
+
+Wed Jul 31 22:52:55 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_parsetest.rb: Fix typos in expected
+ value.
+ pubilc ->
+ public
+ ^^
+
+Wed Jul 31 22:50:51 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_parsetest.rb: Add tests that focus
+ system literal in external ID system notation declaration.
+
+Wed Jul 31 22:36:21 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_cmp): Extracted from rb_big_cmp.
+ (power_cache_get_power): Change n1 argument (number of digits) to
+ power_level which is just passed to power_cache_get_power0.
+ (big2str_karatsuba): Ditto.
+ (rb_big2str1): Calculate the initial power_level.
+
+Wed Jul 31 22:04:36 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_parsetest.rb: Fix a typo.
+ Extern ID ->
+ ExternalID
+ ^^
+
+Wed Jul 31 22:01:36 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_parsetest.rb: Add tests that focus
+ public ID in external ID notation declaration.
+
+Wed Jul 31 22:01:24 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * parse.y: fix build error with bison-3.0.
+
+Wed Jul 31 21:58:53 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_parsetest.rb: Split test patterns.
+
+Wed Jul 31 21:42:33 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_parsetest.rb: Group tests.
+
+Wed Jul 31 21:37:51 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_mixin.rb (TestNotationDecl#test_name):
+ Move to ...
+ * test/rexml/test_notationdecl_parsetest.rb
+ (TestNotationDecl#test_name): ... here.
+
+Wed Jul 31 21:37:47 2013 Kouhei Sutou <kou@cozmixng.org>
+
+Wed Jul 31 21:31:49 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_parsetest.rb: Remove setup because it
+ doesn't share anything with other tests.
+
+Wed Jul 31 21:24:55 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_attributes_mixin.rb: Remove a needless shebang.
+ * test/rexml/test_notationdecl_mixin.rb: ditto.
+ * test/rexml/test_doctype.rb: ditto.
+ * test/rexml/test_xml_declaration.rb: ditto.
+ * test/rexml/test_changing_encoding.rb: ditto.
+
+Wed Jul 31 21:20:08 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_notationdecl_parsetest.rb: remove a needless shebang.
+
+Wed Jul 31 20:11:01 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * string.c (rb_str_rindex): fix bug introduced in r42269.
+ "".rindex("") should return 0.
+ (str_rindex): ditto.
+
+Wed Jul 31 19:55:33 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (MAX_BIG2STR_TABLE_ENTRIES): Use SIZEOF_SIZE_T.
+ (power_cache_get_power0): Add rb_bug call for too bit i argument.
+ (power_cache_get_power): Simplified.
+
+Wed Jul 31 18:32:25 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/uri/common.rb (URI.decode_www_form_component): Use String#b.
+
+Wed Jul 31 18:24:02 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * eval.c (rb_mod_refine, mod_using, top_using): don't show
+ warnings because Refinements are no longer experimental.
+ [ruby-core:55993] [Feature #8632]
+
+ * test/ruby/test_refinement.rb: related test.
+
+ * NEWS: fixes for the above change.
+
+Wed Jul 31 17:55:55 2013 Shota Fukumori <her@sorah.jp>
+
+ * lib/uri/common.rb (URI.decode_www_form_component):
+ Don't raise error when str includes multibyte characters.
+
+Wed Jul 31 17:45:39 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * string.c (rb_str_rindex): performance improvement by using
+ memrchr(3).
+
+Wed Jul 31 16:43:30 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * string.c (rb_str_rindex): refactoring and avoid to call str_nth() if
+ pos == 0.
+
+Wed Jul 31 14:41:36 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb: [DOC] Add a couple of notes on Hash as storage.
+ ref. [Feature #6589]
+
+Wed Jul 31 14:38:52 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb: [DOC] Fix example result. Hash is now ordered.
+
+Wed Jul 31 14:38:10 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb: [DOC] Use the term "sorted" instead of "ordered"
+ when mentioning SortSet.
+
+Wed Jul 31 12:18:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_struct): New structure.
+ (big2str_orig): Use big2str_struct.
+ (big2str_karatsuba): Ditto.
+ (rb_big2str1): Ditto.
+
+Wed Jul 31 12:02:16 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rubygems.rb: [DOC] typo in url patch by @Red54 [Fixes #369]
+ https://github.com/ruby/ruby/pull/369
+
+Wed Jul 31 07:09:07 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Import RubyGems from master as of commit 523551c
+ * test/rubygems: ditto.
+
+Tue Jul 30 22:21:54 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * test/ruby/test_hash.rb: add a test for enumeration order of Hash.
+
+Tue Jul 30 18:52:27 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb (Set#intersect?, Set#disjoint?): Add new methods for
+ testing if two sets have any element in common.
+ [ruby-core:45641] [Feature #6588] Based on the code by marcandre.
+
+Tue Jul 30 17:16:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * sprintf.c (ruby__sfvextra): add QUOTE flag to escape unprintable
+ characters.
+
+Tue Jul 30 11:00:52 2013 Zachary Scott <e@zzak.io>
+
+ * ext/curses/extconf.rb: [DOC] nodoc to reduce Object pollution
+
+Tue Jul 30 08:19:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * sizes.c (Init_sizes): Define sizes only if the type actually exists.
+
+Mon Jul 29 22:55:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * sizes.c (Init_sizes): define RbConfig::SIZEOF. [Feature #8568]
+
+Mon Jul 29 22:25:20 2013 Zachary Scott <e@zzak.io>
+
+ * ext/curses/curses.c: [DOC] Update location of samples
+ * samples/curses/*: Move Curses samples and refactor from mixin
+ The samples are included in rdoc for module and use of mixin is
+ confusing
+
+Mon Jul 29 22:16:11 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (LOG2_KARATSUBA_BIG2STR_DIGITS): Renamed from
+ LOG2_KARATSUBA_DIGITS.
+ (KARATSUBA_BIG2STR_DIGITS): Renamed from KARATSUBA_DIGITS.
+
+Mon Jul 29 22:04:45 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_compare_by_id): add function prototype.
+
+Mon Jul 29 21:53:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_compare_by_id): don't call rb_hash_rehash()
+ if self.compare_by_identity? == true.
+
+Mon Jul 29 21:29:48 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_assoc): performance improvement by replacing
+ compare function in RHASH(hash)->ntbl->type temporarily like r42224.
+ it falls back to rb_hash_foreach() if st_lookup() doesn't find the key.
+
+ * test/ruby/test_hash.rb: add a test for above.
+
+Mon Jul 29 21:15:30 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * test/ruby/test_lazy_enumerator.rb
+ (TestLazyEnumerator#test_initialize): Make sure
+ Enumerator::Lazy#initialize raises error if the object is
+ frozen. The check was performed by rb_ivar_set() before
+ rb_check_frozen() was added to enumerator_init().
+
+Mon Jul 29 21:06:42 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * enumerator.c (enumerator_init): Add a frozenness check to
+ prevent a frozen Enumerator object from being reinitialized with
+ a different enumerable object. This is the least we should do,
+ and more fixes will follow. [Fixes GH-368] Patch by Kenichi
+ Kamiya.
+
+ * enumerator.c (generator_init): Ditto.
+
+Mon Jul 29 20:14:24 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_assoc): revert r42224. table->type->compare is
+ called only if hashes are matched.
+
+ * test/ruby/test_hash.rb: add a test to check using #== to compare.
+
+Mon Jul 29 17:00:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (yycompile): store file name as String to keep the encoding.
+
+ * parse.y (rb_parser_compile_string_path, rb_parser_compile_file_path):
+ new functions to pass file name as a String.
+
+ * parse.y (gettable_gen): return a copy of the original file name, not
+ a copy in filesystem encoding.
+
+ * vm_eval.c (eval_string_with_cref): use Qundef instead of "(eval)".
+
+Mon Jul 29 16:53:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_initialize_copy): copy st_table type even if empty.
+ [ruby-core:56256] [Bug #8703]
+
+Mon Jul 29 16:34:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_initialize_copy): clear old table before copy new
+ table.
+
+Mon Jul 29 16:34:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (rb_hash_assoc): aggregate object can be initialized only
+ with link time constants.
+
+Mon Jul 29 14:54:44 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_assoc): performance improvement by replacing
+ compare function in RHASH(hash)->ntbl->type temporarily.
+
+Mon Jul 29 14:52:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (xsystem): expand environment variable in all macros not
+ expanded with RbConfig. [Bug #8702]
+
+ * test/mkmf/test_framework.rb (create_framework): replace all $@ not
+ only once.
+
+Mon Jul 29 06:54:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_pipe): use enum for compile time constants,
+ instead of const int for debugging.
+
+Mon Jul 29 00:11:49 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem): Specialized implementation added for
+ nx == 2 && ny == 2
+
+Sun Jul 28 20:28:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * io.c (io_getpartial): use rb_str_locktmp_ensure().
+ [ruby-core:56121] [Bug #8669]
+
+ * io.c (rb_io_sysread): ditto.
+
+ * test/ruby/test_io.rb: add tests for above.
+
+Sun Jul 28 20:10:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/extmk.rb (extmake): should make static libraries for extensions
+ to be statically linked. [Bug #7948]
+
+Sun Jul 28 17:38:32 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * string.c: add internal API rb_str_locktmp_ensure().
+
+ * io.c (io_fread): use rb_str_locktmp_ensure().
+ [ruby-core:56121] [Bug #8669]
+
+ * test/ruby/test_io.rb: add a test for above.
+
+Sun Jul 28 13:04:39 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * io.c (interpret_seek_whence): support SEEK_DATA and SEEK_HOLE.
+ These are whences for lseek(2) supported by Linux since version 3.1.
+ [ruby-core:56123] [Feature #8671]
+
+ * test/ruby/test_io.rb: Add tests for above.
+
+Sun Jul 28 12:41:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (absint_numwords_generic): The char_bit variable changed
+ to static constant.
+
+Sun Jul 28 12:03:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Constify bary_* functions.
+
+Sun Jul 28 11:12:07 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/intern.h (rb_absint_size): Declaration moved from
+ internal.h to calculate required buffer size to pack integers.
+ (rb_absint_numwords): Ditto.
+ (rb_absint_singlebit_p): Ditto.
+ [ruby-core:42813] [Feature #6065]
+
+Sun Jul 28 10:54:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_pipe): fix pipe name formatting. as "%x" may
+ not contain '0' at all, fill at fixed position instead.
+
+Sun Jul 28 00:35:14 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_size): Return the bignum "bytewise" size.
+ [ruby-core:55578] [Feature #8553]
+ This is accepted by matz on DevelopersMeeting20130727Japan.
+
+Sun Jul 28 00:07:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/intern.h (rb_integer_pack): Declaration moved from
+ internal.h.
+ (rb_integer_unpack): Ditto.
+ [ruby-core:42813] [Feature #6065]
+
+Fri Jul 26 23:18:13 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * NEWS: Add a new feature that REXML::Parsers::StreamParser
+ supports "entity" event.
+
+Fri Jul 26 23:14:31 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/parsers/streamparser.rb
+ (REXML::Parsers::StreamParser#parse): Add "entity" event support to
+ listener. [Bug #8689] [ruby-dev:47542]
+ Reported by Ippei Obayashi.
+ * test/rexml/test_stream.rb (StreamTester#entity): Add a test for
+ the above case.
+
+Fri Jul 26 23:05:27 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_yylex): separate numeric literal from succeeding
+ token, and treat 'e' as floating point number only if followed by
+ exponent part.
+
+Fri Jul 26 22:14:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_exec.h (CHECK_VM_STACK_OVERFLOW_FOR_INSN): surround with
+ do/while (0), and remove unnecessary casts.
+
+Fri Jul 26 20:12:07 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * ext/syslog/lib/syslog/logger.rb (Syslog::Logger): Add facility
+ to Syslog::Logger. [Fixes GH-305] patch by Max Shytikov
+ https://github.com/ruby/ruby/pull/305
+
+Fri Jul 26 19:25:17 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_exec.h, tool/instruction.rb: not an error, but a BUG if stack
+ overflow checking failed just before/after the beginning of an
+ instruction. It should be treated as a BUG.
+ Please tell us if your code cause BUG with this problem.
+ This check will removed soon (for performance).
+
+Fri Jul 26 18:30:14 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_memcpy): cast to int to suppress a warning.
+
+Fri Jul 26 18:21:58 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_memcpy): try to enable optimization.
+ At least on my environments, I don't see any errors
+ with many trials. Please tell us if you find any GC bugs.
+
+Fri Jul 26 17:49:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/file.c (fix_string_encoding): fix target encoding. the
+ parameter `encoding' is not the target encoding but the original
+ encoding.
+
+Fri Jul 26 14:05:19 2013 Zachary Scott <e@zzak.io>
+
+ * ext/fiddle/*: [DOC] More doc on dlopen and RTLD_DEFAULT from r42184
+
+Fri Jul 26 13:08:53 2013 Zachary Scott <e@zzak.io>
+
+ * ext/fiddle/lib/fiddle.rb: [DOC] Document Fiddle.dlopen(nil)
+ * ext/fiddle/handle.c: [DOC] Document Fiddle::Handle.new(nil)
+
+Fri Jul 26 13:04:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (rb_load_internal): use rb_load_file_str() to keep path
+ encoding.
+
+ * load.c (rb_require_safe): search in OS path encoding for Windows.
+
+ * ruby.c (rb_load_file_str): load file with keeping path encoding.
+
+ * win32/file.c (rb_file_load_ok): use WCHAR type API assuming incoming
+ path is encoded in UTF-8. [ruby-core:56136] [Bug #8676]
+
+ * file.c (rb_str_encode_ospath): simplify using rb_str_conv_enc().
+
+ * win32/file.c (fix_string_encoding): simplify with rb_str_conv_enc().
+
+ * win32/file.c (convert_mb_to_wchar): use bare pointer instead of
+ VALUE, and remove useless argument.
+
+Fri Jul 26 11:42:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * rational.c (f_round_common): Rational is expected to be returned by
+ Rational#*, but mathn.rb breaks that assumption. [ruby-core:56177]
+ [Bug #8687]
+
+Fri Jul 26 01:37:45 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * include/ruby/ruby.h: check defined(USE_RGENGC_LOGGING_WB_UNPROTECT)
+
+Fri Jul 26 01:21:41 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * file.c (rb_file_expand_path_internal): fix r42160; skip '~'.
+
+Thu Jul 25 17:53:18 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/net/http.rb (Net::HTTP#connect): disable Nagle's algorithm on
+ HTTP connection. [ruby-core:56158] [Feature #8681]
+
+Thu Jul 25 17:49:42 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * re.c (rb_reg_to_s): convert closing parenthesis to the target encoding
+ if it is ASCII incompatible encoding. [ruby-core:56063] [Bug #8650]
+
+Thu Jul 25 17:21:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (is_obj_encoding): new macro to check if obj is an
+ Encoding. obj can be any type while is_data_encoding expects T_DATA
+ only.
+
+Thu Jul 25 17:17:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_expand_path_internal): should clear coderange after
+ copying user name as binary data.
+
+Thu Jul 25 16:17:55 2013 Koichi Sasada <ko1@atdot.net>
+
+ * encoding.c (check_encoding): Check T_DATA or not.
+ is_data_encoding(obj) assumes that `obj' is T_DATA.
+
+Thu Jul 25 13:06:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (dir_s_home): use rb_home_dir_of and rb_default_home_dir.
+
+ * file.c (rb_home_dir_of): split from rb_home_dir() for the home
+ directry of the given user, and the user name is a VALUE, not a bare
+ pointer. should raise if the user does not exist.
+
+ * file.c (rb_default_home_dir): split from rb_home_dir() for the home
+ directry of the current user.
+
+Thu Jul 25 12:32:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/openssl/ossl.c: support additional three thread synchronization
+ functions. [ruby-trunk - Bug #8386]
+
+Thu Jul 25 07:15:58 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Import RubyGems from master as of commit 4ff70cc
+ * test/rubygems: ditto.
+
+Wed Jul 24 20:57:44 2013 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (iseq_set_arguments): use RARRAY_RAWPTR() instead of
+ RARRAY_PTR() because there is no new reference.
+
+ * compile.c (iseq_set_exception_table): ditto.
+
+Wed Jul 24 19:49:54 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/uri/generic.rb (find_proxy): raise BadURIError if the URI is
+ a relative URI. [Bug #8645]
+
+Wed Jul 24 18:56:06 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_insnhelper.c (vm_expandarray): use RARRAY_RAWPTR() instead of
+ RARRAY_PTR() because there is no new reference.
+
+ * vm_insnhelper.c (vm_caller_setup_args): ditto.
+
+ * vm_insnhelper.c (vm_yield_setup_block_args): ditto.
+
+Wed Jul 24 18:40:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c, gc.c: move ary_unprotect_logging() into
+ rb_gc_unprotect_logging() which is general version
+
+ * include/ruby/ruby.h: add USE_RGENGC_LOGGING_WB_UNPROTECT
+ to enable.
+
+Wed Jul 24 17:37:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_file_expand_path_internal): preserve the file name
+ encoding in an exception message.
+
+Wed Jul 24 08:04:49 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/-ext-/tracepoint/test_tracepoint.rb: add GC on/off to count
+ GC events strictly.
+
+Tue Jul 23 23:19:24 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/openssl/extconf.rb (CRYPTO_THREADID): check exist or not.
+
+ * ext/openssl/ossl.c (ossl_thread_id): use rb_nativethread_self()
+ implemented at r42137 to allow threads which doesn't associated with
+ Ruby thread to use openssl functions.
+
+ * ext/openssl/ossl.c (Init_ossl_locks): If CRYPTO_THREADID is defined
+ (OpenSSL 1.0.0 or later has it) use CRYPTO_THREADID_set_callback()
+ instead of CRYPTO_set_id_callback() because its argument is
+ unsigned long; it may cause id collision on mswin64
+ whose sizeof(unsigned long) < sizeof(void*).
+ http://www.openssl.org/docs/crypto/threads.html
+
+ * ext/openssl/ossl.c (ossl_threadid_func): defined for above.
+
+Tue Jul 23 20:47:36 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Move functions.
+
+Tue Jul 23 20:14:55 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_divmod): Add special cases for x < y easily detected
+ and nx == 2 && ny == 2.
+
+Tue Jul 23 19:48:38 2013 Koichi Sasada <ko1@atdot.net>
+
+ * thread_(pthread|win32).h: rename rb_thread_cond_t to
+ rb_nativethread_cond_t.
+
+ * thread.c, thread_pthread.c, thread_win32.c, vm_core.h: catch up
+ renaming.
+
+Tue Jul 23 19:44:32 2013 Koichi Sasada <ko1@atdot.net>
+
+ * thread_native.h: add rb_nativethread_self() which returns
+ current running native thread identifier.
+
+ * thread_[pthread|win32].c: implement rb_nativethread_self().
+
+Tue Jul 23 19:34:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * thread_pthread.h, thread_win32.h: rename rb_thread_id_t to
+ rb_nativethread_id_t.
+
+ * thread_pthread.c, vm_core.h: use rb_nativethread_id_t.
+
+Tue Jul 23 18:56:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/openssl/ossl.c: use system native (system provided)
+ thread locking APIs added by last commit.
+ This patch fixes [Bug #8386].
+ "rb_mutex_*" APIs control only "Ruby" threads.
+ Not for native threads.
+
+Tue Jul 23 18:44:15 2013 Koichi Sasada <ko1@atdot.net>
+
+ * thread_native.h: added.
+ Move native thread related lines from vm_core.h.
+ And declare several functions "rb_nativethread_lock_*",
+ manipulate locking.
+
+ * common.mk: add thread_native.h.
+
+ * thread.c: add functions "rb_nativethread_lock_*".
+
+ * thread.c, thread_[pthread,win32].[ch]: rename rb_thread_lock_t
+ to rb_nativethread_lock_t to make it clear that this lock is for
+ native threads, not for ruby threads.
+
+Tue Jul 23 16:14:57 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_before_sweep): fix spacing.
+
+Tue Jul 23 15:57:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (heap_get_freeobj): clear slot->freelist here.
+ This means that this slot doesn't have any free objects.
+ And store this slot with objspace->heap.using_slot.
+
+ * gc.c (gc_before_sweep): restore objspace->freelist
+ into objspace->heap.using_slot->freelist.
+ This means that using_slot has free objects which are
+ pointed from objspace->freelist.
+
+ * gc.c (gc_slot_sweep): do not need to clear slot->freelist.
+
+Tue Jul 23 09:34:49 2013 Zachary Scott <e@zzak.io>
+
+ * sample/drb/README*.rdoc: [DOC] migrate DRb sample READMEs to rdoc
+
+Tue Jul 23 09:28:05 2013 Zachary Scott <e@zzak.io>
+
+ * lib/drb/invokemethod.rb: [DOC] nodoc InvokeMethod18Mixin
+
+Tue Jul 23 08:44:37 2013 Eric Hodel <drbrain@segment7.net>
+
+ * ext/openssl/ossl_asn1.c (asn1time_to_time): Implement YYMMDDhhmmZ
+ format for ASN.1 UTCTime. [ruby-trunk - Bug #8664]
+ * test/openssl/test_asn1.rb: Test for the above.
+
+Tue Jul 23 08:11:32 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rexml/streamlistener.rb: [DOC] Fix examples in
+ REXML::StreamListener#entitydecl patch by Ippei Obayashi [Bug #8665]
+
+Tue Jul 23 07:44:59 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Import RubyGems from master as of commit b165260
+ * test/rubygems: ditto.
+
+Tue Jul 23 07:14:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mulsub_1xN): New function.
+ (bary_mul_toom3): Use bary_mulsub_1xN.
+
+Tue Jul 23 03:32:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (KARATSUBA_BALANCED): New macro.
+ (TOOM3_BALANCED): Ditto.
+ (bary_mul_balance_with_mulfunc): Use KARATSUBA_BALANCED and
+ TOOM3_BALANCED.
+ (rb_big_mul_balance): Relax a condition.
+ (rb_big_mul_karatsuba): Use KARATSUBA_BALANCED.
+ (rb_big_mul_toom3): Use TOOM3_BALANCED.
+ (bary_mul_karatsuba_branch): Use KARATSUBA_BALANCED.
+ (bary_mul_toom3_branch): Use TOOM3_BALANCED.
+
+Tue Jul 23 01:34:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem_mulsub): Extracted from bigdivrem1.
+ (bigdivrem1): Use bary_add.
+
+Mon Jul 22 18:39:52 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * string.c (rb_str_enumerate_chars): specify array capa
+ with str_strlen().
+
+ * string.c (rb_str_enumerate_codepoints): ditto.
+
+Mon Jul 22 18:01:33 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * string.c (rb_str_enumerate_chars): specify array capa.
+
+Mon Jul 22 17:24:14 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * string.c (rb_str_each_char_size): performance improvement by
+ using rb_str_length().
+
+Mon Jul 22 16:32:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (eval_string_with_cref): check by Check_TypedStruct
+ instead of rb_obj_is_kind_of.
+
+Mon Jul 22 13:19:22 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_resize_capa): use RARRAY_RAWPTR() because
+ this code creates no new references.
+
+Mon Jul 22 12:58:18 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_memfill): added.
+
+ * array.c (rb_ary_initialize): use ary_memfill().
+
+ * array.c (rb_ary_fill): ditto.
+
+ * array.c (rb_ary_slice_bang): use RARRAY_RAWPTR() because
+ this code creates no new references.
+
+Mon Jul 22 10:09:46 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_slot_sweep): need to add empty RVALUE as freeobj.
+
+Mon Jul 22 09:48:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (eval_string_with_cref): use the given file name unless
+ eval even if scope is given. additional fix for [Bug #8436].
+ based on the patch by srawlins at [ruby-core:56099] [Bug #8662].
+
+Mon Jul 22 09:24:19 2013 Kouji Takao <kouji@takao7.net>
+
+ * ext/readline/readline.c (Init_readline): added
+ Readline.delete_text. [ruby-dev:45789] [Feature #6626]
+ * ext/readline/extconf.rb: check for rl_delete_text() in Readline library.
+
+ Thanks, Nobuyoshi Nakada, for the patch.
+
+Mon Jul 22 03:15:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/date/date_parse.c (rfc2822_cb): check if wday is given, since it
+ can be omitted.
+
+Mon Jul 22 00:15:20 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_sq_fast): Refine expressions.
+
+Sun Jul 21 21:08:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul): Use simple multiplication if yl is small.
+ (rb_cstr_to_inum): Invoke bigsq instead of bigmul0.
+ (bigsq): Re-implemented.
+ (bigmul0): Invoke bigsq if two arguments are identical.
+
+Sun Jul 21 09:58:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul_toom3): New function based on bigmul1_toom3.
+ (bary_mul_toom3_branch): Call bary_mul_toom3.
+ (rb_big_mul_toom3): Ditto.
+ (bigmul1_toom3): Removed.
+ (big_real_len): Ditto.
+ (big_split): Ditto.
+ (big_split3): Ditto.
+
+Sun Jul 21 08:12:16 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * proc.c (proc_to_s): use PRIsVALUE to preserve the result encoding.
+
+Sun Jul 21 03:36:18 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * hash.c (rb_hash_flatten): use NUM2INT to raise TypeError on 32bit
+ platform. it's introduced by r42039
+
+Sun Jul 21 01:07:45 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * common.mk (help): Fix environment variable name and argument.
+ Actually it can also be a directory or any argument for
+ test/unit runner. [Fixes GH-363]
+
+Sat Jul 20 22:44:50 2013 Zachary Scott <e@zzak.io>
+
+ * common.mk: Document running a single test [Fixes GH-363]
+ Patch by Avdi Grimm https://github.com/ruby/ruby/pull/363
+
+Sat Jul 20 22:39:56 2013 Zachary Scott <e@zzak.io>
+
+ * sample/*: whitespace patch by Sergio Campama [Fixes GH-364]
+ https://github.com/ruby/ruby/pull/364
+
+Sat Jul 20 22:33:13 2013 Zachary Scott <e@zzak.io>
+
+ * doc/regexp.rdoc: [DOC] Fix typo in example [Fixes GH-365]
+ Patch by Juanito Fatas https://github.com/ruby/ruby/pull/365
+
+Sat Jul 20 17:46:03 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * string.c (rb_str_succ): add missing case NEIGHBOR_WRAPPED.
+ r42078 caused buggy behavior like "\xFF".b -> "\x01\xFF".b
+
+Sat Jul 20 15:22:38 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (rb_ary_resize): use simple memcpy because there are no new
+ references.
+
+Sat Jul 20 15:02:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * safe.c (ruby_safe_level_4_warning): define for old extension
+ libraries. [Bug #8652]
+
+Sat Jul 20 14:38:00 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_make_shared): make shared array shady.
+ Making non-shady shared array causes SEGV (see rubyci).
+ It seems a bug around shared array.
+
+Sat Jul 20 12:14:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (enc_succ_char, enc_pred_char): consider wchar case.
+ [ruby-core:56071] [Bug #8653]
+
+ * string.c (rb_str_succ): do not replace with invalid char.
+
+ * encoding.c (rb_enc_code_to_mbclen): add new function which returns
+ mbclen from codepoint like as rb_enc_codelen() but 0 for invalid
+ char.
+
+ * include/ruby/encoding.h (rb_enc_code_to_mbclen): declaration and
+ shortcut macro.
+
+Fri Jul 19 21:59:12 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: declare type_name() at the beginning of file.
+
+Fri Jul 19 21:35:09 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c: reduce shady operations.
+
+ * array.c (rb_ary_modify, ary_make_partial, rb_ary_splice,
+ rb_ary_replace, rb_ary_eql, rb_ary_compact_bang):
+ use RARRAY_RAWPTR() instead of RARRAY_PTR().
+
+ * array.c (rb_ary_shift): use RARRAY_PTR_USE() without WB because
+ there are not new relations.
+
+ * array.c (ary_ensure_room_for_unshift): ditto.
+
+ * array.c (rb_ary_sort_bang): ditto.
+
+ * array.c (rb_ary_delete_at): ditto.
+
+ * array.c (rb_ary_reverse_m): use RARRAY_RAWPTR() because
+ there are not new relations.
+
+Fri Jul 19 20:58:20 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c: reduce shade operations.
+
+ * array.c (rb_ary_modify): use RARRAY_RAWPTR().
+
+ * array.c (ary_make_substitution, rb_ary_s_create, ary_make_partial,
+ rb_ary_splice, rb_ary_resize, rb_ary_rotate_m, rb_ary_times):
+ use ary_memcpy().
+
+Fri Jul 19 19:55:28 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_mem_clear): added. This operation doesn't need WB
+ because this operation creates a reference to Qnil.
+
+ * array.c (ary_make_shared, rb_ary_store, rb_ary_shift_m,
+ rb_ary_splice, rb_ary_resize, rb_ary_fill): use ary_mem_clear()
+ instead of rb_mem_clear().
+
+ * array.c (ary_make_shared): use RARRAY_RAWPTR() instead of RARRAY_PTR().
+
+Fri Jul 19 19:18:51 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c: fix commit miss.
+ RGENGC_UNPROTECT_LOGGING should be 0.
+
+Fri Jul 19 19:15:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (rb_ary_resurrect): use RARRAY_RAWPTR() because there is no
+ writing.
+
+ * array.c (rb_ary_new_from_values): use ary_memcpy().
+
+Fri Jul 19 19:07:31 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_memcpy): add a function to copy VALUEs into ary
+ with write barrier. If ary is promoted, use write barrier correctly.
+
+ * array.c (rb_ary_cat, rb_ary_unshift_m, rb_ary_dup,
+ rb_ary_sort_bang, rb_ary_replace, rb_ary_plus): use ary_memcpy().
+
+Fri Jul 19 15:32:57 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (rb_ary_store): use RARRAY_PTR_USE() instead of RARRAY_PTR().
+ Clearing memory space doesn't need WBs.
+
+Fri Jul 19 15:19:37 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_ensure_room_for_push): use RARRAY_RAWPTR() instead of
+ RARRAY_PTR. In this code, there are no "write" operation.
+
+ * array.c (rb_ary_equal): ditto.
+
+ * array.c (recursive_equal): ditto.
+
+Fri Jul 19 15:09:22 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c, internal.h (rb_gc_writebarrier_remember_promoted): add a new
+ function to remember an specified object. This api is only
+ experimental (strongly depend on WB/rgengc strategy).
+
+Fri Jul 19 14:56:00 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_unprotect_logging): use (void *) for first parameter
+ because VALUE is not defined before including ruby/ruby.h.
+
+Fri Jul 19 14:19:48 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * ext/pathname/pathname.c (path_inspect): use PRIsVALUE to preserve
+ the result encoding.
+
+Fri Jul 19 12:35:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/socket/test_tcp.rb (test_initialize_failure): Use EADDRNOTAVAIL
+ to test an error message generated by bind() failure.
+
+Fri Jul 19 11:27:38 2013 Zachary Scott <e@zzak.io>
+
+ * lib/racc/parser.rb: [DOC] Capitalize "Ruby" in documentation
+ Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+
+Fri Jul 19 11:26:28 2013 Zachary Scott <e@zzak.io>
+
+ * ext/psych/lib/psych*: [DOC] Capitalize "Ruby" in documentation
+ Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+
+Fri Jul 19 11:25:12 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rdoc/*: [DOC] Capitalize "Ruby" in documentation
+ Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+
+Fri Jul 19 11:23:55 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rubygems*: [DOC] Capitalize "Ruby" in documentation
+ Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+
+Fri Jul 19 11:16:54 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb (Set#to_set): Define Set#to_set so that aSet.to_set
+ returns self. [Fixes GH-359]
+
+Fri Jul 19 11:10:23 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rake/*: [DOC] Capitalize "Ruby" in documentation
+ Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+
+Fri Jul 19 01:04:14 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/-test-/bignum/intpack.c: Renamed from ext/-test-/bignum/pack.c.
+ (Init_intpack): Renamed from Init_pack.
+ Reported by Naohisa Goto. [ruby-dev:47526] [Bug #8655]
+
+Fri Jul 19 00:54:27 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * test/ruby/test_array.rb (test_count): add a test case for #count
+ with an argument. See Bug #8654.
+
+Thu Jul 18 23:45:06 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_eql): compare RARRAY_PTR() for performance
+ improvement in case of that self and other are shared.
+
+Thu Jul 18 22:46:42 2013 Zachary Scott <e@zzak.io>
+
+ * lib/cgi.rb: [DOC] Capitalize "Ruby" in documentation [Fixes GH-341]
+ Patch by Dave Worth https://github.com/ruby/ruby/pull/341
+ * lib/webrick.rb: ditto
+ * lib/scanf.rb: ditto
+ * lib/xmlrpc/config.rb: ditto
+ * lib/resolv.rb: ditto
+ * lib/e2mmap.rb: ditto
+ * lib/fileutils.rb: ditto
+ * lib/mkmf.rb: ditto
+ * lib/cgi/session.rb: ditto
+ * lib/yaml.rb: ditto
+ * lib/erb.rb: ditto
+ * lib/irb.rb: ditto
+ * lib/tracer.rb: ditto
+ * lib/net/http.rb: ditto
+ * ext/syslog/lib/syslog/logger.rb: ditto
+ * sample/pty/expect_sample.rb: ditto
+
+Thu Jul 18 21:30:50 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_sq_fast): Specialize the last iteration of the
+ outer loop.
+ (bigfixize): A condition simplified.
+
+Thu Jul 18 21:15:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_equal): compare RARRAY_PTR() for performance
+ improvement in case of that self and other are shared.
+
+Thu Jul 18 20:44:51 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_fill): use memfill().
+
+Thu Jul 18 20:35:14 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * array.c (rb_ary_count): check length to avoid SEGV
+ while iterating. Remove other pointer loop when arg is given.
+
+ * test/ruby/test_array.rb (test_count): add test for bug.
+ [ruby-core:56072] [Bug #8654]
+
+Thu Jul 18 18:14:36 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * array.c (rb_ary_count): iterate items appropriately.
+ [Bug #8654]
+
+Thu Jul 18 17:35:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_flatten): performance improvement by not using
+ rb_hash_to_a() to avoid array creation with rb_assoc_new().
+
+Thu Jul 18 16:16:17 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c: add logging feature for RGenGC's write barrier unprotect
+ event.
+
+Thu Jul 18 15:45:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (RUBY_SAFE_LEVEL_CHECK): make only
+ rb_set_safe_level(4) an error always but make rb_secure(4) an error
+ only in the core. [ruby-dev:47517] [Bug #8652]
+
+Thu Jul 18 15:42:01 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: fix spell miss.
+
+Thu Jul 18 15:11:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (ruby_safe_level_4): get rid of special
+ character. [ruby-dev:47512] [misc #8646]
+
+Thu Jul 18 14:51:39 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (ary_alloc): slim setup process.
+
+Thu Jul 18 14:37:57 2013 Koichi Sasada <ko1@atdot.net>
+
+ * string.c (str_alloc): no need to clear RString (already cleared).
+
+Thu Jul 18 12:57:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (BDIGITS_ZERO): Defined.
+ (bary_pack): Use BDIGITS_ZERO.
+ (bary_unpack): Ditto.
+ (bary_mul_single): Ditto.
+ (bary_mul_normal): Ditto.
+ (bary_sq_fast): Ditto.
+ (bary_mul_balance_with_mulfunc): Ditto.
+ (bary_mul_precheck): Ditto.
+ (bary_mul_toom3_branch): Ditto.
+ (rb_cstr_to_inum): Ditto.
+ (big_shift3): Ditto.
+ (bigmul1_toom3): Ditto.
+ (bary_divmod): Ditto.
+
+Thu Jul 18 06:30:02 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: rename gc related functions with prefix "gc_".
+ * before_gc_sweep() -> gc_before_sweep().
+ * after_gc_sweep() -> gc_after_sweep().
+ * lazy_sweep() -> gc_lazy_sweep().
+ * rest_sweep() -> gc_rest_sweep().
+ * slot_sweep() -> gc_slot_sweep().
+
+ * gc.c: rename a heap management function with prefix "heap_".
+ * get_freeobj() -> heap_get_freeobj().
+
+ * gc.c: rename markable_object_p() to is_markable_object().
+
+Wed Jul 17 22:57:40 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (delete_if_i): use ST_DELETE.
+
+Wed Jul 17 22:34:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: An static assertion for relation of SIZEOF_LONG and
+ SIZEOF_BDIGITS is added.
+ (bary_mul_precheck): Reduce comparisons.
+ (bary_mul): Invoke bary_sq_fast or bary_mul1 if the bignum size is
+ small.
+ (bigfixize): Resize the argument bignum here.
+ (bignorm): Don't call bigtrunc after bigfixize.
+
+Wed Jul 17 22:13:26 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_replace): performance improvement by using
+ st_copy().
+
+Wed Jul 17 17:19:54 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: rename heap management functions with prefix "heap_".
+ * allocate_sorted_array() -> heap_allocate_sorted_array().
+ * slot_add_freeobj() -> heap_slot_add_freeobj().
+ * assign_heap_slot() -> heap_assign_slot().
+ * add_heap_slots() -> heap_add_slots().
+ * init_heap() -> heap_init().
+ * set_heap_increment() -> heap_set_increment().
+
+ * gc.c (initial_expand_heap): inlined in rb_gc_set_params().
+
+Wed Jul 17 17:12:23 2013 Matthew M. Boedicker <matthewm@boedicker.org>
+
+ * hash.c (env_fetch): Add key name to message on ENV.fetch KeyError,
+ as well as Hash#fetch. [ruby-core:56062] [Feature #8649]
+
+Wed Jul 17 15:59:33 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: catch up last changes for debugging/checking mode.
+
+Wed Jul 17 15:50:10 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_objspace_free): free slot itself.
+
+ * gc.c (objspace_each_objects): fix condition.
+ Use slot->body instead of slot.
+
+ * gc.c (count_objects): use "slot" variable.
+
+Wed Jul 17 15:21:10 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (unlink_heap_slot): fix memory leak.
+ free slot itself at free_heap_slot().
+
+ Reproduce-able code is here:
+ N1 = 100_000; N2 = 1_000_000
+ N1.times{ary = []; N2.times{ary << ''}}
+ Maybe this problem is remaining in Ruby 2.0.0.
+
+ * gc.c (unlink_heap_slot): remove not working code.
+
+Wed Jul 17 14:31:13 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: re-design the heap structure.
+
+ (1) The heap is consists of a set of slots.
+ (2) Each "slot" has a "slot_body".
+ slot::start and slot::limit specify RVALUE beginning address
+ and number of RVALUE in a "slot_body".
+ (3) "slot_body" contains a pointer to slot (slot_body::header::slot)
+ and an array of RVALUE.
+ (4) heap::sorted is an array of "slots", sorted by an address of
+ slot::body.
+
+ See https://bugs.ruby-lang.org/projects/ruby-trunk/wiki/GC_design
+ for more details (figure).
+
+ * gc.c: Avoid "heaps" terminology. It is ambiguous.
+
+Wed Jul 17 13:29:16 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: fix heaps_header and heaps_slot to reduce memory consumption.
+ (1) move heaps_header::start and limit to heaps_slot.
+ (2) remove heaps_header::end which can be calculated by start+limit.
+
+ * gc.c: catch up above change.
+
+Wed Jul 17 12:30:05 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/st.h (st_strcasecmp): Macro defined for compatibility.
+ (st_strncasecmp): Ditto.
+
+Wed Jul 17 11:57:45 2013 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
+
+ * lib/cgi/util.rb (CGI::Util#escape, unescape): Avoid use of regexp
+ special global variable. [Feature #8648] Thanks to fotos.
+
+Wed Jul 17 11:57:10 2013 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
+
+ * lib/erb.rb (ERB::Util#url_encode): Avoid use of regexp special global
+ variable. [Feature #8648] Thanks to fotos.
+
+Wed Jul 17 08:12:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * st.c (st_locale_insensitive_strcasecmp): Renamed from st_strcasecmp.
+ (st_locale_insensitive_strncasecmp): Renamed from st_strncasecmp.
+
+ * include/ruby/st.h: Follow above changes.
+
+ * include/ruby/ruby.h: Ditto.
+
+Wed Jul 17 00:14:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigmul1_toom3): Use bigdivrem_single instead of bigdivrem.
+ (big_three): Removed.
+ (Init_Bignum): Don't initialize big_three.
+
+Tue Jul 16 21:46:03 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * configure.in: revert r42008. strcasecmp() uses the current locale.
+
+ * include/ruby/ruby.h: ditto.
+
+ * st.c (st_strcasecmp): ditto.
+
+Tue Jul 16 21:07:04 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * configure.in: check strcasecmp().
+
+ * include/ruby/ruby.h: use strcasecmp() as st_strcasecmp() if it
+ exists.
+
+ * st.c (st_strcasecmp): define the function only if strcasecmp()
+ doesn't exist.
+
+Tue Jul 16 20:21:28 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigsq): Renamed from bigsqr.
+
+Tue Jul 16 19:42:08 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (USHORT): Unused macro removed.
+
+Tue Jul 16 19:18:51 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: slim a path of newobj_of().
+
+ * gc.c (objspace): add a new field objspace::freelist, which contains
+ available RVALUEs.
+
+ * gc.c (newobj_of): simply call new function `get_freeobj()'.
+ get_freeobj() returns objspace::freelist. If objspace::freelist
+ is not available, refill objspace::freelist with a slot pointed by
+ objspace::heap::free_slots.
+
+ * gc.c (before_gc_sweep): clear objspace::freelist.
+
+ * gc.c (slot_sweep): clear slot::freelist.
+
+ * gc.c (heaps_prepare_freeslot): renamed to heaps_prepare_freeslot.
+
+ * gc.c (unlink_free_heap_slot): remove unused function.
+
+ * gc.c (rb_free_const_table): remove unused function.
+
+Tue Jul 16 19:05:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big_shift3): Big shift width is not a problem for right
+ shift.
+
+Tue Jul 16 18:50:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_count): [DOC] fix typo. Array#count uses ==, not
+ ===. a question at asakusa.rb ML.
+
+Tue Jul 16 18:35:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul_karatsuba): Avoid duplicate calculation when
+ squaring.
+ (bary_mul_toom3_branch): Ditto.
+
+Tue Jul 16 17:43:22 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (link_free_heap_slot): removed.
+
+ * gc.c (slot_sweep): use `heaps_add_freeslot' instead of
+ `link_free_heap_slot'.
+
+ * gc.c (assign_heap_slot): use local variable `slot' instead of
+ `heaps'.
+
+Tue Jul 16 17:21:39 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (assign_heap_slot): refactoring variable names.
+
+ * gc.c (slot_add_freeobj): added.
+
+ * gc.c (heaps_add_freeslot): added.
+
+ * gc.c (finalize_list, rb_gc_force_recycle, slot_sweep): use
+ `slot_add_freeobj' instead of modifying linked list directly.
+
+Tue Jul 16 16:30:58 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (lazy_sweep): refactoring.
+
+Tue Jul 16 13:32:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (enc_set_index): since r41967, old terminator is dealt
+ with in str_fill_term(). should not consider it here because this
+ function is called before any encoding is set.
+
+Tue Jul 16 11:12:03 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * proc.c (rb_block_arity): raise ArgumentError if no block given.
+
+Tue Jul 16 08:15:22 2013 Zachary Scott <e@zzak.io>
+
+ * ext/bigdecimal/lib/bigdecimal/util.rb: [DOC] document top-level
+ classes from BigDecimal utils native extensions
+
+Tue Jul 16 03:23:03 2013 Zachary Scott <e@zzak.io>
+
+ * numeric.c: [DOC] improve rdoc formatting for parameters and links
+
+Mon Jul 15 14:40:00 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/intern.h (rb_big2str0): Deprecated.
+
+ * bignum.c (rb_big2str1): Renamed from rb_big2str0.
+ (rb_big2str0): Deprecated wrapper for rb_big2str1.
+ (rb_big2str): Invoke rb_big2str1 instead of rb_big2str0.
+
+Mon Jul 15 14:13:02 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * struct.c (rb_struct_each_pair): use rb_yield_values(2, key, value)
+ instead of rb_yield(rb_assoc_new(key, value)) if rb_block_arity()
+ is greater than 1.
+
+Mon Jul 15 13:46:26 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Add static assertions.
+
+Mon Jul 15 13:36:02 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_each_pair): performance improvement by using
+ rb_block_arity().
+
+Mon Jul 15 13:15:37 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * proc.c (rb_block_arity): create internal API rb_block_arity().
+ it returns arity of given block.
+
+Mon Jul 15 13:07:27 2013 Yuki Yugui Sonoda <yugui@yugui.jp>
+
+ * lib/prime.rb (Prime::EratosthenesGenerator,
+ Prime::EratosthenesSieve): New implementation by
+ robertjlooby <robertjlooby AT gmail.com>.
+
+ * test/test_prime.rb: updated with new method name
+
+Mon Jul 15 11:32:46 2013 Zachary Scott <e@zzak.io>
+
+ * numeric.c (rb_cNumeric): [DOC] Added comment for Numeric to fix doc
+
+Mon Jul 15 11:24:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (maxpow_in_bdigit_dbl): Useless #if removed.
+
+Mon Jul 15 11:10:46 2013 Zachary Scott <e@zzak.io>
+
+ * bignum.c (rb_big_coerce): [DOC] Add docs for Bignum#coerce
+ Based on patch by Juanito Fatas [Fixes GH-360]
+ https://github.com/ruby/ruby/pull/360
+
+Mon Jul 15 10:56:01 2013 Zachary Scott <e@zzak.io>
+
+ * thread.c (mutex_sleep): [DOC] Awake thread will reacquire lock
+ By Tim Abdulla [Fixes GH-342] https://github.com/ruby/ruby/pull/342
+
+Mon Jul 15 10:45:09 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (nlz16): Use __builtin_clz if possible.
+ (nlz32): Use __builtin_clz or __builtin_clzl if possible.
+ (nlz64): Use __builtin_clzl or __builtin_clzll if possible.
+ (nlz128): Use __builtin_clzll if possible.
+
+ * configure.in: Check __builtin_clz, __builtin_clzl and
+ __builtin_clzll.
+
+Mon Jul 15 09:39:07 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (power_cache_get_power): Use bitsize instead of ceil_log2.
+ (ones): Removed.
+ (next_pow2): Removed.
+ (floor_log2): Removed.
+ (ceil_log2): Removed.
+
+ * configure.in (__builtin_popcountl): Don't check.
+
+Mon Jul 15 02:47:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * localeinit.c (rb_locale_charmap, Init_enc_set_filesystem_encoding):
+ move from encoding.c.
+
+ * miniinit.c (rb_locale_charmap, Init_enc_set_filesystem_encoding):
+ define miniruby specific functions only.
+
+Mon Jul 15 02:32:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (rb_enc_init): no longer needs NO_PRESERVED_ENCODING.
+
+ * encoding.c (enc_inspect): defer loading autoloaded encoding.
+
+ * encoding.c (enc_check_encoding): use is_data_encoding() to check
+ type consistently.
+
+ * encoding.c (must_encoding): return rb_encoding* instead of encoding
+ index.
+
+ * encoding.c (enc_check_encoding): use is_data_encoding() to check
+ type consistently.
+
+ * encoding.c (must_encoding): return rb_encoding* instead of encoding
+ index.
+
+Mon Jul 15 02:21:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (str_fill_term): consider old terminator length, and should
+ not use rb_enc_ascget since it depends on the current encoding which
+ may not be compatible with the new terminator. [Bug #8634]
+
+ * encoding.c (enc_inspect): use PRIsVALUE to preserve the result
+ encoding.
+
+Sun Jul 14 23:21:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Check __builtin_popcountl, __builtin_bswap32 and
+ __builtin_bswap64.
+
+ * internal.h (swap32): Use the configure result for the condition to
+ use __builtin_bswap32.
+ (swap64): Use the configure result for the condition to use
+ __builtin_bswap64.
+
+ * bignum.c (ones): Use the configure result for the condition to use
+ __builtin_popcountl.
+ (bary_unpack_internal): Use appropriate types for swap argument.
+
+Sun Jul 14 22:21:11 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_subb): Support xn < yn.
+ (bigsub_core): Removed.
+ (bigsub): Don't compare before subtraction. Just subtract and
+ get the two's complement if the subtraction causes a borrow.
+
+Sun Jul 14 00:36:03 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (DIGSPERLONG): Unused macro removed.
+ (DIGSPERLL): Ditto.
+
+Sun Jul 14 00:32:51 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_aref): Less scan when the number is negative.
+
+Sun Jul 14 00:17:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big_shift): Avoid signed integer overflow.
+
+Sun Jul 14 00:14:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul_precheck): Use bary_small_lshift or
+ bary_mul_normal if xl is 1.
+
+Sat Jul 13 22:58:16 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big_shift3): New function.
+ big_lshift and big_rshift are merged.
+ (big_shift2): New function.
+ (big_lshift): Use big_shift3.
+ (big_rshift): Ditto.
+ (check_shiftdown): Removed.
+ (rb_big_lshift): Use big_shift2 and big_shift3.
+ (rb_big_rshift): Ditto.
+ (big_lshift): Removed.
+ (big_rshift): Ditto.
+
+Sat Jul 13 15:51:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_small_lshift): Use size_t instead of long.
+ (bary_small_rshift): Ditto.
+
+Sat Jul 13 15:33:33 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_small_lshift): Functions moved to remove
+ declaration.
+ (bary_small_rshift): Ditto.
+
+Sat Jul 13 12:27:34 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (rb_enc_associate_index): fill new terminator length, not
+ old one.
+
+Sat Jul 13 12:24:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32: move from ext/dl and ext/fiddle. since ext/extmk.rb
+ builds extensions in alphabetical order, compiled?('fiddle') under
+ ext/dl makes no sense.
+
+Sat Jul 13 09:26:09 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (biglsh_bang): Removed.
+ (bigrsh_bang): Ditto.
+ (bigmul1_toom3): Use bary_small_lshift and bary_small_rshift.
+
+Sat Jul 13 01:04:43 2013 Zachary Scott <e@zzak.io>
+
+ * lib/rubygems/psych_additions.rb: Ignore Psych docs here
+
+Fri Jul 12 18:10:46 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/fiddle/win32/lib/win32/registry.rb
+ (Win32::Registry::API#make_wstr): same as r41922.
+
+Fri Jul 12 16:28:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * encoding.c (rb_enc_associate_index): refill the terminator if it
+ becomes longer than before. [ruby-dev:47500] [Bug #8624]
+
+ * string.c (str_null_char, str_fill_term): get rid of out of bound
+ access.
+
+ * string.c (rb_str_fill_terminator): add a parameter for the length of
+ new terminator.
+
+Fri Jul 12 11:26:25 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_reject_bang): do not call rb_hash_foreach() if RHash
+ has ntbl and it is empty.
+
+Fri Jul 12 11:17:41 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (recursive_hash): use RHASH_SIZE() to check hash size.
+
+Fri Jul 12 00:20:00 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_size): use RHASH_SIZE().
+
+Fri Jul 12 00:08:24 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_values): set array capa to RHASH_SIZE().
+
+Thu Jul 11 23:54:45 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * hash.c (rb_hash_keys): set array capa to RHASH_SIZE().
+
+Thu Jul 11 21:30:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_pow): undef pow to get rid of infinite
+ recursive call. re-fix [Bug #8495]. [ruby-core:55923] [Bug #8621]
+
+Thu Jul 11 20:18:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/dl/win32/lib/win32/registry.rb (Win32::Registry::API#make_wstr):
+ remove workaround to append WCHAR terminator.
+
+ * transcode.c (str_encode_associate): fill terminator after conversion.
+
+ * string.c (rb_enc_str_new, rb_str_set_len, rb_str_resize): fill
+ minimum length of the encoding as the terminator.
+
+ * string.c (str_buf_cat, rb_str_buf_append, rb_str_splice_0): ditto.
+
+ * string.c (str_make_independent_expand, rb_str_modify_expand): make
+ the capacity enough for multi-byte terminator.
+
+ * string.c (rb_string_value_cstr): fill minimum length of the encoding
+ as the terminator.
+
+ * string.c (rb_string_value_cstr): check null char in char, not in
+ byte.
+
+Thu Jul 11 14:48:35 2013 Zachary Scott <e@zzak.io>
+
+ * array.c: Replace confusing example for #reverse_each in overview
+ Patch by Earl St Sauver [Fixes documenting-ruby/ruby-12]
+ https://github.com/documenting-ruby/ruby/pull/12
+
+Thu Jul 11 14:22:37 2013 Zachary Scott <e@zzak.io>
+
+ * test/drb/ut_eq.rb: Use localhost for drb tests [Bug #7311]
+ Patch by Vit Ondruch [ruby-core:49101]
+ * test/drb/ut_array.rb: ditto
+ * test/drb/ut_array_drbssl.rb: ditto
+
+Thu Jul 11 13:48:03 2013 Zachary Scott <e@zzak.io>
+
+ * sprintf.c: Fix typo patch by @hynkle [Fixes GH-357]
+ https://github.com/ruby/ruby/pull/357
+
+Thu Jul 11 13:00:34 2013 Zachary Scott <e@zzak.io>
+
+ * lib/securerandom.rb: Refactor conditions by Rafal Chmiel
+ [Fixes GH-326] https://github.com/ruby/ruby/pull/326
+
+Thu Jul 11 12:04:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Don't use toom3 after once karatsuba is chosen.
+ (mulfunc_t): New type.
+ (bary_mul_toom3_start): Renamed from bary_mul.
+ (bary_mul_karatsuba_start): Renamed from bary_mul.
+ (bary_mul_balance_with_mulfunc): Renamed from bary_mul_balance and
+ new argument, mulfunc, is added.
+ (rb_big_mul_balance): Invoke bary_mul_balance_with_mulfunc with
+ bary_mul_toom3_start.
+ (bary_mul_karatsuba): Invoke bary_mul_karatsuba_start instead of
+ bary_mul.
+ (bary_mul_precheck): Extracted from bary_mul.
+ (bary_mul_karatsuba_branch): Extracted from bary_mul.
+ (bary_mul_karatsuba_start): New function to call bary_mul_precheck
+ and bary_mul_karatsuba_branch.
+ (bary_mul_toom3_branch): Extracted from bary_mul.
+ (bary_mul_toom3_start): New function to call bary_mul_precheck and
+ bary_mul_toom3_branch.
+ (bary_mul): Just call bary_mul_toom3_start.
+ Arguments for work memory are removed.
+ (rb_cstr_to_inum): Follow the bary_mul change.
+ (bigmul0): Ditto.
+
+Thu Jul 11 10:46:38 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/probes_to_wiki.rb: fix usage comment. use Enumerable#grep
+ which yields each elements to reduce unnecessary array.
+
+Thu Jul 11 10:09:18 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * process.c (rb_daemon): daemon(3) is implemented with fork(2).
+ Therefore it needs rb_thread_atfork(). (and revert r41903)
+
+Thu Jul 11 03:22:10 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * tool/probes_to_wiki.rb: adding a script to convert probes.d to wiki
+ format for easy wiki updates.
+
+Thu Jul 11 00:54:07 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * man/ri.1: Incorrect use of .Dd macro [Bug #8620] by Tristan Hill
+
+Thu Jul 11 00:48:29 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/delegate.rb: Add example for __setobj__ and __getobj__
+ [Bug #8615] Patch by Caleb Thompson
+
+Wed Jul 10 23:29:22 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/logger.rb: Use :call-seq: for method signature rdoc
+
+Wed Jul 10 23:23:18 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/logger.rb (#add): Remove incorrect rdoc for return value
+ [Bug #8567] Reported by Tim Pease.
+
+Wed Jul 10 23:12:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_subpos): make public function.
+
+Wed Jul 10 22:44:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Add a static assertion for RBIGNUM_EMBED_LEN_MAX.
+
+Wed Jul 10 22:31:25 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * string.c (rb_str_index): cache single byte flag and some
+ cosmetic changes.
+
+Wed Jul 10 22:03:27 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_2comp): Don't use bary_plus_one.
+ (bary_add_one): Replaced by the implementation of bary_plus_one.
+
+Wed Jul 10 20:48:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * bignum.c (sizeof_bdigit_dbl): check sizeof(BDIGIT_DBL).
+
+ * internal.h (STATIC_ASSERT): move from enum.c.
+
+Wed Jul 10 20:08:21 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (SIZEOF_BDIGIT_DBL): Add a ifdef guard for test.
+
+Wed Jul 10 14:18:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * process.c (fork_daemon): kill the other threads all and abandon the
+ kept mutexes.
+
+Wed Jul 10 11:35:36 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/net/http/test_http.rb (TestNetHTTP_v1_2#test_get,
+ TestNetHTTP_v1_2_chunked#test_get): shouldn't check
+ HttpResponse#decode_content if Zlib is not available.
+ ko1 complained via IRC.
+
+Wed Jul 10 10:20:07 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * tool/rbinstall.rb: always require rubygems to stabilize rubygems
+ related status like whether Gem::Specification is defined or not.
+
+ * tool/rbinstall.rb (Gem::Specification.unresolved_deps): define stub.
+
+Wed Jul 10 08:21:15 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Import RubyGems 2.1
+ * test/rubygems: Ditto.
+
+Wed Jul 10 07:34:34 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/ext/ext_conf_builder.rb: Remove siteconf file after
+ building the gem.
+ * test/rubygems/test_gem_ext_ext_conf_builder.rb: Test for the above.
+
+ * lib/rubygems/psych_tree.rb (module Gem): Add backward compatibility
+ for r41148
+
+ * test/rubygems/test_gem_package.rb: Add backward compatibility for
+ double-slash elimination.
+
+Wed Jul 10 06:22:27 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * ext/date/date_parse.c (date_zone_to_diff): [ruby-core:55831].
+
+Wed Jul 10 00:41:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul): x*1 is x.
+
+Tue Jul 9 22:24:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul1): No need to invoke MEMZERO at last.
+ (bary_mul_single): Invoke MEMZERO here.
+
+Tue Jul 9 21:40:01 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/rexml/test_text.rb: Add missing tests for Text#<<.
+ Reported by nagachika. Thanks!!!
+
+Tue Jul 9 18:02:38 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/fileutils.rb (FileUtils#chown_R): Do not skip traversal even
+ if user and group are both nil, to be consistent with #chown and
+ other commands.
+
+Tue Jul 9 17:58:26 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * test/fileutils/test_fileutils.rb
+ (TestFileUtils#assert_output_lines): New utility assertion
+ method for testing verbose output.
+
+Tue Jul 9 17:43:57 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/test_tracer.rb: catch up recent rubygems changes.
+
+Tue Jul 9 16:58:30 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/{dl,fiddle}/win32/lib/win32/registry.rb: hope that the final
+ resolution to fix the failure of test-all. and includes Win64
+ support (fixed a potential bug).
+
+Tue Jul 9 15:57:20 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * object.c: Fix rdoc for Kernel#<=>. [Fixes GH-352]
+
+Tue Jul 9 15:53:51 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/fileutils.rb (FileUtils#mode_to_s): Define mode_to_s() also
+ as singleton method, or FileUtils.chmod fails in verbose mode.
+
+Tue Jul 9 15:16:02 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * test/fileutils/fileasserts.rb
+ (Test::Unit::FileAssertions#assert_not_symlink): Add a missing
+ optional argument "message".
+
+Tue Jul 9 15:03:24 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/fileutils.rb (FileUtils#chown, FileUtils#chown_R): If user
+ and group are both nil, print ":".
+
+Tue Jul 9 12:47:08 2013 Masaki Matsushita <glass.saga@gmail.com>
+
+ * io.c (appendline): use READ_CHAR_PENDING_XXX macros and
+ RSTRING_END().
+
+ * io.c (rb_io_getline_1): rewrite nested if statement into one
+ statement.
+
+Tue Jul 9 11:04:35 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/{dl,fiddle}/win32/lib/win32/registry.rb (Win32::Registry#check):
+ should report the position of the error.
+
+ * ext/{dl,fiddle}/win32/lib/win32/registry.rb
+ (Win32::Registry#QueryValue): workaround for test-all crash.
+
+Tue Jul 9 10:27:56 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/{dl,fiddle}/win32/lib/win32/registry.rb
+ (Win32::Registry.expand_environ): use suitable encoding for the
+ string.
+
+ * ext/{dl,fiddle}/win32/lib/win32/registry.rb (Win32::Registry#read):
+ should return REG_SZ, REG_EXPAND_SZ and REG_MULTI_SZ values with
+ the expected encoding -- assumed as the same encoding of name.
+
+Tue Jul 9 10:02:45 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/{dl,fiddle}/win32/lib/win32/registry.rb
+ (Win32::Registry::Error#initialize): use suitable encoding for the
+ string.
+
+Tue Jul 9 09:46:53 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/dl/win32/lib/win32/registry.rb (Win32::Registry.expand_environ):
+ use suitable encoding for the string. fixed a test-all error of
+ r41838.
+
+ * ext/fiddle/win32/lib/win32/registry.rb: same changes of r41838 and
+ this revision of dl's win32/registry.rb.
+
+Tue Jul 9 07:39:45 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems 2.0.4. See
+ https://github.com/rubygems/rubygems/blob/2.0/History.txt for changes
+
+Tue Jul 9 01:47:16 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (biglsh_bang): Don't shift a BDIGIT with BITSPERDIG bits.
+ (bigrsh_bang): Ditto.
+
+Tue Jul 9 01:17:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigrsh_bang): Fix bignum digits overrun.
+
+Tue Jul 9 00:46:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (biglsh_bang): Fix bignum digits under-run.
+
+Mon Jul 8 23:36:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/dl/win32/lib/win32/registry.rb (Error, API): use WCHAR
+ interfaces. c.f. [Bug #8508]
+
+Mon Jul 8 23:13:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (rb_w32_pow): move from win32.h and disable strict
+ ANSI mode macro to let _controlfp() stuff defined.
+ [ruby-core:55312] [Bug #8495]
+
+ * numeric.c (finite): add declaration for strict ANSI.
+ [ruby-core:55312] [Bug #8495]
+
+ * thread_win32.c (w32_thread_start_func, thread_start_func_1),
+ (timer_thread_func): use __stdcall instead of _stdcall which is
+ unavailable in strict ANSI mode. [ruby-core:55312] [Bug #8495]
+
+ * win32/win32.c (gettimeofday): use __cdecl instead of _cdecl.
+
+Mon Jul 8 22:41:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul): Arguments for work memory added.
+ (bary_mul_balance): Ditto.
+ (bary_mul_karatsuba): Ditto.
+
+Mon Jul 8 22:03:30 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_sq_fast): New function for testing.
+ (rb_big_mul_toom3): Ditto.
+
+ * internal.h (rb_big_sq_fast): Declared.
+ (rb_big_mul_toom3): Ditto.
+
+Mon Jul 8 21:59:34 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul_balance): Initialize a local variable to suppress
+ a warning.
+
+Mon Jul 8 20:55:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul_balance): Reduce work memory.
+
+Mon Jul 8 08:26:15 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+
+ * test/openssl/test_pkey_ec.rb: Skip tests for "Oakley" curves as
+ they are not suitable for ECDSA.
+ [ruby-core:54881] [Bug #8384]
+
+Mon Jul 8 08:03:01 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul): Add a RB_GC_GUARD.
+
+Sun Jul 7 23:56:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul_karatsuba): Unreachable code removed. Remove
+ several branches.
+
+Sun Jul 7 22:59:06 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (rb_big_mul_normal): Declared.
+ (rb_big_mul_balance): Ditto.
+ (rb_big_mul_karatsuba): Ditto.
+
+ * bignum.c (rb_big_mul_normal): New function for tests.
+ (rb_big_mul_balance): Ditto.
+ (rb_big_mul_karatsuba): Ditto.
+
+Sun Jul 7 19:21:30 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Reorder functions to decrease forward reference.
+
+Sun Jul 7 14:41:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: (bigsub_core): Use bary_sub.
+ (bary_sub): Returns a borrow flag. Use bary_subb.
+ (bary_subb): New function for actually calculating subtraction with
+ borrow.
+ (bary_sub_one): New function.
+ (bigadd_core): Use bary_add.
+ (bary_add): Returns a carry flag. Use bary_addc.
+ (bary_addc): New function for actually calculating addition with
+ carry.
+ (bary_add_one): New function.
+ (bary_muladd_1xN): Extracted from bary_mul_normal.
+ (bigmul1_normal): Removed.
+ (bary_mul_karatsuba): New function.
+ (bary_mul1): Invoke rb_thread_check_ints after bary_mul_normal.
+ (bary_mul): Remove most and least significant zeros before actual
+ multiplication. Use bary_sq_fast, bary_mul_balance,
+ bary_mul_karatsuba and bigmul1_toom3 as bigmul0.
+ (bigmul1_balance): Removed.
+ (bigmul1_karatsuba): Removed.
+ (bigsqr_fast): Removed.
+ (bary_sparse_p): Extracted from big_sparse_p.
+ (big_sparse_p): Removed.
+ (bigmul0): Use bary_mul.
+
+Sun Jul 7 11:54:33 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * NEWS: Add REXML::Text#<< related updates.
+
+Sun Jul 7 11:49:19 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/text.rb (REXML::Text#<<): Support appending in not
+ "raw" mode. [Bug #8602] [ruby-dev:47482]
+ Reported by Ippei Obayashi. Thanks!!!
+
+Sun Jul 7 11:43:13 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/text.rb (REXML::Text#<<): Support method chain use by "<<"
+ like other objects.
+
+Sun Jul 7 11:34:18 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/text.rb (REXML::Text#clear_cache): Extract common
+ cache clear code.
+
+Sun Jul 7 11:01:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (RUBY_DTRACE_POSTPROCESS): dtrace version SUN D 1.11
+ introduces a check in the dtrace compiler to ensure that probes
+ actually exist. If there are no probes, then the -G step will
+ fail. As this test is only being used to determine whether -G is
+ necessary (for instance, on OSX it is not), adding a real probe to
+ the conftest allows it to succeed on newer versions of dtrace.
+ Patch by Eric Saxby <sax AT livinginthepast.org> at
+ [ruby-core:55826]. [Fixes GH-351], [Bug #8606].
+
+Sun Jul 7 10:07:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_sq_fast): Extracted from bigsqr_fast and
+ ensure not to access zds[2*xn].
+ (bigsqr_fast): Allocate the result bignum with 2*xn words.
+
+Sat Jul 6 07:37:43 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+
+ * ext/openssl/ossl_pkey_ec.c: Ensure compatibility to builds of
+ OpenSSL with OPENSSL_NO_EC2M defined, but OPENSSL_NO_EC not
+ defined.
+ * test/openssl/test_pkey_ec.rb: Iterate over built-in curves
+ (and assert their non-emptiness!) instead of hard-coding them, as
+ this may cause problems with respect to the different availability
+ of individual curves in individual OpenSSL builds.
+ [ruby-core:54881] [Bug #8384]
+
+ Thanks to Vit Ondruch for providing the patch!
+
+Sat Jul 6 07:12:39 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+
+ * test/openssl/test_x509crl.rb: Remove unused variable.
+ [ruby-core:53501] [Bug #8114]
+
+ Thanks, Vipul Amler, for pointing this out!
+
+Sat Jul 6 06:37:10 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+
+ * ext/openssl/ossl.c: Provide CRYPTO_set_locking_callback() and
+ CRYPTO_set_id_callback() callback functions ossl_thread_id and
+ ossl_lock_callback to ensure the OpenSSL extension is usable in
+ multi-threaded environments.
+ [ruby-core:54900] [Bug #8386]
+
+ Thanks, Dirkjan Bussink, for the patch!
+
+Sat Jul 6 06:06:16 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+
+ * lib/openssl/ssl.rb: Fix SSL client connection crash for SAN marked
+ critical.
+ The patch for CVE-2013-4073 caused SSL crash when a SSL server returns
+ the certificate that has critical SAN value. X509 extension could
+ include 2 or 3 elements in it:
+
+ [id, criticality, octet_string] if critical,
+ [id, octet_string] if not.
+
+ Making sure to pick the last element of X509 extension and use it as
+ SAN value.
+ [ruby-core:55685] [Bug #8575]
+
+ Thank you @nahi for providing the patch!
+
+Sat Jul 6 04:49:38 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: register time objects so
+ they are referenced as ids during output.
+ * test/psych/test_date_time.rb: corresponding test.
+
+Fri Jul 5 20:46:39 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/ruby/test_unicode_escape.rb (TestUnicodeEscape#test_basic): this
+ assertion doesn't seems to be checking the unicode string on command
+ line, but seems to be checking how to treat the unicode string from
+ stdin. so, should escape '\' before 'u'. this fixes a test failure
+ on Windows.
+
+Fri Jul 5 19:05:40 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/fileutils.rb (FileUtils#chown, FileUtils#chown_R): Fix the
+ wrong output message when user is nil, which should be "chown
+ :group file" instead of "chown group file".
+
+Fri Jul 5 16:21:56 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * test/ruby/test_regexp.rb
+ (TestRegexp#test_options_in_look_behind)
+ (TestRegexp#assert_match_at): Add tests for another problem
+ fixed in Onigmo 5.13.5. Previously Onigmo did not allow option
+ enclosures in look-behind, which makes it impossible to
+ interpolate a regexp into another in the middle of a look-behind
+ pattern. cf. https://github.com/k-takata/Onigmo/pull/17
+
+ * test/ruby/test_regexp.rb
+ (TestRegexp#test_options_in_look_behind)
+ (TestRegexp#assert_match_at): Parse regexps in run time rather
+ than in compile time.
+
+Fri Jul 5 12:14:40 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/ruby/test_rubyoptions.rb (TestRubyOptions#test_notfound): after
+ r41710, the path of command uses backslash as the separator on
+ Windows.
+
+Fri Jul 5 11:29:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/test/unit/assertions.rb (assert_raise_with_message): move from
+ test/fileutils/test_fileutils.rb. this is still experimental and
+ the interface may be changed.
+
+Fri Jul 5 11:08:00 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (w32_spawn): r41710 made that if the command starts with
+ a quote and includes slash, removed the top quote and NOT removed the
+ last quote.
+ this fixes test failures on test/ruby/test_process.rb and
+ test/webrick.
+
+Fri Jul 5 09:53:15 2013 NARUSE, Yui <naruse@ruby-lang.org>
+ * lib/mkmf.rb (CONFIG['CPPOUTFILE']): fix r41769; CONFIG['CPPOUTFILE']
+ may be nil.
+
+Fri Jul 5 05:39:53 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (BARY_MUL1): Renamed from BARY_MUL.
+ (bary_mul1): Renamed from bary_mul.
+ (bary_mul): Renamed from bary_mul2.
+
+Fri Jul 5 04:58:05 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul_balance): Extracted from bigmul1_balance and
+ use bary_mul2 and bary_add to decrease allocations.
+
+Fri Jul 5 02:14:00 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/fileutils.rb (FileUtils#symbolic_modes_to_i): Fix the wrong
+ character class [+-=], which happened to match all desired
+ characters but also match undesired characters.
+
+ * lib/fileutils.rb (FileUtils.chmod{,_R}): Enhance the symbolic
+ mode parser to support the permission symbols u/g/o and multiple
+ actions as defined in SUS, so that chmod("g=o+w", file) works as
+ expected. Invalid symbolic modes are now rejected with
+ ArgumentError.
+
+Fri Jul 5 00:25:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (have_framework): allow header file to check.
+ [ruby-core:55745] [Bug #8593]
+
+Thu Jul 4 22:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * object.c (rb_obj_equal): Fixed an rb_obj_equal documentation typo
+ where "a" was used instead of "obj".
+ Fixes GH-349. Patch by @adnandoric
+
+Thu Jul 4 20:39:20 2013 Tanaka Akira <akr@fsij.org>
+
+ * tool/make-snapshot: Exit with EXIT_FAILURE when it fails.
+
+Thu Jul 4 20:20:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (maxpow_in_bdigit_dbl): Use tables if available.
+ (maxpow_in_bdigit): Ditto.
+ (U16): New macro.
+ (U32): Ditto.
+ (U64): Ditto.
+ (U128): Ditto.
+ (maxpow16_exp): New table.
+ (maxpow16_num): New table.
+ (maxpow32_exp): New table.
+ (maxpow32_num): New table.
+ (maxpow64_exp): New table.
+ (maxpow64_num): New table.
+ (maxpow128_exp): New table.
+ (maxpow128_num): New table.
+
+Thu Jul 4 18:25:25 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_cstr_to_inum): Avoid temporary buffer allocation except
+ very big base non-power-of-2 numbers.
+
+Thu Jul 4 15:51:56 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * string.c (rb_str_succ): use ONIGENC_MBCLEN_CHARFOUND_P correctly.
+
+ * string.c (rb_str_dump): ditto.
+
+Thu Jul 4 10:04:11 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * regcomp.c (): Merge Onigmo 5.13.5 23b523076d6f1161.
+
+ * [bug] (thanks Akinori MUSHA and Ippei Obayashi)
+ Fix a renumbering bug in condition regexp with a named
+ capture. [Bug #8583]
+ * [spec] (thanks Akinori MUSHA)
+ Allow ENCLOSE_OPTION in look-behind.
+
+Thu Jul 4 00:36:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * internal.h (SIGNED_INTEGER_MAX): suppress warning C4146 on VC6.
+ seems a logical ORed expression becomes unsigned.
+
+Thu Jul 4 00:13:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby_atomic.h (rb_w32_atomic_cas): call InterlockedCompareExchange
+ directly.
+
+ * ruby_atomic.h (ATOMIC_CAS): fix missing function call.
+
+Wed Jul 3 23:47:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby_atomic.h (ATOMIC_CAS): suppress C4022 and C4047 warnings in
+ VC6. only InterlockedCompareExchange is declared using PVOID.
+
+Wed Jul 3 22:29:20 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (ruby_digit36_to_number_table): Declared.
+
+ * util.c (ruby_digit36_to_number_table): Moved from scan_digits.
+
+ * bignum.c (conv_digit): Use ruby_digit36_to_number_table.
+
+ * pack.c (hex2num): Ditto.
+
+Wed Jul 3 18:12:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (install_dirs): revert DESTDIR prefix by r39841, since
+ it is fixed by r41648. [ruby-core:55760] [Bug #8115]
+
+Wed Jul 3 14:15:25 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (do_stat): use rb_w32_ustati64() in win32.c to get rid of
+ mysterious behavior of FindFirstFile() Windows API which treat "<"
+ and ">" like as wildcard characters. [ruby-core:55764] [Bug #8597]
+
+Wed Jul 3 12:06:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (maxpow_in_bdigit): Renamed from calc_hbase and return
+ maxpow.
+
+Tue Jul 2 23:47:50 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (roomof): Cast to long.
+ (rb_ull2big): Fix bignew arguments.
+
+Tue Jul 2 21:17:37 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_cstr_to_inum): Merge two temporary buffers.
+
+Tue Jul 2 20:25:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_cstr_to_inum): Use BDIGIT_DBL to collect adjacent digits.
+ (BDIGIT_DBL_MAX): New macro.
+ (maxpow_in_bdigit_dbl): New function.
+
+Tue Jul 2 17:23:33 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * doc/syntax/refinements.rdoc: add description of Module#using and
+ refinement inheritance by module inclusion.
+
+Tue Jul 2 17:22:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * internal.h: add EUC-JP and Windows-31J.
+
+ * re.c (rb_char_to_option_kcode): use built-in encoding indexes in
+ internal.h.
+
+ * internal.h: add UTF8-MAC.
+
+ * dir.c (rb_utf8mac_encoding): use built-in encoding indexes in
+ internal.h.
+
+ * internal.h: add UTF-{16,32} dummy encodings.
+
+ * string.c (rb_str_inspect, str_scrub0): use built-in encoding indexes
+ in internal.h.
+
+ * internal.h: add UTF-{16,32}{BE,LE}.
+
+ * io.c (io_strip_bom): use built-in encoding indexes in internal.h.
+
+ * internal.h (rb_{ascii8bit,utf8,usascii}_encindex): use built-in
+ encoding indexes for optimization.
+
+ * encoding.c (enc_inspect, rb_locale_encindex),
+ (enc_set_filesystem_encoding, rb_filesystem_encindex): use built-in
+ encoding indexes directly.
+
+ * encoding.c (rb_enc_set_index, rb_enc_associate_index): validate
+ argument encoding index.
+
+ * include/ruby/encoding.h (ENCODING_SET): use rb_enc_set_index()
+ instead of setting inlined bits directly.
+
+ * encoding.c (rb_enc_init): register preserved indexes.
+
+ * internal.h (ruby_preserved_encindex): move from encoding.c.
+
+Tue Jul 2 11:14:36 2013 Shota Fukumori <sorah@cookpad.com>
+
+ * lib/mkmf.rb (try_config): Fix to not replace $LDFLAGS with $libs
+ (1.9.3 behavior) [ruby-core:55752] [Bug #8595]
+
+Tue Jul 2 00:39:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/ipsocket.c (init_inetsock_internal): Don't try mismatched
+ address family if already failed.
+
+Mon Jul 1 23:07:38 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * template/encdb.h.tmpl: define encoding index macros to use the index
+ statically from C source.
+
+Mon Jul 1 22:57:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul2): New function.
+ (rb_cstr_to_inum): Use a better algorithm to compose the result
+ if input length is very long.
+
+Mon Jul 1 20:22:00 2013 Kenta Murata <mrkn@cookpad.com>
+
+ * ext/bigdecimal/bigdecimal.h (RB_UNUSED_VAR, UNREACHABLE):
+ import macros from ruby.h for 1.9.3.
+ [Bug #8588] [ruby-core:55730]
+
+ * ext/bigdecimal/bigdecimal.gemspec: Bump version to 1.2.1.
+
+Mon Jul 1 20:03:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/ipsocket.c (init_inetsock_internal): Use an address
+ family for local address which is different to the remote
+ address if no other choice.
+
+Mon Jul 1 15:05:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/csv.rb (CSV#<<): use StringIO#set_encoding instead of creating
+ new StringIO instance with String#force_encoding, forcing encoding
+ discards the cached coderange bits and can make further operations
+ very slow. [ruby-core:55714] [Bug #8585]
+
+ * ext/stringio/stringio.c (strio_write): keep coderange of
+ ptr->string.
+
+ * string.c (rb_enc_cr_str_buf_cat, rb_str_append): consider an empty
+ string 7bit-clean and should not discard cached coderange of string
+ to be appended.
+
+Mon Jul 1 12:56:41 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * eval.c (rb_using_module): activate refinements in the ancestors of
+ the argument module to support refinement inheritance by
+ Module#include. [ruby-core:55671] [Feature #8571]
+
+ * test/ruby/test_refinement.rb: related test.
+
+Mon Jul 1 12:02:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_cstr_to_inum): Skip leading zeros.
+
+Mon Jul 1 00:59:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (nlz16): New function.
+ (nlz32): Ditto.
+ (nlz64): Ditto.
+ (nlz128): Ditto.
+ (nlz): Redefined using an above function.
+ (bitsize): New macro.
+ (rb_cstr_to_inum): Use bitsize instead of nlz.
+
+Sun Jun 30 22:40:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * lib/prime.rb: Corrected a few comments. Patch by @Nullset14.
+ Fixes GH-346.
+
+Sun Jun 30 21:53:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_cstr_to_inum): Use rb_integer_unpack if base is a power
+ of 2.
+
+Sun Jun 30 10:59:23 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (join_argv): use backslash instead of slash in program
+ path, otherwise cannot invoke "./c\u{1ee7}a.exe" for some reason.
+ [ruby-core:24309] [Bug #1771]
+
+ * io.c (spawnv, spawn): use UTF-8 spawn family. [Bug #1771]
+
+ * process.c (proc_exec_sh, proc_spawn_cmd, proc_spawn_sh): ditto.
+
+ * win32/win32.c (translate_char, join_argv, has_redirection): make
+ codepage aware.
+
+ * win32/win32.c (rb_w32_udln_find_exe_r, rb_w32_udln_find_file_r):
+ codepage independent versions.
+
+ * win32/win32.c (w32_spawn): extract codepage aware code from
+ rb_w32_spawn().
+
+ * win32/win32.c (rb_w32_uspawn): add UTF-8 version function.
+
+ * win32/win32.c (w32_aspawn_flags): extract codepage aware code from
+ rb_w32_aspawn_flags().
+
+ * win32/win32.c (rb_w32_uaspawn_flags, rb_w32_uaspawn_flags): add
+ UTF-8 version functions.
+
+ * win32/win32.c (w32_getenv): extract codepage aware code from
+ rb_w32_ugetenv() and rb_w32_getenv().
+
+ * win32/win32.c (w32_stati64): extract codepage aware code from
+ rb_w32_ustati64() and rb_w32_stati64().
+
+ * dln.h (DLN_FIND_EXTRA_ARG, DLN_FIND_EXTRA_ARG_DECL): allow extra
+ arguments to dln_find_{exe,file}_r().
+
+ * dln_find.c (dln_find_exe_r, dln_find_file_r): add extract arguments.
+
+ * process.c (EXPORT_STR, EXPORT_DUP): convert to default process
+ encoding if defined.
+
+ * process.c (check_exec_env_i): convert environment variables too.
+
+ * process.c (rb_exec_fillarg): convert program path and arguments too.
+
+Sun Jun 30 01:57:08 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big_rshift): Use abs2twocomp and twocomp2abs_bang.
+
+Sun Jun 30 00:14:20 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (RBIGNUM_SET_NEGATIVE_SIGN): New macro.
+ (RBIGNUM_SET_POSITIVE_SIGN): Ditto.
+ (rb_big_neg): Inline get2comp to avoid double negation.
+
+Sat Jun 29 23:26:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_neg): Extracted from bary_2comp.
+ (bary_plus_one): Extracted from bary_2comp.
+ (bary_2comp): Use bary_neg and bary_plus_one.
+ (big_extend_carry): Extracted from get2comp.
+ (get2comp): Use big_extend_carry.
+ (rb_integer_unpack): Use big_extend_carry.
+ (rb_big_neg): Use bary_neg.
+
+Sat Jun 29 22:31:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_2comp): Simplified.
+
+Sat Jun 29 09:33:53 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigor_int): Return -1 if y == -1.
+
+Sat Jun 29 09:07:16 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigor_int): Use RB_GC_GUARD.
+ (bigxor_int): Take xn and hibitsx arguments. Use twocomp2abs_bang.
+ (rb_big_xor): Use abs2twocomp and twocomp2abs_bang.
+
+Sat Jun 29 08:19:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigand_int): Don't apply bitwise and for BDIGIT and long.
+ (bigor_int): Take xn and hibitsx arguments. Use twocomp2abs_bang.
+ (rb_big_or): Use abs2twocomp and twocomp2abs_bang.
+
+Fri Jun 29 01:08:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * numeric.c (fix_mul): remove FIT_SQRT_LONG test as it was causing
+ fix_mul to return an incorrect result for -2147483648*-2147483648
+ on 64 bit platforms
+
+ * test/ruby/test_integer_comb.rb (class TestIntegerComb): add test case
+
+Fri Jun 28 12:26:53 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_and): Allocate new bignum with same size to shorter
+ argument if it's high bits are zero.
+
+Fri Jun 28 12:14:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/ipsocket.c (init_inetsock_internal): Don't use local
+ addresses which address family is different to remote address.
+
+Fri Jun 28 08:06:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigand_int): Add arguments, xn and hibitsx.
+ Use twocomp2abs_bang.
+
+Thu Jun 27 23:58:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (abs2twocomp_bang): Removed.
+ (abs2twocomp): Take n_ret argument to return actual length.
+ (rb_big_and): Follow above change.
+
+Thu Jun 27 22:52:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (get2comp): Use bary_2comp.
+ (abs2twocomp_bang): New function.
+ (abs2twocomp): New function.
+ (twocomp2abs_bang): New function.
+ (rb_big_and): Use abs2twocomp and twocomp2abs_bang.
+
+Thu Jun 27 20:03:13 2013 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+
+ * ext/openssl/lib/openssl/ssl.rb (verify_certificate_identity): fix
+ hostname verification. Patched by nahi.
+
+ * test/openssl/test_ssl.rb (test_verify_certificate_identity): test for
+ above.
+
+
+Thu Jun 27 00:23:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_pow): Retry if y is a Bignum and it is
+ representable as a Fixnum.
+ Use rb_absint_numwords.
+
+Wed Jun 26 23:53:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_save_rounding_mode): fix typo.
+ Fixes GH-343. Patch by @jgarber.
+
+Wed Jun 26 23:22:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enumerator.c (rb_enumeratorize_with_size): use strict definition
+ rb_enumerator_size_func.
+
+Wed Jun 26 23:11:14 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * gc.c (is_before_sweep): Add a missing space before a parenthesis.
+ * gc.c (rb_gc_force_recycle): Add a missing space around a parenthesis.
+
+Wed Jun 26 22:44:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/intern.h (rb_enumeratorize_with_size): cast for
+ backward compatibility.
+
+ * include/ruby/intern.h (rb_enumerator_size_func): define strict
+ function declaration for rb_enumeratorize_with_size().
+
+Wed Jun 26 21:01:22 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * test/ruby/test_io.rb (TestIO#test_write_32bit_boundary): skip if
+ writing a file is slow.
+ [ruby-core:55541] [Bug #8519]
+
+Wed Jun 26 16:42:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb: should use expanded values for header directories
+ unless extmk. patch by vo.x (Vit Ondruch) at [ruby-core:55653]
+ [Bug #8115], rhbz#921650.
+
+Wed Jun 26 12:48:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigxor_int): Fix a buffer over read.
+
+Wed Jun 26 12:13:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigand_int): Consider negative values.
+ (bigor_int): The allocated bignum should have enough size
+ to store long.
+ This fixes (bignum fits in a BDIGIT) | (fixnum bigger than BDIGIT)
+ on platforms which SIZEOF_BDIGITS < SIZEOF_LONG,
+ such as LP64 with 32bit BDIGIT (no int128).
+
+Wed Jun 26 12:08:51 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/socket/test_udp.rb: Close sockets explicitly.
+ Don't use fixed port number.
+
+Wed Jun 26 07:27:17 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigand_int): Fix a buffer over read.
+
+Wed Jun 26 06:48:07 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigadd_int): Fix a buffer over read.
+
+Wed Jun 26 01:18:13 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (is_before_sweep): Add new helper function that check the object
+ is before sweep?
+ * gc.c (rb_gc_force_recycle): Have to clear mark bit if object's slot
+ already ready to minor sweep.
+
+Wed Jun 26 01:17:29 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigsub_int): Fix a buffer over read.
+
+Tue Jun 25 22:45:43 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_absint_singlebit_p): Use POW2_P.
+ (bary_pack): Ditto.
+ (rb_big2str0): Ditto.
+ (POW2_P): Moved to top.
+
+Tue Jun 25 22:28:07 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/rubygems/ext/builder.rb (Gem::Ext::Builder.make): Pass
+ DESTDIR via command line to override what's in MAKEFLAGS. This
+ fixes an installation problem under a package building
+ environment where DESTDIR is specified in the (parent) command
+ line. [Fixes GH-327]
+
+Tue Jun 25 21:43:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2dbl): Use (BDIGIT)1 instead of 1UL.
+ (bary_mul_normal): Remove a useless cast.
+
+Tue Jun 25 21:26:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigMath_s_exp): Fix for the cases when
+ the argument x is not a BigDecimal.
+ This change is based on the patch made by Heesob Park and Garth Snyder.
+ [Bug #6862] [ruby-core:47145]
+ [Fixes GH-332] https://github.com/ruby/ruby/pull/332
+
+Tue Jun 25 20:36:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2ulong): "check" argument removed.
+ (rb_big2ulong): Follow above change.
+ (rb_big2long): Ditto.
+ (rb_big_rshift): Ditto.
+ (rb_big_aref): Ditto.
+
+Tue Jun 25 20:08:29 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big2ulong_pack): Use rb_integer_pack.
+ (rb_big_aref): Call big2ulong with TRUE for "check" argument.
+ It should be non-effective.
+
+Tue Jun 25 19:07:33 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (LSHIFTX): Revert r41611.
+ The redundant expression suppresses a warning, C4293, by Visual
+ Studio.
+ http://ruby-mswin.cloudapp.net/vc10-x64/ruby-trunk/log/20130625T072854Z.log.html.gz#miniruby
+
+Tue Jun 25 19:03:00 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2ulong): Add a cast.
+ (big2ull): Add a specialized code for SIZEOF_LONG_LONG <=
+ SIZEOF_BDIGITS.
+
+Tue Jun 25 12:42:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (integer_unpack_single_bdigit): Use "1 + ~u" instead of
+ "-u" to suppress warning (C4146) by Visual Studio.
+ Reported by ko1 via IRC.
+
+Tue Jun 25 12:28:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2ulong): Add code specialized for SIZEOF_LONG <=
+ SIZEOF_BDIGITS.
+ This prevents shift width warning from "num <<= BITSPERDIG".
+
+Tue Jun 25 12:23:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: fix oldgen/remembered_shady counting algorithm.
+
+ * gc.c (rgengc_check_shady): increment
+ `objspace->rgengc.remembered_shady_object_count' here.
+
+ * gc.c (rgengc_remember): return FALSE if obj is already remembered.
+
+ * gc.c (rgengc_rememberset_mark): make it void.
+
+ * gc.c (gc_mark_children): fix to double counting oldgen_object_count
+ at minor GC.
+
+Tue Jun 25 12:07:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (MSB): Removed.
+ (BDIGIT_MSB): Defined using BIGRAD_HALF.
+ (bary_2comp): Apply BIGLO after possible over flow of BDIGIT.
+ (get2comp): Ditto.
+ (bary_unpack_internal): Use BDIGIT_MSB.
+ Apply BIGLO after possible over flow of BDIGIT.
+ (rb_integer_unpack): Use BDIGIT_MSB.
+ (calc_hbase): Use BDIGMAX.
+ (big2dbl): Use BDIGMAX.
+ Apply BIGLO after possible over flow of BDIGIT.
+ (rb_big_neg): Apply BIGLO after possible over flow of BDIGIT.
+ (biglsh_bang): Ditto.
+ (bigrsh_bang): Ditto.
+ (bary_divmod): Use BDIGIT_MSB.
+ (bigdivrem): Ditto.
+ (bigxor_int): Apply BIGLO after possible over flow of BDIGIT.
+
+ * marshal.c (shortlen): Use SIZEOF_BDIGITS instead of sizeof(BDIGIT).
+
+ * ext/openssl/ossl_bn.c (ossl_bn_initialize): Use SIZEOF_BDIGITS
+ instead of sizeof(BDIGIT).
+
+Tue Jun 25 11:40:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * bignum.c (big2ulong): suppress shorten-64-to-32 warning. BDIGIT can
+ be bigger than long now.
+
+ * bignum.c (LSHIFTX): remove redundant never-true expression.
+
+Tue Jun 25 00:55:54 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (typedef struct rb_objspace): Change members for monitor objects.
+ * gc.c (gc_marks_test): Check all WriteBarrier Errors and track them in obj-tree.
+ * gc.c (rgengc_check_shady): Ditto.
+ * gc.c (gc_marks): Move 2 function calls to gc_marks_test for test initialize.
+
+Mon Jun 24 23:30:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (integer_unpack_single_bdigit): Refine code to filling
+ higher bits and use BIGLO.
+
+Mon Jun 24 22:26:31 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * test/rinda/test_rinda.rb (RingIPv6#prepare_ipv6):
+ ifindex() function may not be implemented on Windows. We use another
+ check for the case.
+
+Mon Jun 24 22:11:37 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * test/gdbm/test_gdbm.rb (TestGDBM#test_s_open_nolock):
+ skip a failing test on Windows because flock() implementation is
+ different from Unix.
+
+Mon Jun 24 22:06:14 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * test/rubygems/test_gem_installer.rb (test_install_extension_flat):
+ use ruby in build directory in case ruby is not installed.
+ [ruby-core:53265] [Bug #8058]
+
+Mon Jun 24 22:04:02 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * ext/dl/cfunc.c (rb_dlcfunc_call): fix conversion from Bignum to
+ pointer. sizeof(DLSTACK_TYPE) is larger than sizeof(long) on
+ Windows x64 and higher bits over sizeof(long) of DLSTACK_TYPE was
+ zero even if a pointer value was over 32 bits which causes SEGV on
+ DL::TestCPtr#test_to_ptr_io. Adding a cast solves the bug.
+
+Mon Jun 24 22:04:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * eval_error.c (warn_printf): use rb_vsprintf instead so ruby specific
+ extensions like PRIsVALUE can be used in format strings
+ * eval_error.c (error_print): use warn_print_str (alias for
+ rb_write_error_str) to print a string value instead of using
+ RSTRING_PTR and RSTRING_LEN manually
+ * eval.c (setup_exception): use PRIsVALUE instead of %s and RSTRING_PTR
+
+Mon Jun 24 20:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * compile.c (make_name_for_block): use PRIsVALUE in format string
+ instead of %s and RSTRING_PTR to protect objects from being garbage
+ collected too soon
+ * encoding.c (str_to_encindex): ditto
+ * hash.c (rb_hash_fetch_m): ditto
+ * io.c (rb_io_reopen): ditto
+ * parse.y (reg_fragment_check_gen): ditto
+ * parse.y (reg_compile_gen): ditto
+ * parse.y (ripper_assert_Qundef): ditto
+ * re.c (rb_reg_raise): ditto
+ * ruby.c (set_option_encoding_once): ditto
+ * vm_eval.c (rb_throw_obj): ditto
+
+Mon Jun 24 07:57:18 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (after_gc_sweep): Have to record malloc info before reset.
+ * gc.c (gc_prof_timer_start): Pick out part of new record creation as gc_prof_setup_new_record.
+ * gc.c (gc_prof_set_malloc_info): Move point of recording allocation size to front of mark.
+
+Mon Jun 24 02:53:09 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * array.c: Return value in Array overview example found by @PragTob
+ [Fixes GH-336] https://github.com/ruby/ruby/pull/336
+
+Mon Jun 24 02:45:51 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * array.c (rb_ary_zip): typo by @PragTob [Fixes GH-337]
+ https://github.com/ruby/ruby/pull/337
+
+Mon Jun 24 02:42:01 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * win32/README.win32: grammar typo by @blankenshipz [Fixes GH-334]
+ https://github.com/ruby/ruby/pull/334
+
+Mon Jun 24 00:59:35 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (BIGUP): Use LSHIFTX and avoid cast to consider the type
+ of x is bigger than BDIGIT_DBL.
+ (big2ulong): Use unsigned long to store the result.
+ (big2ull): Use unsigned LONG_LONG to store the result.
+ (bigand_int): Use long for num to avoid data loss.
+ (bigor_int): Ditto.
+ (bigxor_int): Ditto.
+
+Sun Jun 23 23:05:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/defines.h (BDIGIT): Define it only if it is not defined
+ yet. This eases tests and debug.
+ (SIZEOF_BDIGITS): Ditto.
+ (BDIGIT_DBL): Ditto.
+ (BDIGIT_DBL_SIGNED): Ditto.
+ (PRI_BDIGIT_PREFIX): Ditto.
+ (PRI_BDIGIT_DBL_PREFIX): Ditto.
+ (PRIdBDIGIT): Define it only if PRI_BDIGIT_PREFIX is defined.
+ (PRIiBDIGIT): Ditto.
+ (PRIoBDIGIT): Ditto.
+ (PRIuBDIGIT): Ditto.
+ (PRIxBDIGIT): Ditto.
+ (PRIXBDIGIT): Ditto.
+ (PRIdBDIGIT_DBL): Ditto.
+ (PRIiBDIGIT_DBL): Ditto.
+ (PRIoBDIGIT_DBL): Ditto.
+ (PRIuBDIGIT_DBL): Ditto.
+ (PRIxBDIGIT_DBL): Ditto.
+ (PRIXBDIGIT_DBL): Ditto.
+
+ * include/ruby/ruby.h (RBIGNUM_EMBED_LEN_MAX): Define it only if it is
+ not defined yet.
+
+Sun Jun 23 17:29:51 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (integer_unpack_single_bdigit): Use a cast.
+
+Sun Jun 23 15:38:07 2013 Koichi Sasada <ko1@atdot.net>
+
+ * bootstraptest/test_thread.rb: rescue resource limitation errors.
+
+Sun Jun 23 08:19:27 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (integer_unpack_single_bdigit): Extracted from
+ bary_unpack_internal.
+
+Sun Jun 23 07:41:52 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_unpack_internal): Suppress warnings (C4146) on Visual Studio.
+ Reported by ko1 via IRC.
+
+Sun Jun 23 06:49:28 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h, gc.c: rename macros and functions:
+ OBJ_WB_GIVEUP() -> OBJ_WB_UNPROTECT(),
+ rb_obj_wb_giveup() -> rb_obj_wb_unprotect(),
+ rb_gc_giveup_promoted_writebarrier() ->
+ rb_gc_writebarrier_unprotect_promoted(),
+
+ * class.c, eval.c, hash.c: use OBJ_WB_UNPROTECT().
+
+Sun Jun 23 05:41:32 2013 Koichi Sasada <ko1@atdot.net>
+
+ * class.c (rb_include_class_new), eval.c (rb_using_refinement):
+ make classes/modules (who share method table) shady.
+ If module `a' and `b' shares method table m_tbl and new method
+ with iseq is added, then write barrier is applied only `a' or `b'.
+ To avoid this issue, shade such classes/modules.
+
+ * vm_method.c (rb_method_entry_make): add write barriers.
+
+Sun Jun 23 01:27:54 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bytes_zero_p): Removed.
+ (bary_pack): Don't call bytes_zero_p.
+
+Sun Jun 23 00:51:29 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bytes_zero_p): Extracted from bary_pack.
+ (bary_pack): Use bytes_zero_p.
+
+Sun Jun 23 00:16:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (MSB): New macro.
+ (bary_unpack_internal): Use MSB.
+ (bary_divmod): Ditto.
+ (bigdivrem): Ditto.
+
+Sat Jun 22 23:45:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_swap): New function.
+ (bary_pack): Use bary_swap.
+ (bary_unpack_internal): Ditto.
+
+Sat Jun 22 23:18:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bytes_2comp): Renamed from quad_buf_complement.
+ (bary_pack): Use bytes_2comp.
+ (rb_quad_pack): Use rb_integer_pack.
+ (rb_quad_unpack): Use rb_integer_unpack.
+
+Sat Jun 22 21:46:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_integer_unpack): Don't allocate a Bignum if possible.
+
+Sat Jun 22 21:03:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * pack.c (pack_unpack): Remove specialized unpackers for integers.
+
+Sat Jun 22 20:36:50 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_unpack_internal): Specialized unpacker implemented.
+ (bary_unpack): Support INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION.
+ (rb_integer_unpack): Support INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION.
+
+Sat Jun 22 18:53:10 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_pack): Support
+ INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION flag.
+ Fix byte order and word order handling in code specialized for
+ wordsize % SIZEOF_BDIGITS == 0.
+
+ * internal.h (INTEGER_PACK_FORCE_GENERIC_IMPLEMENTATION): Defined.
+
+Sat Jun 22 15:41:25 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rgengc_check_shady): add new WB miss checking
+ on RGENGC_CHECK_MODE >= 2.
+
+ (1) Save bitmaps before marking
+ (2) Run full marking
+ (3) On each traceable object,
+ (a) object was not oldgen (== newly or shady object) &&
+ (b) parent object was oldgen &&
+ (c) parent object was not remembered &&
+ (d) object was not remembered
+ then, it should be WB miss.
+
+ This idea of this checker is by Masaya Tarui <tarui@ruby-lang.org>.
+
+Sat Jun 22 15:25:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * ext/etc/etc.c (setup_passwd): revert r41560, unnecessary
+
+Sat Jun 22 14:39:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * ext/etc/etc.c (Init_etc): omit 'passwd' from definition of Etc::Passwd
+ if HAVE_STRUCT_PASSWD_PW_PASSWD is not defined to prevent mismatch of
+ fields and values in setup_passwd
+
+Sat Jun 22 14:35:40 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/dl/cfunc.c (rb_dlcfunc_call): Use rb_big_pack instead of
+ rb_big2ulong_pack and rb_big2ull.
+
+ * include/ruby/intern.h (rb_big2ulong_pack): Deprecated.
+
+Sat Jun 22 14:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * ext/etc/etc.c (setup_passwd): pass 0 as VALUE to rb_struct_new to
+ prevent segfault if the compiler passes it as a 32 bit integer on
+ a 64 bit ruby
+
+Sat Jun 22 13:47:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_pack): MEMZERO can be used even if nails is not zero.
+
+Sat Jun 22 13:43:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * ext/etc/etc.c (etc_getpwnam): use PRIsVALUE in format string instead
+ of %s and RSTRING_PTR
+
+ * ext/etc/etc.c (etc_getgrnam): ditto
+
+Sat Jun 22 13:07:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (CLEAR_LOWBITS): Rewritten without RSHIFTX.
+ (RSHIFTX): Removed.
+
+Sat Jun 22 10:38:03 2013 Tanaka Akira <akr@fsij.org>
+
+ * pack.c (num2i32): Removed.
+ (pack_pack): Don't use num2i32.
+
+Sat Jun 22 09:55:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (LSHIFTX): Defined to suppress a warning.
+ (RSHIFTX): Ditto.
+ (CLEAR_LOWBITS): Use LSHIFTX and RSHIFTX.
+ (FILL_LOWBITS): Use LSHIFTX.
+ Reported by ko1 via IRC.
+
+Sat Jun 22 09:11:33 2013 Ryan Davis <ryand-ruby@zenspider.com>
+
+ * lib/minitest/*: Imported minitest 4.7.5 (r8724)
+ * test/minitest/*: ditto
+
+Sat Jun 22 07:20:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_prof_set_heap_info, after_gc_sweep): call
+ gc_prof_set_heap_info() just after sweeping to calculate
+ live object number correctly.
+ (live object number = total generated number (before marking) -
+ total freed number (after sweeping))
+
+ * gc.c (gc_marks): record `oldgen_object_count' into current profile`
+ record directly.
+
+ * gc.c (rgengc_rememberset_mark): same for remembered_normal_objects
+ and remembered_shady_objects.
+
+Sat Jun 22 06:46:04 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_objspace::profile): rename rb_objspace::profile::record to
+ records (because it points a set of records) and add a field
+ rb_objspace::profile::current_record to point a current profiling
+ record.
+
+ * gc.c: use above fields.
+
+Sat Jun 22 06:05:36 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_gc_giveup_promoted_writebarrier): remove `rest_sweep()'
+ because all of remembered objects are called for gc_mark_children().
+
+Sat Jun 22 05:08:03 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rgengc_rememberset_mark): call gc_mark_children() for
+ remembered objects directly instead of pushing on the mark stack.
+
+Sat Jun 22 04:48:53 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h (OBJ_WRITE): cast to (VALUE *) for second
+ parameter `slot'. You don't need to write a cast (VALUE *) any more.
+
+ * class.c, compile.c, hash.c, iseq.c, proc.c, re.c, variable.c,
+ vm.c, vm_method.c: remove cast expressions for OBJ_WRITE().
+
+Sat Jun 22 04:37:08 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (slot_sweep_body): rename to slot_sweep().
+ No need to separate major/minor GC.
+
+ * gc.c (gc_setup_mark_bits): remove gc_clear_mark_bits() and unify to
+ this function.
+
+Sat Jun 22 04:20:21 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (check_bitmap_consistency): add to check flag and bitmap consistency.
+ Use this function in several places.
+
+Sat Jun 22 02:18:07 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_pack): Specialized packers implemented.
+ (HOST_BIGENDIAN_P): New macro.
+ (ALIGNOF): New macro.
+ (CLEAR_LOWBITS): New macro.
+ (FILL_LOWBITS): New macro.
+ (swap_bdigit): New macro.
+ (bary_2comp): Returns an int.
+
+ * internal.h (swap16): Moved from pack.c
+ (swap32): Ditto.
+ (swap64): Ditto.
+
+Fri Jun 21 21:29:49 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (typedef enum): Introduce flags of major gc reason.
+ * gc.c (garbage_collect_body): Ditto.
+ * gc.c (gc_profile_flags): Ditto.
+ * gc.c (gc_profile_dump_on): Ditto.
+
+Fri Jun 21 21:11:53 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (allocate_sorted_heaps): remove unused variable `add'.
+
+Fri Jun 21 20:50:32 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: constify RArray::as::ary and RArray::heap::ptr.
+ Use RARRAY_ASET() or RARRAY_PTR_USE() to modify Array objects.
+
+ * array.c, gc.c: catch up above changes.
+
+Fri Jun 21 20:32:13 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_eval.c (eval_string_with_cref): fix WB miss.
+
+Fri Jun 21 20:15:49 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: support write barrier protection for T_STRUCT.
+ Introduce the following C APIs:
+ * RSTRUCT_RAWPTR(st) returns pointer (do WB on your risk).
+ The type of returned pointer is (const VALUE *).
+ * RSTRUCT_GET(st, idx) returns idx-th value of struct.
+ * RSTRUCT_SET(st, idx, v) set idx-th value by v with WB.
+ And
+ * RSTRUCT_PTR(st) returns pointer with shady operation.
+ The type of returned pointer is (VALUE *).
+
+ * struct.c, re.c, gc.c, marshal.c: rewrite with above APIs.
+
+Fri Jun 21 19:38:37 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (BDIGMAX): Use BIGRAD.
+ (BIGLO): Use BDIGMAX.
+ (bigdivrem1): Ditto.
+ (bigor_int): Ditto.
+ (rb_big_or): Ditto.
+
+Fri Jun 21 19:18:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * pack.c (pack_pack): Move the implementation for 'c' directive after
+ pack_integer label.
+
+Fri Jun 21 19:11:56 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h, re.c: support write barrier for T_REGEXP.
+
+ Note: T_MATCH object is also easy to support write barriers.
+ However, most of T_MATCH objects are short-lived objects.
+ So I skipped to support non-shady T_MATCH.
+
+Fri Jun 21 18:56:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigsub_int): Use bdigit_roomof.
+ (bigadd_int): Ditto.
+ (bigand_int): Ditto.
+ (bigor_int): Ditto.
+ (bigxor_int): Ditto.
+
+Fri Jun 21 17:56:25 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc/gcbench.rb: fix summary of benchmark result notation.
+
+Fri Jun 21 16:38:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * ext/openssl/ossl_x509attr.c: change OSSL_X509ATTR_IS_SINGLE and
+ OSSL_X509ATTR_SET_SINGLE macros to use ->value.set rather than
+ ->set to fix compile failure
+
+Fri Jun 21 15:26:45 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_sweep): profile sweep time correctly when LAZY_SWEEP is
+ disabled.
+
+ * gc.c (gc_marks_test): store oldgen count and shady count
+ before test marking and restore them after marking.
+
+Fri Jun 21 15:07:42 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: enable lazy sweep (commit miss).
+
+Fri Jun 21 14:31:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * hash.c (ruby_setenv): refine error message so include the variable
+ name.
+
+Fri Jun 21 14:15:08 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: fix to use total_allocated_object_num and heaps_used
+ at the GC time for profiler.
+
+Fri Jun 21 12:35:35 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: RGENGC_CHECK_MODE should be 0.
+
+Fri Jun 21 11:18:25 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_marks_body): fix to get `th' in this function.
+
+Fri Jun 21 10:21:44 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (heaps_header/heaps_slot): embed bitmaps into heaps_slot.
+ no need to maintain allocation/free bitmaps.
+
+Fri Jun 21 09:22:16 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (slot_sweep_body): add counters at a time.
+
+ * gc.c (gc_profile_dump_on): fix line break position.
+
+Fri Jun 21 08:14:00 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c: refactoring bitmaps. introduce bits_t type and some Consts.
+
+Fri Jun 21 08:04:32 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: fix to support USE_RGENGC == 0 (disable RGenGC).
+ If USE_RGENGC==0, it caused compilation error.
+
+Fri Jun 21 08:08:11 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (lazy_sweep): Use is_lazy_sweeping()
+ * gc.c (rest_sweep): Ditto.
+ * gc.c (gc_prepare_free_objects): Ditto.
+
+Fri Jun 21 07:34:47 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_profile_record::oldgen_objects): added.
+
+ * gc.c (gc_profile_dump_on): print the following information:
+ * Living object counts
+ * Free object counts
+ If RGENGC_PROFILE > 0 then
+ * Oldgen object counts
+ * Remembered normal object counts
+ * Remembered shady object counts
+
+Fri Jun 21 06:43:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_ull2big): Refactored.
+ (rb_uint2big): Useless code removed.
+
+Fri Jun 21 05:37:39 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_prof_sweep_timer_stop): accumulate sweep time only when
+ record->gc_time > 0.
+
+Fri Jun 21 00:37:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/bigdecimal: Workaround fix for bigdecimal test failures caused
+ by [ruby-dev:47413] [Feature #8509]
+
+ * ext/bigdecimal/bigdecimal.h (BDIGIT): Make it independent from the
+ definition for bignum.c.
+ (SIZEOF_BDIGITS): Ditto.
+ (BDIGIT_DBL): Ditto.
+ (BDIGIT_DBL_SIGNED): Ditto.
+ (PRI_BDIGIT_PREFIX): Undefine the definition.
+ (PRI_BDIGIT_DBL_PREFIX): Ditto.
+
+ * ext/bigdecimal/bigdecimal.c (RBIGNUM_ZERO_P): Use rb_bigzero_p.
+ (bigzero_p): Removed.
+ (is_even): Use rb_big_pack.
+
+Thu Jun 20 22:52:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigmul1_toom3): Don't call bignorm twice.
+
+Thu Jun 20 22:49:27 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bignorm): Don't call bigtrunc if the result is a fixnum.
+
+Thu Jun 20 22:29:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_uint2big): Refactored.
+
+Thu Jun 20 22:24:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (dump_bignum): Use SIZEOF_BDIGITS.
+
+Thu Jun 20 22:22:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2ulong): Change the return type to unsigned long.
+ (rb_big2ulong_pack): Follow the above change.
+ (rb_big2long): Ditto.
+ (rb_big_lshift): Ditto.
+ (rb_big_rshift): Ditto.
+ (rb_big_aref): Ditto.
+
+Thu Jun 20 22:02:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_unpack_internal): Return -2 when negative overflow.
+ (bary_unpack): Set the overflowed bit if an extra BDIGIT exists.
+ (rb_integer_unpack): Set the overflowed bit.
+
+Thu Jun 20 21:17:19 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rgengc_rememberset_mark): record
+ (1) normal objects count in remember set
+ (2) shady objects count in remember set
+ each GC timing.
+
+ * gc.c (gc_profile_record_get): enable to access above information
+ and REMOVING_OBJECTS, EMPTY_OBJECTS.
+
+Thu Jun 20 18:29:26 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc/gcbench.rb: Do not use GC::Profiler::disable because
+ GC::Profiler::disable prohibit to access profiling data. It should
+ be spec bug.
+
+ Skip GC::Profiler::report if RUBY_VERSION < '2.0.0'
+
+Thu Jun 20 17:59:08 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc/gcbench.rb: stop GC::Profiler before output results.
+ Generating GC::Profiler result under profiling causes infinite loop.
+
+Thu Jun 20 17:24:24 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc/gcbench.rb: don't use __dir__ to make compatible
+ with ruby 1.9.3.
+
+Thu Jun 20 16:57:19 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/bm_app_aobench.rb: use attr_accessor/reader instead of
+ defining methods.
+
+Thu Jun 20 16:46:46 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/bm_app_aobench.rb: added.
+
+ * benchmark/gc/aobench.rb: added.
+
+Thu Jun 20 16:28:33 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/bm_so_binary_trees.rb: disable `puts' method
+ and change iteration parameter to increase execution time.
+
+ * benchmark/gc/binarytree.rb: added.
+
+Thu Jun 20 16:06:37 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc/pentomino.rb: added.
+ Simply load pentomino puzzle in the benchmark/ directory.
+
+Thu Jun 20 15:32:56 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc/redblack.rb: import red black tree benchmark from
+ https://github.com/jruby/rubybench/blob/master/time/bench_red_black.rb
+
+ * benchmark/gc/ring.rb: add a benchmark. This benchmark create many
+ old objects.
+
+Thu Jun 20 15:14:00 2013 Koichi Sasada <ko1@atdot.net>
+
+ * benchmark/gc: create a directory to store GC related benchmark.
+
+ * benchmark/gc/gcbench.rb: moved from tool/gcbench.rb.
+
+ * benchmark/gc/hash(1|2).rb: ditto.
+
+ * benchmark/gc/rdoc.rb: ditto.
+
+ * benchmark/gc/null.rb: added.
+
+ * common.mk: fix rule.
+
+Thu Jun 20 14:09:54 2013 Koichi Sasada <ko1@atdot.net>
+
+ * tool/hashbench1.rb: fix parameter too. Increase temporary objects.
+
+Thu Jun 20 14:01:35 2013 Koichi Sasada <ko1@atdot.net>
+
+ * tool/hashbench1.rb: fix parameters.
+
+Thu Jun 20 14:00:34 2013 Koichi Sasada <ko1@atdot.net>
+
+ * common.mk: remove dependency from ruby.
+
+Thu Jun 20 13:14:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (rb_check_backtrace): evaluate RARRAY_AREF only once.
+ the first argument of RB_TYPE_P is expanded twice for non-immediate
+ types.
+
+Thu Jun 20 08:09:29 2013 Koichi Sasada <ko1@atdot.net>
+
+ * tool/gcbench.rb: Summary in one line.
+
+ * common.mk: separate gcbench-hash to gcbench-hash1 and gcbench-hash2.
+
+Thu Jun 20 08:07:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (BIGSIZE): New macro.
+ (bigfixize): Use BIGSIZE.
+ (big2ulong): Ditto.
+ (check_shiftdown): Ditto.
+ (rb_big_aref): Ditto.
+
+Thu Jun 20 07:46:48 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (rb_gc_writebarrier): give up rescan A and register B directly
+ if A has huge number of children.
+
+Thu Jun 20 07:30:35 2013 Koichi Sasada <ko1@atdot.net>
+
+ * common.mk: add new rules `gcbench-rdoc', `gcbench-hash'.
+
+ * tool/gcbench.rb: separate GC bench framework and process.
+
+ * tool/hashbench1.rb, tool/hashbench2.rb: add two types GC bench.
+ hashbench1: many temporal objects (GC by newobj)
+ hashbench2: hash size becomes bigger and bigger (GC by malloc)
+ Two benches are executed by `gcbench-hash' rule.
+
+ * tool/rdocbench.rb: separated.
+
+Thu Jun 20 06:25:39 2013 Koichi Sasada <ko1@atdot.net>
+
+ * tool/rdocbench.rb: add summary.
+
+Thu Jun 20 06:18:01 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_profile_total_time): check objspace->profile.next_index > 0.
+
+Thu Jun 20 05:47:41 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_prof_sweep_timer_start): fix merge miss.
+
+ * gc.c (GC_PROFILE_MORE_DETAIL): set it 0.
+
+Thu Jun 20 05:38:56 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: Accumulate sweep time to GC time.
+ Now [GC time] is [mark time] + [sweep time] + [misc].
+ ([GC time] >= [mark time] + [sweep time])
+
+ * gc.c (gc_prof_sweep_slot_timer_start/stop): rename to
+ gc_prof_sweep_timer_start/stop and locate at lazy_sweep().
+
+ * gc.c (elapsed_time_from): add a utility function.
+
+Thu Jun 20 05:08:53 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_marks): fix wrong option. FALSE means major/full GC.
+ It should be TRUE (minor marking).
+
+Thu Jun 20 02:44:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (waitpid): should not return 0 but wait until exit
+ unless WNOHANG is given. waiting huge process may return while
+ active, for some reason.
+
+Thu Jun 20 01:34:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bdigit_roomof): Use SIZEOF_BDIGITS.
+ (bigfixize): Refine an ifdef condition.
+ (rb_absint_size): Use bdigit_roomof.
+ (rb_absint_singlebit_p): Ditto.
+ (rb_integer_pack): Ditto.
+ (integer_pack_fill_dd): Use BITSPERDIG.
+ (integer_unpack_push_bits): Use BITSPERDIG, BIGLO and BIGDN.
+
+Thu Jun 20 01:07:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (MARKED_IN_BITMAP, FL_TEST2): return boolean value since always
+ used as boolean value.
+
+ * gc.c (MARK_IN_BITMAP, CLEAR_IN_BITMAP): evaluate bits once.
+
+Thu Jun 20 00:05:07 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (RVALUE_PROMOTED): fix type.
+
+Wed Jun 19 23:39:01 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_marks_test): rewrite checking code.
+ When RGENGC_CHECK_MODE >= 2, all minor marking, run normal minor
+ marking *and* major/full marking. After that, compare the results
+ and shows BUG if a object living with major/full marking but dead
+ with minor marking.
+ After detecting bugs, print references information.
+ (RGENGC_CHECK_MODE == 2, show references to dead object)
+ (RGENGC_CHECK_MODE == 3, show all references)
+
+Wed Jun 19 23:51:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigfixize): Use rb_absint_size.
+ (check_shiftdown): Ditto.
+ (big2ulong): Use bdigit_roomof.
+
+Wed Jun 19 23:32:23 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (RVALUE_PROMOTED): check consistency between oldgen flag and
+ oldgen bitmap if RGENGC_CHECK_MODE > 0.
+
+Wed Jun 19 23:29:29 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_gc_force_recycle): clear oldgen bitmap, too.
+
+Wed Jun 19 21:02:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_uint2big): Consider environments BDIGIT is bigger than
+ long.
+ (big2ulong): Ditto.
+ (rb_big_aref): Ditto.
+ (rb_big_pack): Just call rb_integer_pack.
+ (rb_big_unpack): Just call rb_integer_unpack.
+
+Wed Jun 19 20:51:21 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * gc.c (gc_stress_get): GC.stress can be Fixnum.
+
+Wed Jun 19 19:31:30 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (DIGSPERLONG): Don't define if BDIGIT is bigger than long.
+ (DIGSPERLL): Don't define if BDIGIT is bigger than LONG_LONG
+ (rb_absint_size): Consider environments BDIGIT is bigger than long.
+ Use BIGLO and BIGDN.
+ (rb_absint_singlebit_p): Ditto.
+ (rb_integer_pack): Ditto.
+ (bigsub_int): Consider environments BDIGIT is bigger than long.
+ Use SIZEOF_BDIGITS instead of sizeof(BDIGIT).
+ (bigadd_int): Ditto.
+ (bigand_int): Ditto.
+ (bigor_int): Ditto.
+ (bigxor_int): Ditto.
+
+Wed Jun 19 15:14:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h (struct rb_data_type_struct), gc.c: add
+ rb_data_type_struct::flags. Now, this flags is passed
+ at T_DATA object creation. You can specify FL_WB_PROTECTED
+ on this flag.
+
+ * iseq.c: making non-shady iseq objects.
+
+ * class.c, compile.c, proc.c, vm.c: add WB for iseq objects.
+
+ * vm_core.h, iseq.h: constify fields to detect WB insertion.
+
+Wed Jun 19 15:11:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (gc_mark_children): show more info for broken object.
+
+Wed Jun 19 14:04:41 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * test/ruby/envutil.rb (EnvUtil#rubybin): remove unnecessary
+ unless expression.
+
+Wed Jun 19 07:47:48 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (garbage_collect_body): use FIX2INT for ruby_gc_stress.
+
+Wed Jun 19 07:44:31 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_objspace::gc_stress): int -> VALUE to store Fixnum object.
+
+Wed Jun 19 07:25:35 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (make_deferred): clear flags to T_ZOMBIE.
+
+ * gc.c (slot_sweep_body): fix indent.
+
+Wed Jun 19 07:18:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_aref): Apply BIGLO to ~xds[i] for environment which
+ BDIGIT is 16bit.
+
+Wed Jun 19 07:09:26 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rgengc_remember): fix output level.
+
+ * gc.c (rgengc_rememberset_mark): fix to output clear count.
+ (shady_object_count + clear_count = count of remembered objects)
+
+Wed Jun 19 07:06:21 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rgengc_remember): check T_NONE and T_ZOMBIE
+ if RGENGC_CHECK_MODE > 0.
+
+Wed Jun 19 07:02:19 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (RGENGC_CHECK_MODE): add new check mode `3'.
+ In this mode, show all references if there is
+ a miss-corrected object.
+
+Wed Jun 19 06:31:08 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_stress_set): add special option of GC.stress.
+ `GC.stress=(flag)' accepts integer to control behavior of GC.
+ See code for details. Of course, this feature is only for MRI.
+
+ You can debug RGenGC (WB) using `GC.stress = 1'.
+ Using this option, do minor marking at all possible places.
+
+ GC::STRESS_MINOR_MARK = 1 and GC::STRESS_LAZY_SWEEP = 2
+ seem good to add.
+
+Wed Jun 19 06:29:31 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (kwmerge_i): add WB.
+
+Wed Jun 19 06:26:49 2013 Koichi Sasada <ko1@atdot.net>
+
+ * hash.c: `st_update()' also has same issue of last fix.
+ write barriers at callback function are too early.
+ All write barriers are executed after `st_update()'
+
+Wed Jun 19 04:33:22 2013 Koichi Sasada <ko1@atdot.net>
+
+ * variable.c (rb_const_set): fix WB miss.
+
+ WBs had located before creating reference between a klass
+ and constant value. It causes GC bug.
+
+ # pseudo code:
+ WB(klass, value); # WB and remember klass
+ st_insert(klass->const_table, const_id, value);
+
+ `st_insert()' can cause GC before inserting `value' and
+ forget `klass' from the remember set. After that, relationship
+ between `klass' and `value' are created with constant table.
+ Now, `value' can be young (shady) object and `klass' can be old
+ object, without remembering `klass' object.
+ At the next GC, old `klass' object will be skipped and
+ young (shady) `value' will be miss-collected. -> GC bug
+
+ Lesson: The place of a WB is important.
+
+Tue Jun 18 22:01:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_call_method): ensure methods of type
+ VM_METHOD_TYPE_ATTR_SET are called with 1 argument
+
+ * test/ruby/test_module.rb
+ (TestModule#test_attr_writer_with_no_arguments): add test
+ [ruby-core:55543] [Bug #8540]
+
+Tue Jun 18 22:36:23 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (gc_profile_record_flag): fix typo.
+
+Tue Jun 18 22:08:53 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/objspace/object_tracing.c: Return for ::allocation_generation
+
+Tue Jun 18 22:04:35 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/objspace/object_tracing.c: Document object_tracing methods.
+
+Tue Jun 18 21:58:17 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * gc.c: Rename rb_mObSpace -> rb_mObjSpace
+
+Tue Jun 18 20:55:05 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/objspace/objspace.c: Document ObjectSpace::InternalObjectWrapper.
+
+Tue Jun 18 20:39:04 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/objspace/object_tracing.c: Teach rdoc object_tracing.c [Bug #8537]
+
+Tue Jun 18 20:29:47 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/.document: add object_tracing.c to document file
+
+Tue Jun 18 20:20:27 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/objspace/objspace.c: rdoc on require to overview from r41355
+
+Tue Jun 18 18:39:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Check __int128.
+
+ * include/ruby/defines.h (BDIGIT_DBL): Use uint128_t if it is available.
+ (BDIGIT): Use uint64_t if uint128_t is available.
+ (SIZEOF_BDIGITS): Defined for above case.
+ (BDIGIT_DBL_SIGNED): Ditto.
+ (PRI_BDIGIT_PREFIX): Ditto.
+
+ * include/ruby/ruby.h (PRI_64_PREFIX): Defined.
+
+ * bignum.c (rb_big_pow): Don't use BITSPERDIG for the condition which
+ rb_big_pow returns Float or Bignum.
+
+ [ruby-dev:47413] [Feature #8509]
+
+Tue Jun 18 16:43:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_heredoc_restore): clear lex_strterm always to get
+ rid of marking recycled node. this bug is revealed by r41372 with
+ GC.stress=true.
+
+Tue Jun 18 12:53:25 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (nlz): Cast the result explicitly.
+ (big2dbl): Don't assign BDIGIT values to int variable.
+
+Tue Jun 18 12:25:16 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_xor): Non-effective code removed.
+
+Tue Jun 18 11:26:05 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_stat): add `generated_normal_object_count_types' for
+ RGENGC_PROFILE >= 2.
+
+Tue Jun 18 11:02:18 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_maybe): check to skip T_NONE.
+
+ * gc.c (markable_object_p): do not need to check (flags == 0) here.
+
+Tue Jun 18 10:17:37 2013 Koichi Sasada <ko1@atdot.net>
+
+ * variable.c (rb_autoload): fix WB miss.
+
+Tue Jun 18 04:20:18 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_children): don't need to care about T_ZOMBIE here.
+
+Mon Jun 17 22:16:02 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * test/ruby/test_proc.rb (TestProc#test_block_given_method_to_proc):
+ run test for r41359.
+
+Mon Jun 17 21:42:18 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * include/ruby/ruby.h, vm_eval.c (rb_funcall_with_block):
+ new function to invoke a method with a block passed
+ as an argument.
+
+ * string.c (sym_call): use the above function to avoid
+ a block sharing. [ruby-dev:47438] [Bug #8531]
+
+ * vm_insnhelper.c (vm_yield_with_cfunc): don't set block
+ in the frame.
+
+ * test/ruby/test_symbol.rb (TestSymbol#test_block_given_to_proc):
+ run related tests.
+
+Mon Jun 17 21:33:27 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * include/ruby/intern.h, proc.c (rb_method_call_with_block):
+ new function to invoke a Method object with a block passed
+ as an argument.
+
+ * proc.c (bmcall): use the above function to avoid a block sharing.
+ [ruby-core:54626] [Bug #8341]
+
+ * test/ruby/test_proc.rb (TestProc#test_block_persist_between_calls):
+ run related tests.
+
+Mon Jun 17 20:53:21 2013 Tanaka Akira <akr@fsij.org>
+
+ * loadpath.c (RUBY_REVISION): Defined to suppress revision.h
+ inclusion actually. r41352 removes the dependency.
+
+Mon Jun 17 18:15:57 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * ext/objspace/objspace.c: let rdoc know about objspace methods.
+ Specify 'objspace' should be required. See #8537.
+
+Mon Jun 17 17:44:31 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * gc.c (ObjectSpace): is a module not a class.
+
+ * ext/objspace/objspace.c: try to include overview in rdoc,
+ see #8537.
+
+Mon Jun 17 17:38:24 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * gc.c: fix example of ObjectSpace.define_finalizer in overview
+
+Mon Jun 17 16:59:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/tk/tkutil/tkutil.c: use rb_sprintf(), rb_id2str(), and
+ rb_intern_str() instead of rb_intern() and RSTRING_PTR() with
+ RB_GC_GUARD(), to prevent temporary objects from GC.
+ [ruby-core:39000] [Bug #5199]
+
+Mon Jun 17 14:27:54 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * vm_backtrace.c: Update rdoc for Backtrace#label with @_ko1
+
+Mon Jun 17 13:04:01 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * tool/ifchange (until): Fix the condition, although harmless in
+ this case.
+
+Mon Jun 17 11:50:29 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_mark_maybe): added. check `is_pointer_to_heap()' and
+ type is not T_ZOMBIE.
+
+ * gc.c: use `gc_mark_maybe()'. T_ZOMBIE objects should not be pushed
+ to the mark stack.
+
+Mon Jun 17 07:56:24 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_small_lshift): Renamed from bdigs_small_lshift.
+ (bary_small_rshift): Renamed from bdigs_small_rshift.
+
+Mon Jun 17 07:38:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (absint_numwords_bytes): Removed.
+ (rb_absint_numwords): Don't call absint_numwords_bytes.
+
+Sun Jun 16 23:14:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (BARY_ADD): New macro.
+ (BARY_SUB): Ditto.
+ (BARY_MUL): Ditto.
+ (BARY_DIVMOD): Ditto.
+ (BARY_ZERO_P): Ditto.
+ (absint_numwords_generic): Use these macros.
+
+Sun Jun 16 21:41:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_2comp): Extracted from get2comp.
+ (integer_unpack_num_bdigits): Extracted from
+ rb_integer_unpack_internal.
+ (bary_unpack_internal): Renamed from bary_unpack and support
+ INTEGER_PACK_2COMP.
+ (bary_unpack): New function to validate arguments and invoke
+ bary_unpack_internal.
+ (rb_integer_unpack_internal): Removed.
+ (rb_integer_unpack): Invoke bary_unpack_internal.
+ (rb_integer_unpack_2comp): Removed.
+
+ * internal.h (rb_integer_unpack_2comp): Removed.
+
+ * pack.c: Follow the above change.
+
+Sun Jun 16 18:41:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (INTEGER_PACK_2COMP): Defined.
+ (rb_integer_pack_2comp): Removed.
+
+ * bignum.c (bary_pack): Support INTEGER_PACK_2COMP.
+ (rb_integer_pack): Invoke bary_pack directly.
+ (rb_integer_pack_2comp): Removed.
+ (rb_integer_pack_internal): Ditto.
+ (absint_numwords_generic): Follow the above change.
+
+ * pack.c (pack_pack): Ditto.
+
+ * sprintf.c (rb_str_format): Ditto.
+
+Sun Jun 16 17:48:14 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (absint_numwords_generic): rb_funcall invocations removed.
+
+Sun Jun 16 16:04:38 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * tool/config_files.rb: use URI.read to allow it runs with Ruby 1.8.5.
+
+Sun Jun 16 14:32:25 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_pack) Extracted from rb_integer_pack_internal.
+ (absint_numwords_generic): Use bary_pack.
+
+Sun Jun 16 11:01:57 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * NEWS (XMLRPC::Client#http): Add.
+ [ruby-core:55197] [Feature #8461]
+
+Sun Jun 16 10:38:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_add): New function.
+ (bary_zero_p): Extracted from bigzero_p.
+ (absint_numwords_generic): Use bary_zero_p and bary_add.
+ (bary_mul): Fix an argument for bary_mul_single.
+ (bary_divmod): Use size_t for arguments.
+
+Sun Jun 16 08:55:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem): Use a BDIGIT variable to store the return
+ value of bigdivrem_single.
+
+Sun Jun 16 08:43:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_divmod): New function.
+ (absint_numwords_generic): Use bary_divmod.
+ (bigdivrem_num_extra_words): Extracted from bigdivrem.
+ (bigdivrem_single): Ditto.
+ (bigdivrem_normal): Ditto.
+ (BIGDIVREM_EXTRA_WORDS): Defined.
+
+Sun Jun 16 05:51:51 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c: Fixup around GC by MALLOC.
+ Add allocate size to malloc_increase before GC
+ for updating limit in after_gc_sweep.
+ Reset malloc_increase into garbage_collect()
+ for preventing GC again soon.
+
+Sun Jun 16 05:15:36 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c: Add some columns to more detail profile.
+ new columns: Allocated size, Prepare Time, Removing Objects, Empty Objects
+
+Sun Jun 16 02:04:40 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (gc_prof_timer_stop): Merge function codes of GC_PROFILE_MORE_DETAIL and !GC_PROFILE_MORE_DETAIL.
+ * gc.c (gc_prof_mark_timer_start): Ditto.
+ * gc.c (gc_prof_mark_timer_stop): Ditto.
+ * gc.c (gc_prof_sweep_slot_timer_start): Ditto.
+ * gc.c (gc_prof_sweep_slot_timer_stop): Ditto.
+ * gc.c (gc_prof_set_malloc_info): Ditto.
+ * gc.c (gc_prof_set_heap_info): Ditto.
+
+Sat Jun 15 23:50:24 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_sub): New function.
+ (absint_numwords_generic): Use bary_sub.
+ (bigsub_core): Skip unnecessary copy.
+
+Sat Jun 15 22:05:30 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_mul): New function.
+ (absint_numwords_generic): Use bary_mul.
+ (bary_mul_single): Extracted from bigmul1_single.
+ (bary_mul_normal): Extracted from bigmul1_normal.
+
+Sat Jun 15 20:13:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bary_unpack): Extracted from rb_integer_unpack_internal.
+ (absint_numwords_generic): Use bary_unpack.
+ (roomof): Defined.
+ (bdigit_roomof): Defined.
+ (BARY_ARGS): Defined.
+ (bary_unpack): Declared.
+
+Sat Jun 15 19:35:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (absint_numwords_bytes): Make it static.
+ (absint_numwords_small): Ditto.
+ (absint_numwords_generic): Ditto.
+
+Sat Jun 15 17:14:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigmul1_normal): Shrink the result Bignum length.
+
+Sat Jun 15 10:19:42 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/bigdecimal/bigdecimal.c: Update overview formatting of headers
+
+Sat Jun 15 10:19:06 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/bigdecimal/bigdecimal.gemspec: Update authors
+
+Sat Jun 15 10:02:26 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bdigs_small_rshift): Extracted from big_rshift.
+ (bigdivrem): Use bdigs_small_rshift.
+
+Sat Jun 15 08:37:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (eval_string_with_cref): propagate absolute path from the
+ binding if it is given explicitly. patch by Gat (Dawid Janczak) at
+ [ruby-core:55123]. [Bug #8436]
+
+Sat Jun 15 02:40:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bdigs_small_lshift): Extracted from big_lshift.
+ (bigdivrem): Use bdigs_small_lshift.
+
+Fri Jun 14 20:47:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem): Reduce number of digits before bignew() for div.
+
+Fri Jun 14 20:12:37 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem): Use bignew when ny == 1.
+
+Fri Jun 14 18:52:51 2013 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (rb_iseq_compile_node): fix location of a `trace'
+ instruction (b_return event).
+ [ruby-core:55305] [ruby-trunk - Bug #8489]
+ (need a backport to 2.0.0?)
+
+ * test/ruby/test_settracefunc.rb: add a test.
+
+Fri Jun 14 18:18:07 2013 Koichi Sasada <ko1@atdot.net>
+
+ * class.c, include/ruby/ruby.h: add write barriers for T_CLASS,
+ T_MODULE, T_ICLASS.
+
+ * constant.h: constify rb_const_entry_t::value and file to detect
+ assignment.
+
+ * variable.c, internal.h (rb_st_insert_id_and_value, rb_st_copy):
+ added. update table with write barrier.
+
+ * method.h: constify some variables to detect assignment.
+
+ * object.c (init_copy): add WBs.
+
+ * variable.c: ditto.
+
+ * vm_method.c (rb_add_method): ditto.
+
+Fri Jun 14 14:33:47 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * NEWS: add a note for Module#using.
+
+Fri Jun 14 13:40:27 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * .travis.yml (before_script): update config files.
+
+ * common.mk ($(srcdir)/tool/config.{guess,sub}): use get-config_files.
+
+ * tool/config_files.rb: split get-config_files.
+
+ * common.mk (update-config_files): rule to download config files.
+
+ * tool/config.guess, tool/config.sub: remove and download from the
+ upstream.
+
+ * tool/config_files.rb: download config files from GNU.
+
+Fri Jun 14 12:21:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (RUBY_SAFE_LEVEL_CHECK): suppress warnings
+ "left-hand operand of comma expression has no effect", on gcc 4.4.
+
+Fri Jun 14 09:48:48 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * NEWS: add notes for $SAFE.
+
+ * doc/security.rdoc: remove the description of $SAFE=4.
+
+Fri Jun 14 00:14:29 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem): Zero test condition simplified.
+
+Thu Jun 13 23:43:11 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/bigdecimal/*: improve documentation, nodoc samples with @mrkn
+
+Thu Jun 13 23:02:14 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/xmlrpc/client.rb (XMLRPC::Client#http): Add reader for raw
+ Net::HTTP. [ruby-core:55197] [Feature #8461]
+ Reported by Herwin Weststrate. Thanks!!!
+
+Thu Jun 13 22:44:52 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/xmlrpc/client.rb (XMLRPC::Client#parse_set_cookies): Support
+ multiple names in a response. [ruby-core:41711] [Bug #5774]
+ Reported by Roman Riha. Thanks!!!
+ * test/xmlrpc/test_client.rb (XMLRPC::ClientTest#test_cookie_override):
+ Add a test of the above case.
+
+Thu Jun 13 22:35:50 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/xmlrpc/client.rb (XMLRPC::Client#parse_set_cookies): Use
+ guard style.
+
+Thu Jun 13 22:12:32 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/fileutils.rb (FileUtils#rmdir): fix traversal loop, not trying
+ remove same directory only.
+
+Thu Jun 13 21:30:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (opt-dir), tool/ifchange: get rid of "alternate value"
+ expansion for legacy sh. [ruby-dev:47420] [Bug #8524]
+
+Thu Jun 13 21:24:09 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem): Refactored to use ALLOCV_N for temporary
+ buffers.
+
+Thu Jun 13 18:54:11 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * bignum.c (integer_unpack_num_bdigits_generic): reorder terms (but not
+ changed the intention of the expression) because VC++ reports a
+ warning for it. reported by ko1 via IRC.
+
+Thu Jun 13 18:53:14 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_thread.rb (test_thread_local_security): Don't create
+ an unused thread.
+
+Thu Jun 13 18:34:20 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bigdivrem): Use nlz.
+
+Thu Jun 13 14:51:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (RUBY_SAFE_LEVEL_CHECK): check constant safe
+ level at compile time.
+
+Thu Jun 13 14:39:08 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * test/-ext-/test_printf.rb, test/rss/test_parser.rb,
+ test/ruby/test_array.rb, test/ruby/test_hash.rb,
+ test/ruby/test_m17n.rb, test/ruby/test_marshal.rb,
+ test/ruby/test_object.rb, test/ruby/test_string.rb: don't use
+ untrusted?, untrust, and trust to avoid warnings in case $VERBOSE is
+ true.
+
+Thu Jun 13 10:47:16 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * bootstraptest/test_autoload.rb, bootstraptest/test_method.rb:
+ remove tests for $SAFE=4.
+
+ * lib/pp.rb: use taint instead of untrust to avoid warnings when
+ $VERBOSE is set to true.
+
+Thu Jun 13 06:12:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (integer_unpack_num_bdigits_small): Fix a compile error on
+ clang -Werror,-Wshorten-64-to-32
+ Reported by Eric Hodel. [ruby-core:55467] [Bug #8522]
+
+Thu Jun 13 05:32:13 2013 Eric Hodel <drbrain@segment7.net>
+
+ * ext/socket/extconf.rb: Enable RFC 3542 IPV6 socket options for OS X
+ 10.7+. [ruby-trunk - Bug #8517]
+
+Thu Jun 13 00:17:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_integer_unpack_2comp): New function.
+ (rb_integer_unpack_internal): Extracted from rb_integer_unpack and
+ nlp_bits_ret argument added.
+ (integer_unpack_num_bdigits_small): nlp_bits_ret argument added to
+ return number of leading padding bits.
+ (integer_unpack_num_bdigits_generic): Ditto.
+
+ * internal.h (rb_integer_unpack_2comp): Declared.
+
+ * pack.c (pack_unpack): Use rb_integer_unpack_2comp and
+ rb_integer_unpack.
+
+Wed Jun 12 23:27:03 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * eval.c (mod_using): new method Module#using, which activates
+ refinements of the specified module only in the current class or
+ module definition. [ruby-core:55273] [Feature #8481]
+
+ * test/ruby/test_refinement.rb: related test.
+
+Wed Jun 12 22:58:48 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * safe.c (rb_set_safe_level, safe_setter): raise an ArgumentError
+ when $SAFE is set to 4. $SAFE=4 is now obsolete.
+ [ruby-core:55222] [Feature #8468]
+
+ * object.c (rb_obj_untrusted, rb_obj_untrust, rb_obj_trust):
+ Kernel#untrusted?, untrust, and trust are now deprecated.
+ Their behavior is same as tainted?, taint, and untaint,
+ respectively.
+
+ * include/ruby/ruby.h (OBJ_UNTRUSTED, OBJ_UNTRUST): OBJ_UNTRUSTED()
+ and OBJ_UNTRUST() are aliases of OBJ_TAINTED() and OBJ_TAINT(),
+ respectively.
+
+ * array.c, class.c, debug.c, dir.c, encoding.c, error.c, eval.c,
+ ext/curses/curses.c, ext/dbm/dbm.c, ext/dl/cfunc.c,
+ ext/dl/cptr.c, ext/dl/dl.c, ext/etc/etc.c, ext/fiddle/fiddle.c,
+ ext/fiddle/pointer.c, ext/gdbm/gdbm.c, ext/readline/readline.c,
+ ext/sdbm/init.c, ext/socket/ancdata.c, ext/socket/basicsocket.c,
+ ext/socket/socket.c, ext/socket/udpsocket.c,
+ ext/stringio/stringio.c, ext/syslog/syslog.c, ext/tk/tcltklib.c,
+ ext/win32ole/win32ole.c, file.c, gc.c, hash.c, io.c, iseq.c,
+ load.c, marshal.c, object.c, proc.c, process.c, random.c, re.c,
+ safe.c, string.c, thread.c, transcode.c, variable.c,
+ vm_insnhelper.c, vm_method.c, vm_trace.c: remove code for
+ $SAFE=4.
+
+ * test/dl/test_dl2.rb, test/erb/test_erb.rb,
+ test/readline/test_readline.rb,
+ test/readline/test_readline_history.rb, test/ruby/test_alias.rb,
+ test/ruby/test_array.rb, test/ruby/test_dir.rb,
+ test/ruby/test_encoding.rb, test/ruby/test_env.rb,
+ test/ruby/test_eval.rb, test/ruby/test_exception.rb,
+ test/ruby/test_file_exhaustive.rb, test/ruby/test_hash.rb,
+ test/ruby/test_io.rb, test/ruby/test_method.rb,
+ test/ruby/test_module.rb, test/ruby/test_object.rb,
+ test/ruby/test_pack.rb, test/ruby/test_rand.rb,
+ test/ruby/test_regexp.rb, test/ruby/test_settracefunc.rb,
+ test/ruby/test_struct.rb, test/ruby/test_thread.rb,
+ test/ruby/test_time.rb: remove tests for $SAFE=4.
+
+Wed Jun 12 22:18:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (integer_unpack_num_bdigits_generic): Rewritten without
+ rb_funcall.
+ (integer_unpack_num_bdigits_bytes): Removed.
+ (rb_integer_unpack): integer_unpack_num_bdigits_bytes invocation
+ removed.
+
+Wed Jun 12 20:18:03 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/xmlrpc/client.rb (XMLRPC::Client#parse_set_cookies): Extract.
+
+Wed Jun 12 18:19:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (validate_integer_pack_format): supported_flags argument
+ added and validate given flags.
+ (rb_integer_pack_internal): Specify supported_flags.
+ (rb_integer_unpack): Ditto.
+
+Wed Jun 12 16:41:38 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_sort_bang): remove duplicated assertions.
+ ARY_HEAP_PTR() implies ary not to be embedded. [ruby-dev:47419]
+ [Bug #8518]
+
+Wed Jun 12 12:44:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (io_getc): fix 7bit coderange condition, check if ascii read
+ data instead of read length. [ruby-core:55444] [Bug #8516]
+
+Wed Jun 12 12:35:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * pack.c (pack_pack): Use rb_integer_pack_2comp.
+
+Wed Jun 12 12:07:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * sprintf.c (rb_str_format): Fix a dynamic format string.
+
+Wed Jun 12 12:04:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_uniq_bang): must not be modified once frozen even in
+ a callback method.
+
+Wed Jun 12 12:03:43 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_sort_bang): must not be modified once frozen even in
+ a callback method.
+
+Wed Jun 12 12:00:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (FL_SET_EMBED): shared object is frozen even when get
+ unshared.
+
+ * array.c (rb_ary_modify): ARY_SET_CAPA needs unshared array.
+
+Wed Jun 12 07:32:01 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (rand_int): Use rb_big_uminus.
+
+Wed Jun 12 07:12:54 2013 Eric Hodel <drbrain@segment7.net>
+
+ * struct.c: Improve documentation: replace "instance variable" with
+ "member", recommend the use of a block to customize structs, note
+ that member accessors are created, general cleanup.
+
+Wed Jun 12 06:35:01 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (INTEGER_PACK_NEGATIVE): Defined.
+ (rb_integer_unpack): sign argument removed.
+
+ * bignum.c (rb_integer_unpack): sign argument removed.
+ Non-negative integers generated by default.
+ INTEGER_PACK_NEGATIVE flag is used to generate non-positive integers.
+
+ * pack.c (pack_unpack): Follow the above change.
+
+ * random.c (int_pair_to_real_inclusive): Ditto.
+ (make_seed_value): Ditto.
+ (mt_state): Ditto.
+ (limited_big_rand): Ditto.
+
+ * marshal.c (r_object0): Ditto.
+
+Wed Jun 12 00:07:46 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/xmlrpc/test_client.rb (XMLRPC::ClientTest#test_cookie_simple):
+ Add a test for the extracted method.
+
+Tue Jun 11 23:56:24 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/xmlrpc/test_client.rb (XMLRPC::ClientTest::Fake::HTTP#started):
+ Add a missing empty line.
+
+Tue Jun 11 23:37:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (validate_integer_pack_format): Don't require a word order
+ flag if numwords is 1 or less.
+ (absint_numwords_generic): Don't specify a word order for
+ rb_integer_pack.
+
+ * hash.c (rb_hash): Ditto.
+
+ * time.c (v2w_bignum): Ditto.
+
+Tue Jun 11 23:01:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (validate_integer_pack_format): Refine error messages.
+
+Tue Jun 11 22:25:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (validate_integer_pack_format): numwords argument added.
+ Move a varidation from rb_integer_pack_internal and rb_integer_unpack.
+ (rb_integer_pack_internal): Follow above change.
+ (rb_integer_unpack): Ditto.
+
+Tue Jun 11 20:52:43 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_integer_pack_internal): Renamed from rb_integer_pack
+ and overflow_2comp argument added.
+ (rb_integer_pack): Just call rb_integer_pack_internal.
+ (rb_integer_pack_2comp): New function.
+
+ * internal.h (rb_integer_pack_2comp): Declared.
+
+ * sprintf.c (rb_str_format): Use rb_integer_pack and
+ rb_integer_pack_2comp to format binary/octal/hexadecimal integers.
+ (ruby_digitmap): Declared.
+ (remove_sign_bits): Removed.
+ (BITSPERDIG): Ditto.
+ (EXTENDSIGN): Ditto.
+
+Tue Jun 11 16:15:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (ary_shrink_capa): shrink the capacity so it fits just with
+ the length.
+
+ * array.c (ary_make_shared): release never used elements from frozen
+ array to be shared. [ruby-dev:47416] [Bug #8510]
+
+Tue Jun 11 12:49:01 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * doc/re.rdoc: Rename to doc/regexp.rdoc
+ * re.c: Update rdoc include for rename of file
+
+Tue Jun 11 07:13:13 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * eval_error.c (error_print): keep that errat is non-shady object.
+ and guard errat from GC.
+
+Tue Jun 11 05:04:25 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * ext/racc/cparse/cparse.c: use rb_ary_entry() and
+ rb_ary_subseq() instead of RARRAY_PTR.
+ Based on a patch by Dirkjan Bussink. See Bug #8399.
+
+Mon Jun 10 23:51:51 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * array.c (rb_ary_new_from_values): fix a typo. pointed out by
+ nagachika.
+ http://d.hatena.ne.jp/nagachika/20130610/ruby_trunk_changes_41199_41220
+
+Mon Jun 10 21:51:03 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * ext/socket/raddrinfo.c (nogvl_getaddrinfo): Fix indent.
+
+Mon Jun 10 21:49:43 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * ext/socket/raddrinfo.c (nogvl_getaddrinfo): Add missing return
+ value assignment.
+
+Mon Jun 10 20:58:11 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/socket/raddrinfo.c (nogvl_getaddrinfo): work around for Ubuntu
+ 13.04's getaddrinfo issue with mdns4. [ruby-list:49420]
+
+Mon Jun 10 19:34:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_integer_pack): Returns sign instead of words.
+ (absint_numwords_generic): Follow the above change.
+ (big2str_base_powerof2): Follow the above change.
+
+ * internal.h: Ditto.
+
+ * hash.c (rb_hash): Ditto.
+
+ * pack.c (pack_pack): Ditto.
+
+ * random.c (int_pair_to_real_inclusive): Ditto.
+ (rand_init): Ditto.
+ (random_load): Ditto.
+ (limited_big_rand): Ditto.
+
+ * time.c (v2w_bignum): Ditto.
+
+Mon Jun 10 17:20:01 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rgengc_remember): permit promoted object.
+ (rb_gc_writebarrier -> remember)
+
+Mon Jun 10 17:14:01 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (RVALUE_PROMOTE): fix parameter name (`x' to `obj')
+ and make it inline function (like RVALUE_PROMOTE).
+
+Mon Jun 10 16:22:50 2013 Koichi Sasada <ko1@atdot.net>
+
+ * array.c (rb_ary_new_from_values): add assertion
+ (ary should be young object).
+
+Mon Jun 10 16:05:59 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (wmap_mark): check allocation of `w->obj2wmap'.
+ (no-allocation `w->obj2wmap' will be NULL pointer reference)
+
+Mon Jun 10 15:36:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval_error.c (error_print): use checking functions instead of
+ catching exceptions.
+
+ * eval_error.c (error_print): restore errinfo for the case new
+ exception raised while printing the message. [ruby-core:55365]
+ [Bug #8501]
+
+ * eval_error.c (error_print): reduce calling setjmp.
+
+Mon Jun 10 12:10:06 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (integer_unpack_num_bdigits_small: Extracted from
+ rb_integer_unpack.
+ (integer_unpack_num_bdigits_generic): Ditto.
+ (integer_unpack_num_bdigits_bytes): New function.
+ (rb_integer_unpack): Use above functions.
+ Return a Bignum for INTEGER_PACK_FORCE_BIGNUM even when the result
+ is zero.
+
+Mon Jun 10 05:38:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (absint_numwords_small): New function.
+ (absint_numwords_generic): Use absint_numwords_small if possible.
+
+Mon Jun 10 01:07:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (absint_numwords_bytes): New function.
+ (absint_numwords_generic): Extracted from rb_absint_numwords.
+ (rb_absint_numwords): Use absint_numwords_bytes if possible.
+
+Sun Jun 9 21:33:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_absint_numwords): Return (size_t)-1 when overflow.
+ Refine variable names.
+ (rb_absint_size): Refine variable names.
+
+ * internal.h (rb_absint_size): Refine an argument name.
+ (rb_absint_numwords): Ditto.
+
+Sun Jun 9 16:51:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_absint_numwords): Renamed from rb_absint_size_in_word.
+
+ * internal.h (rb_absint_numwords): Follow the above change.
+
+ * pack.c (pack_pack): Ditto.
+
+ * random.c (rand_init): Ditto.
+ (limited_big_rand): Ditto.
+
+Sun Jun 9 14:41:05 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_integer_pack): numwords_allocated argument removed.
+
+ * internal.h (rb_integer_pack): Follow the above change.
+
+ * hash.c (rb_hash): Ditto.
+
+ * time.c (v2w_bignum): Ditto.
+
+ * pack.c (pack_pack): Ditto.
+
+ * random.c (int_pair_to_real_inclusive): Ditto.
+ (rand_init): Ditto.
+ (random_load): Ditto.
+ (limited_big_rand): Ditto.
+
+Sun Jun 9 09:34:44 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big2str_base_powerof2): New function.
+ (rb_big2str0): Use big2str_base_powerof2 if base is 2, 4, 8, 16 or 32.
+
+Sun Jun 9 00:59:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * hash.c (rb_hash): Use rb_integer_pack to obtain least significant
+ long integer.
+
+Sat Jun 8 23:56:00 2013 Tanaka Akira <akr@fsij.org>
+
+ * numeric.c (rb_num_to_uint): Use rb_absint_size instead of
+ RBIGNUM_LEN.
+
+Sat Jun 8 22:53:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * marshal.c (r_object0): Use rb_integer_unpack.
+
+Sat Jun 8 22:18:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * time.c (v2w): Use rb_absint_size instead of RBIGNUM_LEN.
+
+Sat Jun 8 21:47:33 2013 Tanaka Akira <akr@fsij.org>
+
+ * time.c (v2w_bignum): Simplified using rb_integer_pack.
+ (rb_big_abs_find_maxbit): Removed.
+
+Sat Jun 8 21:03:40 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_absint_singlebit_p): New function.
+
+ * internal.h (rb_absint_singlebit_p): Declared.
+
+ * time.c (v2w_bignum): Use rb_absint_singlebit_p instead of
+ rb_big_abs_find_minbit.
+ (rb_big_abs_find_minbit): Removed.
+
+Sat Jun 8 20:24:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * time.c (rb_big_abs_find_maxbit): Use rb_absint_size.
+ (bdigit_find_maxbit): Removed.
+
+Sat Jun 8 19:47:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * class.c (include_modules_at): invalidate method cache if included
+ module contains constants
+
+ * test/ruby/test_module.rb: add test
+
+Sat Jun 8 19:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * random.c (limited_big_rand): declare rnd, lim and mask as uint32_t
+ to avoid 64 bit to 32 bit shorten warnings.
+
+Sat Jun 8 19:23:53 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * win32/Makefile.sub: r41163 changed win32/win32.c and configure.in
+ but it didn't treat about mswin32/mswin64, so fix it.
+ NOTE: this needs a review by usa whether additional condition is
+ required or not.
+
+Sat Jun 8 19:06:26 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c: Unused RBignum internal accessing macros removed.
+
+Sat Jun 8 19:04:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (limited_big_rand): The argument, limit, is changed to
+ VALUE. Use rb_integer_pack and rb_integer_unpack.
+
+Sat Jun 8 17:15:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (make_seed_value): Fix the length given for
+ rb_integer_unpack.
+
+Sat Jun 8 16:38:02 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_integer_unpack): Don't use rb_funcall if possible.
+
+ * random.c: Use uint32_t for elements of seed.
+ (make_seed_value): Use rb_integer_unpack.
+
+Sat Jun 8 15:58:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (rand_init): Add a cast to fix clang compile error:
+ random.c:410:32: error: implicit conversion loses integer precision:
+ 'size_t' (aka 'unsigned long') to 'int' [-Werror,-Wshorten-64-to-32]
+ This cast doesn't cause a problem because len is not bigger than
+ MT_MAX_STATE.
+
+Sat Jun 8 15:30:03 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (rand_init): Use rb_integer_pack.
+ (roomof): Removed.
+
+Sat Jun 8 14:58:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (INTEGER_PACK_FORCE_BIGNUM): New flag constant.
+
+ * bignum.c (rb_integer_unpack): Support INTEGER_PACK_FORCE_BIGNUM.
+
+ * random.c (int_pair_to_real_inclusive): Use
+ INTEGER_PACK_FORCE_BIGNUM to use rb_big_mul instead of rb_funcall.
+
+Sat Jun 8 14:17:01 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: check for NET_LUID. header macro varies across
+ compiler versions.
+
+ * win32/win32.c: use configured macro.
+
+Sat Jun 8 11:59:55 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (int_pair_to_real_inclusive): Use rb_funcall instead of
+ rb_big_mul because rb_integer_unpack can return a Fixnum.
+
+Sat Jun 8 11:17:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (int_pair_to_real_inclusive): Use rb_integer_pack.
+
+Sat Jun 8 09:49:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (int_pair_to_real_inclusive): Use rb_integer_unpack.
+
+Sat Jun 8 08:12:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (random_load): Use rb_integer_pack.
+
+Sat Jun 8 06:15:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (numberof): Removed.
+
+Sat Jun 8 06:00:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c: include internal.h.
+ (mt_state): Use rb_integer_unpack.
+
+Sat Jun 8 00:55:51 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (integer_pack_loop_setup): word_num_nailbytes_ret argument
+ removed.
+ (rb_integer_pack): Follow the above change.
+ (rb_integer_unpack): Follow the above change.
+
+Sat Jun 8 00:37:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (validate_integer_pack_format): Renamed from
+ validate_integer_format.
+ (integer_pack_loop_setup): Renamed from integer_format_loop_setup.
+ (integer_pack_fill_dd): Renamed from int_export_fill_dd.
+ (integer_pack_take_lowbits): Renamed from int_export_take_lowbits.
+ (integer_unpack_push_bits): Renamed from int_import_push_bits.
+
+Fri Jun 7 23:58:06 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_integer_pack): Arguments changed. Use flags to
+ specify word order and byte order.
+ (rb_integer_unpack): Ditto.
+ (validate_integer_format): Follow the above change.
+ (integer_format_loop_setup): Ditto.
+
+ * pack.c: Ditto.
+
+ * internal.h: Ditto.
+ (INTEGER_PACK_MSWORD_FIRST): Defined.
+ (INTEGER_PACK_LSWORD_FIRST): Ditto.
+ (INTEGER_PACK_MSBYTE_FIRST): Ditto.
+ (INTEGER_PACK_LSBYTE_FIRST): Ditto.
+ (INTEGER_PACK_NATIVE_BYTE_ORDER): Ditto.
+ (INTEGER_PACK_LITTLE_ENDIAN): Ditto.
+ (INTEGER_PACK_BIG_ENDIAN): Ditto.
+
+Fri Jun 7 22:10:50 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/rubygems/specification.rb (Gem::Specification#to_yaml):
+ use Gem::NoAliasYAMLTree.create instead of Gem::NoAliasYAMLTree.new
+ to suppress deprecated warnings.
+
+Fri Jun 7 21:39:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_integer_pack): Renamed from rb_int_export.
+ (rb_integer_unpack): Renamed from rb_int_import.
+
+ * internal.h, pack.c: Follow the above change.
+
+Fri Jun 7 21:05:26 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (integer_format_loop_setup): Extracted from rb_int_export
+ and rb_int_import.
+
+Fri Jun 7 19:48:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (validate_integer_format): Extracted from rb_int_export and
+ rb_int_import.
+
+Fri Jun 7 19:23:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_absint_size): Use numberof.
+ (rb_int_export): Ditto.
+
+Fri Jun 7 18:58:56 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (numberof): Gathered from various files.
+
+ * array.c, math.c, thread_pthread.c, iseq.c, enum.c, string.c, io.c,
+ load.c, compile.c, struct.c, eval.c, gc.c, parse.y, process.c,
+ error.c, ruby.c: Remove the definitions of numberof.
+
+Fri Jun 7 18:24:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_absint_size): Declare a variable, i, just before used
+ to suppress a warning.
+ (rb_int_export): Ditto.
+
+Fri Jun 7 17:41:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * bignum.c (rb_absint_size): explicit cast to BDIGIT to avoid implicit
+ 64 bit to 32 bit shortening warning
+ * bignum.c (rb_int_export): ditto
+ * bignum.c (int_import_push_bits): ditto
+
+Fri Jun 7 17:31:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * internal.h (RCLASS_SUPER): use descriptive variable name
+ * internal.h (RCLASS_SET_SUPER): ditto
+
+Fri Jun 7 13:25:27 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/json/fbuffer/fbuffer.h (fbuffer_append_str): change the place of
+ RB_GC_GUARD. it should be after the object is used.
+
+Fri Jun 7 13:22:43 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * gc.c (before_gc_sweep): noinline can also avoid the segv instead of
+ -O0 of r41084. this way is expected less slow.
+
+Fri Jun 7 11:45:42 2013 Kenta Murata <mrkn@cookpad.com>
+
+ * rational.c (numeric_quo): move num_quo in numeric.c to numeric_quo
+ in rational.c to refer canonicalization state for mathn support.
+ [ruby-core:41575] [Bug #5736]
+
+ * numeric.c (num_quo): ditto.
+
+ * test/test_mathn.rb: add a test for the change at r41109.
+
+Fri Jun 7 11:41:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: revert r41106. size_t may not be unsigned
+
+ * bignum.c (rb_absint_size_in_word, rb_int_export, rb_int_import): use
+ NUM2SIZET() and SIZET2NUM() already defined in ruby/ruby.h.
+
+Fri Jun 7 11:28:37 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c: use oldgen bitmap as initial mark bitmap when major gc.
+ so can skip oldgen bitmap check around mark & sweep.
+ * gc.c (slot_sweep_body): change scan algorithm for performance:
+ from object's pointer base to bitmap one.
+
+Fri Jun 7 11:25:56 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c: introduce oldgen bitmap for preparing performance tuning.
+
+Fri Jun 7 11:20:57 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (MARKED_IN_BITMAP, MARK_IN_BITMAP, CLEAR_IN_BITMAP): bring
+ bitmap macros in one place, and introduce BITMAP_BIT.
+
+Fri Jun 7 11:18:35 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * array.c (ary_new): change order of allocation in order
+ to remove FL_OLDGEN operation.
+
+Fri Jun 7 11:16:28 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * tool/rdocbench.rb: add gc total time information.
+
+Fri Jun 7 10:12:01 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: remove "Sunny" terminology.
+ "Sunny" doesn't mean antonym of "Shady" (questionable, doubtful, etc).
+ Instead of "Sunny", use "non-shady" or "normal".
+
+Fri Jun 7 09:29:33 2013 Kenta Murata <mrkn@cookpad.com>
+
+ * bignum.c (rb_int_import): explicitly casting BDIGIT_DBL to BDIGIT
+ to prevent warning.
+
+Fri Jun 7 07:29:33 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (rb_int_export): countp argument is split into
+ wordcount_allocated and wordcount.
+
+ * bignum.c (rb_int_export): Follow the above change.
+
+ * pack.c (pack_pack): Ditto.
+
+Fri Jun 7 07:17:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * NEWS: describe a compatibility issue of Numeric#quo
+ introduced at r41109.
+
+Fri Jun 7 07:15:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * NEWS: fix style.
+
+Fri Jun 7 06:48:17 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * numeric.c: remove unused ID id_to_r introduced in r41109.
+
+Fri Jun 7 06:15:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_int_import): New function.
+ (int_import_push_bits): Ditto.
+
+ * internal.h (rb_int_import): Declared.
+
+ * pack.c (pack_unpack): Use rb_int_import for BER compressed integer.
+
+Thu Jun 6 22:24:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * numeric.c (num_quo): Use to_r method to convert the receiver to
+ rational. [ruby-core:41575] [Bug #5736]
+
+ * test/ruby/test_numeric.rb: add a test for the above change.
+
+Thu Jun 6 20:40:17 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Invoke RUBY_REPLACE_TYPE for size_t.
+ Don't invoke RUBY_CHECK_PRINTF_PREFIX for size_t to avoid conflict
+ with RUBY_REPLACE_TYPE.
+
+ * internal.h (rb_absint_size): Declared.
+ (rb_absint_size_in_word): Ditto.
+ (rb_int_export): Ditto.
+
+ * bignum.c (rb_absint_size): New function.
+ (rb_absint_size_in_word): Ditto.
+ (int_export_fill_dd): Ditto.
+ (int_export_take_lowbits): Ditto.
+ (rb_int_export): Ditto.
+
+ * pack.c (pack_pack): Use rb_int_export for BER compressed integer.
+
+Thu Jun 6 19:31:33 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * ext/date/date_core.c: fixed coding error [ruby-core:55337].
+ reported by Riley Lynch.
+
+Thu Jun 6 14:16:37 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * ext/objspace/object_tracing.c: rename allocation_info to
+ lookup_allocation_info. At times I confused "struct
+ allocation_info" with "function allocation_info".
+
+Thu Jun 6 13:57:06 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * ext/objspace/object_tracing.c: allocation_info function isn't
+ called by any other file.
+
+Thu Jun 6 09:41:00 2013 Kenta Murata <mrkn@cookpad.com>
+
+ * numeric.c (num_quo): should return a Float for a Float argument.
+ [ruby-dev:44710] [Bug #5515]
+
+ * test/ruby/test_fixnum.rb: Add an assertion for the above change.
+
+ * test/ruby/test_bignum.rb: ditto.
+
+Thu Jun 6 00:59:44 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (gc_mark): get rid of pushing useless objects.
+ * gc.c (rgengc_rememberset_mark): bypass gc_mark() in order to push
+ sunny old object at minor gc.
+ * gc.c (gc_mark_children): move sunny old check to gc_mark().
+ * gc.c (rgengc_check_shady): remove DEMOTE that already unnecessary.
+ * gc.c (rb_gc_writebarrier): ditto.
+
+ change sunny old check point in order to save mark stack and
+ remove unnatural rest_sweep & demote.
+
+Thu Jun 6 00:52:42 2013 Masaya Tarui <tarui@ruby-lang.org>
+
+ * gc.c (rgengc_rememberset_mark): change scan algorithm for performance:
+ from object's pointer base to bitmap one.
+
+Thu Jun 6 00:30:04 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * win32/win32.c (NET_LUID): define it on MinGW32.
+ mingw-w64 has NET_LUID but mingw32 (mingw.org) still doesn't have
+ NET_LUID. reported by taco on IRC
+
+Thu Jun 6 00:05:08 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * string.c (String#b): Allow code range scan to happen later so
+ ascii_only? on a result string returns the correct value.
+ [ruby-core:55315] [Bug #8496]
+
+Wed Jun 5 22:40:42 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/imap.rb (capability_response): should ignore trailing
+ spaces. Thanks, Peter Kovacs. [ruby-core:55024] [Bug #8415]
+
+ * test/net/imap/test_imap_response_parser.rb: related test.
+
+Wed Jun 5 21:17:08 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (big_fdiv): Use nlz() instead of bdigbitsize().
+ (bdigbitsize): Removed.
+
+Wed Jun 5 20:32:00 2013 Kenta Murata <mrkn@cookpad.com>
+
+ * include/ruby/ruby.h: fix alignment in comment.
+
+Wed Jun 5 20:05:29 2013 Tanaka Akira <akr@fsij.org>
+
+ * random.c (int_pair_to_real_inclusive): Add a cast to BDIGIT.
+ (random_load): Fix shift width for fixnums.
+ Re-implement bignum extraction without ifdefs.
+
+Wed Jun 5 15:26:10 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * gc.c (before_gc_sweep): don't optimize it to avoid segv on Ubuntu
+ 10.04 gcc 4.4.
+ http://u32.rubyci.org/~chkbuild/ruby-trunk/log/20130527T190301Z.diff.html.gz
+
+Wed Jun 5 09:46:46 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * test/fileutils/test_fileutils.rb (TestFileUtils#test_mkdir): add
+ EACCES for Windows.
+
+Wed Jun 5 08:13:37 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_big_pow): Don't need to multiply SIZEOF_BDIGITS.
+ Use nlz instead of bitlength_bdigit.
+ (bitlength_bdigit): Removed.
+
+Wed Jun 5 07:14:18 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * ext/date/date_core.c (d_lite_cmp, d_lite_equal): simplified.
+
+Wed Jun 5 07:07:01 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * ext/date/date_core.c: fixed a bug [ruby-core:55295]. reported
+ by Riley Lynch.
+
+Wed Jun 5 06:44:08 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems: Update to RubyGems 2.0.3
+
+ * test/rubygems: Tests for the above.
+
+ * NEWS: Added RubyGems 2.0.3 note.
+
+Wed Jun 5 06:35:15 2013 Eric Hodel <drbrain@segment7.net>
+
+ * doc/marshal.rdoc: Add description of Marshal format.
+
+Wed Jun 5 01:16:09 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * array.c (Array#+): fix documentation example.
+ Patch by Logan Serman. [Fixes GH-324]
+
+Wed Jun 5 00:21:54 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * lib/irb/lc/ja/help-message: update help messages.
+ following r41028. [ruby-dev:46707] [Feature #7510]
+
+Wed Jun 5 00:09:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * marshal.c (r_object0): Generalize a round up expression.
+ Use BDIGIT instead of int.
+
+Tue Jun 4 23:44:02 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * object.c (rb_Hash): fix docs. patched by Stefan Sch"ussler.
+ [ruby-core:55299] [Bug #8487]
+
+Tue Jun 4 23:16:49 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * lib/irb/completion.rb: Use %w literal construction for long lists.
+ Patch by Dave Goodchild. [Fixes GH-299]
+
+Tue Jun 4 23:08:42 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * ext/objspace/objspace.c: improve wording and remove duplicated comment.
+ Based on a patch by Dave Goodchild. [Fixes GH-299]
+
+Tue Jun 4 18:41:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bitlength_bdigit): Fix an off-by-one error.
+
+Tue Jun 4 15:30:00 2013 Kenta Murata <mrkn@cookpad.com>
+
+ * ext/bigdecimal/lib/bigdecimal/util.rb (Float#to_d): fix the number
+ of figures. Patch by Vipul A M <vipulnsward@gmail.com>.
+ https://github.com/ruby/ruby/pull/323 fix GH-323
+
+ * test/bigdecimal/test_bigdecimal_util.rb: fix for the above change.
+
+Tue Jun 4 00:44:27 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * test/fileutils/test_fileutils.rb (TestFileUtils#test_mkdir): add
+ EEXIST for Linux. (suggested by nurse)
+
+Mon Jun 3 23:58:19 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * lib/fileutils.rb (FileUtils.rmdir): use remove_tailing_slash.
+ * test/fileutils/test_fileutils.rb: test for above.
+
+Mon Jun 3 23:47:55 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (bitlength_bdigit): New function.
+ (rb_big_pow): Use bitlength_bdigit instead of ffs.
+
+Mon Jun 3 23:11:19 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * lib/fileutils.rb: fix behavior when mkdir/mkdir_p accepted "/".
+ * test/fileutils/test_fileutils.rb: add test for above change.
+ Patched by Mitsunori Komatsu. [GH-319]
+
+Mon Jun 3 19:02:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (is_hfs): use the file descriptor instead of a path.
+
+Mon Jun 3 07:15:17 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: removes AC_CHECK_FUNCS(readdir_r). readdir_r()
+ is only used from dir.c and it doesn't need readdir_r().
+ * configure.in (SIZEOF_STRUCT_DIRENT_TOO_SMALL): removed. It is
+ only used for readdir_r.
+ * dir.c: removes NAME_MAX_FOR_STRUCT_DIRENT. It is not right way
+ to detect maximum length of path len. POSIX require to use
+ fpathconf(). IOW, it might have lead to make a vulnerability
+ using stack smashing. Moreover, readdir() works enough for our
+ usage.
+ * dir.c (READDIR): removes an implementation which uses
+ readdir_r() and parenthesize in a macro body correctly.
+ * dir.c (dir_read): removes IF_HAVE_READDIR_R(DEFINE_STRUCT_DIRENT
+ entry), it is used only for readdir_r().
+ * dir.c (dir_each): ditto.
+ * dir.c (glob_helper): ditto.
+
+ * dir.c (READDIR): removes entry and dp argument.
+ * dir.c (dir_read): adjust for the above change.
+ * dir.c (dir_each): ditto.
+ * dir.c (glob_helper): ditto.
+
+Mon Jun 3 03:40:29 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_yield_setup_block_args): partially revert r41019.
+ The code is not useless.
+
+Mon Jun 3 01:25:25 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * test/socket/test_sockopt.rb: change test name. follow r41037.
+
+Mon Jun 3 01:08:43 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * test/rinda/test_rinda.rb: rename functions introduced in r41009.
+
+Sun Jun 2 23:33:42 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * enc/trans/japanese_euc.trans, test/ruby/test_transcode.rb,
+ tool/transcode-tblgen.rb: change EUC-JP-2004 to EUC-JIS-2004.
+ This is follow up to changes in r41024.
+
+Sun Jun 2 22:44:42 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/socket/option.c: rename functions introduced in r41009
+ s/ip/ipv4/g because they are ipv4 functions.
+ (there's a policy that the name "ip" is for methods which supports
+ both ipv4 and ipv6)
+
+Sun Jun 2 16:15:29 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dln_find.c (dln_find_exe, dln_find_file): remove deprecated
+ non-reentrant functions.
+
+Sun Jun 2 15:04:35 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/cgi/util.rb, lib/erb.rb: Use String#b [Feature #8394] by znz
+
+Sun Jun 2 14:10:21 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/irb/lc/help-message: Apply english updates for irb --help #7510
+
+Sun Jun 2 12:03:58 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * range.c: Fix rdoc on Range#bsearch [Bug #8242] [ruby-core:54143]
+
+Sun Jun 2 02:08:37 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * enc/euc_jp.c: fix typo: the name of EUC-JIS-2004.
+
+Sat Jun 1 23:17:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * vm_eval.c (rb_mod_module_eval): mention in docs that arguments passed
+ to the method are passed to the block
+
+Sat Jun 1 17:58:13 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb (Set#freeze, taint, untaint): Save a "self" by
+ utilizing super returning self, and add tests while at it.
+
+Sat Jun 1 17:24:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_set_arguments): not a simple single argument if any
+ keyword arguments exist. [ruby-core:55203] [Bug #8463]
+
+ * vm_insnhelper.c (vm_yield_setup_block_args): split single parameter
+ if any keyword arguments exist, and then extract keyword arguments.
+ [ruby-core:55203] [Bug #8463]
+
+Sat Jun 1 11:16:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * error.c (rb_exc_new_cstr): rename from rb_exc_new2.
+
+ * error.c (rb_exc_new_str): rename from rb_exc_new3.
+
+Sat Jun 1 10:13:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_new[2-5], rb_{tainted,usascii}_str_new2),
+ (rb_str_buf_new2): remove old interfaces.
+
+Sat Jun 1 08:00:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/zlib/zlib.c (gzfile_read, gzfile_read_all, gzfile_getc),
+ (gzreader_gets): check EOF. [ruby-core:55220] [Bug #8467]
+
+Sat Jun 1 07:32:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Use BDIGIT type for hbase.
+
+Sat Jun 1 02:37:35 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/socket/option.c (sockopt_s_byte): constructor of the sockopt
+ whose value's is byte.
+
+ * ext/socket/option.c (sockopt_byte): getter for above.
+
+ * ext/socket/option.c (inspect_byte): inspect for above.
+
+ * ext/socket/option.c (sockopt_s_ip_multicast_loop): constructor of
+ the sockopt whose optname is IP_MULTICAST_LOOP.
+
+ * ext/socket/option.c (sockopt_ip_multicast_loop): getter for above.
+
+ * ext/socket/option.c (sockopt_s_ip_multicast_ttl): constructor of
+ the sockopt whose optname is IP_MULTICAST_TTL.
+
+ * ext/socket/option.c (sockopt_ip_multicast_ttl): getter for above.
+
+ * ext/socket/option.c (sockopt_inspect): use above.
+
+Sat Jun 01 01:50:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_power): use rb_dbl2big
+ to convert a double value to a Bignum.
+
+Sat Jun 1 00:19:50 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (calc_hbase): Make hbase the maximum power of base
+ representable in BDIGIT.
+
+Fri May 31 23:56:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (calc_hbase): Extracted from rb_big2str0.
+
+Fri May 31 23:22:24 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c: Don't hard code SIZEOF_BDIGITS for log_base(hbase).
+ (big2str_orig): hbase_numdigits argument added.
+ (big2str_karatsuba): Ditto.
+ (rb_big2str0): Calculate hbase_numdigits.
+
+Fri May 31 17:57:21 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * process.c: Improve Process::exec documentation
+
+Fri May 31 17:26:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (rb_funcallv): add better names of rb_funcall2.
+
+ * vm_eval.c (rb_funcallv_public): ditto for rb_funcall3.
+
+Fri May 31 17:04:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * array.c (rb_ary_new_capa): add better names of rb_ary_new2.
+
+ * array.c (rb_ary_new_from_args): ditto for rb_ary_new3.
+
+ * array.c (rb_ary_new_from_values): ditto for rb_ary_new4.
+
+Fri May 31 16:35:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (HAVE_ATTRIBUTE_FUNCTION_ALIAS): define to tell if
+ alias attribute is available.
+
+Fri May 31 16:03:23 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * object.c, proc.c: s/call_seq/call-seq in rdoc. [Fixes GH-322]
+
+Fri May 31 15:56:36 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/openssl/ossl_ssl.c: Add missing paren in rdoc [Fixes GH-321]
+
+Fri May 31 11:58:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c (set_visibility): extract from rb_mod_public(),
+ rb_mod_protected() and rb_mod_private().
+
+Thu May 30 19:47:42 2013 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * vm_insnhelper.c (vm_callee_setup_keyword_arg,
+ vm_callee_setup_arg_complex): consider a hash argument for keyword
+ only when the number of arguments is more than the expected
+ mandatory parameters. [ruby-core:53199] [ruby-trunk - Bug #8040]
+
+ * test/ruby/test_keyword.rb: update a test for above.
+
+Thu May 30 17:55:04 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * process.c: RDoc on Process.spawn
+
+Thu May 30 00:08:14 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_profile_enable): rest_sweep() to finish last GC.
+ Profiling record is allocated at first of marking phase.
+ Enable at lazy sweeping may cause an error (SEGV).
+
+Wed May 29 10:33:27 2013 Koichi Sasada <ko1@atdot.net>
+
+ * hash.c: fix WB bug.
+ (1) Hash's key also needs WB.
+ (2) callback parameter *key and *value of st_update() is not a
+ storage of st_table itself (only local variable). So that
+ OBJ_WRITE() is not suitable, especially for `!existing'.
+ OBJ_WRITTEN() is used instead of OBJ_WRITE().
+
+Tue May 28 12:31:21 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/object_tracing.c: fix a bug reported at
+ "[ruby-core:55182] [ruby-trunk - Bug #8456][Open] Sugfault in Ruby Head"
+ Care about the case TracePoint#path #=> `nil'.
+
+ * ext/objspace/object_tracing.c: add two new methods:
+ * ObjectSpace.allocation_class_path(o)
+ * ObjectSpace.allocation_method_id(o)
+ They are not useful for Object.new because they are always
+ "Class" and :new.
+ To trace more useful information, we need to maintain call-tree
+ using call/return hooks, which is implemented by
+ ll-prof <http://sunagae.net/wiki/doku.php?id=software:llprof>
+
+ * test/objspace/test_objspace.rb: add a test.
+
+Tue May 28 11:30:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/extmk.rb (extmake): leave makefiles untouched if the content is
+ not changed, to get rid of unnecessary re-linking.
+
+Tue May 28 03:11:02 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/gc_hook.c, ext/objspace/objspace.c: add new methods to
+ hook GC invocation.
+ * ObjectSpace.after_gc_start_hook=(proc)
+ * ObjectSpace.after_gc_end_hook=(proc)
+
+ Note that hooks are not kicked immediately. Procs are kicked
+ at postponed_job.
+
+ This feature is a sample of new internal event and
+ rb_postponed_job API.
+
+Tue May 28 02:56:15 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_stat): remove wrong rest_sweep().
+
+Tue May 28 02:44:23 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (garbage_collect_body): fix GC_ENABLE_LAZY_SWEEP condition.
+
+ * gc.c (GC_NOTIFY): move debug print location and use stderr instead
+ of stdout.
+
+Tue May 28 02:07:21 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (rb_postponed_job_register_one): fix iteration bug.
+
+ * ext/-test-/postponed_job/postponed_job.c,
+ test/-ext-/postponed_job/test_postponed_job.rb: add a test.
+
+Tue May 28 00:34:23 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h, gc.c: add new internal event
+ RUBY_INTERNAL_EVENT_GC_END. This event invokes at the end of
+ after_sweep().
+ Time chart with lazy sweep is:
+ (1) Kick RUBY_INTERNAL_EVENT_GC_START
+ (2) [gc_marks()]
+ (3) [lazy_sweep()]
+ (4) [... run Ruby program (mutator) with lazy_sweep() ...]
+ (5) [after_sweep()]
+ (6) Kick RUBY_INTERNAL_EVENT_GC_END
+ (7) [... run Ruby program (mutator), and go to (1) ...]
+ Time chart without lazy sweep (GC.start, etc) is:
+ (1) Kick RUBY_INTERNAL_EVENT_GC_START
+ (2) [gc_marks()]
+ (3) [gc_sweep()]
+ (4) [after_sweep()]
+ (5) Kick RUBY_INTERNAL_EVENT_GC_END
+ (6) [... run Ruby program (mutator), and go to (1) ...]
+
+ * ext/-test-/tracepoint/tracepoint.c,
+ test/-ext-/tracepoint/test_tracepoint.rb: modify a test.
+
+Tue May 28 00:18:57 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (rb_postponed_job_flush): remove a wrong comment.
+
+Mon May 27 22:09:33 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/ruby.h (RHASH_SIZE): Add a cast to suppress a
+ warning, comparison between signed and unsigned integer
+ expressions [-Wsign-compare], on ILP32.
+
+Mon May 27 19:25:47 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: rename RUBY_INTERNAL_EVENT_FREE to
+ RUBY_INTERNAL_EVENT_FREEOBJ.
+
+ * ext/-test-/tracepoint/tracepoint.c,
+ ext/objspace/object_tracing.c,
+ gc.c, vm_trace.c: catch up this change.
+
+Mon May 27 18:57:28 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/objspace/objspace.c: support ObjectSpace.trace_object_allocations.
+ Read the following test to know HOWTO.
+ This feature is a sample of RUBY_INTERNAL_EVENT.
+
+ * test/objspace/test_objspace.rb: add a test.
+
+ * ext/objspace/object_tracing.c: ditto.
+
+ * gc.c (rb_gc_count): add. This function returns GC count.
+
+ * internal.h: add decl. of rb_gc_count(). Same as `GC.count'.
+
+Mon May 27 17:33:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/rbinstall.rb (install_recursive): add maxdepth option.
+
+ * tool/rbinstall.rb (bin-comm): limit depth of bindir and reject empty
+ files. [ruby-core:55101] [Bug #8432]
+
+Mon May 27 16:16:18 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_trace.c (rb_postponed_job_flush, rb_postponed_job_register): use
+ ruby_xmalloc/xfree. It is safe during GC.
+
+Mon May 27 09:24:03 2013 Koichi Sasada <ko1@atdot.net>
+
+ * test/-ext-/postponed_job/test_postponed_job.rb: fix typo and class name.
+
+Mon May 27 09:05:17 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h, gc.c, vm_trace.c: add internal events.
+ * RUBY_INTERNAL_EVENT_NEWOBJ: object created.
+ * RUBY_INTERNAL_EVENT_FREE: object freed.
+ * RUBY_INTERNAL_EVENT_GC_START: GC started.
+ And rename `RUBY_EVENT_SWITCH' to `RUBY_INTERNAL_EVENT_SWITCH'.
+
+ Internal events can not invoke any Ruby program because the tracing
+ timing may be critical (under huge restriction).
+ These events can be hooked only by C-extensions.
+ We recommend to use rb_postponed_job_register() API to call Ruby
+ program safely.
+
+ This change is mostly written by Aman Gupta (tmm1).
+ https://bugs.ruby-lang.org/issues/8107#note-12
+ [Feature #8107]
+
+ * include/ruby/debug.h, vm_trace.c: added two new APIs.
+ * rb_tracearg_event_flag() returns rb_event_flag_t of this event.
+ * rb_tracearg_object() returns created/freed object.
+
+ * ext/-test-/tracepoint/extconf.rb,
+ ext/-test-/tracepoint/tracepoint.c,
+ test/-ext-/tracepoint/test_tracepoint.rb: add a test.
+
+Mon May 27 08:38:21 2013 Koichi Sasada <ko1@atdot.net>
+
+ * ext/-test-/postponed_job/postponed_job.c: fix `init' function name.
+
+Mon May 27 06:22:41 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/debug.h, vm_trace.c: add rb_postponed_job API.
+ Postponed jobs are registered with this API. Registered jobs
+ are invoked at `ruby-running-safe-point' as soon as possible.
+ This timing is completely same as finalizer timing.
+
+ There are two APIs:
+ * rb_postponed_job_register(flags, func, data): register a
+ postponed job with data. flags are reserved.
+ * rb_postponed_job_register_one(flags, func, data): same as
+ `rb_postponed_job_register', but only one `func' job is
+ registered (skip if `func' is already registered).
+
+ This change is mostly written by Aman Gupta (tmm1).
+ https://bugs.ruby-lang.org/issues/8107#note-15
+ [Feature #8107]
+
+ * gc.c: use postponed job API for finalizer.
+
+ * common.mk: add dependency from vm_trace.c to debug.h.
+
+ * ext/-test-/postponed_job/extconf.rb, postponed_job.c,
+ test/-ext-/postponed_job/test_postponed_job.rb: add a test.
+
+ * thread.c: implement postponed API.
+
+ * vm_core.h: ditto.
+
+Mon May 27 02:26:02 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_stat): collect promote_operation_count and
+ types (RGENGC_PROFILE >= 2).
+
+Mon May 27 01:40:58 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_stat): collect shade_operation_count,
+ remembered_sunny_object_count and remembered_shady_object_count
+ for each types when RGENGC_PROFILE >= 2.
+ They are informative for optimization.
+
+Mon May 27 01:15:22 2013 Koichi Sasada <ko1@atdot.net>
+
+ * hash.c (rb_hash_tbl_raw), internal.h: added.
+ Returns st_table without shading hash.
+
+ * array.c: use rb_hash_tbl_raw() for read-only purpose.
+
+ * compile.c (iseq_compile_each): ditto.
+
+ * gc.c (count_objects): ditto.
+
+ * insns.def: ditto.
+
+ * process.c: ditto.
+
+ * thread.c (clear_coverage): ditto.
+
+ * vm_insnhelper.c: ditto.
+
+Mon May 27 00:31:09 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * tool/make-snapshot: use ENV["AUTOCONF"] instead of directly using
+ literal "autoconf".
+
+Sun May 26 21:31:46 2013 Koichi Sasada <ko1@atdot.net>
+
+ * hash.c, include/ruby/ruby.h: support WB protected hash.
+ * constify RHash::ifnone and make new macro RHASH_SET_IFNONE().
+ * insert write barrier for st_update().
+
+ * include/ruby/intern.h: declare rb_hash_set_ifnone(hash, ifnone).
+
+ * marshal.c (r_object0): use RHASH_SET_IFNONE().
+
+ * ext/openssl/ossl_x509name.c (Init_ossl_x509name): ditto.
+
+Sat May 25 23:22:38 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * test/fiddle/test_c_struct_entry.rb,
+ test/fiddle/test_c_union_entity.rb,
+ test/fiddle/test_cparser.rb, test/fiddle/test_func.rb,
+ test/fiddle/test_handle.rb, test/fiddle/test_import.rb,
+ test/fiddle/test_pointer.rb: don't run test if the system
+ don't support fiddle.
+
+Sat May 25 21:29:34 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/pty/pty.c (get_device_once): FreeBSD 10-current and 9-stable
+ added O_CLOEXEC support to posix_openpt, so assume FreeBSD 9.2 or
+ later supports it.
+ http://www.freebsd.org/cgi/query-pr.cgi?pr=162374
+
+Sat May 25 18:46:23 2013 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * proc.c (rb_method_entry_min_max_arity): fix missing break in switch.
+ This was introduced in r38236, which is not intentional apparently.
+ This has caused no actual harm because VM_METHOD_TYPE_OPTIMIZED is
+ not used except for OPTIMIZED_METHOD_TYPE_SEND, but may do in
+ future. Coverity Scan found this inadequacy.
+
+Sat May 25 18:08:06 2013 Yusuke Endoh <mame@tsg.ne.jp>
+
+ * dir.c (bracket): fix copy-paste error. When the first and last
+ characters of fnmatch range have different length, fnmatch may
+ have wrongly matched a path that does not really match.
+ Coverity Scan found this bug.
+
+Sat May 25 17:06:25 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (after_gc_sweep): reduce full GC timing.
+
+Sat May 25 11:28:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * variable.c (set_const_visibility): return without clearing method
+ cache if no arguments.
+
+ * vm_method.c (set_method_visibility): ditto.
+
+Sat May 25 11:27:32 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c (set_method_visibility): quote unprintable method name.
+
+Sat May 25 11:24:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval.c (rb_frame_callee): returns the called name of the current
+ frame, not the previous frame.
+
+ * eval.c (prev_frame_callee, prev_frame_func): rename and make static,
+ as these are used by rb_f_method_name() and rb_f_callee_name() only.
+
+ * variable.c (set_const_visibility): use the called name.
+
+Sat May 25 08:58:23 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_quote_unprintable): check if argument is a string.
+
+Fri May 24 19:32:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * variable.c (set_const_visibility): use rb_frame_this_func() instead
+ of rb_frame_callee() for getting the name of the called method
+
+ * test/ruby/test_module.rb: add test for private_constant with no args
+
+Fri May 24 18:53:10 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: do major/full GC when:
+ * number of oldgen object is bigger than twice of
+ number of oldgen object at last full GC.
+ * number of remembered shady object is bigger than twice of
+ number of remembered shady object at last full GC.
+ * number of oldgen object and remembered shady object is bigger
+ than half of total object space.
+ (please fix my English!)
+
+Fri May 24 17:07:00 2013 Charlie Somerville <charliesome@ruby-lang.org>
+
+ * intern.h: remove dangling rb_class_init_copy declaration
+ [ruby-core:55120] [Bug #8434]
+
+Fri May 24 16:31:23 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/strscan/strscan.c (strscan_aref): raise error if given
+ name reference is not found.
+
+Fri May 24 15:48:18 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (after_gc_sweep, garbage_collect_body): do major GC (full GC)
+ before extending heaps.
+ TODO: do major GC when there are many old (promoted) objects.
+
+ * gc.c (after_gc_sweep): remove TODO comments.
+
+Fri May 24 11:04:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (LIBRUBY_RPATHFLAGS): do not append -L option with
+ runtime library directory if cross compiling, but only -R option.
+ runtime path makes no sense on the host system. [ruby-dev:47363]
+ [Bug #8443]
+
+Fri May 24 02:57:17 2013 Koichi Sasada <ko1@atdot.net>
+
+ * object.c (rb_obj_clone): should not propagate OLDGEN status.
+ This propagation had caused WB miss for class.
+
+Thu May 23 17:35:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (loaded_feature_path): fix invalid read by index underflow.
+ the beginning of name is also a boundary as well as just after '/'.
+
+Thu May 23 17:21:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (gc_profile_dump_on): revert r40898. ok to show the record
+ accumulating while lazy_sweep().
+
+Wed May 22 16:50:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (gc_profile_dump_on): use size_t to get rid of overflow and
+ show the header when next_index > 0, instead of next_index != 1.
+
+Wed May 22 15:18:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (setup_overlapped): check the error code in addition
+ to the result of SetFilePointer() to determine if an error occurred,
+ because INVALID_SET_FILE_POINTER is a valid value.
+ [ruby-core:55098] [Bug #8431]
+
+ * win32/win32.c (setup_overlapped, finish_overlapped): extract from
+ rb_w32_read() and rb_w32_write().
+
+Wed May 22 14:19:56 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_prepare_free_objects, rest_sweep, lazy_sweep): fix position
+ of `during_gc' setting.
+
+Wed May 22 07:36:08 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (garbage_collect): all GC is start from garbage_collect()
+ (or garbage_collect_body()). `garbage_collect()' accept additional
+ two parameters `full_mark' and `immediate_sweep'.
+ If `full_mark' is TRUE, then force it full gc (major gc), otherwise,
+ it depends on status of object space. Now, it will be minor gc.
+ If `immediate_sweep' is TRUE, then disable lazy sweep.
+ To allocate free memory, `full_mark' and `immediate_sweep' should be
+ TRUE. Otherwise, they should be FALSE.
+
+ * gc.c (gc_prepare_free_objects): use `garbage_collect_body()'.
+
+ * gc.c (slot_sweep, before_gc_sweep, after_gc_sweep): add logging code.
+
+Tue May 21 22:47:06 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/strscan/strscan.c (strscan_aref): support named captures.
+ patched by Konstantin Haase [ruby-core:54664] [Feature #8343]
+
+Tue May 21 21:48:44 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * test/ruby/test_dir_m17n.rb (TestDir_M17N#test_entries_compose):
+ Use #each instead of #map just for iteration.
+
+Tue May 21 19:57:22 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * ext/digest/lib/digest.rb (Digest::Class.file): Take optional
+ arguments that are passed to the constructor of the digest
+ class.
+
+Tue May 21 17:21:12 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: remove gc_profile_record::is_marked. always true.
+
+Tue May 21 17:13:40 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: fix to collect additional information for GC::Profiler.
+ * major/minor GC
+ * trigger reason of GC
+
+ * gc.c (gc_profile_dump_on): change reporting format with
+ added information.
+
+ * gc.c (gc_profile_record_get): return added information by
+ :GC_FLAGS => array.
+
+Tue May 21 16:45:31 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: GC::Profiler's sweeping time is accumulated all slot
+ sweeping time. At lazy GC, GC::Profiler makes new record entry
+ for each lazy_sweep(). In this change, accumulating all
+ slot_sweep() time.
+ And change indentation.
+
+Tue May 21 16:29:09 2013 Koichi Sasada <ko1@atdot.net>
+
+ * common.mk (rdoc-bench): add a benchmark rule
+ using RDoc. Generate all rdoc related files
+ (same as `make rdoc') in temporary directory
+ and remove them. Execution time, GC::Profiler
+ and results of GC.stat are printed.
+
+ * tool/rdocbench.rb: added for `rdoc-bench'.
+
+Tue May 21 16:25:05 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (gc_profile_dump_on): `count' should be (int) because it
+ can be negative number.
+ And use pointer for `record' (don't copy).
+
+Tue May 21 03:11:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (dir_each): compose HFS file names from
+ UTF8-MAC. [ruby-core:48745] [Bug #7267]
+
+Tue May 21 03:08:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/ruby/envutil.rb (assert_separately): require envutil in the
+ child process too.
+
+Tue May 21 03:07:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_conv_enc_opts): should infect.
+
+Mon May 20 22:24:45 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb (Set#delete_if, Set#keep_if): Avoid blockless call of
+ proc, which is not portable to JRuby. Replace &method() with
+ faster and simpler literal blocks while at it.
+
+Mon May 20 22:00:31 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/e2mmap.rb: Format of E2MM documentation
+
+Mon May 20 21:41:15 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/extmk.rb: nodoc this file
+
+Mon May 20 20:43:32 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/cmath.rb: Remove duplicate RDoc heading from overview
+
+Mon May 20 20:36:19 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/securerandom.rb: Update position of overview for RDoc
+
+Mon May 20 19:33:55 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * math.c: improve and fix documentation of sin, tan and log
+
+Mon May 20 19:31:49 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * lib/logger.rb (Logger::Application): show namespace in documentation
+
+Mon May 20 11:50:12 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/pp.rb: Revert part of r40834 and nodoc PP::ObjectMixin
+ [ruby-core:55068]
+
+Mon May 20 10:40:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/webrick/htmlutils.rb (WEBrick::HTMLUtils#escape): replace HTML
+ meta chars even in non-ascii string. [Bug #8425] [ruby-core:55052]
+
+ * lib/webrick/httputils.rb (WEBrick::HTTPUtils#{_escape,_unescape}):
+ fix %-escape encodings. [Bug #8425] [ruby-core:55052]
+
+ * lib/webrick/httpservlet/filehandler.rb (set_dir_list): revert r20152
+ partially and fix misuse of bytesize and regexp repetition operator.
+
+Mon May 20 08:03:51 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/profiler.rb: Document Profiler__ methods
+
+Mon May 20 08:02:13 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/tempfile.rb: nodoc Tempfile#inspect
+
+Mon May 20 07:48:24 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/stringio/stringio.c: Correct position of method rdoc
+
+Mon May 20 07:27:41 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * math.c: RDoc formatting of Math core docs with domains and codomains
+ Patch by @eLobato [Fixes GH-309]
+
+Mon May 20 05:58:12 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/bigdecimal/bigdecimal.c: Formatting for BigMath [Fixes GH-306]
+ Based on a patch by @eLobato.
+ * ext/bigdecimal/lib/bigdecimal/math.rb: ditto
+
+Mon May 20 04:56:59 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/forwardable.rb: Forwardable examples in overview were broken
+ Based on patch by @joem [Fixes GH-303] [Bug #8392]
+
+Mon May 20 03:35:26 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/optparse.rb: nodoc OptionParser::Version and SPLAT_PROC
+
+Mon May 20 03:16:52 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/pp.rb: Document PP::ObjectMixin [Fixes GH-312]
+
+Sun May 19 23:52:22 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * test/webrick/test_htmlutils.rb: add test for WEBrick::HTMLUtils.
+
+Sun May 19 23:12:07 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * encoding.c: document fix, change default script encoding.
+ patched by @windwiny [Fixes GH-310]
+
+Sun May 19 17:29:07 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb (Set#delete_if, Set#keep_if): Add comments.
+
+Sun May 19 11:37:36 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * ext/fiddle/extconf.rb: ignore rc version of libffi to fix build failure.
+
+Sun May 19 10:38:50 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el (ruby-electric-delete-backward-char): Use
+ delete-char instead of delete-backward-char, which is an
+ interactive function.
+
+Sun May 19 03:59:29 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * string.c (str_scrub0): added for refactoring.
+
+Sun May 19 03:48:26 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/uri/common.rb (URI.decode_www_form): scrub string if decoded
+ bytes are invalid for the encoding.
+
+Sun May 19 02:46:32 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/set.rb (Set#delete_if, Set#keep_if): Make Set#delete_if and
+ Set#keep_if more space and time efficient by avoiding to_a.
+
+Sun May 19 02:33:09 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el (ruby-electric-setup-keymap): Make
+ backquotes electric as well. It was listed in
+ ruby-electric-expand-delimiters-list but not activated.
+
+ * misc/ruby-electric.el (ruby-electric-delete-backward-char):
+ Introduce electric DEL that deletes what the previous electric
+ command has input.
+
+ * misc/ruby-electric.el (ruby-electric-matching-char): Make
+ electric quotes work again at the end of buffer.
+
+Sun May 19 01:39:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (setjmp-type): check if setjmpex() is really available.
+ workaround for i686-w64-mingw32 which declares it but lacks its
+ definition.
+
+ * include/ruby/defines.h: include setjmpex.h only if also setjmpex()
+ is available.
+
+Sat May 18 23:57:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (setjmp-type): use setjmpex() on w64-mingw32 to get rid
+ of -Wclobbered warnings.
+
+ * include/ruby/defines.h: include setjmpex.h here becase setjmp.h is
+ included from win32.h via intrin.h, winnt.h, and so on.
+
+Sat May 18 20:28:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/mkconstants.rb (INTEGER2NUM): Make less comparisons.
+
+Sat May 18 20:15:28 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * string.c (str_scrub_bang): add String#scrub!. [Feature #8414]
+
+Sat May 18 16:59:52 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/mkconstants.rb (INTEGER2NUM): Renamed from INTEGER2VALUE.
+
+Sat May 18 16:57:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/mkconstants.rb (INTEGER2VALUE): Suppress a warning:
+ comparison between signed and unsigned integer expressions
+
+Sat May 18 16:38:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): forward anonymous and first keyword
+ rest argument one. [ruby-core:55033] [Bug #8416].
+
+Sat May 18 15:49:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_core.h (rb_vm_tag): move jmpbuf between tag and prev so ensure to
+ be accessible.
+
+Sat May 18 11:05:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enumerator.c (inspect_enumerator): use VALUE instead of mere char*
+ by using rb_sprintf() and rb_id2str().
+
+ * enumerator.c (append_method): extract from inspect_enumerator().
+
+Sat May 18 09:00:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/mkconstants.rb (INTEGER2VALUE): Use LONG2FIX if possible.
+
+Sat May 18 00:38:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/mkconstants.rb: Convert integer constants bigger than int
+ correctly.
+
+Fri May 17 22:02:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/ifaddr.c: Use unsigned LONG_LONG to represent flags
+ because SunOS 5.11 (OpenIndiana) defines ifa_flags as uint64_t.
+
+Fri May 17 21:47:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * cont.c: Typo in constant MAX_MACHINE_STACK_CACHE from '..MAHINE..'
+ patch by @schmurfy [Fixes GH-307]
+
+Fri May 17 19:18:24 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el (ruby-electric-matching-char): Do not put
+ a closing quote when the quote typed does not start a string, as
+ in $', ?\' or ?\".
+
+Fri May 17 18:06:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Consider error messages to find out version option of
+ C compiler.
+ The C compiler of Sun Studio C emits "Warning: Option -qversion
+ passed to ld, if ld is invoked, ignored otherwise" and exit
+ successfully.
+
+Fri May 17 17:34:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * gc.c (rb_gc_guarded_ptr): unoptimize on other compilers than gcc and
+ msvc.
+
+Fri May 17 11:06:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * eval_intern.h (TH_PUSH_TAG): ensure jmpbuf to be accessible before
+ pushing tag to get rid of unaccessible tag by stack overflow.
+
+Thu May 16 17:15:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_eval.c (rb_catch_obj): add volatile to tag to prevent crash
+ experimentally.
+ http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130515T133500Z.log.html.gz
+
+Thu May 16 16:19:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/Makefile.sub (verconf.in): no longer used.
+
+ * win32/Makefile.sub (config.status): fix typo.
+
+ * configure.in, template/verconf.h.in (RUBY_EXEC_PREFIX): fix for
+ default prefix.
+
+Thu May 16 13:12:27 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * template/verconf.h.in: generate verconf.h from the template and
+ rbconfig.rb.
+
+Thu May 16 05:47:18 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: fix syntax error.
+ Thanks @spastorino! [ruby-core:55011]
+
+Thu May 16 03:05:45 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_node_newnode): use newobj_of() instead of rb_newobj().
+
+Thu May 16 02:03:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/depend: Add a dependency for ifaddr.o.
+
+Thu May 16 01:44:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * common.mk (verconf.h): $< cannot be used in explicit rules with
+ nmake.
+
+ * win32/Makefile.sub (CONFIG_H): create verconf.in instead of
+ verconf.h.
+
+Thu May 16 01:25:07 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: only emit warnings when
+ -w is enabled.
+
+Wed May 15 18:58:17 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (newobj): rename to `newobj_of' and accept additional
+ three parameters v1, v2, v3. newobj_of() do OBJSETUP() and
+ fill values with v1, v2, v3.
+
+ * gc.c (rb_data_object_alloc, rb_data_typed_object_alloc):
+ use newobj_of().
+
+Wed May 15 17:55:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (RUBY_PLATFORM): move to config.h as needed by
+ version.c.
+
+Wed May 15 17:04:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: add an additional RGENGC_PROFILE mode (2).
+ Profiling result can be check by GC.stat.
+
+ * gc.c (type_name): separate from obj_type_name().
+
+Wed May 15 16:58:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: save configured load path values into verconf.in.
+
+ * common.mk (verconf.h): create from verconf.in with shvar_to_cpp.rb.
+
+ * tool/shvar_to_cpp.rb: turn shell variables into C macros.
+ [Bug #7959]
+
+ * loadpath.c: split load path staffs from version.c.
+
+ * dmyloadpath.c: miniruby has no builtin load paths, so verconf.h is
+ not needed.
+
+Wed May 15 03:56:09 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: adding backwards
+ compatible YAMLTree.new method
+
+Wed May 15 02:22:16 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych.rb: Adding Psych.safe_load for loading a user
+ defined, restricted subset of Ruby object types.
+ * ext/psych/lib/psych/class_loader.rb: A class loader for
+ encapsulating the logic for which objects are allowed to be
+ deserialized.
+ * ext/psych/lib/psych/deprecated.rb: Changes to use the class loader
+ * ext/psych/lib/psych/exception.rb: ditto
+ * ext/psych/lib/psych/json/stream.rb: ditto
+ * ext/psych/lib/psych/nodes/node.rb: ditto
+ * ext/psych/lib/psych/scalar_scanner.rb: ditto
+ * ext/psych/lib/psych/stream.rb: ditto
+ * ext/psych/lib/psych/streaming.rb: ditto
+ * ext/psych/lib/psych/visitors/json_tree.rb: ditto
+ * ext/psych/lib/psych/visitors/to_ruby.rb: ditto
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: ditto
+ * ext/psych/psych_to_ruby.c: ditto
+ * test/psych/helper.rb: ditto
+ * test/psych/test_safe_load.rb: tests for restricted subset.
+ * test/psych/test_scalar_scanner.rb: ditto
+ * test/psych/visitors/test_to_ruby.rb: ditto
+ * test/psych/visitors/test_yaml_tree.rb: ditto
+
+Wed May 15 02:06:35 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * test/psych/helper.rb: envutil is not available outside Ruby, so
+ port the functions from envutil to the test helper.
+
+ * test/psych/test_deprecated.rb: ditto
+
+ * test/psych/test_encoding.rb: ditto
+
+Wed May 15 00:42:54 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * signal.c: need to include unistd.h for write(2).
+ unistd.h is now included via ruby/defines.h, but should explicitly
+ include here. (suggested by kosaki)
+
+Tue May 14 23:43:05 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/.document: Add ifaddr.c.
+
+Tue May 14 23:24:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/socket/extconf.rb: check for if_nametoindex() for
+ i686-w64-mingw32, and check for declarations of if_indextoname() and
+ if_nametoindex().
+
+ * ext/socket/ifaddr.c (ifaddr_ifindex): not-implement unless
+ if_nametoindex() is available.
+
+ * ext/socket/rubysocket.h: declare if_indextoname() and
+ if_nametoindex() if available but not declared.
+
+Tue May 14 19:58:17 2013 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+
+ * ext/dl/lib/dl/func.rb (DL::Function#call): check tainted when
+ $SAFE > 0.
+ * ext/fiddle/function.c (function_call): check tainted when $SAFE > 0.
+ * test/fiddle/test_func.rb (module Fiddle): add test for above.
+
+
+Tue May 14 14:51:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/win32.h (INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX): split
+ from intptr_t and uintptr_t, since VC9 defines the latter only in
+ crtdefs.h.
+
+Tue May 14 12:21:28 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (NET_LUID): mingw may have NET_LUID and not defined
+ _IFDEF_.
+
+Tue May 14 03:33:17 2013 Koichi Sasada <ko1@atdot.net>
+
+ * string.c (rb_str_new_frozen): remove debug print.
+
+Tue May 14 03:22:51 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: enable to generate write barrier protected
+ arrays (T_ARRAY).
+
+Tue May 14 03:21:42 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: enable to generate write barrier protected
+ strings (T_STRING).
+
+Tue May 14 03:19:59 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: enable to generate write barrier protected
+ objects (T_OBJECT).
+
+Tue May 14 03:17:15 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: enable to generate write barrier protected
+ objects for numeric types (Float, Complex, Rational, Bignum).
+
+Tue May 14 03:10:59 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: enable RGENGC (USE_RGENGC)
+ but no type creates write protected (sunny) objects
+ (RGENGC_WB_PROTECTED_* == 0).
+
+Tue May 14 02:47:30 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: support RGENGC. [ruby-trunk - Feature #8339]
+ See this ticket about RGENGC.
+
+ * gc.c: Add several flags:
+ * RGENGC_DEBUG: if >0, then prints debug information.
+ * RGENGC_CHECK_MODE: if >0, add assertions.
+ * RGENGC_PROFILE: if >0, add profiling features.
+ check GC.stat and GC::Profiler.
+
+ * include/ruby/ruby.h: disable RGENGC by default (USE_RGENGC == 0).
+
+ * array.c: add write barriers for T_ARRAY and generate sunny objects.
+
+ * include/ruby/ruby.h (RARRAY_PTR_USE): added. Use this macro if
+ you want to access raw pointers. If you modify the contents which
+ pointer pointed, then you need to care write barrier.
+
+ * bignum.c, marshal.c, random.c: generate T_BIGNUM sunny objects.
+
+ * complex.c, include/ruby/ruby.h: add write barriers for T_COMPLEX
+ and generate sunny objects.
+
+ * rational.c (nurat_s_new_internal), include/ruby/ruby.h: add write
+ barriers for T_RATIONAL and generate sunny objects.
+
+ * internal.h: add write barriers for RBasic::klass.
+
+ * numeric.c (rb_float_new_in_heap): generate sunny T_FLOAT objects.
+
+ * object.c (rb_class_allocate_instance), range.c:
+ generate sunny T_OBJECT objects.
+
+ * string.c: add write barriers for T_STRING and generate sunny objects.
+
+ * variable.c: add write barriers for ivars.
+
+ * vm_insnhelper.c (vm_setivar): ditto.
+
+ * include/ruby/ruby.h, debug.c: use two flags
+ FL_WB_PROTECTED and FL_OLDGEN.
+
+ * node.h (NODE_FL_CREF_PUSHED_BY_EVAL, NODE_FL_CREF_OMOD_SHARED):
+ move flag bits.
+
+Tue May 14 01:54:48 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: remove rb_objspace_t::marked_num.
+ We can use `objspace_live_num()' instead of removed `marked_num'
+ if it is after `after_gc_sweep()' function call.
+
+ * gc.c (after_gc_sweep): use objspace_live_num() instead of removed
+ rb_objspace_t::marked_num.
+
+ * gc.c (gc_mark_ptr, gc_marks): remove rb_objspace_t::marked_num code.
+
+ * gc.c (gc_prepare_free_objects): do not call set_heaps_increment()
+ with checking objspace->heap.marked_num. At this point, we only
+ need to check availability of free-cell.
+
+ * gc.c (lazy_sweep): call after_gc_sweep() if there are no sweep_able entry.
+
+ * gc.c (rest_sweep, gc_prepare_free_objects): remove after_gc_sweep() call.
+
+Tue May 14 01:50:41 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: disable GC_PROFILE_MORE_DETAIL (fix last commit).
+
+ * gc.c (gc_prof_set_malloc_info): fix "objspace->heap.live_num" to
+ "objspace_live_num(objspace)". There is no such member variable.
+
+Tue May 14 01:25:55 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c: refactoring GC::Profiler.
+
+ * gc.c (gc_prof_sweep_timer_start/stop): removed because
+ they doesn't support lazy sweep.
+
+ * gc.c (gc_prof_sweep_slot_timer_start/stop): added.
+ redefine `sweeping time' to accumulated time of all of
+ slot_sweep().
+
+ * gc.c (rb_objspace_t::profile::count): renamed to
+ rb_objspace_t::profile::next_index. `counter' seems ambiguous.
+ increment it when next record is acquired.
+
+Tue May 14 00:48:55 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: constify RRational::(num,den) and
+ RComplex::(real,imag).
+ Add macro to set these values:
+ * RRATIONAL_SET_NUM()
+ * RRATIONAL_SET_DEN()
+ * RCOMPLEX_SET_REAL()
+ * RCOMPLEX_SET_IMAG()
+ This change is a part of RGENGC branch [ruby-trunk - Feature #8339].
+
+ TODO: API design. RRATIONAL_SET(rat,num,den) is enough?
+ TODO: Setting constify variable with cast has same issue of r40691.
+
+ * complex.c, rational.c: use above macros.
+
+Mon May 13 21:49:17 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Check socketpair again.
+ It is required on Unix.
+
+Mon May 13 21:20:32 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (getipaddrs): use alternative interface name if
+ available, because if_nametoindex() requires them.
+
+Mon May 13 20:23:24 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c, include/ruby/win32.h (getipaddrs): [experimental]
+ emulate getipaddrs(3) on Unix.
+
+ * win32/Makefile.sub, configure.in (LIBS): need iphlpapi.lib for above
+ function.
+
+ * include/ruby/win32.h (socketpair): rb_w32_socketpair() doesn't
+ substitute for any function, so use non-prefixed name.
+
+ * ext/socket/extconf.rb (socketpair); follow above change.
+
+Mon May 13 20:11:06 2013 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (prepare_iseq_build): remove additional line break.
+
+Mon May 13 19:29:54 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: constify RBasic::klass and add
+ RBASIC_CLASS(obj) macro which returns a class of `obj'.
+ This change is a part of RGENGC branch [ruby-trunk - Feature #8339].
+
+ * object.c: add new function rb_obj_reveal().
+ This function reveal internal (hidden) object by rb_obj_hide().
+ Note that do not change class before and after hiding.
+ Only permitted example is:
+ klass = RBASIC_CLASS(obj);
+ rb_obj_hide(obj);
+ ....
+ rb_obj_reveal(obj, klass);
+
+ TODO: API design. rb_obj_reveal() should be replaced with others.
+
+ TODO: modify constified variables using cast may be harmful for
+ compiler's analysis and optimization.
+ Any idea to prohibit inserting RBasic::klass directly?
+ If rename RBasic::klass and force to use RBASIC_CLASS(obj),
+ then all codes such as `RBASIC(obj)->klass' will be
+ compilation error. Is it acceptable? (We have similar
+ experience at Ruby 1.9,
+ for example "RARRAY(ary)->ptr" to "RARRAY_PTR(ary)".
+
+ * internal.h: add some macros.
+ * RBASIC_CLEAR_CLASS(obj) clear RBasic::klass to make it internal
+ object.
+ * RBASIC_SET_CLASS(obj, cls) set RBasic::klass.
+ * RBASIC_SET_CLASS_RAW(obj, cls) same as RBASIC_SET_CLASS
+ without write barrier (planned).
+ * RCLASS_SET_SUPER(a, b) set super class of a.
+
+ * array.c, class.c, compile.c, encoding.c, enum.c, error.c, eval.c,
+ file.c, gc.c, hash.c, io.c, iseq.c, marshal.c, object.c,
+ parse.y, proc.c, process.c, random.c, ruby.c, sprintf.c,
+ string.c, thread.c, transcode.c, vm.c, vm_eval.c, win32/file.c:
+ Use above macros and functions to access RBasic::klass.
+
+ * ext/coverage/coverage.c, ext/readline/readline.c,
+ ext/socket/ancdata.c, ext/socket/init.c,
+ * ext/zlib/zlib.c: ditto.
+
+Mon May 13 18:44:14 2013 Koichi Sasada <ko1@atdot.net>
+
+ * *.c, parse.y, insns.def: use RARRAY_AREF/ASET macro
+ instead of using RARRAY_PTR().
+
+Mon May 13 16:53:53 2013 Koichi Sasada <ko1@atdot.net>
+
+ * include/ruby/ruby.h: add new utility macros to access
+ Array's element.
+ * RARRAY_AREF(a, i) returns i-th element of an array `a'
+ * RARRAY_ASET(a, i, v) set i-th element of `a' to `v'
+ This change is a part of RGENGC branch [ruby-trunk - Feature #8339].
+
+Mon May 13 15:31:10 2013 Koichi Sasada <ko1@atdot.net>
+
+ * object.c (rb_obj_setup): added.
+
+ * include/ruby/ruby.h (OBJSETUP): use rb_obj_setup() instead of
+ a macro.
+
+Mon May 13 15:24:16 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_data_object_alloc): check klass only if klass is not 0.
+ klass==0 means internal object.
+
+Mon May 13 14:57:28 2013 Koichi Sasada <ko1@atdot.net>
+
+ * gc.c (rb_data_object_alloc, rb_data_typed_object_alloc):
+ use NEWOBJ_OF() instead of NEWOBJ().
+
+Mon May 13 14:51:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (rb_obj_singleton_method): new method Kernel#singleton_method
+ which returns a Method object of the singleton method.
+ non-singleton method causes NameError, but not aliased or zsuper
+ method, right now.
+ [ruby-core:54914] [Feature #8391]
+
+ * vm_method.c (rb_method_entry_at): return the method entry for id at
+ klass, without ancestors.
+
+ * class.c (rb_singleton_class_get): get the singleton class if exists,
+ or nil.
+
+Mon May 13 10:20:59 2013 Yuki Yugui Sonoda <yugui@google.com>
+
+ * ext/openssl/ossl_ssl.c: Disabled OpenSSL::SSL::SSLSocket if
+ defined(OPENSSL_NO_SOCK).
+
+ This fixes a linkage error on platforms which do not have socket.
+ OpenSSL itself is still useful as a set of cryptographic functions
+ even on such platforms.
+
+Mon May 13 10:30:04 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * hash.c: Hash[] and {} are not equivalent by @eam [Fixes GH-301]
+
+Mon May 13 10:04:22 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * random.c: Document Random::DEFAULT by @eLobato [Fixes GH-304]
+
+Sun May 12 21:12:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (OFFT2NUM): RUBY_REPLACE_TYPE also defines macro
+ to convert int type to VALUE if found.
+
+Wed May 8 13:46:52 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * include/ruby/intern.h (rb_iv_set, rb_iv_get): removed. Because
+ ruby.h has a declaration for that.
+
+Wed May 8 13:49:06 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * include/ruby/intern.h (rb_uint2big, rb_int2big, rb_uint2inum)
+ (rb_int2inum, rb_ll2inum, rb_ull2inum): removed because ruby.h
+ has a declaration for these.
+
+Sun May 12 17:52:23 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: removes 'ac_cv_func_fseeko=yes' form MinGW
+ specific definitions.
+
+Sun May 12 17:25:46 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * file.c (rb_file_s_truncate): use correct type. chsize takes
+ a long.
+
+Sun May 12 17:18:46 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * process.c: move '#define HAVE_SPAWNV 1' to win32/Makefile.sub.
+ * win32/Makefile.sub: see above.
+
+Sun May 12 17:13:32 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: removes AC_CHECK_FUNCS(setitimer) because it's
+ unused.
+
+Sun May 12 17:08:16 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: removes AC_CHECK_FUNCS(pause) because it's unused.
+
+Sun May 12 17:05:18 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * signal.c (rb_f_kill): fixes typo. s/HAS_KILLPG/HAVE_KILLPG/.
+
+Sun May 12 17:03:27 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: abort if gettimeofday doesn't exist.
+
+Sun May 12 16:31:27 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: adds RUBY_REPLACE_TYPE(off_t) for creating
+ NUM2OFFT.
+ * file.c (rb_file_truncate): use correct type. chsize() take
+ a long.
+ * include/ruby/ruby.h (NUM2OFFT): use a definition created by
+ a configure script by default.
+
+Sun May 12 16:03:41 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: removes AC_CHECK_FUNC(fseeko, fseeko64, ftello,
+ ftello64). They are not used from anywhere.
+
+ * win32/win32.c (fseeko): removes.
+ * win32/win32.c (rb_w32_ftello): removes.
+ * include/ruby/win32.h: removes declarations of rb_w32_ftello and
+ rb_w32_fseeko.
+ * win32/Makefile.sub: removes '#define HAVE_FTELLO 1'.
+
+Sun May 12 15:51:47 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: remove AC_CHECK_FUNC(close). It is not used from
+ anywhere.
+
+Sun May 12 15:50:45 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: adds comments for setjmp check.
+
+Sun May 12 15:38:09 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: move clock_gettime() check into regular place.
+
+Wed May 8 13:45:53 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: add getenv() declaration check.
+ * dln_find.c: add HAVE_DECL_GETENV test.
+
+Sun May 12 15:33:18 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: sorts AC_CHECK_FUNCS()s as alphabetical order.
+
+Wed May 8 13:41:57 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * bignum.c: remove redundant decl for big_lshift() big_rshift().
+
+Sun May 12 16:06:43 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/socket/rubysocket.h (rsock_inspect_sockaddr): as r40646
+ check HAVE_TYPE_STRUCT_SOCKADDR_DL.
+
+Sat May 11 23:01:58 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/socket/rubysocket.h (HAVE_TYPE_STRUCT_SOCKADDR_DL):
+ MSVC has struct sockaddr_dl, but its content is broken.
+ http://ruby-mswin.cloudapp.net/vc10-x64/ruby-trunk/log/20130511T103938Z.log.html.gz
+
+Sat May 11 22:07:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/rinda/test_rinda.rb: Socket.getifaddrs may returns an interface
+ which #addr method returns nil for venet0 in OpenVZ.
+
+Sat May 11 21:56:34 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/raddrinfo.c (rsock_inspect_sockaddr): Add casts to
+ suppress warnings.
+
+Sat May 11 17:28:51 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket: New method, Socket.getifaddrs, implemented.
+ [ruby-core:54777] [Feature #8368]
+
+Sat May 11 00:47:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * gc.h (SET_MACHINE_STACK_END): Add !defined(_ILP32) to a defining
+ condition to avoid compilation error on x32.
+ https://sites.google.com/site/x32abi/
+
+Fri May 10 23:56:34 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_peek_variable_name): treat invalid global, class,
+ and instance variable names as mere strings rather than errors.
+ [ruby-core:54885] [Bug #8375]
+
+Fri May 10 20:22:40 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Move library checks into "Checks for libraries." part.
+
+Fri May 10 19:32:01 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Reformat arguments of AC_CHECK_HEADERS and
+ AC_CHECK_FUNCS to track modifications easily.
+
+Fri May 10 12:01:36 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Don't link librt if clock_gettime is available in
+ the main C library.
+ glibc 2.17 moves clock_* from librt to the main C library.
+ http://sourceware.org/ml/libc-announce/2012/msg00001.html
+
+Thu May 9 22:00:35 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal): controls_num should
+ not be negative.
+
+Thu May 9 21:09:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * file.c, ext/etc/etc.c, ext/socket/unixsocket.c,
+ ext/openssl/ossl.h, ext/openssl/openssl_missing.c: Use
+ HAVE_AGGREGATE_MEMBER instead of HAVE_ST_MEMBER.
+
+Thu May 9 20:43:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/ancdata.c (bsock_sendmsg_internal): Always set
+ controls_num to raise NotImplementedError appropriately.
+ (bsock_recvmsg_internal): Raise NotImplementedError if
+ :scm_rights=>true is given on platforms which don't have
+ 4.4BSD style control message.
+
+Thu May 9 12:06:07 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/rubysocket.h, ext/socket/unixsocket.c,
+ ext/socket/ancdata.c: Use HAVE_STRUCT_MSGHDR_MSG_CONTROL instead
+ of HAVE_ST_MSG_CONTROL.
+
+Thu May 9 11:30:02 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * string.c: Add call-seq alias for String#=== [Bug #8381]
+
+Thu May 9 11:14:18 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * doc/contributing.rdoc: Add guide for contributing to CRuby
+
+Thu May 9 04:55:49 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Check socket library again. shutdown() is used in
+ io.c.
+
+Thu May 9 01:52:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Don't check socketpair. socketpair is not used in
+ ruby command itself.
+
+Thu May 9 01:05:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rb_mod_included_modules): should not include non-modules.
+ [ruby-core:53158] [Bug #8025]
+
+Wed May 8 22:46:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rb_mod_included_modules): should not include the original
+ module itself. [ruby-core:53158] [Bug #8025]
+
+Wed May 8 17:43:55 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * io.c (rb_io_ext_int_to_encs): ignore internal encoding if external
+ encoding is ASCII-8BIT. [Bug #8342]
+
+Wed May 8 13:49:38 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/json/generator/generator.c (isArrayOrObject): cast char to
+ unsigned char. [Bug #8378]
+
+Wed May 8 13:46:10 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/json/generator/depend: fix dependencies [Bug #8379]
+
+ * ext/json/parser/depend: ditto.
+
+Wed May 8 13:07:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_yylex): fail if $, @, @@ are not followed by a valid
+ name character. [ruby-core:54846] [Bug #8375].
+
+Wed May 8 13:06:31 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (ISGRAPH): add missing macro.
+
+Wed May 8 06:42:56 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/socket/socket.c (socket_s_ip_address_list): fix wrongly filled
+ sin6_scope_id on KAME introduced by r40593 for OpenIndiana.
+ KAME uses fe80:<scope_id>::<interface id> for link-local address
+ internally.
+ Setting sin6_scope_id causes it leaked.
+ see also comments of sockaddr_obj().
+
+Tue May 7 22:12:34 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/readline/readline.c (insert_ignore_escape): Add a cast to
+ unsigned char * before dereference.
+ This suppress a warning on Cygwin.
+
+Tue May 7 12:15:24 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/ancdata.c (bsock_recvmsg_internal): Add a cast to
+ suppress warning.
+ Bionic defines socklen_t as int.
+ Bionic defines msg_controllen as unsigned int (__kernel_size_t)
+ instead of socklen_t as POSIX.
+
+Tue May 7 12:12:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/ancdata.c (ancillary_inspect): Don't call
+ anc_inspect_ipv6_pktinfo if !HAVE_TYPE_STRUCT_IN6_PKTINFO.
+ anc_inspect_ipv6_pktinfo is not defined in the case.
+
+Tue May 7 12:10:52 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/socket.c (socket_s_ip_address_list): Cast EXTRA_SPACE as
+ int. This suppress a warning.
+
+Tue May 7 12:09:29 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Set close_fds false for Cygwin.
+ Cygwin doesn't support fd passing.
+ This enables socket extension library cross-compilable by default.
+
+Tue May 7 12:07:35 2013 Tanaka Akira <akr@fsij.org>
+
+ * pack.c (swap32): Don't redefine it if it is already defined.
+ Bionic defines it.
+ (swap64): Ditto.
+
+Mon May 6 20:50:37 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/socket.c (socket_s_ip_address_list): Fill sin6_scope_id
+ if getifaddrs() returns an IPv6 link local address which
+ sin6_scope_id is zero, such as on OpenIndiana SunOS 5.11.
+
+Sun May 5 18:56:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * insns.def (defined): use vm_search_superclass() like as normal super
+ call. based on a patch <https://gist.github.com/wanabe/5520026> by
+ wanabe.
+
+ * vm_insnhelper.c (vm_search_superclass): return error but not raise
+ exceptions.
+
+ * vm_insnhelper.c (vm_search_super_method): check the result of
+ vm_search_superclass and raise exceptions on error.
+
+Sun May 5 16:29:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * insns.def (defined): get method entry from the method top level
+ frame, not block frame. [ruby-core:54769] [Bug #8367]
+
+Sun May 5 13:28:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * template/ruby.pc.in (Cflags): use rubyarchhdrdir for multiarch.
+ [Bug #7874]
+
+Sat May 4 07:20:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * doc/security.rdoc: Add note about reporting security vulns
+
+Sat May 4 04:13:27 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * include/ruby/defines.h (RUBY_ATTR_ALLOC_SIZE): New for
+ attribute((alloc_size(params))).
+
+ * include/ruby/defines.h (xmalloc, xmalloc2, xcalloc)
+ (xrealloc, xrealloc2): Annotated by RUBY_ATTR_ALLOC_SIZE.
+ * include/ruby/ruby.h (rb_alloc_tmp_buffer): ditto.
+
+Fri May 3 19:32:13 2013 Takeyuki FUJIOKA <xibbar@ruby-lang.org>
+
+ * lib/cgi/util.rb: All class methods modulized.
+ We can use these methods like a function when "include CGI::Util".
+ [Feature #8354]
+
+Fri May 3 14:09:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Make default_ipv6 true for Cygwin.
+ Cygwin supports IPv6 since Cygwin 1.7.1 (2009-12).
+ http://cygwin.com/ml/cygwin-announce/2009-12/msg00027.html
+
+Fri May 3 13:35:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/socket/{getaddrinfo,getnameinfo}.c: define socklen_t if not
+ defined, e.g., older VC.
+
+Fri May 3 13:29:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/win32.h (INTPTR_MAX, INTPTR_MIN, UINTPTR_MAX): also
+ should be defined when defining intptr_t and uintptr_t.
+ bigdecimal.c requires the former two now.
+
+Fri May 3 13:22:12 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (poll_child_status): fix build error on older mingw.
+
+Fri May 3 00:15:58 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * common.mk: remove timestamps in distclean-ext realclean-ext.
+
+Thu May 2 23:23:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (rb_obj_is_kind_of): skip prepending modules.
+ [ruby-core:54742] [Bug #8357]
+
+ * object.c (rb_class_inherited_p): ditto.
+ [ruby-core:54736] [Bug #8357]
+
+Thu May 2 22:11:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * bin/irb: remove dead code from sample/irb.rb.
+
+Thu May 2 17:32:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (copy_ivar_i): get rid of overwriting already copied
+ instance variables. c.f. [Bug #8276]
+
+Thu May 2 16:55:43 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (id_locals): use cached ID.
+
+ * vm.c (ruby_thread_init): ditto.
+
+ * defs/id.def: add more predefined IDs used in core.
+
+Thu May 2 13:42:42 2013 Ryan Davis <ryand-ruby@zenspider.com>
+
+ * lib/minitest/*: Imported minitest 4.7.4 (r8483)
+ * test/minitest/*: ditto
+
+Thu May 2 11:32:22 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (poll_child_status): [experimental] set the cause of
+ a child's death to status if its exitcode seems to be an error.
+
+ * test/ruby/test_process.rb (TestProcess#test_no_curdir): maybe now
+ we can test it.
+
+ * test/ruby/test_thread.rb (TestThread#test_thread_timer_and_interrupt):
+ ditto.
+
+Thu May 2 11:24:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/yaml.rb: nodoc EngineManager, add History doc #8344
+
+Wed May 1 21:11:17 2013 Tanaka Akira <akr@fsij.org>
+
+ * time.c (localtime_with_gmtoff_zone): musl libc may return NULL for
+ tm_zone.
+
+Wed May 1 18:59:36 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * enum.c (Enumerable#chunk): fix grammar of error message
+ for symbols beginning with an underscore [Bug #8351]
+
+Wed May 1 16:47:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/curses/extconf.rb (curses_version): try once for each tests, a
+ function or a variable. fallback to variable for old SVR4.
+
+Wed May 1 16:17:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/extmk.rb (extmake): extensions not to be installed should not
+ make static libraries, but make dynamic libraries always.
+
+Wed May 1 12:20:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/rake/version.rb: Fix RDoc warning with :include: [Bug #8347]
+
+Wed May 1 11:40:25 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * defs/id.def (predefined): add "idProc".
+
+ * eval.c (frame_func_id): use predefined IDs.
+
+ * proc.c (mnew, mproc, mlambda): use predefined IDs.
+
+ * vm.c (rb_vm_control_frame_id_and_class): ditto.
+
+ * vm.c (Init_VM): ditto.
+
+Tue Apr 30 23:18:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/benchmark.rb: Update Benchmark results on newer CPU
+
+Tue Apr 30 12:31:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (mproc, mlambda): use frozen core methods instead of plain
+ global methods, so that methods cannot be overridden.
+ [ruby-core:54687] [Bug #8345]
+
+ * vm.c (Init_VM): define proc and lambda on the frozen core object.
+
+ * include/ruby/intern.h (rb_block_lambda): add declaration instead of
+ deprecated rb_f_lambda.
+
+Mon Apr 29 17:02:30 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/nkf/nkf-utf8/nkf.h: Bionic libc doesn't have locale.
+ [Feature #8338]
+
+
+Mon Apr 29 06:58:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/openssl/ossl_bn.c (ossl_bn_initialize): no need of alloca for
+ small fixed size array.
+
+ * ext/openssl/ossl_bn.c (ossl_bn_initialize): check overflow first,
+ and use alloca for small size input.
+
+Mon Apr 29 00:40:13 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * lib/yaml.rb: Clarify documentation about YAML being always Psych.
+ Give a tip about using Syck. See #8344.
+
+Sun Apr 28 23:34:01 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * lib/yaml.rb: Use another trick to define the YAML module.
+ https://twitter.com/n0kada/status/328342207511801856
+
+Sun Apr 28 23:19:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/pp.rb: Update PP module overview by @geopet
+
+Sun Apr 28 22:04:37 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * ext/openssl/ossl_bn.c (ossl_bn_initialize): fix buffer overflow on
+ x64 Windows and memory leak when initializing with integer.
+ [ruby-core:54615] [Bug #8337]
+
+Sun Apr 28 12:38:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * README.EXT: correct method name to be used. [Bug #7982]
+
+ * README.EXT.ja: add notes too.
+
+Sun Apr 28 10:35:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * object.c: With feedback from Steve Klabnik, reverted a change to
+ #untrusted? and #tainted?. Also adjusted grammar for $SAFE levels
+
+Sun Apr 28 10:10:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/yaml.rb: Disable setting YAML const twice [ruby-core:54642]
+
+Sun Apr 28 09:50:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * object.c: Documentation for taint and trust [Bug #8162]
+
+Sun Apr 28 09:40:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * README.EXT: Copy note from r40505 for rb_sprintf() [Bug #7982]
+
+Sun Apr 28 08:28:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/curses/curses.c: Update Curses::Window example for nicer output
+ Patch by Michal Suchanek [Bug #8121] [ruby-core:53520]
+
+Sun Apr 28 08:10:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * README.EXT: Update note from r40504, by Jeremy Evans [Bug #7982]
+
+Sun Apr 28 08:02:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * README.EXT: Add note to warn use of %i in Exceptions [Bug #7982]
+
+Sun Apr 28 02:41:05 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Fix a typo. Should check endgrent() instead of
+ endgrnam().
+
+Sun Apr 28 00:35:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c (obj2gid): Don't call endgrent() if not exist.
+ Bionic (Android's libc) don't have endgrent().
+
+ * configure.in: Check endgrnam function.
+
+Sat Apr 27 23:53:00 2013 Charlie Somerville <charlie@charliesomerville.com>
+
+ * lib/yaml.rb: add security warning to YAML documentation
+
+Sat Apr 27 23:25:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/yaml.rb: Documentation for YAML module [Bug #8213]
+
+Sat Apr 27 20:19:21 2013 Tanaka Akira <akr@fsij.org>
+
+ * thread_pthread.c (ruby_init_stack): Add STACK_GROW_DIR_DETECTION.
+ This fixes a compilation failure while cross-compiling for Tensilica
+ Xtensa Processor.
+
+Sat Apr 27 19:32:44 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * thread.c: fix typos and documentation
+
+Sat Apr 27 19:04:55 2013 Tanaka Akira <akr@fsij.org>
+
+ * sparc.c: Use __asm__ instead of asm for gcc.
+ gcc doesn't provide asm keyword if -ansi option is given.
+ http://gcc.gnu.org/onlinedocs/gcc/Alternate-Keywords.html
+
+Sat Apr 27 17:22:50 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Redundant test removed.
+
+Sat Apr 27 16:00:10 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb (test_recvmsg_with_msg_peek_creates_fds):
+ Extracted.
+
+Sat Apr 27 15:50:40 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (SIGNED_INTEGER_TYPE_P): New macro.
+ (SIGNED_INTEGER_MAX): Ditto.
+ (SIGNED_INTEGER_MIN): Ditto.
+ (UNSIGNED_INTEGER_MAX): Ditto.
+ (TIMET_MAX): Use SIGNED_INTEGER_MAX and UNSIGNED_INTEGER_MAX.
+ (TIMET_MIN): Use SIGNED_INTEGER_MIN.
+
+ * thread.c (TIMEVAL_SEC_MAX): Use SIGNED_INTEGER_MAX.
+ (TIMEVAL_SEC_MIN): Use SIGNED_INTEGER_MIN.
+
+Sat Apr 27 10:52:52 2013 Tanaka Akira <akr@fsij.org>
+
+ * thread.c (TIMEVAL_SEC_MAX, TIMEVAL_SEC_MIN): Consider environments,
+ sizeof(time_t) is smaller than sizeof(tv_sec), such as
+ OpenBSD 5.2 (amd64).
+
+Fri Apr 26 23:34:59 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/text.rb (REXML::Text.normalize): Fix a bug that all
+ entity filters are ignored. [ruby-dev:47278] [Bug #8302]
+ Patch by Ippei Obayashi. Thanks!!!
+ * test/rexml/test_entity.rb (EntityTester#test_entity_filter): Add
+ a test of the above change.
+
+Fri Apr 26 22:53:55 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/element.rb (REXML::Attributes#to_a): Support
+ namespaced attributes. [ruby-dev:47277] [Bug #8301]
+ Patch by Ippei Obayashi. Thanks!!!
+ * test/rexml/test_attributes.rb
+ (AttributesTester#test_to_a_with_namespaces): Add a test of the
+ above change.
+
+Fri Apr 26 21:48:29 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rss/atom.rb (RSS::Atom::Entry): Fix indent of document comment.
+
+Fri Apr 26 21:21:17 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rss/maker.rb (RSS::Maker): Fix indent of document comment.
+
+Fri Apr 26 18:41:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Use a block of enable_config() for
+ --{enable,disable}-close-fds-by-recvmsg-with-peek configure option
+
+Fri Apr 26 18:08:08 2013 Tanaka Akira <akr@fsij.org>
+
+ * dir.c (dir_set_pos): Fix a compilation error when seekdir() is not
+ exist.
+
+Fri Apr 26 17:41:17 2013 Tanaka Akira <akr@fsij.org>
+
+ * thread_pthread.c (ruby_init_stack): Add STACK_GROW_DIR_DETECTION.
+ This fixes a compilation failure while cross-compiling for ARM.
+
+Fri Apr 26 14:35:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/rss/atom.rb: Documentation for RSS::Atom based on a patch by
+ Michael Denomy
+ * lib/rss/maker.rb: Documentation for RSS::Maker also by @mdenomy
+
+Fri Apr 26 12:41:22 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/curses/extconf.rb: Test linkability of curses_version at first.
+
+ * ext/socket/extconf.rb: Test the behavior of fd passing with MSG_PEEK
+ only if recvmsg(), msg_control member, AF_UNIX and SCM_RIGHTS are
+ available.
+
+Fri Apr 26 00:07:52 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * lib/rinda/ring.rb (Rinda::RingServer#initialize): accept array
+ arguments of address to specify multicast interface.
+
+ * lib/rinda/ring.rb (Rinda::RingServer#make_socket): add optional
+ arguments for multicast interface.
+
+ * test/rinda/test_rinda.rb
+ (TestRingFinger#test_ring_server_ipv4_multicast,
+ TestRingFinger#test_ring_server_ipv6_multicast): add tests for
+ above change.
+
+ * test/rinda/test_rinda.rb
+ (TestRingServer#test_make_socket_ipv4_multicast,
+ TestRingServer#test_make_socket_ipv6_multicast): change bound
+ interface address because multicast address is not allowed on Linux
+ or Windows.
+ [ruby-core:53692] [Bug #8159]
+
+Thu Apr 25 23:45:02 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * lib/rinda/ring.rb (Rinda::RingServer#initialize): add a socket
+ to @sockets in make_socket() to close sockets on shutdown even if
+ make_socket() is called after initialize.
+
+ * lib/rinda/ring.rb (Rinda::RingServer#make_socket): ditto.
+
+Thu Apr 25 23:39:42 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * test/rinda/test_rinda.rb (TupleSpaceProxyTest#test_take_bug_8215):
+ use KILL on Windows since TERM doen't work and ruby process remains
+ after test-all on Windows.
+
+Thu Apr 25 23:16:28 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/curses/extconf.rb: Implement
+ --with-curses-version={function,variable} configure option for
+ cross-compiling.
+
+Thu Apr 25 18:15:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Don't use WIDE getaddrinfo by default.
+
+Thu Apr 25 17:56:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Remove obsolete options: ---with-ipv6-lib and
+ --with-ipv6-libdir.
+
+Thu Apr 25 17:43:49 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Implement
+ --{enable,disable}-close-fds-by-recvmsg-with-peek configure option
+ for cross-compiling.
+ Make --{enable,disable}-wide-getaddrinfo configure option
+ cross-compiling friendly.
+
+Thu Apr 25 16:11:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (rb_io_ext_int_to_encs, parse_mode_enc): bom-prefixed name is
+ not a real encoding name, just a fallback. so the proper conversion
+ should take place even if if the internal encoding is equal to the
+ bom-prefixed name, unless actual encoding is equal to the internal
+ encoding. [ruby-core:54563] [Bug #8323]
+
+ * io.c (io_set_encoding_by_bom): reset extenal encoding if no BOM
+ found. [ruby-core:54569]
+
+Thu Apr 25 14:35:01 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/openssl/ossl_bn.c (ossl_bn_initialize): allow Fixnum and Bignum.
+ [ruby-core:53986] [Feature #8217]
+
+Thu Apr 25 14:26:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/uri/common.rb (URI.decode_www_form): follow current URL Standard.
+ It gets encoding argument to specify the character encoding.
+ It now allows loose percent encoded strings, but denies ;-separator.
+ [ruby-core:53475] [Bug #8103]
+
+ * lib/uri/common.rb (URI.decode_www_form): follow current URL Standard.
+ It gets encoding argument to convert before percent encode.
+ Now UTF-16 strings aren't converted to UTF-8 before percent encode
+ by default.
+
+Wed Apr 25 14:26:00 2013 Charlie Somerville <charlie@charliesomerville.com>
+
+ * benchmark/bm_hash_shift.rb: add benchmark for Hash#shift
+
+ * hash.c (rb_hash_shift): use st_shift if hash is not being iterated to
+ delete element without iterating the whole hash.
+
+ * hash.c (shift_i): remove function
+
+ * include/ruby/st.h (st_shift): add st_shift function
+
+ * st.c (st_shift): ditto
+
+ [Bug #8312] [ruby-core:54524] Patch by funny-falcon
+
+Thu Apr 25 12:03:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Extract C programs as toplevel constants.
+
+Thu Apr 25 02:23:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (RUBY_RM_RECURSIVE): this hack is needed by only
+ autoconf 2.69 or earlier on darwin.
+
+Thu Apr 25 01:22:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/tracer.rb (get_line): simply read by File.readlines.
+
+ * lib/debug.rb (script_lines): get source lines from SCRIPT_LINES__ or
+ read from the file.
+
+ * lib/debug.rb (display_list): use script_lines instead of recursion.
+ [Bug #8318]
+
+ * lib/debug.rb (line_at): use script_lines same as display_list.
+
+ * lib/debug.rb (display_list): Fix debug listing when called from the
+ same file it has been required. patch by Dario Bertini <berdario AT
+ gmail.com> [Bug #8318] [fix GH-280]
+
+Wed Apr 24 21:51:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: Check mblen().
+ mblen() is optional in uClibc.
+
+ * eval_intern.h (CharNext): Don't use mblen() is not available.
+
+Wed Apr 24 15:55:06 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * io.c (rb_fd_fix_cloexec): use rb_update_max_fd().
+
+Wed Apr 24 14:08:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * numeric.c: Fix wiki link on Float imprecision in overview, patched
+ by Makoto Kishimoto [Bug #8304] [ruby-dev:47280]
+
+Wed Apr 24 14:03:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (parser_yylex): disallow $- without following identifier
+ character. [ruby-talk:406969]
+
+ * parse.y (is_special_global_name): mere $- is not a valid global
+ variable name.
+
+Wed Apr 24 13:54:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * string.c: Document String#setbyte return value by @gjmurakami-10gen
+ [Fixes GH-294]
+
+Wed Apr 24 13:45:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * class.c: Example of Object#methods by @windwiny [Fixes GH-293]
+ * ruby.c: Document return values of Kernel #sub, #gsub, and #chop
+
+Wed Apr 24 12:54:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/socket/lib/socket.rb: Doc typos by @vipulnsward [Fixes GH-292]
+
+
+Wed Apr 24 12:54:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/socket/lib/socket.rb: Doc typos by @vipulnsward [Fixes GH-292]
+
+Wed Apr 24 12:27:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * array.c: Fix documentation for Array#index and #replace aliases
+ Based on a patch by @phiggins [Fixes GH-282]
+
+Tue Apr 23 21:14:38 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * string.c (rb_str_inspect): refix r40413, on Ruby 1.9 usual character
+ escape uses hex/Unicode escapes, so fix to use Unicode escape on
+ Unicode strings and hex on others. [ruby-core:54458] [Bug #8290]
+
+Tue Apr 23 20:10:02 2013 Tanaka Akira <akr@fsij.org>
+
+ * missing/isnan.c (isnan): Don't define if isnan() macro is defined.
+ This fixes a compilation failure on uClibc based Gentoo system.
+
+Tue Apr 23 17:40:40 2013 Martin Duerst <duerst@it.aoyama.ac.jp>
+
+ * lib/rexml/document.rb, lib/rexml/element.rb,
+ lib/rexml/formatters/pretty.rb: remove opinionated
+ language in documentation. [Bug #8309],
+ reported by Charles Beckmann
+
+Tue Apr 23 14:04:44 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/imap.rb (getacl_response): parse the mailbox of an ACL
+ response correctly. [ruby-core:54365] [Bug #8281]
+
+Tue Apr 23 11:58:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_scrub): fix for UTF-32. strlen() on strings
+ contain NUL returns wrong result, use sizeof operator instead.
+ [ruby-dev:45975] [Feature #6752]
+
+Tue Apr 23 10:26:50 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * test/ruby/test_module.rb
+ (TestModule#test_const_get_invalid_name)
+ (test_const_defined_invalid_name): Fix expected values.
+
+Tue Apr 23 09:51:26 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * string.c (rb_str_inspect): NUL should not be represented as "\0"
+ when octal digits may follow. [ruby-core:54458] [Bug #8290]
+
+Mon Apr 22 22:54:00 2013 Charlie Somerville <charlie@charliesomerville.com>
+
+ * insns.def (opt_mod): Use % operator if both operands are positive for
+ a significant performance improvement. Thanks to @samsaffron.
+
+Mon Apr 22 17:09:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (r_object0): copy all instance variables not only generic
+ ivars, before calling post proc. [ruby-core:51163] [Bug #7627]
+
+Mon Apr 22 10:25:21 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * util.c (ruby_hdtoa): revert r29729.
+ If you want ruby to behave as before on x86, specify to use SSE like
+ -msse2 -mfpmath=sse for gcc.
+
+Sun Apr 21 23:19:00 2013 Charlie Somerville <charlie@charliesomerville.com>
+
+ * configure.in: Revert using sigsetjmp by default due to performance
+ problems on some systems (eg. older Linux)
+
+Sun Apr 21 21:35:00 2013 Charlie Somerville <charlie@charliesomerville.com>
+
+ * configure.in: Use sigsetjmp by default so jumping out of signal
+ handlers properly restores the signal mask and SS_ONSTACK flag.
+ [ruby-core:54175] [Bug #8254]
+
+ * configure.in: Manually check for presence of sigsetjmp. It is not a
+ function on some systems, so AC_CHECK_FUNCS cannot be used.
+
+Sun Apr 21 08:00:55 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/csv/test_features.rb, test/logger/test_logger.rb
+ test/mkmf/test_have_macro.rb, test/net/http/test_http.rb,
+ test/openssl/test_config.rb, test/psych/test_encoding.rb,
+ test/psych/test_exception.rb, test/psych/test_psych.rb,
+ test/psych/test_tainted.rb, test/readline/test_readline.rb,
+ test/rexml/test_contrib.rb, test/ruby/test_autoload.rb,
+ test/ruby/test_beginendblock.rb, test/ruby/test_exception.rb,
+ test/ruby/test_file.rb, test/ruby/test_io.rb,
+ test/ruby/test_marshal.rb, test/ruby/test_process.rb,
+ test/ruby/test_require.rb, test/ruby/test_rubyoptions.rb,
+ test/syslog/test_syslog_logger.rb, test/webrick/test_httpauth.rb,
+ test/zlib/test_zlib.rb: Use Tempfile.create.
+
+Sun Apr 21 00:15:36 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/tempfile.rb (Tempfile.create): Close when the block exits.
+
+Sat Apr 20 23:38:14 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/webrick/httpauth/htpasswd.rb: Use Tempfile.create to avoid
+ unintentional unlink() by the finalizer.
+ lib/webrick/httpauth/htdigest.rb: Ditto.
+
+Sat Apr 20 22:47:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/tempfile.rb (Tempfile.create): New method.
+ The method name is proposed by Shugo Maeda. [ruby-dev:47220]
+ [ruby-core:41478] [Feature #5707]
+
+Sat Apr 20 14:22:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (w_object): dump no ivars to the original by marshal_dump.
+ [ruby-core:54334] [Bug #8276]
+
+ * marshal.c (r_object0): copy all ivars of marshal_dump data to the
+ result object instead. [ruby-core:51163] [Bug #7627]
+
+Sat Apr 20 02:33:27 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * string.c (str_scrub): add ruby method String#scrub which verify and
+ fix invalid byte sequence. [ruby-dev:45975] [Feature #6752]
+
+ * string.c (str_compat_and_valid): check given string is compatible
+ and valid with given encoding.
+
+ * transcode.c (str_transcode0): If invalid: :replace is specified for
+ String#encode, replace invalid byte sequence even if the destination
+ encoding equals to the source encoding.
+
+Fri Apr 19 21:55:40 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * README.EXT.ja (Data_Wrap_Struct): Remove a description about
+ orphan argument. Oh, I renamed the argument name without
+ changing description at r36180... Sorry....
+ Patch by Makoto Kishimoto. Thanks!!! [ruby-dev:47269] [Bug #8292]
+ * README.EXT.ja (Data_Make_Struct): Add a sample code that describes
+ how it works.
+ Patch by Makoto Kishimoto. Thanks!!! [ruby-dev:47269] [Bug #8292]
+
+Fri Apr 19 17:54:57 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * lib/net/imap.rb (body_type_msg): should accept
+ message/delivery-status with extra data.
+ [ruby-core:53741] [Bug #8167]
+
+ * test/net/imap/test_imap_response_parser.rb: related test.
+
+Fri Apr 19 13:03:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (w_object): do not dump encoding which is dumped with
+ marshal_dump data. [ruby-core:54334] [Bug #8276]
+
+Fri Apr 19 11:36:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (stack_protector): control use of -fstack-protector.
+
+ * configure.in (debugflags): let -fstack-protector precede and disable
+ debugflags, because they can't work together on SmartOS. [Bug #8268]
+
+Fri Apr 19 07:43:52 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * test/openssl/test_cipher.rb: Correct a typo
+ by jgls <joerg@joergleis.com>
+ https://github.com/ruby/ruby/pull/291 fix GH-291
+
+Thu Apr 18 16:58:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c (rb_mod_public_method): fix visibility on anonymous
+ module. set visibility of singleton method, not method in base
+ class. [ruby-core:54404] [Bug #8284]
+
+Thu Apr 18 16:20:51 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (glob_helper): should skip dot directories only for recursion,
+ but should not if matching to the given pattern. [ruby-core:54387]
+ [Bug #8283]
+
+Thu Apr 18 16:20:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * pack.c (pack_unpack): increase buffer size to fix buffer overflow,
+ and fix garbage just after unpacking without missing paddings.
+ [Bug #8286]
+
+Thu Apr 18 13:35:54 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * pack.c (pack_unpack): output characters even if the input doesn't
+ have paddings. [Bug #8286]
+
+Thu Apr 18 08:20:48 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * common.mk (clean-ext): remove timestamps.
+
+Wed Apr 17 22:07:50 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/rubysocket.h (SOCKLEN_MAX): Expression simplified.
+
+Wed Apr 17 20:09:19 2013 Aman Gupta <ruby@tmm1.net>
+
+ * compile.c (iseq_add_mark_object): Use new rb_iseq_add_mark_object().
+
+ * insns.def (setinlinecache): Ditto.
+
+ * iseq.c (rb_iseq_add_mark_object): New function to allocate
+ iseq->mark_ary on demand. [Bug #8142]
+
+ * iseq.h (rb_iseq_add_mark_object): Ditto.
+
+ * iseq.c (prepare_iseq_build): Avoid allocating mark_ary until needed.
+
+ * iseq.c (rb_iseq_build_for_ruby2cext): Ditto.
+
+Wed Apr 17 20:00:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/rubysocket.h (SOCKLEN_MAX): Defined.
+
+ * ext/socket/raddrinfo.c (ext/socket/raddrinfo.c): Reject too long
+ Linux abstract socket name.
+
+Wed Apr 17 19:45:27 2013 Aman Gupta <tmm1@ruby-lang.org>
+
+ * iseq.c (iseq_location_setup): re-use existing string when iseq has
+ the same path and absolute_path. [Bug #8149]
+
+Wed Apr 17 11:38:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/test/unit/assertions.rb (Test::Unit::Assertions#assert):
+ UNASSIGNED is not a valid message.
+
+Wed Apr 17 10:58:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (sleep_timeval): get rid of overflow on Windows where
+ timeval.tv_sec is not time_t but mere long.
+
+Tue Apr 16 23:07:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/unixsocket.c (unix_send_io): Suppress a warning by clang.
+ (unix_recv_io): Ditto.
+
+Tue Apr 16 12:27:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/sdbm/init.c: Fix comment indentation, by windwiny [Fixes GH-277]
+
+Tue Apr 16 12:25:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/socket/option.c: Document synonymous methods, by windwiny [GH-277]
+ * ext/stringio/stringio.c: ditto
+ * ext/io/wait/wait.c: ditto
+ * ext/gdbm/gdbm.c: ditto
+ * ext/dl/cfunc.c: ditto
+ * ext/zlib/zlib.c: ditto
+ * ext/win32ole/win32ole.c: ditto
+ * ext/dbm/dbm.c: ditto
+ * ext/json/generator/generator.c: ditto
+ * ext/date/date_core.c: ditto
+
+Tue Apr 16 11:23:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/openssl/*: Document synonymous methods, by windwiny [GH-277]
+
+Mon Apr 15 22:21:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/fiddle/depend: New file.
+
+Mon Apr 15 22:01:02 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el (ruby-electric-insert): Check
+ ruby-electric-is-last-command-char-expandable-punct-p here.
+
+ * misc/ruby-electric.el (ruby-electric-closing-char): New
+ interactive function bound to closing characters. Typing one of
+ those closing characters right after the matching counterpart
+ cancels the effect of automatic closing. For example, typing
+ "{" followed by "}" simply makes "{}" instead of "{ } }".
+
+Mon Apr 15 12:54:42 2013 Martin Bosslet <Martin.Bosslet@gmail.com>
+
+ * ext/openssl/ossl_ssl.c: Correct shutdown behavior w.r.t GC.
+
+ * test/openssl/test_ssl.rb: Add tests to verify correct behavior.
+
+ [Bug #8240] Patch provided by Shugo Maeda. Thanks!
+
+Mon Apr 15 10:23:39 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/coverage/depend: fix id.h place as r40283.
+
+ * ext/coverage/extconf.rb: add topdir and topsrcdir to VPATH.
+
+Sun Apr 14 19:46:14 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/-test-/debug/depend: New file.
+
+ * ext/-test-/exception/depend: Ditto.
+
+ * ext/-test-/printf/depend: Ditto.
+
+ * ext/-test-/string/depend: Ditto.
+
+ * ext/coverage/depend: Ditto.
+
+ * ext/io/console/depend: Ditto.
+
+ * ext/io/nonblock/depend: Ditto.
+
+ * ext/io/wait/depend: Ditto.
+
+ * ext/openssl/depend: Ditto.
+
+ * ext/pathname/depend: Ditto.
+
+ * ext/psych/depend: Ditto.
+
+ * ext/zlib/depend: Ditto.
+
+Sun Apr 14 02:46:50 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/mkmf.rb (MakeMakefile#create_makefile): remove {$(VPATH)} other
+ than nmake.
+
+ * ext/ripper/depend: use VPATH expecting removed by above.
+
+Sat Apr 13 23:06:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (timestamp_file): gather timestamp files in one
+ directory from each extension directories.
+
+Sat Apr 13 21:09:02 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * lib/mkmf.rb (MakeMakefile#create_makefile): output new macro
+ disthdrdir to specify the path of id.h, parse.h and etc.
+
+ * ext/ripper/depend: use above macro.
+
+Sat Apr 13 20:28:08 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * Merge Onigmo 5.13.4 f22cf2e566712cace60d17f84d63119d7c5764ee.
+ [bug] fix problem with optimization of \z (Issue #16) [Bug #8210]
+
+Sat Apr 13 18:56:15 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/ripper/depend: parse.h and id.h may be created on topdir.
+
+Sat Apr 13 12:08:16 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * lib/matrix.rb: Add Vector#cross_product, patch by Luis Ezcurdia
+ [fix GH-276] [rubyspec:81eec89a124]
+
+Sat Apr 13 10:20:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * struct.c (rb_struct_define_without_accessor, rb_struct_define),
+ (rb_struct_s_def): hide member names array.
+
+ * struct.c (anonymous_struct, new_struct, setup_struct): split
+ make_struct() for each purpose.
+
+Sat Apr 13 09:34:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/mkmf.rb: Add ruby/ruby.h, ruby/missing.h, ruby/intern.h,
+ ruby/st.h and ruby/subst.h for ruby_headers in generated Makefile.
+
+ * ext/-test-/old_thread_select/depend: Update dependencies.
+
+ * ext/-test-/wait_for_single_fd/depend: Ditto.
+
+ * ext/bigdecimal/depend: Ditto.
+
+ * ext/curses/depend: Ditto.
+
+ * ext/digest/bubblebabble/depend: Ditto.
+
+ * ext/digest/depend: Ditto.
+
+ * ext/digest/md5/depend: Ditto.
+
+ * ext/digest/rmd160/depend: Ditto.
+
+ * ext/digest/sha1/depend: Ditto.
+
+ * ext/digest/sha2/depend: Ditto.
+
+ * ext/dl/callback/depend: Ditto.
+
+ * ext/dl/depend: Ditto.
+
+ * ext/etc/depend: Ditto.
+
+ * ext/nkf/depend: Ditto.
+
+ * ext/objspace/depend: Ditto.
+
+ * ext/pty/depend: Ditto.
+
+ * ext/readline/depend: Ditto.
+
+ * ext/ripper/depend: Ditto.
+
+ * ext/sdbm/depend: Ditto.
+
+ * ext/socket/depend: Ditto.
+
+ * ext/stringio/depend: Ditto.
+
+ * ext/strscan/depend: Ditto.
+
+ * ext/syslog/depend: Ditto.
+
+ * ext/-test-/num2int/depend: Removed.
+
+ * ext/dbm/depend: Ditto.
+
+ * ext/fcntl/depend: Ditto.
+
+ * ext/gdbm/depend: Ditto.
+
+ * ext/racc/cparse/depend: Ditto.
+
+Sat Apr 13 00:15:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/etc/etc.c (Init_etc): move Passwd and Group under Etc namespace
+ as primary names.
+
+Fri Apr 12 21:06:55 2013 Tanaka Akira <akr@fsij.org>
+
+ * common.mk: pack.o depends on internal.h.
+
+Fri Apr 12 20:59:24 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (ones): Use __builtin_popcountl if available.
+
+ * internal.h (GCC_VERSION_SINCE): Macro moved from pack.c.
+
+ * pack.c: Include internal.h for GCC_VERSION_SINCE.
+
+Fri Apr 12 18:29:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * common.mk: version.o depends on $(srcdir)/include/ruby/version.h
+ instead of {$(VPATH)}version.h to avoid confusion by VPATH between
+ top level version.h and include/ruby/version.h for build in-place.
+ [ruby-dev:47249] [Bug #8256]
+
+Fri Apr 12 15:21:24 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_callee_setup_keyword_arg): non-symbol key is not
+ a keyword argument, keep it as a positional argument.
+
+Fri Apr 12 11:58:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * array.c: Document synonymous methods, by windwiny [GH-277]
+ * bignum.c: ditto
+ * complex.c: ditto
+ * dir.c: ditto
+ * encoding.c: ditto
+ * enumerator.c: ditto
+ * numeric.c: ditto
+ * proc.c: ditto
+ * re.c: ditto
+ * string.c: ditto
+
+Thu Apr 11 23:41:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * common.mk: Add dependencies for include/ruby.h
+
+ * tool/update-deps: Use "make -p all miniruby ruby golf" to extract
+ dependencies in makefiles.
+
+Thu Apr 11 23:21:17 2013 Tanaka Akira <akr@fsij.org>
+
+ * tool/update-deps: Use "make -p all golf" to extract dependencies in
+ makefiles.
+
+Thu Apr 11 21:02:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * common.mk: Dependency updated.
+
+ * tool/update-deps: Rewritten.
+
+Thu Apr 11 19:59:48 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * common.mk: partially revert r40183, which breaks building on
+ other than source directory. (its commit log also says the same
+ thing, but such failure is not reproducible on my environment
+ and the commit breaks build on my environment)
+
+Thu Apr 11 16:10:01 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 on
+ Mac OS X and Linux [Bug #3371]
+
+Thu Apr 11 13:19:22 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/drb/drbtest.rb (Drb{Core,Ary}#teardown): retry Process.kill
+ if it fails with Errno::EPERM on Windows (workaround).
+ [ruby-dev:47245] [Bug #8251]
+
+Thu Apr 11 11:11:38 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * dir.c: Fix a typo.
+
+Thu Apr 11 10:39:34 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): add missing case:
+ RUBY_LIBFFI_MODVERSION is not defined (usually on Windows).
+
+Thu Apr 11 09:27:04 2013 Konstantin Haase <me@rkh.im>
+
+ * dir.c (file_s_fnmatch): Document File::FNM_EXTGLOB flag.
+
+Thu Apr 11 09:17:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * README: Fix typo by Benjamin Winkler [Fixes GH-281]
+
+Thu Apr 11 06:15:51 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * regint.h: fix typo: _M_AMD86 -> _M_AMD64.
+
+ * siphash.c: ditto.
+
+ * st.c: ditto.
+
+Thu Apr 11 06:09:57 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/fiddle/extconf.rb: define RUBY_LIBFFI_MODVERSION macro.
+
+ * ext/fiddle/closure.c (USE_FFI_CLOSURE_ALLOC): define 0 or 1
+ with platform and libffi's version. [Bug #3371]
+
+Thu Apr 11 05:30:43 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * lib/mkmf.rb (pkg_config): Add optional argument "option".
+ If it is given, it returns the result of
+ `pkg-config --<option> <pkgname>`.
+
+Thu Apr 11 03:33:05 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/fiddle/closure.c (initialize): check mprotect's return value.
+ If mprotect is failed because of PaX or something, its function call
+ will cause SEGV.
+ http://c5664.rubyci.org/~chkbuild/ruby-trunk/log/20130401T210301Z.diff.html.gz
+
+Wed Apr 10 17:39:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/bigdecimal/bigdecimal.c (VpCtoV): Initialize a local variable
+ even when overflow.
+
+Wed Apr 10 12:32:37 2013 Tanaka Akira <akr@fsij.org>
+
+ * bignum.c (rb_ll2big): Don't overflow on signed integer negation.
+
+ * ext/bigdecimal/bigdecimal.c (MUL_OVERFLOW_SIGNED_VALUE_P): New
+ macro.
+ (AddExponent): Don't overflow on signed integer multiplication.
+ (VpCtoV): Don't overflow on signed integer arithmetic.
+ (VpCtoV): Don't overflow on signed integer arithmetic.
+
+Wed Apr 10 06:32:12 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (MUL_OVERFLOW_INT_P): New macro.
+
+ * sprintf.c (GETNUM): Don't overflow on signed integer multiplication.
+
+Tue Apr 9 20:38:20 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (MUL_OVERFLOW_SIGNED_INTEGER_P): New macro.
+ (MUL_OVERFLOW_FIXNUM_P): Ditto.
+ (MUL_OVERFLOW_LONG_P): Ditto.
+
+ * array.c (rb_ary_product): Don't overflow on signed integer
+ multiplication.
+
+ * numeric.c (fix_mul): Ditto.
+ (int_pow): Ditto.
+
+ * rational.c (f_imul): Ditto.
+
+ * insns.def (opt_mult): Ditto.
+
+ * thread.c (sleep_timeval): Don't overflow on signed integer addition.
+
+ * bignum.c (rb_int2big): Don't overflow on signed integer negation.
+ (rb_big2ulong): Ditto.
+ (rb_big2long): Ditto.
+ (rb_big2ull): Ditto.
+ (rb_big2ll): Ditto.
+
+Tue Apr 9 19:45:44 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/open-uri.rb: Support multiple fields with same field
+ name (like Set-Cookie).
+ (OpenURI::Meta#metas): New accessor to obtain fields as a Hash from
+ field name (string) to field values (array of strings).
+ [ruby-core:37734] [Bug #4964] reported by ren li.
+
+Tue Apr 9 15:26:12 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): append keyword hash to argument array
+ to splat if needed. [ruby-core:54094] [Bug #8236]
+
+Tue Apr 9 10:02:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (timestamp_file): gather timestamp files in one
+ directory from each extension directories, with considering
+ target_prefix.
+
+Tue Apr 9 04:57:59 JST 2013 Charles Oliver Nutter <headius@headius.com>
+
+ * error.c: Capture EAGAIN, EWOULDBLOCK, EINPROGRESS exceptions and
+ export them for use in WaitReadable/Writable exceptions.
+ * io.c: Create versions of EAGAIN, EWOULDBLOCK, EINPROGRESS that
+ include WaitReadable and WaitWritable. Add rb_readwrite_sys_fail
+ for nonblocking failures using those exceptions. Use that
+ function in io_getpartial and io_write_nonblock instead of
+ rb_mod_sys_fail
+ * ext/openssl/ossl_ssl.c: Add new SSLError subclasses that include
+ WaitReadable and WaitWritable. Use those classes for
+ write_would_block and read_would_block instead of rb_mod_sys_fail.
+ * ext/socket/ancdata.c: Use rb_readwrite_sys_fail instead of
+ rb_mod_sys_fail in bsock_sendmsg_internal and
+ bsock_recvmsg_internal.
+ * ext/socket/init.c: Use rb_readwrite_sys_fail instead of
+ rb_mod_sys_fail in rsock_s_recvfrom_nonblock and
+ rsock_s_connect_nonblock.
+ * ext/socket/socket.c: Use rb_readwrite_sys_fail instead of
+ rb_mod_sys_fail in sock_connect_nonblock.
+ * include/ruby/ruby.h: Export rb_readwrite_sys_fail for use instead
+ of rb_mod_sys_fail. Introduce new constants RB_IO_WAIT_READABLE and
+ RB_IO_WAIT_WRITABLE for first arg to rb_readwrite_sys_fail.
+
+Tue Apr 9 02:44:32 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/socket/extconf.rb: $defs needs -D or -U. nothing is added
+ otherwize.
+
+ * ext/socket/extconf.rb: check struct in_addr6, which is defined in
+ VC6 instead of in6_addr.
+
+ * ext/socket/option.c (optname_to_sym): fix macro name.
+
+ * ext/socket/constants.c (rsock_cmsg_type_arg): fix macro name.
+
+Mon Apr 8 23:57:21 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (id_for_setter): extract common code from const, class
+ variable, instance variable setters.
+
+Mon Apr 8 23:55:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/depend (ENCOBJS, TRANSOBJS): use explicit path to ruby.h for
+ nmake.
+
+ * ext/depend (ENCOBJS, TRANSOBJS): fix header dependency, VPATH has
+ $(srcdir)/include/ruby but not $(srcdir)/include, so cannot find out
+ ruby/ruby.h. use ruby.h instead and ../ruby for include/ruby.h.
+
+Mon Apr 8 20:30:37 2013 Yuki Yugui Sonoda <yugui@google.com>
+
+ * ext/depend (ENCOBJS, TRANSOBJS): Add missing dependencies.
+
+Mon Apr 8 17:19:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/win32ole/win32ole.c (fole_missing): should check actual argument
+ count before accessing.
+
+Mon Apr 8 16:03:55 2013 Yuki Yugui Sonoda <yugui@google.com>
+
+ Fixes a build failure of ext/ripper/ripper.c on building out of place.
+ * common.mk (id.h, id.c): Always generated in $(srcdir).
+ (ext/ripper/ripper.c): Passes $(PATH_SEPARATOR) too to the sub make.
+
+Mon Apr 8 12:05:02 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * object.c (rb_obj_ivar_set): call to_str for string only once.
+ to_str was called from rb_is_const_name and rb_to_id before.
+
+ * object.c (rb_mod_const_set): ditto.
+
+ * object.c (rb_mod_cvar_set): ditto.
+
+Sun Apr 7 13:56:16 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * test/ruby/test_require.rb (TestRequire#test_require_nonascii_path):
+ RUBY_PLATFORM should escape as Regexp,
+ because RUBY_PLATFORM may contain '.'.
+
+Sun Apr 7 10:44:01 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/defines.h: Simplify the logic to include sys/select.h.
+ This fixes a compilation error on Haiku (gcc2 and gcc4).
+
+ * configure.in: Use shared linker as $(CC) for Haiku.
+ This fixes a build error on Haiku (gcc2).
+
+Sun Apr 7 10:41:30 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv.rb (MDNSOneShot#sender): Delete an unused variable.
+
+Sun Apr 7 03:24:36 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * addr2line.c: use more generic type:
+ * u_char -> unsigned char
+ * u_short -> unsigned short
+ * u_int -> unsigned int
+ * u_long -> unsigned long
+ * quad_t -> int64_t
+ * u_quad_t -> uint64_t
+
+ * addr2line.c (imax): inline is defined by configure.
+
+Sun Apr 7 01:40:39 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el (ruby-electric-hash): New electric
+ function that expands a hash sign inside a string or regexp to
+ "#{}".
+
+ * misc/ruby-electric.el (ruby-electric-curlies): Do not insert
+ spaces inside when the curly brace is a delimiter of %r, %w,
+ etc.
+
+ * misc/ruby-electric.el (ruby-electric-curlies): Insert another
+ space before a closing curly brace when
+ ruby-electric-newline-before-closing-bracket is nil.
+
+Sun Apr 7 01:01:26 2013 Tanaka Akira <akr@fsij.org>
+
+ * strftime.c (rb_strftime_with_timespec): Test yday range.
+ [ruby-core:44088] [Bug #6247] reported by Ruby Submit.
+
+Sat Apr 6 23:46:54 2013 Naohisa Goto <ngotogenome@gmail.com>
+
+ * configure.in (AC_CHECK_HEADERS): atomic.h for Solaris atomic_ops.
+
+ * ruby_atomic.h: Skip using Solaris10 atomic_ops on Solaris 9 or
+ earlier if atomic.h is not available. [ruby-dev:47229] [Bug #8228]
+
+Sat Apr 6 23:40:40 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv.rb: Support LOC resources.
+ [ruby-core:23361] [Feature #1436] by JB Smith.
+
+Sat Apr 6 23:38:09 2013 Naohisa Goto <ngotogenome@gmail.com>
+
+ * addr2line.c: quad_t and u_quad_t is not available on Solaris.
+ __inline is not available with old compilers on Solaris.
+ [ruby-dev:47229] [Bug #8227]
+
+Sat Apr 6 23:31:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv.rb: Add one-shot multicast DNS support.
+ [ruby-core:53387] [Feature #8089] by Eric Hodel.
+
+Sat Apr 6 22:12:01 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv.rb (Resolv::DNS.fetch_resource): New method to obtain
+ full result.
+ [ruby-dev:43587] [Feature #4788] proposed by Makoto Kishimoto.
+
+Sat Apr 6 20:17:51 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/socket.c (rsock_sys_fail_raddrinfo): Renamed from
+ rsock_sys_fail_addrinfo.
+ (rsock_sys_fail_raddrinfo_or_sockaddr): Renamed from
+ rsock_sys_fail_addrinfo_or_sockaddr.
+
+ * ext/socket/rubysocket.h: Follow the above change.
+
+Sat Apr 6 19:24:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/socket.c (rsock_sys_fail_sockaddr): Takes struct sockaddr
+ and socklen_t instead of String object.
+ (rsock_sys_fail_addrinfo_or_sockaddr): Follow the above change.
+
+ * ext/socket/rubysocket.h (rsock_sys_fail_sockaddr): Follow the above
+ change.
+
+Sat Apr 6 14:28:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/rubysocket.h (SockAddrStringValueWithAddrinfo): New macro.
+ (rsock_sockaddr_string_value_with_addrinfo): New declaration.
+ (rsock_addrinfo_inspect_sockaddr): Ditto.
+ (rsock_sys_fail_addrinfo): Ditto.
+ (rsock_sys_fail_sockaddr_or_addrinfo): Ditto.
+
+ * ext/socket/raddrinfo.c (rsock_addrinfo_inspect_sockaddr): Renamed
+ from addrinfo_inspect_sockaddr and exported.
+ (rsock_sockaddr_string_value_with_addrinfo): New function to obtain
+ string and possibly addrinfo object.
+
+ * ext/socket/socket.c (rsock_sys_fail_sockaddr): Don't use
+ rsock_sys_fail_host_port which is IP dependent. Invoke
+ rsock_sys_fail_addrinfo.
+ (rsock_sys_fail_addrinfo): New function using
+ rsock_addrinfo_inspect_sockaddr.
+ (rsock_sys_fail_addrinfo_or_sockaddr): New function.
+ (sock_connect): Use SockAddrStringValueWithAddrinfo and
+ rsock_sys_fail_addrinfo_or_sockaddr.
+ (sock_connect_nonblock): Ditto.
+ (sock_bind): Ditto.
+
+Sat Apr 6 13:34:20 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/socket.c (rsock_sys_fail_sockaddr): Delete 2nd argument.
+
+ * ext/socket/rubysocket.h (rsock_sys_fail_sockaddr): Follow above
+ change.
+
+Sat Apr 6 13:13:39 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/socket.c (rsock_sys_fail_path): Use rb_str_inspect only
+ for String to avoid SEGV.
+
+Sat Apr 6 12:40:16 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/rubysocket.h (rsock_sys_fail_host_port): Wrap by NORETURN.
+ (rsock_sys_fail_path): Ditto.
+ (rsock_sys_fail_sockaddr): Ditto.
+
+Sat Apr 6 11:49:35 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/socket.c (rsock_sys_fail_path): Use rb_str_inspect if the
+ path contains a NUL.
+
+Sat Apr 6 11:39:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket: Improve socket exception message to show socket address.
+ [ruby-core:45617] [Feature #6583] proposed Eric Hodel.
+
+ * ext/socket/rubysocket.h (rsock_sys_fail_host_port): Declared.
+ (rsock_sys_fail_path): Ditto.
+ (rsock_sys_fail_sockaddr): Ditto.
+
+ * ext/socket/udpsocket.c (udp_connect): Use rsock_sys_fail_host_port.
+ (udp_bind): Ditto.
+ (udp_send): Ditto.
+
+ * ext/socket/init.c (rsock_init_sock): Specify a string for rb_sys_fail
+ argument.
+ (make_fd_nonblock): Ditto.
+ (rsock_s_accept): Ditto.
+
+ * ext/socket/ipsocket.c (init_inetsock_internal): Use
+ rsock_sys_fail_host_port.
+
+ * ext/socket/socket.c (rsock_sys_fail_host_port): Defined.
+ (rsock_sys_fail_path): Ditto.
+ (rsock_sys_fail_sockaddr): Ditto.
+ (setup_domain_and_type): Use rsock_sys_fail_sockaddr.
+ (sock_connect_nonblock): Ditto.
+ (sock_bind): Ditto.
+ (sock_gethostname): Specify a string for rb_sys_fail argument.
+ (socket_s_ip_address_list): Ditto.
+
+ * ext/socket/basicsocket.c (bsock_shutdown): Specify a string for
+ rb_sys_fail argument.
+ (bsock_setsockopt): Use rsock_sys_fail_path.
+ (bsock_getsockopt): Ditto.
+ (bsock_getpeereid): Refine the argument for rb_sys_fail.
+
+ * ext/socket/unixsocket.c (rsock_init_unixsock): Use
+ rsock_sys_fail_path.
+ (unix_path): Ditto.
+ (unix_send_io): Ditto.
+ (unix_recv_io): Ditto.
+ (unix_addr): Ditto.
+ (unix_peeraddr): Ditto.
+
+Sat Apr 6 11:23:18 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * test/ruby/test_require.rb (TestRequire#test_require_nonascii_path):
+ fix load path for encoding to run the test as stand-alone.
+
+Sat Apr 6 09:54:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * pack.c (NATINT_LEN): fix definition order, must be after
+ NATINT_PACK.
+
+Sat Apr 6 03:11:07 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/yaml_tree.rb: fix symbol keys in coder
+ emission. Thanks @tjwallace
+ * test/psych/test_coder.rb: test for change
+
+Sat Apr 6 02:54:08 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/exception.rb: there should be only one exception
+ base class. Fixes tenderlove/psych #125
+ * ext/psych/lib/psych.rb: require the correct exception class
+ * ext/psych/lib/psych/syntax_error.rb: ditto
+ * ext/psych/lib/psych/visitors/to_ruby.rb: ditto
+
+Sat Apr 6 02:30:28 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (new_defined): remove all extra parentheses, and return
+ "nil" for defined? with empty expression.
+ [ruby-core:54024] [Bug #8224]
+
+Sat Apr 6 02:06:04 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * ext/psych/lib/psych/visitors/to_ruby.rb: correctly register
+ self-referential strings. Fixes tenderlove/psych #135
+
+ * test/psych/test_string.rb: appropriate test.
+
+Sat Apr 6 01:21:56 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/init.c (cloexec_accept): Fix a compile error on
+ Debian GNU/kFreeBSD. Consider HAVE_ACCEPT4 is defined
+ but SOCK_CLOEXEC is not defined.
+
+Sat Apr 6 00:19:30 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * load.c (features_index_add): use rb_str_subseq() to specify C string
+ position properly to fix require non ascii path.
+ [ruby-core:53733] [Bug #8165]
+
+ * test/ruby/test_require.rb (TestRequire#test_require_nonascii_path):
+ a test for the above.
+
+Fri Apr 5 20:41:49 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/defines.h (HAVE_TRUE_LONG_LONG): Defined to distinguish
+ availability of long long and availability of 64bit integer type.
+
+ * pack.c: Use HAVE_TRUE_LONG_LONG to distinguish q! and Q! support.
+
+Fri Apr 5 20:19:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * addr2line.c: Include ruby/missing.h to fix compile error on Debian.
+
+Fri Apr 5 19:39:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): fix of defined? with empty
+ expression. [ruby-core:53999] [Bug #8220]
+
+Fri Apr 5 13:22:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/curses/curses.c (Init_curses): fix implementation function,
+ crmode should be same as cbreak. [ruby-core:54013] [Bug #8222]
+
+Fri Apr 5 12:06:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/curses/hello.rb: Typo in Curses example by Drew Blas
+ [Fixes GH-273]
+
+Thu Apr 4 23:45:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv.rb (bind_random_port): Rescue EACCES for SunOS.
+ bind() on SunOS for port 2049 (nfs) and 4045 (lockd) causes
+ EACCES with unprivileged process. cf. PRIV_SYS_NFS in privileges(5)
+ [ruby-core:48064] [Bug #7183] reported by Frank Meier.
+
+Thu Apr 4 23:24:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Remove condition for bcc.
+
+Thu Apr 4 22:53:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/ruby.h (FIX2LONG): Parenthesize the macro body.
+
+Thu Apr 4 22:32:32 2013 Tanaka Akira <akr@fsij.org>
+
+ * time.c (time_strftime): Describe %L and %N truncates digits under
+ the specified length.
+ [ruby-core:52130] [Bug #7829]
+
+Thu Apr 4 22:08:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * object.c (rb_mod_cvar_set): Reverted "avoid inadvertent
+ symbol creation" to avoid SEGV by
+ Class.new.class_variable_set(1, 2).
+
+Thu Apr 4 20:07:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/pathname/pathname.c (path_write): New method.
+ (path_binwrite): Ditto.
+ [ruby-core:49468] [Feature #7378]
+
+Thu Apr 4 16:51:29 2013 Yuki Yugui Sonoda <yugui@google.com>
+
+ * thread_pthread.c: Fixes wrong scopes of #if USE_SLEEPY_TIMER_THREAD
+ .. #endif sections. This fixes a build error on NativeClient.
+
+Wed Apr 3 17:25:31 2013 Yuki Yugui Sonoda <yugui@google.com>
+
+ * thread_pthread.c (ruby_init_stack): Avoid using uninitialized value.
+ stackaddr and size are not set if get_stack() fails.
+
+Thu Apr 4 16:55:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * struct.c (make_struct): avoid inadvertent symbol creation.
+ (rb_struct_aref): ditto.
+ (rb_struct_aset): ditto.
+
+Thu Apr 4 16:54:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * object.c (rb_mod_const_set): avoid inadvertent symbol creation.
+ (rb_obj_ivar_set): ditto.
+ (rb_mod_cvar_set): ditto.
+
+Thu Apr 4 15:46:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enum.c (enum_inject): avoid inadvertent symbol creation.
+
+Thu Apr 4 14:37:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (rb_thread_aref): avoid inadvertent symbol creation.
+ (rb_thread_variable_get): ditto.
+ (rb_thread_key_p): ditto.
+ (rb_thread_variable_p): ditto.
+
+Thu Apr 4 11:33:57 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/openssl/ossl_bn.c (ossl_bn_to_i): Use bn2hex to speed up.
+ In general, binary to/from decimal needs extra cost.
+
+Thu Apr 4 07:24:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Specify arguments to test functions.
+
+Thu Apr 4 03:25:09 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/openssl/ossl_bn.c (ossl_bn_initialize): fix can't create from bn.
+
+Wed Apr 3 22:09:25 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: Test functions and libraries after headers.
+
+Wed Apr 3 21:23:29 2013 Tanaka Akira <akr@fsij.org>
+
+ * io.c (rb_io_seek_m): Accept :CUR, :END, :SET as "whence" argument.
+ (interpret_seek_whence): New function.
+ [ruby-dev:45818] [Feature #6643]
+
+Wed Apr 3 20:52:49 2013 Tanaka Akira <akr@fsij.org>
+
+ * process.c: Describe the behavior which Ruby invokes a commandline
+ directly without shell if the commandline is simple enough.
+ [ruby-core:50459] [Bug #7489]
+
+Wed Apr 3 20:27:37 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/extmk.rb (extmake): Invoke Logging::log_close in a ensure
+ clause.
+
+Wed Apr 3 18:53:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/extmk.rb (extmake): Use Logging.open to switch stdout and
+ stderr. Delay Logging::log_close until the failure message is
+ written. Write the failure message only if log file is opened.
+
+ * lib/mkmf.rb (Logging.log_opened?): New method.
+
+ [ruby-dev:47215] [Bug #8209]
+
+Wed Apr 3 17:11:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/win32.c (constat_apply): pass through unknown sequence which
+ starts with ESC but is not followed by a bracket. [ruby-core:53879]
+ [Bug #8201]
+
+Wed Apr 3 16:35:32 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * bignum.c (rb_big_eq): hide intermediate Bignums not just freeing
+ memory. [ruby-core:53893] [Bug #8204]
+
+ * object.c (rb_obj_hide): hide an object by clearing klass.
+
+ * bignum.c (rb_big_eq): test as Fixnum if possible and get rid of zero
+ length Bignum. [ruby-core:53893] [Bug #8204]
+
+Tue Apr 2 23:56:03 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/securerandom.rb (SecureRandom.random_bytes): Use
+ OpenSSL::Random.random_add instead of OpenSSL::Random.seed and
+ specify 0.0 as the entropy.
+ [ruby-core:47308] [Bug #6928]
+
+Tue Apr 2 20:24:52 2013 Tanaka Akira <akr@fsij.org>
+
+ * pack.c: Support Q! and q! for long long.
+ (natstr): Moved to toplevel. Add q and Q if there is long long type.
+ (endstr): Moved to toplevel.
+ (NATINT_PACK): Consider long long.
+ (NATINT_LEN_Q): New macro.
+ (pack_pack): Support Q! and q!.
+ (pack_unpack): Ditto.
+ [ruby-dev:43970] [Feature #3946]
+
+Tue Apr 2 19:24:26 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/-test-/num2int/num2int.c: Define utility methods
+ as module methods of Num2int.
+
+ * test/-ext-/num2int/test_num2int.rb: Follow the above change.
+
+Tue Apr 2 18:49:01 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/securerandom.rb: Don't use Array#to_s.
+ [ruby-core:52058] [Bug #7811] fixed by zzak (Zachary Scott).
+
+Tue Apr 2 17:38:20 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * re.c (rb_reg_to_s): suppress duplicated charclass warning.
+ Regexp#to_s suppress extra its whole regexp options by calling
+ onig_new with its source, but it doesn't call rb_reg_preprocess.
+ Therefore its Unicode escapes (\u{XXXX}) are given as is,
+ and it may cause duplicated charclass warning for example
+ "[\u{33}]" (3 is duplicated) or "[\u{a}\u{b}]" (u is duplicated).
+ [ruby-core:53649] [Bug #8151]
+
+Tue Apr 2 16:00:06 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_dump.c (rb_print_backtrace): separate to ease showing C backtrace.
+
+ * internal.h (rb_print_backtrace): ditto.
+
+Tue Apr 2 15:22:09 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * test/ruby/envutil.rb (assert_separately): stop_auto_run of
+ Test::Unit::Runner to prevent auto runner use ARGV.
+
+ * test/ruby/envutil.rb (assert_separately): add $: to separate process.
+
+ * test/ruby/envutil.rb (assert_separately): fail if stderr is not
+ empty and ignore_stderr is false.
+
+Tue Apr 2 06:46:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/-test-/num2int/num2int.c: Rename utility methods
+ to global functions to ease manual experiments.
+
+ * test/-ext-/num2int/test_num2int.rb: Follow the above change.
+
+Mon Apr 1 22:26:17 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/zlib/zlib.c (rb_gzfile_set_mtime): Use NUM2UINT.
+ The old logic doesn't work well on LP64 platforms as:
+ .. -2**63-1 => error,
+ -2**63 .. -2**62-1 => success,
+ -2**62 .. -2**31-1 => error,
+ -2**31 .. 2**31-1 => success,
+ 2**31 .. 2**62-1 => error,
+ 2**62 .. 2**64-1 => success,
+ 2**64 .. => error.
+
+Mon Apr 1 22:08:02 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * ext/zlib/zlib.c (Zlib::Inflate.new):
+ Fix documentation syntax and naming errors.
+ Based on patch by Robin Dupret. Fix GH-271.
+
+Mon Apr 1 21:22:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/-ext-/num2int/test_num2int.rb: Test small bignums.
+
+Mon Apr 1 21:10:56 2013 Tanaka Akira <akr@fsij.org>
+
+ * numeric.c (rb_num2ulong_internal): Don't cast a negative double value
+ into unsigned long, which is undefined behavior.
+ (rb_num2ull): Don't cast a value bigger than LLONG_MAX into
+ long long, which is undefined behavior.
+
+Mon Apr 1 20:57:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/-test-/num2int/num2int.c: Return string for result, instead of
+ printing.
+
+ * test/-ext-/num2int/test_num2int.rb: updated to follow above change.
+
+Mon Apr 1 20:08:07 2013 Tanaka Akira <akr@fsij.org>
+
+ * numeric.c (rb_num2long): Don't use SIGNED_VALUE uselessly.
+ (check_int): Ditto.
+ (check_short): Ditto.
+ (rb_num2fix): Ditto.
+ (rb_num2ulong_internal): Add a cast.
+
+Mon Apr 1 18:41:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: skip autoconf 2.64 and 2.66, 2.67 seems short-lived
+ but stick on it for Debian Squeeze.
+
+Mon Apr 1 14:22:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: check clang version by predefined macro values.
+ [Bug #8192]
+
+Mon Apr 1 12:05:15 2013 Tanaka Akira <akr@fsij.org>
+
+ * numeric.c (check_uint): Take the 1st argument as unsigned long,
+ instead of VALUE. Refine the validity test conditions.
+ (check_ushort): Ditto.
+
+Mon Apr 1 07:15:03 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * configure.in: use quadrigraph to put '[' or ']'. [Bug #8192]
+
+Mon Apr 1 04:16:41 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * configure.in: kick old clang. [ruby-dev:47204] [Bug #8192]
+
+Mon Apr 1 01:12:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/ruby.h (FIX2ULONG): Make it consistent with NUM2ULONG.
+
+ * ext/-test-/num2int/num2int.c: Add utility methods for FIX2XXX tests.
+
+ * test/-ext-/num2int/test_num2int.rb: Add tests for FIX2XXX.
+
+Sun Mar 31 17:17:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (rb_mod_define_method): consider visibility in define_method.
+ patch by mashiro <mail AT mashiro.org>. fix GH-268.
+
+Sun Mar 31 15:40:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/configure.bat: try to fix option arguments split by commas and
+ equals here. this batch file no longer run with old command.com.
+
+ * tool/mkconfig.rb: no hacks for cmd.exe.
+
+Sun Mar 31 13:47:04 2013 Tanaka Akira <akr@fsij.org>
+
+ * numeric.c (rb_num2ulong_internal): New function similar to
+ rb_num2ulong but integer wrap around flag is also returned.
+ (rb_num2ulong): Use rb_num2ulong_internal.
+ (rb_num2uint): Use rb_num2ulong_internal and the wrap around flag is
+ used instead of negative_int_p(val).
+ (rb_num2ushort): ditto.
+
+Sun Mar 31 06:27:17 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (HAVE_METACLASS_P): should check FL_SINGLETON flag before get
+ instance variable to get rid of wrong warning about __attached__.
+ [ruby-core:53839] [Bug #8188]
+
+Sat Mar 30 14:11:28 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * bcc32: removed. agreed at
+ http://bugs.ruby-lang.org/projects/ruby/wiki/DevelopersMeeting20130223Japan
+
+Sat Mar 30 03:58:00 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/file.c (code_page): use cp1252 instead of cp20127 as US-ASCII.
+ fix [ruby-core:53079] [Bug #7996]
+ reported and patched by mmeltner (Michael Meltner).
+
+Sat Mar 30 03:49:21 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * win32/win32.c (wrename): use MoveFileExW instead of MoveFileW,
+ because the latter fails on cross device file move of some
+ environments.
+ fix [ruby-core:53492] [Bug #8109]
+ reported by mitchellh (Mitchell Hashimoto).
+
+Fri Mar 29 22:09:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (rb_mutex_synchronize_m): yield no block params. patch by
+ splattael (Peter Suschlik) in [ruby-core:53773] [Bug #8097].
+ fix GH-266.
+
+Fri Mar 29 16:51:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * io.c (argf_next_argv): set init flag if succeeded to forward, after
+ skipping.
+
+ * io.c (argf_block_call_i, argf_block_call): no more forwarding if
+ forwarded after skipping. [ruby-list:49185]
+
+ * io.c (argf_close): deal with init flag.
+
+ * io.c (argf_block_call_i, argf_block_call): forward next file if
+ skipped while iteration, to get rid of IOError. [ruby-list:49185]
+
+Fri Mar 29 11:09:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (configuration): not include all CFLAGS in CXXFLAGS, to
+ use different set than C for C++. [ruby-core:45273] [Bug #6504]
+
+Fri Mar 29 10:24:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/io.h: undef POSIX compliant names on AIX, which are no
+ longer needed. patch suggested by edelsohn (David Edelsohn) in
+ [ruby-core:53815]. [Bug #8174]
+
+Fri Mar 29 06:39:42 2013 Tanaka Akira <akr@fsij.org>
+
+ * numeric.c (rb_num2ull): Cast double to unsigned LONG_LONG via
+ LONG_LONG instead of double to unsigned LONG_LONG directly.
+ This is a challenge to fix a test_num2ull(TestNum2int)
+ failure (NUM2ULL(-1.0) should be "18446744073709551615" but was "0")
+ on Mac OS X with 32bit clang.
+ http://a.mrkn.jp/~mrkn/chkbuild/mountain_lion/ruby-trunk-m32-o0/log/20130328T191100Z.diff.html.gz
+
+Fri Mar 29 00:54:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (MAIN_DOES_NOTHING): ensure symbols for tests to be
+ preserved. [ruby-core:53745] [Bug #8169]
+
+Thu Mar 28 23:11:25 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv.rb: Test Windows platform by detecting LoadError when
+ require 'win32/resolv' suggested by Nobuyoshi Nakada [ruby-core:53389].
+ [ruby-core:53388] [Feature #8090] Reported by Charles Nutter.
+
+Thu Mar 28 23:10:10 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/io.h: rename SVR3,4 member names as POSIX compliant,
+ to get rid of conflict on AIX. [ruby-core:53765] [Bug #8174]
+
+Thu Mar 28 18:22:21 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/-ext-/num2int/test_num2int.rb: extract
+ assert_num2i_success_internal and assert_num2i_error_internal and
+ provide assertion messages as "NUM2XXX(NNN)".
+
+Thu Mar 28 07:05:25 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/intern.h: Delete redundant inclusions caused by
+ AC_INCLUDES_DEFAULT in defines.h.
+
+ * include/ruby/defines.h: Ditto.
+
+ * include/ruby/ruby.h: Ditto.
+
+ * include/ruby/st.h: Ditto.
+
+Thu Mar 28 06:51:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * include/ruby/defines.h: Fix a compilation error on NetBSD,
+ "type of formal parameter 1 is incomplete" for the rb_thread_wait_for
+ invocation in rb_file_flock, by including header files as
+ AC_INCLUDES_DEFAULT of autoconf.
+
+Wed Mar 27 22:09:14 2013 Tanaka Akira <akr@fsij.org>
+
+ * numeric.c (LONG_MIN_MINUS_ONE_IS_LESS_THAN): New macro.
+ (LLONG_MIN_MINUS_ONE_IS_LESS_THAN): Ditto.
+ (rb_num2long): Use LONG_MIN_MINUS_ONE_IS_LESS_THAN.
+ (rb_num2ulong): Ditto.
+ (rb_num2ll): Use LLONG_MIN_MINUS_ONE_IS_LESS_THAN.
+ (rb_num2ull): Ditto.
+
+ * test/-ext-/num2int/test_num2int.rb (assert_num2i_success): Test the
+ value converted into a Float if Float can represent the value
+ exactly.
+ (assert_num2i_error): Ditto.
+
+Wed Mar 27 20:59:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/-ext-/num2int/test_num2int.rb (assert_num2i_success): New
+ utility method.
+ (assert_num2i_error): Ditto.
+
+Wed Mar 27 20:37:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * time.c (num_exact): Use to_r method only if to_int method is
+ available.
+ [ruby-core:53764] [Bug #8173] Reported by Hiro Asari.
+
+Wed Mar 27 12:07:40 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/-ext-/num2int/test_num2int.rb (test_num2ll): test LLONG_MIN,
+ not LONG_MIN.
+
+Wed Mar 27 12:02:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (TIMET_MAX_PLUS_ONE): definition simplified.
+
+Wed Mar 27 06:39:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (MAIN_DOES_NOTHING): force to refer symbols for tests
+ to be preserved. [ruby-core:53745] [Bug #8169]
+
+Wed Mar 27 05:15:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (RUBY_REPLACE_TYPE): define SIGNEDNESS_OF_type same as
+ check_signedness of mkmf.rb.
+
+ * internal.h (TIMET_MAX, TIMET_MIN, TIMET_MAX_PLUS_ONE): use
+ SIGNEDNESS_OF_TIME_T.
+
+Wed Mar 27 00:28:45 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h (TIMET_MAX_PLUS_ONE): Defined.
+
+ * thread.c (double2timeval): Saturate out-of-range values.
+
+Tue Mar 26 23:41:18 2013 Tanaka Akira <akr@fsij.org>
+
+ * internal.h: Define TIMET_MAX and TIMET_MIN here.
+
+ * time.c: Remove TIMET_MAX and TIMET_MIN definitions.
+
+ * thread.c: Ditto.
+
+ * thread_pthread.c: Remove TIMET_MAX definition.
+
+ * thread_win32.c: Ditto.
+
+Tue Mar 26 22:31:10 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/socket.c (sockaddr_len): return the shortest length for
+ unknown socket address.
+
+Tue Mar 26 22:14:46 2013 Tanaka Akira <akr@fsij.org>
+
+ * thread.c (double2timeval): convert the infinity to TIME_MAX to avoid
+ SEGV by Thread.new {}.join(Float::INFINITY) on
+ Debian GNU/Linux (amd64).
+
+Mon Mar 25 07:09:20 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rinda/tuplespace.rb: Only return tuple entry once on move,
+ either through port or regular return, not both. This results in a
+ 120% speedup when combined with #8125. Patch by Joel VanderWerf.
+ [ruby-trunk - Feature #8119]
+
+Mon Mar 25 06:59:01 2013 Eric Hodel <drbrain@segment7.net>
+
+ * test/rinda/test_rinda.rb: Skip IPv6 tests if no IPv6 addresses
+ exist. Skip fork-dependent test if fork is not available.
+ [ruby-trunk - Bug #8159]
+
+Sun Mar 24 10:38:24 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * addr2line.c (putce): suppress unused return value warning.
+
+Mon Mar 25 02:01:03 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * proc.c (bm_free): need to clean up the mark flag of a free and
+ unlinked method entry. [Bug #8100] [ruby-core:53439]
+
+Sun Mar 24 22:13:51 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * string.c (rb_str_rpartition): revert r39903, and convert byte offset
+ to char offset; the return value of rb_reg_search is byte offset,
+ but other than it of rb_str_rpartition expects char offset.
+ [Bug #8138] [ruby-dev:47183]
+
+Sun Mar 24 18:29:46 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * string.c (rb_str_rpartition): Fix String#rpartition(/re/)
+ against a multibyte string. [Bug #8138] [ruby-dev:47183]
+
+Sun Mar 24 13:42:24 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * gc.c (GC_ENABLE_LAZY_SWEEP): new macro to switch lazy sweeping
+ for debugging. [Feature #8024] [ruby-dev:47135]
+
+Sun Mar 24 12:55:47 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * gc.c: We have no chance to expand the heap when lazy sweeping is
+ restricted. So collecting is often invoked if there is not
+ enough free space in the heap. Try to expand heap when this is
+ the case.
+
+Sun Mar 24 11:03:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/ruby/test_require.rb: Remove temporally files in the tests.
+
+ * test/ruby/test_rubyoptions.rb: Ditto.
+
+ * test/logger/test_logger.rb: Ditto.
+
+ * test/psych/test_psych.rb: Ditto.
+
+ * test/readline/test_readline.rb: Ditto.
+
+ * test/syslog/test_syslog_logger.rb: Ditto.
+
+ * test/webrick/test_httpauth.rb: Ditto.
+
+ * test/zlib/test_zlib.rb: Ditto.
+
+Sun Mar 24 05:36:29 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rinda/ring.rb: Added documentation for multicast support.
+
+ * NEWS: Point to above documentation.
+
+Sun Mar 24 05:32:39 2013 Eric Hodel <drbrain@segment7.net>
+
+ * test/rinda/test_rinda.rb: Restore tests commented out while fixing
+ test slowdown bug before r39895.
+
+Sun Mar 24 05:03:36 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rinda/ring.rb: Add multicast support to Rinda::RingFinger and
+ Rinda::RingServer. [ruby-trunk - Bug #8073]
+ * test/rinda/test_rinda.rb: Test for the above.
+
+ * NEWS: Update with Rinda multicast support
+
+Sun Mar 24 04:13:27 2013 Eric Hodel <drbrain@segment7.net>
+
+ * test/rinda/test_rinda.rb: Fixed test failures in r39890 and r39891
+ due to stopping DRb service.
+
+Sun Mar 24 03:34:02 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rinda/rinda.rb: Fixed loss of tuple when remote is alive but the
+ call stack was unwound. Patch by Joel VanderWerf.
+ [ruby-trunk - Bug #8125]
+ * test/rinda/test_rinda.rb: Test for the above.
+
+Sun Mar 24 02:14:53 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/mkmf/test_have_macro.rb: remove temporally files in the tests.
+
+Sat Mar 23 23:50:04 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * addr2line.c (kprintf): added from FreeBSD libstand's printf.
+ this is consided as async signal safe function.
+
+ * addr2line.c (rb_dump_backtrace_with_lines): use kfprintf.
+ [Bug #8144] [ruby-core:53632]
+
+Sat Mar 23 23:28:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_divide): Use Qnil and NIL_P
+ instead of (VALUE)0 as a return value.
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_div): ditto.
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_divremain): ditto.
+
+ * ext/bigdecimal/bigdecimal.c (BigDecimal_remainder): ditto.
+
+Sat Mar 23 17:39:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_eval.c (check_funcall_respond_to): preserve passed_block, which
+ is modified in vm_call0_body() via vm_call0(), and caused a bug of
+ rb_check_funcall() by false negative result of rb_block_given_p().
+ re-fix [ruby-core:53650] [Bug #8153].
+ [ruby-core:53653] [Bug #8154]
+
+Fri Mar 22 17:48:34 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/forwardable.rb (Forwardable::FILE_REGEXP): create regexp object
+ outside sources for eval, to reduce allocations in def_delegators
+ wrappers. //o option does not make each regexps shared. patch by
+ tmm1 (Aman Gupta) in [ruby-core:53620] [Bug #8143].
+
+Fri Mar 22 17:38:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (rb_feature_p), vm_core.h (rb_vm_struct): turn
+ loaded_features_index into st_table. patches by tmm1 (Aman Gupta)
+ in [ruby-core:53251] and [ruby-core:53274] [Bug #8048]
+
+Fri Mar 22 10:29:00 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/bigdecimal/bigdecimal.c: Fix style.
+
+Fri Mar 22 05:30:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (ambiguous_operator): refine warning message, since this
+ warning is shown after literal too.
+
+Fri Mar 22 04:51:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_callee_setup_keyword_arg): should check required
+ keyword arguments even if rest hash is defined. [ruby-core:53608]
+ [Bug #8139]
+
+Fri Mar 22 01:00:17 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * process.c (rb_execarg_addopt, run_exec_pgroup): use rb_pid_t
+ instead of pid_t.
+
+ * ext/pty/pty.c (raise_from_check, pty_check): ditto.
+
+Fri Mar 22 00:04:15 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * addr2line.c (rb_dump_backtrace_with_lines): output line at once.
+
+Thu Mar 21 23:17:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * thread.c (ruby_kill): get rid of deadlock on signal 0.
+ [ruby-dev:47182] [Bug #8137]
+
+Thu Mar 21 22:39:46 2013 Naohisa Goto <ngotogenome@gmail.com>
+
+ * marshal.c (marshal_dump, marshal_load): workaround for segv on
+ Intel Solaris compiled with Oracle SolarisStudio 12.3.
+ Partly revert r38174. [ruby-core:52042] [Bug #7805]
+
+Thu Mar 21 16:48:06 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (simple_re_meta): escape all closing characters, not only
+ round parenthesis. [ruby-core:53578] [Bug #8133]
+
+Thu Mar 21 13:50:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_core.h (UNINITIALIZED_VAR): suppress warnings by clang 4.2.
+ [ruby-core:51742] [Bug #7756]
+
+Thu Mar 21 07:34:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/date/date_core.c: Typo in Date::MONTHNAMES by Matt Gauger
+ [GH fixes #261]
+
+Wed Mar 20 22:53:14 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (find_library): fix to format message.
+ [ruby-core:53568] [Bug #8130]
+
+Wed Mar 20 22:52:52 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (install_dirs, with_destdir): prefix with DESTDIR
+ directories to install only unless bundled extension libraries.
+ [ruby-core:53502] [Bug #8115]
+
+Wed Mar 20 17:47:53 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/win32ole/test_err_in_callback.rb (TestErrInCallBack#setup):
+ allow using different root for source and build directories.
+ this may fixes a minor problem of r39834.
+
+Wed Mar 20 16:40:48 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * test/ruby/test_signal.rb (test_hup_me): skip if HUP isn't supported.
+ On Windows this test causes ArgumentError.
+
+Wed Mar 20 16:24:12 2013 Hiroshi Shirosaki <h.shirosaki@gmail.com>
+
+ * test/rubygems/test_gem_installer.rb (test_install_extension_flat):
+ use ruby in build directory in case ruby is not installed.
+ [ruby-core:53265] [Bug #8058]
+
+Wed Mar 20 15:22:07 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/win32ole/test_err_in_callback.rb (TestErrInCallBack#setup): use
+ relative path to get rid of "too long commandline" error.
+
+Wed Mar 20 04:27:42 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * test/rinda/test_rinda.rb: remove unused variables.
+ patched by Vipul A M <vipulnsward@gmail.com>
+
+Wed Mar 20 04:15:32 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * ext/bigdecimal/bigdecimal.c: fixed typo.
+ patched by Vipul A M <vipulnsward@gmail.com>
+
+Sat Mar 16 03:40:49 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * test/ruby/test_signal.rb (test_hup_me): added a few comments.
+
+Sat Mar 16 03:39:38 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread.c (ruby_kill): added a few comments.
+
+Sat Mar 16 03:36:56 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread.c (ruby_kill): release GVL while waiting signal delivered.
+
+Tue Mar 19 19:50:48 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ruby_kill (internal.h, thread.c): use rb_pid_t instead of pid_t.
+ this fixes the build failure of mswin introduced at r39819.
+
+Tue Mar 19 17:09:30 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * string.c (rb_str_conv_enc_opts): convert with one converter, instead
+ of re-creating converters for each buffer expansion.
+
+Tue Mar 19 17:06:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (glob_helper): compose HFS file names from UTF8-MAC.
+ [ruby-core:48745] [Bug #7267]
+
+Sat Mar 16 01:44:29 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * internal.h: added a declaration of ruby_kill().
+ * thread.c (ruby_kill): helper function of kill().
+
+ * signal.c (rb_f_kill): use ruby_kill() instead of kill().
+ * signal.c (rb_f_kill): call rb_thread_execute_interrupts()
+ to ensure that make SignalException if sent a signal
+ to myself. [Bug #7951] [ruby-core:52864]
+
+ * vm_core.h (typedef struct rb_thread_struct): added
+ th->interrupt_cond.
+ * thread.c (rb_threadptr_interrupt_common): added to
+ initialization of th->interrupt_cond.
+ * thread.c (thread_create_core): ditto.
+
+ * test/ruby/test_signal.rb (TestSignal#test_hup_me): test for
+ the above.
+
+Sat Mar 16 00:42:39 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * io.c (linux_iocparm_len): enable only exist _IOC_SIZE().
+ Because musl libc doesn't have it. [Bug #8051] [ruby-core:53229]
+
+Tue Mar 19 10:05:04 2013 Shota Fukumori <her@sorah.jp>
+
+ * ext/objspace/objspace.c: Fix typo in doc. Patch by Sho Hashimoto.
+ [Bug #8116] [ruby-dev:47177]
+
+Tue Mar 19 02:13:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * configure.in: set ac_cv_prog_cxx if CXX is supplied.
+
+Tue Mar 19 01:18:00 2013 Kenta Murata <mrkn@mrkn.jp>
+
+ * configure.in: Fix c++ compiler auto-selection not only for
+ Darwin 11.x, but also the other versions of Darwin.
+
+Tue Mar 19 00:26:22 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * gc.c: Improve accuracy of objspace_live_num() and
+ allocated/freed counters. patched by tmm1(Aman Gupta).
+ [Bug #8092] [ruby-core:53392]
+
+Mon Mar 18 21:42:48 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * gc.c: Avoid unnecessary heap growth. patched by tmm1(Aman Gupta).
+ [Bug #8093] [ruby-core:53393]
+
+Mon Mar 18 17:58:36 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * gc.c: Fix unlimited memory growth with large values of
+ RUBY_FREE_MIN. patched by tmm1(Aman Gupta).
+ [Bug #8095] [ruby-core:53405]
+
+Mon Mar 18 14:46:19 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/win32ole/test_err_in_callback.rb
+ (TestErrInCallBack#test_err_in_callback): shouldn't create a file in
+ the top of build directory.
+
+Mon Mar 18 13:29:52 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_dump.c (backtrace): on darwin use custom backtrace() to trace
+ beyond _sigtramp. darwin's backtrace can't trace beyond signal
+ trampoline with sigaltstack.
+
+ * configure.in: check execinfo.h on darwin.
+
+Mon Mar 18 11:03:23 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_exec.h (END_INSN): revert r39517 because the segv seems fixed by
+ r39806.
+
+Mon Mar 18 10:41:06 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_exec.c: Correct predefined macro name. This typo is introduced by
+ r36534 and should be backported to ruby_2_0_0.
+
+Mon Mar 18 03:18:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * array.c: Typo in Array#delete by Timo Sand [GH fixes #258]
+
+Mon Mar 18 01:14:56 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * io.c (io_fillbuf): show fd number on failure to debug.
+ http://c5632.rubyci.org/~chkbuild/ruby-trunk/log/20130316T050302Z.diff.html.gz
+
+Sun Mar 17 02:38:21 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * ext/date/date_core.c: include sys/time.h for avoiding implicit
+ declaration of gettimeofday().
+
+Sun Mar 17 00:55:31 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * include/ruby/missing.h: removed __linux__. it's unnecessary.
+
+Fri Mar 15 14:57:16 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread.c: disabled _FORTIFY_SOURCE for avoid to hit glibc bug.
+ [Bug #8080] [ruby-core:53349]
+ * test/ruby/test_io.rb (TestIO#test_io_select_with_many_files):
+ test for the above.
+
+Wed Mar 13 15:16:35 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * include/ruby/missing.h (__syscall): moved to...
+ * io.c: here. because __syscall() is only used from io.c.
+
+ * include/ruby/missing.h: move "#include <sys/type.h>" to ....
+ * include/ruby/intern.h: here. because it was introduced for
+ fixing NFDBITS issue. [ruby-core:05179].
+
+Wed Mar 13 14:38:53 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * include/ruby/missing.h (struct timespec): include <sys/time.h>
+
+Wed Mar 13 13:54:45 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in: check struct timeval exist or not.
+ * include/ruby/missing.h (struct timeval): check HAVE_STRUCT_TIMEVAL
+ properly. and don't include sys/time.h if struct timeval exist.
+
+ * file.c: include sys/time.h explicitly.
+ * random.c: ditto.
+ * thread_pthread.c: ditto.
+ * time.c: ditto.
+ * ext/date/date_strftime.c: ditto.
+
+Fri Mar 15 14:45:02 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * configure.in (_FORTIFY_SOURCE): added a few comments.
+
+Fri Mar 15 14:17:55 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread_pthread.c (numberof): renamed from ARRAY_SIZE() because
+ other all files use numberof().
+
+Say Mar 15 01:33:00 2013 Charles Oliver Nutter <headius@headius.com>
+
+ * test/ruby/test_lazy_enumerator.rb (TestLazyEnumerator#test_drop_while):
+ Modify while condition to show dropping remains off after first false
+ value. This change was made in 39711.
+
+Fri Mar 15 23:06:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * time.c (GetTimeval): check if already initialized instance.
+
+ * time.c (GetNewTimeval): check if newly created instance.
+
+ * time.c (time_init_0, time_init_1, time_init_copy, time_mload): must
+ be newly created instance. [ruby-core:53436] [Bug #8099]
+
+Fri Mar 15 14:51:33 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * file.c (rb_sys_fail_path_with_func): share same function, and path
+ may be nil.
+
+Fri Mar 15 08:24:51 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * io.c (rb_sys_fail_path): define & use rb_sys_fail_path0 like r39752
+
+Fri Mar 15 04:08:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * proc.c: Typo in Proc.arity found by Jack Nagel [Bug #8094]
+
+Thu Mar 14 16:59:09 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (rb_cv_function_name_string): macro for function name
+ string predefined identifier, __func__ in C99, or __FUNCTION__ in
+ gcc.
+
+ * file.c (rb_sys_fail_path): use RUBY_FUNCTION_NAME_STRING.
+
+Thu Mar 14 14:12:34 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * file.c (rb_sys_fail_path): use rb_sys_fail_path0 only on GCC.
+ __func__ is C99 feature.
+
+Thu Mar 14 12:59:59 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * file.c (rb_sys_fail_path0): add to append the name of called function
+ to ease debugging for example blow umask_spec failure.
+ http://fbsd.rubyci.org/~chkbuild/ruby-trunk/log/20130309T010202Z.diff.html.gz
+
+ * file.c (rb_sys_fail_path): use rb_sys_fail_path0.
+
+Thu Mar 14 12:53:15 2013 Luis Lavena <luislavena@gmail.com>
+
+ * win32/file.c (get_user_from_path): add internal function that retrieves
+ username from supplied path (refactored).
+ * win32/file.c (rb_file_expand_path_internal): refactor expansion of user
+ home to use get_user_from_path and cover dir_string corner cases.
+ [ruby-core:53168] [Bug #8034]
+
+Thu Mar 14 11:53:01 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * NEWS: describe RUBY_HEAP_SLOTS_GROWTH_FACTOR.
+
+Thu Mar 14 10:01:12 2013 Eric Hodel <drbrain@segment7.net>
+
+ * doc/globals.rdoc: $? is thread-local
+
+Wed Mar 13 23:25:59 2013 Narihiro Nakamura <authornari@gmail.com>
+
+ * gc.c: allow to tune growth of heap by environment variable
+ RUBY_HEAP_SLOTS_GROWTH_FACTOR. patched by tmm1(Aman Gupta).
+ [Feature #8015] [ruby-core:53131]
+
+Wed Mar 13 19:43:46 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * doc/irb/irb.rd.ja: fix typo
+
+ * ext/tk/MANUAL_tcltklib.eng: fix typos
+
+ * ext/tk/sample/tktextframe.rb (Tk#component_delegates): fix typo
+
+Wed Mar 13 15:13:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rb_obj_singleton_methods): collect methods from the origin
+ class. [ruby-core:53207] [Bug #8044]
+
+Wed Mar 13 14:51:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c (rb_export_method): directly override the flag of method
+ defined in prepending class too, not adding zsuper entry.
+ [ruby-core:53106] [Bug #8005]
+
+Wed Mar 13 13:06:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (rm, shvar_to_cpp, unexpand_shvar): local is not
+ available on old shells.
+
+ * configure.in (shvar_to_cpp): escape quotes for old shells.
+ [Bug #7959] [Bug #8071]
+
+Wed Mar 13 11:11:07 2013 Shugo Maeda <shugo@ruby-lang.org>
+
+ * object.c (Init_Object): remove Module#used, which has been
+ introduced in Ruby 2.0 by mistake. [Bug #7916] [ruby-core:52719]
+
+Wed Mar 13 05:49:29 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/irb.rb: Fix typo
+
+Tue Mar 12 22:20:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_set_arguments, iseq_compile_each): support required
+ keyword arguments. [ruby-core:51454] [Feature #7701]
+
+ * iseq.c (rb_iseq_parameters): ditto.
+
+ * parse.y (f_kw, f_block_kw): ditto. this syntax is still
+ experimental, the notation may change.
+
+ * vm_core.h (rb_iseq_struct): ditto.
+
+ * vm_insnhelper.c (vm_callee_setup_keyword_arg): ditto.
+
+Tue Mar 12 17:02:53 2013 TAKANO Mitsuhiro <tak@no32.tk>
+
+ * date_core.c: clearly specify operator precedence.
+
+Tue Mar 12 17:00:45 2013 TAKANO Mitsuhiro <tak@no32.tk>
+
+ * insns.def: fix condition.
+
+Tue Mar 12 16:48:19 2013 TAKANO Mitsuhiro <tak@no32.tk>
+
+ * rational.c: fix dangling if, else-if and else.
+
+Tue Mar 12 06:27:59 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/commands/setup_command.rb: Don't delete non-rubygems
+ files when installing RubyGems.
+ * test/rubygems/test_gem_commands_setup_command.rb: Test for the
+ above.
+
+ * lib/rubygems/ext/ext_conf_builder.rb: Use full path to siteconf.rb
+ in case the extconf.rb changes directories (like memcached does).
+
+ * lib/rubygems/package.rb: Remove double slash from path.
+ * test/rubygems/test_gem_package.rb: Test for the above.
+ * test/rubygems/test_gem_package_old.rb: ditto.
+
+ * lib/rubygems/source.rb: Revert automatic HTTPS upgrade
+ * lib/rubygems/spec_fetcher.rb: ditto.
+ * test/rubygems/test_gem_remote_fetcher.rb: ditto.
+ * test/rubygems/test_gem_source.rb: ditto.
+ * test/rubygems/test_gem_spec_fetcher.rb: ditto.
+
+Tue Mar 12 02:25:19 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/net/smtp.rb: Added Net::SMTP#rset method to implement the SMTP
+ RSET command. [ruby-trunk - Feature #5373]
+ * NEWS: ditto.
+ * test/net/smtp/test_smtp.rb: Test for the above.
+
+Mon Mar 11 22:44:57 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/resolv-replace.rb (TCPSocket#initialize): resolve the 3rd
+ argument only if non-nil value is given.
+ [ruby-dev:47150] [ruby-trunk - Bug #8054] reported and analyzed by
+ mrkn.
+
+Mon Mar 11 19:22:54 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * test/mkmf/base.rb: class name conflict.
+
+Mon Mar 11 18:45:09 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * enumerator.c (enumerator_with_index): try to convert given offset to
+ integer. fix bug introduced in r39594.
+
+Mon Mar 11 17:27:57 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * test/ruby/envutil.rb (EnvUtil.with_default_external): add for
+ changing Encoding.default_external without warnings.
+
+ * test/ruby/envutil.rb (EnvUtil.with_default_internal): ditto.
+
+ * test/ruby/test_io_m17n.rb: use above with_default_external.
+
+Mon Mar 11 16:57:00 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * io.c (extract_binmode): raise error even if binmode and textmode
+ don't conflict. [Bug #5918] [ruby-core:42199]
+
+Mon Mar 11 12:25:12 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * Merge Onigmo d4bad41e16e3eccd97ccce6f1f96712e557c4518.
+ fix lookbehind assertion fails with /m mode enabled. [Bug #8023]
+ fix \Z matches where it shouldn't. [Bug #8001]
+
+Mon Mar 11 11:53:35 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (MakeMakefile#dir_config, MakeMakefile#_libdir_basename):
+ defer use of instance variable until needed. [Bug #8074]
+
+Thu Mar 7 10:42:28 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * lib/thread.rb (Queue#clear): return self.
+ Patch by Cubing Cube. Thank you! [Bug #7947] [ruby-dev:47098]
+ * lib/thread.rb (Queue#push): ditto.
+ * lib/thread.rb (SizedQueue#push): ditto.
+ * test/thread/test_queue.rb: add tests for the above.
+
+Thu Mar 7 10:40:49 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * tool/change_maker.rb (#diff2index): check Encoding::BINARY.
+ BASERUBY may still be 1.8.x.
+
+Thu Mar 7 08:47:42 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * NEWS (Mutex#owned?): no longer experimental.
+
+Sun Mar 10 23:38:15 2013 Luis Lavena <luislavena@gmail.com>
+
+ * win32/file.c (rb_file_expand_path_internal): Expand home directory when
+ used as second parameter (dir_string). [ruby-core:53168] [Bug #8034]
+ * test/ruby/test_file_exhaustive.rb: add test to verify.
+
+Sun Mar 10 23:27:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
+ it is impossible to predict which file will be installed to where,
+ by the arguments, so use intermediate destination directory always.
+ [Bug #7698]
+
+Sun Mar 10 17:00:22 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * complex.c: edited rdoc.
+ * rational.c: ditto.
+
+Sun Mar 10 15:02:39 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * process.c (setup_communication_pipe): remove unused function.
+ it was unintentionally added r39683.
+
+Wed Mar 6 00:30:40 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * tool/gen_ruby_tapset.rb: add tapset generator.
+
+Wed Mar 6 03:27:43 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * probes.d (symbol-create): change argument name `string' to
+ `str'. `string' is a keyword for systemtap.
+
+Tue Mar 5 22:23:01 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * probes.d: added argument name
+
+Thu Mar 7 01:17:00 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * test/thread/test_queue.rb (TestQueue#test_thr_kill): reduce
+ iterations from 2000 to 250. When running on uniprocessor
+ systems, every th.kill needs TIME_QUANTUM_USEC time (i.e.
+ 100msec on posix systems). Because, "r.read 1" is 3 steps
+ operations that 1) release GVL 2) read 3) acquire gvl and
+ (1) invoke context switch to main thread. and then, main
+ thread's th.kill resume (1), but not (2). Thus read interrupt
+ need TIME_QUANTUM_USEC. Then maximum iteration is 30sec/100msec
+ = 300.
+
+Thu Mar 7 00:14:51 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * io.c (rb_update_max_fd): use ATOMIC_CAS because this function
+ is used from timer thread too.
+
+Wed Mar 6 23:30:21 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread_pthread.c (ARRAY_SIZE): new.
+ * thread_pthread.c (gvl_acquire_common): use low priority
+ notification for avoiding timer thread interval confusion.
+ If we use timer_thread_pipe[1], every gvl_yield() request
+ one more gvl_yield(). It lead to thread starvation.
+ [Bug #7999] [ruby-core:53095]
+ * thread_pthread.c (rb_reserved_fd_p): adds timer_thread_pipe_low
+ to reserved fds.
+
+Wed Mar 6 22:36:19 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread_pthread.c (rb_thread_wakeup_timer_thread_fd): add fd
+ argument and remove hardcoded dependency of timer_thread_pipe[1].
+ * thread_pthread.c (consume_communication_pipe): add fd argument.
+ * thread_pthread.c (close_communication_pipe): ditto.
+
+ * thread_pthread.c (timer_thread_sleep): adjust the above changes.
+
+ * thread_pthread.c (setup_communication_pipe_internal): factor
+ out pipe initialize logic.
+
+Wed Mar 6 22:56:14 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread_pthread.c (ubf_select): add to small comments why we
+ need to call rb_thread_wakeup_timer_thread().
+
+Wed Mar 6 21:42:24 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread_pthread.c (rb_thread_create_timer_thread): factor out
+ creating communication pipe logic into separate function.
+ * thread_pthread.c (setup_communication_pipe): new helper function.
+ * thread_pthread.c (set_nonblock): moves a definition before
+ setup_communication_pipe.
+
+Sun Mar 3 02:42:29 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread_pthread.c (consume_communication_pipe): retry when
+ read returned CCP_READ_BUFF_SIZE.
+
+Wed Mar 6 21:31:35 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread_pthread.c (timer_thread_sleep): use poll() instead of
+ select(). select doesn't work if timer_thread_pipe[0] is
+ greater than FD_SETSIZE.
+ * thread_pthread.c (USE_SLEEPY_TIMER_THREAD): add a dependency
+ against poll.
+
+Wed Mar 6 21:00:23 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread_pthread.c (USE_SLEEPY_TIMER_THREAD): use more accurate
+ ifdef conditions.
+
+Sun Mar 3 02:30:36 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * thread_pthread.c (set_nonblock): new helper function for set
+ O_NONBLOCK.
+ * thread_pthread.c (rb_thread_create_timer_thread): set O_NONBLOCK
+ to timer_thread_pipe[0] too.
+
+Sun Mar 10 09:12:51 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * complex.c: described syntax of string form.
+ * rational.c: ditto.
+
+Sat Mar 9 11:58:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (w_extended): check for prepended object.
+ [ruby-core:53206] [Bug #8043]
+
+Sat Mar 9 08:36:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * load.c (features_index_add_single, rb_feature_p): store single index
+ as Fixnum to reduce the number of arrays for the indexes. based on
+ the patch by tmm1 (Aman Gupta) in [ruby-core:53216] [Bug #8048].
+
+Sat Mar 9 00:25:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * marshal.c (r_object0): load prepended objects. treat the class of
+ extended object in the included modules as prepended singleton
+ class. [ruby-core:53202] [Bug #8041]
+
+Fri Mar 8 19:44:00 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * man/rake.1, man/ruby.1: Use the Pa macro to make URLs stand out.
+
+Fri Mar 8 13:20:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/pathname/pathname.c (path_f_pathname): rdoc for Pathname()
+
+Fri Mar 8 12:00:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * man/rake.1: Document ENVIRONMENT variables on RAKE(1) manpage
+
+Fri Mar 8 10:44:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/webrick/httpproxy.rb: Fix typos in HTTPProxyServer [Bug #8013]
+ Patch by Nobuhiro IMAI [ruby-core:53127]
+
+Fri Mar 8 03:16:15 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * class.c (rb_mod_ancestors): Include singleton_class in ancestors
+ list [Feature #8035]
+
+ * test/ruby/test_module.rb (class): test for above
+
+ * test/ruby/marshaltestlib.rb (module): adapt test
+
+ * NEWS: list change
+
+Thu Mar 7 14:21:37 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_compile_each): pass keyword arguments to zsuper,
+ with current values. [ruby-core:53114] [Bug #8008]
+
+Thu Mar 7 12:53:47 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/commands/setup_command.rb: Install .pem files.
+ * test/rubygems/test_gem_commands_setup_command.rb: Test for the
+ above.
+
+ * lib/rubygems/spec_fetcher.rb: Test HTTPS upgrade with URI::HTTPS,
+ not URI::HTTP. Fixes bug in automatic HTTPS upgrade.
+ * test/rubygems/test_gem_spec_fetcher.rb: Test for the above.
+
+ * lib/rubygems.rb: Version 2.0.2
+
+ * lib/rubygems/test_utilities.rb: Ensure scheme and uri class match.
+
+Thu Mar 7 10:39:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/rbinstall.rb (gem): Gem.ensure_gem_subdirectories now has mode
+ option since r39607. refix of r38870.
+
+Wed Mar 6 13:14:28 2013 Eric Hodel <drbrain@segment7.net>
+
+ * test/rubygems/test_gem_spec_fetcher.rb: Removed unused variable.
+
+Wed Mar 6 08:10:15 2013 Eric Hodel <drbrain@segment7.net>
+
+ * test/rubygems/test_require.rb: Fix tests when 'a.rb' exists.
+ [ruby-trunk - Bug #7749]
+
+Wed Mar 6 08:00:59 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems.rb: Allow specification of directory permissions.
+ [ruby-trunk - Bug #7713]
+ * test/rubygems/test_gem.rb: Test for the above.
+
+Wed Mar 6 07:40:21 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/commands/query_command.rb: Only fetch remote specs when
+ showing details. [ruby-trunk - Bug #8019] RubyGems bug #487
+ * lib/rubygems/remote_fetcher.rb: ditto.
+ * lib/rubygems/security/policy.rb: ditto.
+ * test/rubygems/test_gem_commands_query_command.rb: Test for the
+ above.
+
+ * lib/rubygems/security.rb: Make OpenSSL optional for RubyGems.
+ * lib/rubygems/commands/cert_command.rb: ditto.
+
+ * lib/rubygems/config_file.rb: Display file with YAML error, not
+ ~/.gemrc
+
+ * lib/rubygems/remote_fetcher.rb: Only create gem subdirectories when
+ installing gems.
+ * lib/rubygems/dependency_resolver.rb: ditto.
+ * lib/rubygems/test_utilities.rb: ditto.
+ * test/rubygems/test_gem_commands_fetch_command.rb: Test for the
+ above.
+
+ * lib/rubygems/spec_fetcher.rb: Only try to upgrade
+ http://rubygems.org to HTTPS
+ * test/rubygems/test_gem_spec_fetcher.rb: Test for the above.
+
+ * lib/rubygems.rb: Update win_platform? check for JRuby compatibility.
+
+ * test/rubygems/test_gem_installer.rb: Update for Ruby 1.9.2
+ compatibility
+
+Wed Mar 6 01:19:28 2013 Kazuhiro NISHIYAMA <zn@mbf.nifty.com>
+
+ * enumerator.c (enumerator_with_index, lazy_take): use INT2FIX(0)
+ instead of INT2NUM(0).
+
+ * ext/bigdecimal/bigdecimal.c (BigMath_s_exp): ditto.
+
+ * ext/fiddle/function.c (function_call): ditto.
+
+ * ext/openssl/ossl_x509store.c (ossl_x509store_initialize): ditto.
+
+ * process.c (proc_getsid): ditto.
+
+ * transcode.c (econv_finish): ditto.
+
+Tue Mar 5 21:36:43 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (rb_prepend_module): check redefinition of built-in optimized
+ methods. [ruby-dev:47124] [Bug #7983]
+
+ * vm.c (rb_vm_check_redefinition_by_prepend): ditto.
+
+Tue Mar 5 20:29:25 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (mnew): revert r39224. [ruby-core:53038] [Bug #7988]
+
+Tue Mar 5 20:23:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/intern.h (rb_check_arity): make a static inline
+ function so it can be used as an expression and argc would be
+ evaluated only once.
+
+Tue Mar 5 12:30:55 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems.rb: Bump version to 2.0.1 for upcoming bugfix release
+
+ * lib/rubygems/ext/ext_conf_builder.rb: Restore ruby 1.8 compatibility
+ for [Bug #7698]
+ * test/rubygems/test_gem_installer.rb: Ditto.
+
+ * lib/rubygems/package.rb: Restore ruby 1.8 compatibility.
+
+ * test/rubygems/test_gem_dependency_installer.rb: Fix warnings
+
+Tue Mar 5 12:24:23 2013 Eric Hodel <drbrain@segment7.net>
+
+ * enumerator.c (enumerator_with_index): Restore handling of a nil memo
+ from r39594.
+
+Tue Mar 5 10:40:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/objspace/objspace.c (count_nodes): count also newly added nodes,
+ and fix key for unknown node. patch by tmm1 (Aman Gupta) in
+ [ruby-core:53130] [Bug #8014]
+
+Tue Mar 5 10:20:16 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enumerator.c (enumerator_with_index_i): allow Bignum as offset, to
+ get rid of conversion exception and integer overflow.
+ [ruby-dev:47131] [Bug #8010]
+
+ * numeric.c (rb_int_succ, rb_int_pred): shortcut optimization for
+ Bignum.
+
+Tue Mar 5 10:02:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
+ clear DESTDIR so RUBYARCHDIR and RUBYLIBDIR are not be overridden.
+ [Bug #7698]
+
+Mon Mar 4 15:33:40 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
+ fix for unusual cases again. install to a temporary directory once
+ and move installed files to the destination directory, if it is same
+ as the current directory. [Bug #7698]
+
+Mon Mar 4 14:13:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * Makefile.in (miniruby, ruby): move MAINLIBC because linker arguments
+ must appear after object files with newer versions of gcc. patch by
+ tmm1 (Aman Gupta) in [ruby-core:53121] [Bug #8009]
+
+Mon Mar 4 10:23:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * encoding.c: Typo in Encoding overview by Tom Wardrop [GH fixes #255]
+
+Sun Mar 3 12:35:08 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (MakeMakefile#libpath_env): set runtime library path for
+ the case rpath is disabled.
+
+Sun Mar 3 12:17:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rubygems/ext/ext_conf_builder.rb
+ (Gem::Ext::ExtConfBuilder.hack_for_obsolete_style_gems): remove
+ circular dependencies in install-so too. [ruby-core:52882]
+ [Bug #7698]
+
+Sun Mar 3 07:33:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/socket/tcpserver.c: Grammar for TCPServer.new from r39554
+
+Sun Mar 3 01:17:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/rubygems/ext/ext_conf_builder.rb
+ (Gem::Ext::ExtConfBuilder.hack_for_obsolete_style_gems): remove
+ circular dependencies for old style gems which locate extconf.rb on
+ the toplevel. [ruby-core:53059] [ruby-trunk - Bug #7698]
+
+ * lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
+ use RUBYOPT instead of -r option, and revert some tests. [Bug #7698]
+
+ * lib/rubygems/ext/ext_conf_builder.rb (Gem::Ext::ExtConfBuilder.build):
+ revert use of temporary directory for build, to work some buggy
+ extconf.rb which cannot build outside the source directory.
+ [ruby-core:53056] [Bug #7698]
+
+Sun Mar 3 00:04:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enc/depend (CPPFLAGS), lib/mkmf.rb (MakeMakefile#create_makefile):
+ define RUBY_EXPORT for static-linked-ext mswin. [Bug #7960]
+
+Sat Mar 2 22:49:47 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * win32/Makefile.sub (ENCOBJS, EXTOBJS, config.h): definitions for
+ static-linked-ext. [Bug #7960]
+
+Sat Mar 2 17:34:19 2013 Tanaka Akira <akr@fsij.org>
+
+ * lib/webrick/utils.rb: use Socket.tcp_server_sockets to create server
+ sockets.
+ fix [Bug #7100] https://bugs.ruby-lang.org/issues/7100
+ reported by sho-h (Sho Hashimoto).
+
+Sat Mar 2 02:45:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * array.c: typo in comment patch by Nami-Doc [Github fixes #253]
+
+Sat Mar 2 01:33:17 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * Merge Onigmo 0fe387da2fee089254f6b04990541c731a26757f
+ v5.13.3 [Bug#7972] [Bug#7974]
+
+Fri Mar 1 11:09:06 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/fileutils.rb: Revert r34669 which altered the way
+ metaprogramming in FileUtils occurred. [ruby-trunk - Bug #7958]
+
+ * test/fileutils/visibility_tests.rb: Refactored tests of FileUtils
+ options modules to expose bug found in #7958
+ * test/fileutils/test_dryrun.rb: ditto.
+ * test/fileutils/test_nowrite.rb: ditto.
+ * test/fileutils/test_verbose.rb: ditto.
+
+Fri Mar 1 09:18:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/psych.rb: specify in rdoc what object is returned in parser
+ By Adam Stankiewicz [Github tenderlove/psych#133]
+
+Fri Mar 1 07:21:41 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/ext/builder.rb: Fix incompatibilities when installing
+ extensions. Patch by Nobu.
+ [ruby-trunk - Bug #7698] [ruby-trunk - Bug #7971]
+ * lib/rubygems/ext/ext_conf_builder.rb: ditto.
+ * lib/rubygems/installer.rb: ditto.
+ * test/rubygems/test_gem_ext_ext_conf_builder.rb: Test for the above.
+ * test/rubygems/test_gem_installer.rb: ditto.
+
+ * lib/rubygems/commands/sources_command.rb: Prefer HTTPS over HTTP.
+ * lib/rubygems/defaults.rb: ditto
+ * lib/rubygems/dependency_resolver.rb: Ditto.
+ * lib/rubygems/source.rb: ditto.
+ * lib/rubygems/spec_fetcher.rb: ditto.
+ * lib/rubygems/specification.rb: ditto.
+ * lib/rubygems/test_utilities.rb: ditto.
+ * test/rubygems/test_gem.rb: Test for the above.
+ * test/rubygems/test_gem_commands_sources_command.rb: ditto.
+ * test/rubygems/test_gem_dependency_resolver_api_set.rb: ditto.
+ * test/rubygems/test_gem_remote_fetcher.rb: ditto.
+ * test/rubygems/test_gem_source.rb: ditto.
+ * test/rubygems/test_gem_spec_fetcher.rb: ditto.
+
+Fri Mar 1 03:25:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/psych/lib/psych.rb: rdoc for Psych overview by Adam Stankiewicz
+ [Github tenderlove/psych#134]
+
+Thu Feb 28 22:57:48 2013 Koichi Sasada <ko1@atdot.net>
+
+ * compile.c (iseq_compile_each): remove redundant trace(line)
+ instruction. for example, at the following script
+ def m()
+ p:xyzzy
+ 1
+ 2
+ end
+ compiler ignores `1' because there is no effect. However,
+ `trace(line)' instruction remains in bytecode.
+ This modification removes such redundant trace(line) instruction.
+
+ * test/ruby/test_iseq.rb: add a test.
+
+Thu Feb 28 22:23:27 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/raddrinfo.c (inspect_sockaddr): don't show that Unix
+ domain socket filename is bigger than sizeof(sun_path).
+ This limit is not rigid on some platforms such as Darwin and SunOS.
+
+Thu Feb 28 21:33:01 2013 WATANABE Hirofumi <eban@ruby-lang.org>
+
+ * configure.in(AC_DISABLE_OPTION_CHECKING): avoid warning "WARNING:
+ Unrecognized options: --with-PACKAGE".
+
+Thu Feb 28 20:22:04 2013 Koichi Sasada <ko1@atdot.net>
+
+ * iseq.c (iseq_data_to_ary): fix condition.
+ r34303 introduces a bug to avoid all line information from
+ a result of ISeq#to_a. This is a regression problem from 2.0.0p0.
+
+ * test/ruby/test_iseq.rb: add a test of lines after ISeq#to_a.
+
+Thu Feb 28 08:20:33 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/available_set.rb: Undent for style
+
+ * lib/rubygems/dependency_installer.rb: Pick latest prerelease gem to
+ install. Fixes RubyGems bug #468.
+ * test/rubygems/test_gem_dependency_installer.rb: Test for the above.
+
+ * lib/rubygems/dependency_installer.rb: Don't display "Done installing
+ documentation" if documentation will not be installed.
+ * lib/rubygems/rdoc.rb: ditto
+
+ * lib/rubygems/dependency_list.rb: Use Array#concat for Ruby 1.x
+ performance.
+
+ * lib/rubygems/installer.rb: Use formatted program name when comparing
+ executables. RubyGems pull request #471
+ * test/rubygems/test_gem_installer.rb: Test for the above.
+
+ * lib/rubygems/package.rb: Use more explicit feature check to work
+ around JRuby bug #552
+
+ * lib/rubygems/ssl_certs/GeoTrust_Global_CA.pem: Added GeoTrust root
+ certificate.
+
+ * test/rubygems/test_gem_source_list.rb: Use "example" instead of real
+ hostname
+
+Thu Feb 28 05:57:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * thread.c: rdoc formatting for Thread, ThreadGroup, and ThreadError
+
+Thu Feb 28 02:42:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * vm.c: Typo in overview for example of Thread#status returning false
+ Reported by Lee Jarvis
+
+Wed Feb 27 22:54:27 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/rubysocket.h (union_sockaddr): make it longer for SunOS
+ and Darwin.
+
+Wed Feb 27 21:14:34 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/security.rb (REXML::Security): create.
+ * lib/rexml/rexml.rb: move entity_expansion_limit and
+ entity_expansion_text_limit accessors to ...
+ * lib/rexml/security.rb: ... here.
+ * lib/rexml/document.rb: use REXML::Security.
+ * lib/rexml/text.rb: use REXML::Security.
+ * test/rexml/test_document.rb: use REXML::Security.
+
+Wed Feb 27 19:53:32 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * vm.c (Thread): fix typos in overview
+
+Wed Feb 27 13:21:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * vm.c (Thread): Typo in overview, swap setting and getting
+
+Wed Feb 27 13:02:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * vm.c (Thread): Documentation overview of Thread class
+
+Wed Feb 27 12:57:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * thread.c (rb_thread_wakeup): rdoc formatting
+
+Wed Feb 27 12:53:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * thread.c (rb_thread_group): rdoc formatting
+
+Wed Feb 27 12:33:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/ostruct.rb: Typo in OpenStruct overview [Github Fixes #251]
+ Patch by Chun-wei Kuo
+
+Wed Feb 27 12:13:32 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_exec.h (END_INSN): llvm-gcc may optimize out reg_cfp and cause
+ Stack/cfp consistency error when the instruction doesn't use reg_cfp.
+ Usually instructions use PUSH() but for example trace doesn't.
+ This hack cause speed down but you shouldn't use llvm-gcc, use clang.
+ [Bug #7938]
+
+Wed Feb 27 10:23:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * thread.c (thread_raise_m): rdoc formatting
+
+Tue Feb 26 23:32:44 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/document.rb: move entity_expansion_limit accessor to ...
+ * lib/rexml/rexml.rb: ... here for consistency.
+ * lib/rexml/document.rb (REXML::Document.entity_expansion_limit):
+ deprecated.
+ * lib/rexml/document.rb (REXML::Document.entity_expansion_limit=):
+ deprecated.
+
+Tue Feb 26 23:26:13 2013 Kouhei Sutou <kou@cozmixng.org>
+
+ * lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...
+ * lib/rexml/rexml.rb: ... here to make rexml/text independent from
+ REXML::Document. It causes circular require.
+ * lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
+ deprecated.
+ * lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit=):
+ deprecated.
+ * lib/rexml/text.rb: add missing require "rexml/rexml" for
+ REXML.entity_expansion_text_limit.
+ Reported by Robert Ulejczyk. Thanks!!! [ruby-core:52895] [Bug #7961]
+
+Tue Feb 26 15:12:11 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * tool/mkconfig.rb: reconstruct comma separated list values. a
+ command line to Windows batch file is split not only by spaces
+ and equal signs but also by commas and semicolons.
+
+Tue Feb 26 15:04:19 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (unexpand_shvar): get rid of non-portable shell
+ behavior on OpenBSD, so no extra quotes. [Bug #7959]
+
+Tue Feb 26 10:24:49 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * parse.y (IS_LABEL_POSSIBLE): allow labels for keyword arguments just
+ after method definition without a parenthesis. [ruby-core:52820]
+ [Bug #7942]
+
+Tue Feb 26 04:50:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * error.c: clarify reason for sleep in SignalException example
+
+Tue Feb 26 03:47:00 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * error.c: clarify a document of SignalException. Process.kill()
+ doesn't have any guarantee when signal will be delivered.
+ [Bug #7951] [ruby-core:52864]
+
+Mon Feb 25 23:51:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/version.h: bump RUBY_API_VERSION same as RUBY_VERSION.
+
+Mon Feb 25 21:03:34 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * string.c (str_byte_substr): don't set coderange if it's not known.
+ [Bug #7954] [ruby-dev:47108]
+
+Mon Feb 25 16:47:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * common.mk (realclean-local): miniprelude.c is made by srcs, so it
+ should not removed by distclean but by realclean. [Bug #6807]
+
+Mon Feb 25 16:30:30 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/config_file.rb: Lazily load .gem/credentials to only
+ check permissions when necessary. RubyGems bug #465
+ * test/rubygems/test_gem_config_file.rb: Test for the above.
+
+ * test/rubygems/test_gem_commands_push_command.rb: Remove duplicated
+ test.
+
+Mon Feb 25 15:47:18 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * enc/depend (ARFLAGS): VisualC++ linker does not allow spaces between
+ output option and the output file name. [Bug #7950]
+
+ * enc/depend (RANLIB): set default command to do nothing, or make the
+ entire line a label on Windows.
+
+Mon Feb 25 14:41:07 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (MakeMakefile#init_mkmf): default libdirname to libdir.
+
+ * tool/rbinstall.rb: ditto.
+
+Mon Feb 25 13:12:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (setup): find Setup file from target_os 1. by
+ suffix (e.g. Setup.nacl, Setup.atheos), 2. by "platform"
+ option (e.g. Setup.nt, Setup.emx), and 3. default Setup. And
+ Setup.dj had been removed.
+
+Mon Feb 25 12:48:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * thread.c: Document Thread::new, clean up ::fork and mention calling
+ super if subclassing Thread
+
+Mon Feb 25 12:38:50 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: don't test ss_family and ss_len member of
+ struct sockaddr_storage. They are not used now except SunOS
+ specific code.
+
+Mon Feb 25 11:03:38 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * configure.in (unexpand_shvar): Use the numeric comparison
+ operator instead of '==' which is a ksh extension. [Bug #7941]
+
+Mon Feb 25 02:37:56 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket: define and use union_sockaddr instead of struct
+ sockaddr_storage for less casts.
+
+ * ext/socket/rubysocket.h (union_sockaddr): defined.
+
+ * ext/socket/socket.c (sock_accept): use union_sockaddr.
+ (sock_accept_nonblock): ditto.
+ (sock_sysaccept): ditto.
+ (sock_s_getnameinfo): ditto.
+
+ * ext/socket/basicsocket.c (bsock_getsockname): ditto.
+ (bsock_getpeername): ditto.
+ (bsock_local_address): ditto.
+ (bsock_remote_address): ditto.
+
+ * ext/socket/ancdata.c (bsock_recvmsg_internal): ditto.
+
+ * ext/socket/init.c (recvfrom_arg): ditto.
+ (recvfrom_blocking): ditto.
+ (rsock_s_recvfrom): ditto.
+ (rsock_s_recvfrom_nonblock): ditto.
+ (rsock_getfamily): ditto.
+
+ * ext/socket/raddrinfo.c (rb_addrinfo_t): ditto.
+ (ai_get_afamily): ditto.
+ (inspect_sockaddr): ditto.
+ (addrinfo_mdump): ditto.
+ (addrinfo_mload): ditto.
+ (addrinfo_getnameinfo): ditto.
+ (addrinfo_ip_port): ditto.
+ (extract_in_addr): ditto.
+ (addrinfo_ipv6_to_ipv4): ditto.
+ (addrinfo_unix_path): ditto.
+
+ * ext/socket/tcpserver.c (tcp_accept): ditto.
+ (tcp_accept_nonblock): ditto.
+ (tcp_sysaccept): ditto.
+
+ * ext/socket/ipsocket.c (ip_addr): ditto.
+ (ip_peeraddr): ditto.
+ (ip_s_getaddress): ditto.
+
+Sun Feb 24 21:15:05 2013 Tadayoshi Funaba <tadf@dotrb.org>
+
+ * ext/date/date_core.c: [ruby-core:52303]
+
+Sun Feb 24 15:33:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (rb_random_ulong_limited): limit is inclusive, but generic
+ rand method should return a number less than it, so increase for the
+ difference. [ruby-core:52779] [Bug #7935]
+
+Sun Feb 24 15:32:36 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (rb_random_ulong_limited): limit is inclusive, but generic
+ rand method should return a number less than it, so increase for the
+ difference. [ruby-core:52779] [Bug #7935]
+
+Sun Feb 24 15:14:43 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/net/http.rb: Removed duplicate Accept-Encoding in Net::HTTP#get.
+ [ruby-trunk - Bug #7924]
+ * test/net/http/test_http.rb: Test for the above.
+
+Wed Feb 20 14:28:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * thread.c: Document ThreadGroup::Default
+
+Wed Feb 20 14:23:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * thread.c: Grammar for #backtrace_locations and ::handle_interrupt
+
+Sun Feb 24 13:35:57 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_insnhelper.c (vm_call_method): block level control frame does not
+ have method entry, so obtain the method entry from method top-level
+ control frame to be compared with refined method entry.
+ [ruby-core:52750] [Bug #7925]
+
+Wed Feb 20 13:23:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * object.c: Document methods receiving string and convert to symbol
+ Patch by Stefan Rusterholz
+ * vm_eval.c: ditto
+ * vm_method.c: ditto
+
+Wed Feb 20 07:20:56 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * signal.c (sigsegv): suppress unused result warning. Because
+ write(2) is marked __warn_unused_result__ on Linux glibc.
+
+Sun Feb 24 07:50:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compile.c (iseq_set_arguments): no keyword check if any keyword rest
+ argument exists, even unnamed. [ruby-core:52744] [Bug #7922]
+
+Sat Feb 23 16:51:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * thread.c: Documentation for Thread#backtrace_locations
+
+Sat Feb 23 16:05:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * vm.c: Typo in ObjectSpace::WeakMap overview
+
+Sat Feb 23 16:00:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * thread.c: Improved rdoc for ::handle_interrupt, ::pending_interrupt?
+ and #pending_interrupt?
+
+Sat Feb 23 12:26:43 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * misc/ruby-electric.el (ruby-electric-curlies)
+ (ruby-electric-matching-char, ruby-electric-bar): Avoid electric
+ insertion when there is a prefix argument.
+
+ * misc/ruby-electric.el (ruby-electric-insert)
+ (ruby-electric-cua-replace-region-p)
+ (ruby-electric-cua-replace-region): Avoid electric insertion and
+ fall back when cua-mode is enabled and a region is active.
+
+Sat Feb 23 12:35:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * array.c: Document #<=> return values and formatting
+ * bignum.c: ditto
+ * file.c: ditto
+ * object.c: ditto
+ * numeric.c: ditto
+ * rational.c: ditto
+ * string.c: ditto
+ * time.c: ditto
+
+Sat Feb 23 10:50:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * array.c (rb_ary_diff, rb_ary_and, rb_ary_or): Document return order
+ [RubySpec #7803]
+
+Sat Feb 23 10:17:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * object.c (rb_obj_comp): Documenting Object#<=> return values
+ Patch by Stefan Rusterholz
+
+Sat Feb 23 09:48:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * dir.c (file_s_fnmatch, fnmatch_brace): encoding-incompatible pattern
+ and string do not match, instead of exception. [ruby-dev:47069]
+ [Bug #7911]
+
+Sat Feb 23 08:57:46 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * doc/NEWS-*: Update NEWS from their respective branches
+
+Sat Feb 23 08:14:43 2013 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
+
+ * NEWS: many additions for Ruby 2.0.0
+
+ * object.c: Add doc for Module.prepended
+
+Sat Feb 23 07:52:53 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * template/ruby.pc.in: reorder library flags which may refer library
+ names. [Bug #7913]
+
+Fri Feb 22 23:46:20 2013 CHIKANAGA Tomoyuki <nagachika@ruby-lang.org>
+
+ * lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
+ fix a typo in comment in r39384.
+
+Fri Feb 22 18:31:46 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
+ new attribute to read/write entity expansion text limit. the default
+ limit is 10Kb.
+
+ * lib/rexml/text.rb (REXML::Text.unnormalize): check above attribute.
+
+Fri Feb 22 17:36:23 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * test/test_rbconfig.rb (TestRbConfig): fix r39372.
+ It must see RbConfig::CONFIG instead of CONFIG.
+
+Fri Feb 22 14:55:41 2013 Naohisa Goto <ngotogenome@gmail.com>
+
+ * signal.c (ruby_abort): fix typo in r39354 [Bug #5014]
+
+Fri Feb 22 12:46:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * random.c (rb_random_ulong_limited): fix error message for negative
+ value. [ruby-dev:47061] [Bug #7903]
+
+Fri Feb 22 11:36:45 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * test/test_rbconfig.rb (TestRbConfig): skip user defined values by
+ configuration options. [Bug #7902]
+
+Fri Feb 22 11:33:42 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (MakeMakefile#init_mkmf): adjust default library path
+ for multiarch. [Bug #7874]
+
+Fri Feb 22 11:10:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * enum.c (Enumerable#chunk: Improved examples, grammar, and formatting
+ Patch by Dan Bernier and Rich Bruchal of newhaven.rb
+ [Github documenting-ruby/ruby#8]
+
+Fri Feb 22 11:00:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * numeric.c: Examples and formatting for Numeric and Float
+ Based on a patch by Zach Morek and Oren K of newhaven.rb
+ [Github documenting-ruby/ruby#5]
+
+Fri Feb 22 07:04:41 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/installer.rb (build_extensions): Create extension
+ install destination before building extension. Patch by Kenta Murata.
+ [ruby-trunk - Bug #7897]
+ * test/rubygems/test_gem_installer.rb: Test for the above.
+
+Fri Feb 22 06:30:57 2013 Eric Hodel <drbrain@segment7.net>
+
+ * doc/globals.rdoc: Document what setting $DEBUG does.
+
+ * doc/globals.rdoc: Added pointer to $-d for full documentation.
+
+Fri Feb 22 06:27:07 2013 Eric Hodel <drbrain@segment7.net>
+
+ * doc/globals.rdoc: Document what setting $VERBOSE does. [Bug #7899]
+
+ * doc/globals.rdoc: Added pointer to $-w and $-v for full
+ documentation.
+
+Fri Feb 22 02:33:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/abbrev.rb: Add words parameter to Abbrev::abbrev
+ Patch by Devin Weaver [Github documenting-ruby/ruby#7]
+
+Thu Feb 21 17:28:14 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * tool/merger.rb: add interaction when only ChangeLog is modified.
+
+Thu Feb 21 16:34:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * signal.c (check_stack_overflow): extract duplicated code and get rid
+ of declaration-after-statement. [Bug #5014]
+
+Thu Feb 21 14:14:13 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * signal.c (sigsegv): avoid to use async signal unsafe functions
+ when nested sigsegv is happen.
+ [Bug #5014] [ruby-dev:44082]
+
+Thu Feb 21 13:47:59 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * file.c (rb_group_member): added an error check. SUS says,
+ getgroups(small_value) may return EINVAL.
+
+Thu Feb 21 13:37:07 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * process.c (RB_MAX_GROUPS): moved to
+ * internal.h (RB_MAX_GROUPS): here.
+
+ * file.c (rb_group_member): use RB_MAX_GROUPS instead of
+ RUBY_GROUP_MAX. They are the same.
+
+Thu Feb 21 13:15:40 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * file.c (access_internal): removed.
+ * file.c (rb_file_readable_real): use access() instead of
+ access_internal().
+ * file.c (rb_file_writable_real): ditto.
+ * file.c (rb_file_executable_real): ditto.
+
+Thu Feb 21 13:04:59 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * file.c (eaccess): use access() when not using setuid nor setgid.
+ This is minor optimization.
+
+Thu Feb 21 12:56:19 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * file.c (rb_group_member): get rid of NGROUPS dependency.
+ [Bug #7886] [ruby-core:52537]
+
+Thu Feb 21 12:45:03 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ruby.c (ruby_init_loadpath_safe): try two levels upper for stripping
+ libdir name. [Bug #7874]
+
+ * configure.in (libdir_basename): expand with multiarch in configure,
+ not to defer the expansion till ruby.pc.in and mkmf.rb. [Bug #7874]
+
+ * configure.in (libdir_basename): also -rpath and -install_name flags
+ are affected when libruby directory changes. [Bug #7874]
+
+Wed Feb 20 19:27:02 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * include/ruby/ruby.h (HAVE_RB_SCAN_ARGS_OPTIONAL_HASH): for
+ rb_scan_args() optional hash feature. [Bug #7861]
+
+Wed Feb 20 18:02:26 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (target_os): do not strip -gnu suffix on Linux if
+ --target is given explicitly. [Bug #7874]
+
+ * configure.in (libdirname): adjust library path name which libruby
+ files will be installed. [Bug #7874]
+
+ * tool/rbinstall.rb (libdir): ditto.
+
+Wed Feb 20 13:37:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/pty/pty.c: Documentation for the PTY module
+
+Wed Feb 20 12:18:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * object.c: Document Data class [Bug #7890] [ruby-core:52549]
+ Patch by Matthew Mongeau
+
+Wed Feb 20 11:50:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/mutex_m.rb: Add rdoc for Mutex_m module
+
+Wed Feb 20 09:34:43 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/commands/update_command.rb: Create the installer after
+ options are processed. [ruby-trunk - Bug #7779]
+ * test/rubygems/test_gem_commands_update_command.rb: Test for the
+ above.
+
+Wed Feb 20 07:51:19 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/installer.rb: Use gsub instead of gsub! to avoid
+ altering @bin_dir. Fixes tests on windows. [ruby-trunk - Bug #7885]
+
+Tue Feb 19 20:50:00 2013 Kenta MURATA <mrkn@mrkn.jp>
+
+ * ext/bigdecimal/bigdecimal.gemspec: bump to 1.2.0.
+ [ruby-core:51777] [Bug #7761]
+
+Tue Feb 19 13:07:25 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * ext/syslog/syslog.c (Init_syslog): Define inspect as a singleton
+ method and remove it as an instance method. [Bug #6502]
+
+Tue Feb 19 12:30:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * object.c: rdoc formatting for Kernel#Array()
+ * array.c: Add rdoc for Array() method to Creating Arrays section
+
+Tue Feb 19 10:35:52 2013 Eric Hodel <drbrain@segment7.net>
+
+ * ext/openssl/ossl.c (class OpenSSL): Use only inner parenthesis in
+ create_extension examples.
+
+Tue Feb 19 10:27:12 2013 Eric Hodel <drbrain@segment7.net>
+
+ * ext/openssl/ossl.c (class OpenSSL): Fixed ExtensionFactory example.
+ Patch by Richard Bradley. [ruby-trunk - Bug #7551]
+
+Tue Feb 19 08:32:11 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm_eval.c (vm_call0_body): check interrupts after method dispatch
+ from C methods. [Bug #7878]
+
+Tue Feb 19 08:14:40 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/installer.rb: Fixed placement of executables with
+ --user-install. [ruby-trunk - Bug #7779]
+ * test/rubygems/test_gem_installer.rb: Test for above.
+
+Tue Feb 19 06:04:06 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * vm_dump: FreeBSD ports' libexecinfo's backtrace(3) can't trace
+ beyond signal trampoline, and as described in r38342 it can't
+ trace on -O because it see stack frame pointers.
+ libunwind unw_backtrace see dwarf information in the binary
+ and it works with -O (without frame pointers).
+
+ * configure.in: remove r38342's hack and check libunwind.
+
+Tue Feb 19 04:26:29 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * configure.in: check whether backtrace(3) works well or not.
+
+ * vm_dump.c: set HAVE_BACKTRACE 0 if BROKEN_BACKTRACE.
+
+Mon Feb 18 16:30:18 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/ipaddr.rb (IPAddr#in6_addr): Fix a typo with the closing
+ parenthesis.
+
+Mon Feb 18 12:32:24 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * lib/ipaddr.rb (IPAddr#in6_addr): Fix the parser so that it can
+ recognize IPv6 addresses with only one edge 16-bit piece
+ compressed, like [::2:3:4:5:6:7:8] or [1:2:3:4:5:6:7::].
+ [Bug #7477]
+
+Mon Feb 18 10:09:54 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (unexpand_shvar): regularize a shell variable by
+ unexpanding shell variables in it.
+
+Sun Feb 17 20:55:44 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * compar.c (rb_invcmp): compare by inversed comparison, with preventing
+ from infinite recursion. [ruby-core:52305] [Bug #7870]
+
+ * string.c (rb_str_cmp_m), time.c (time_cmp): get rid of infinite
+ recursion.
+
+Sun Feb 17 17:23:22 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb: remove extra topdir in VPATH, which was in
+ win32/Makefile.sub for some reason and moved from there.
+ [ruby-dev:46998] [Bug #7864]
+
+Sun Feb 17 01:19:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * ext/psych/lib/psych/y.rb: Document Kernel#y by Adam Stankiewicz
+ [Github tenderlove/psych#127]
+
+Sun Feb 17 00:52:14 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * tool/mkconfig.rb: remove prefix from rubyarchdir.
+ r39267 expands variables, it changes expansion timing,
+ breaks RbConfig::CONFIG["includedir"] and building
+ extension libraries with installed ruby.
+
+Sat Feb 16 20:51:17 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * vm.c (ENV_IN_HEAP_P): fix off-by-one error.
+
+Sat Feb 16 20:47:16 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * configure.in (LIBRUBY_DLDFLAGS): Fix a bug where --with-opt-dir
+ options given were not reflected to LIBRUBY_DLDFLAGS on many
+ platforms including Linux and other GNU-based systems, NetBSD,
+ AIX and BeOS.
+
+Sat Feb 16 20:43:20 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/ancdata.c (rsock_recvmsg): ignore truncated part of
+ socket address returned from recvmsg().
+
+ * ext/socket/init.c (recvfrom_blocking): ignore truncated part of
+ socket address returned from recvfrom().
+ (rsock_s_recvfrom_nonblock): ditto.
+
+Sat Feb 16 20:05:26 2013 Ayumu AIZAWA <ayumu.aizawa@gmail.com>
+
+ * test/ruby/test_thread.rb: fixed typo
+ patched by Hiroki Matsue via https://github.com/ruby/ruby/pull/248
+
+Sat Feb 16 16:08:35 2013 Koichi Sasada <ko1@atdot.net>
+
+ * vm.c (rb_thread_mark): mark a working Proc of bmethod
+ (a method defined by define_method) even if the method was removed.
+ We could not trace working Proc object which represents the body
+ of bmethod if the method was removed (alias/undef/overridden).
+ Simply, it was mark miss.
+ This patch by Kazuki Tsujimoto. [Bug #7825]
+
+ NOTE: We can brush up this marking because we do not need to mark
+ `me' on each living control frame. We need to mark `me's
+ only if `me' was free'ed. This is future work after Ruby 2.0.0.
+
+ * test/ruby/test_method.rb: add a test.
+
+Sat Feb 16 15:45:56 2013 Koichi Sasada <ko1@atdot.net>
+
+ * proc.c (rb_binding_new_with_cfp): create binding object even if
+ the frame is IFUNC. But return a ruby-level binding to keep
+ compatibility.
+ This patch fix degradation introduced from r39067.
+ [Bug #7774] [ruby-dev:46960]
+
+ * test/ruby/test_settracefunc.rb: add a test.
+
+Sat Feb 16 13:40:13 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (shvar_to_cpp): do not substitute exec_prefix itself
+ with RUBY_EXEC_PREFIX, which cause recursive definition.
+ [ruby-core:52296] [Bug #7860]
+
+Sat Feb 16 13:13:04 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/io/console/io-console.gemspec: bump to 0.4.2. now explicitly
+ requires ruby 1.9.3 or later. [Bug #7847]
+
+ * ext/io/console/console.c (console_dev): compatibility with ruby 1.8.
+
+ * ext/io/console/console.c (rawmode_opt, console_dev): compatibility
+ with ruby 1.9. [ruby-core:52220] [Bug #7847]
+
+Sat Feb 16 12:45:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: unexpand arch sitearch and exec_prefix values, so
+ directly specified bindir, libdir, rubyprefix, etc can be properly
+ substituted. [ruby-core:52296] [Bug #7860]
+
+Sat Feb 16 12:15:20 2013 Aaron Patterson <aaron@tenderlovemaking.com>
+
+ * parse.y: add dtrace probe for symbol create.
+
+ * probes.d: ditto
+
+Sat Feb 16 09:27:37 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: don't test sys/feature_tests.h which is not
+ used now.
+ It was included in r7901 as "bug of gcc 3.0 on Solaris 8 ?".
+
+Sat Feb 16 09:24:37 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: reorder header tests to consider inclusion
+ order in rubysocket.h.
+
+Sat Feb 16 08:42:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in, ext/socket/extconf.rb: test netinet/in_systm.h in
+ ext/socket/extconf.rb instead of configure.in.
+
+ Originally, netinet/in_systm.h is included for NextStep, OpenStep,
+ and Rhapsody. [ruby-core:1596]
+
+Sat Feb 16 07:55:40 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: don't test xti.h here.
+
+ * ext/socket/extconf.rb: test xti.h here.
+
+ Originally, xti.h is included for IRIX [ruby-core:14447].
+
+Sat Feb 16 07:16:49 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: test struct sockaddr_un and its member,
+ sun_len.
+
+ * ext/socket/sockport.h (INIT_SOCKADDR_UN): new macro defined.
+
+ * ext/socket/socket.c (sock_s_pack_sockaddr_un): use INIT_SOCKADDR_UN.
+
+ * ext/socket/unixsocket.c (rsock_init_unixsock): ditto.
+
+ * ext/socket/raddrinfo.c (init_unix_addrinfo): ditto.
+ (addrinfo_mload): ditto.
+
+Sat Feb 16 07:05:59 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/sockport.h (INIT_SOCKADDR_IN): don't need family
+ argument. it is always AF_INET.
+
+ * ext/socket/raddrinfo.c (make_inetaddr): follow INIT_SOCKADDR_IN
+ change.
+ (addrinfo_ipv6_to_ipv4): ditto.
+
+Sat Feb 16 04:21:07 2013 NAKAMURA Usaku <usa@ruby-lang.org>
+
+ * ext/socket/extconf.rb: workaround for mswin/mingw build problem.
+ sendmsg emulation in win32/win32.c is not enough.
+
+Sat Feb 16 00:19:20 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: use all all tested available headers for
+ have_func.
+
+Fri Feb 15 22:21:37 2013 Akinori MUSHA <knu@iDaemons.org>
+
+ * configure.in: Fix a bug introduced in r38342 that the cflagspat
+ substitution is messed up by the way CFLAGS and optflags are
+ modified, which affected FreeBSD and NetBSD/amd64 when
+ configured to use libexecinfo. This bug resulted in CFLAGS and
+ CXXFLAGS in RbConfig::CONFIG having warnflags expanded in them,
+ forcing third-party C/C++ extensions to follow what warnflags
+ demands, like ANSI/ISO-C90 conformance. ref [Bug #7101]
+
+Fri Feb 15 20:29:11 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/sockport.h (SET_SIN_LEN): defined for strict-aliasing
+ rule.
+ (INIT_SOCKADDR_IN): ditto.
+
+ * ext/socket/raddrinfo.c (make_inetaddr): use INIT_SOCKADDR_IN.
+ (addrinfo_ipv6_to_ipv4): ditto.
+
+Fri Feb 15 18:24:48 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * lib/mkmf.rb (MakeMakefile#try_run): bail out explicitly if cross
+ compiling, because it cannot work of course.
+
+Fri Feb 15 12:34:58 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: test struct sockaddr_storage directly.
+
+ * ext/socket/rubysocket.h: use HAVE_TYPE_STRUCT_SOCKADDR_STORAGE.
+
+Fri Feb 15 12:26:13 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/getaddrinfo.c (GET_AI): don't cast 1st argument for
+ INIT_SOCKADDR.
+
+Fri Feb 15 08:12:11 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/sockport.h (SET_SS_LEN): removed.
+ (SET_SIN_LEN): removed.
+ (INIT_SOCKADDR): new macro.
+
+ * ext/socket/ancdata.c (extract_ipv6_pktinfo): use INIT_SOCKADDR.
+
+ * ext/socket/raddrinfo.c (make_inetaddr): use INIT_SOCKADDR.
+ (addrinfo_ipv6_to_ipv4): ditto.
+
+ * ext/socket/getaddrinfo.c (GET_AI): use INIT_SOCKADDR.
+
+Fri Feb 15 07:49:27 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rdoc.rb: Update to release version of 4.0.0
+
+ * lib/rubygems.rb: Update to release version of 2.0.0
+
+Fri Feb 15 07:07:27 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/sockport.h (SA_LEN): removed because unused now.
+ (SS_LEN): ditto.
+ (SIN_LEN): ditto.
+
+Thu Feb 14 10:45:31 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * test/ruby/test_process.rb (test_setsid): Added a workaround for
+ MacOS X. Patch by nagachika. [Bug #7826] [ruby-core:52126]
+
+Fri Feb 15 00:15:31 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/sockport.h (VALIDATE_SOCKLEN): new macro to validate
+ sa_len member of 4.4BSD socket address.
+
+ * ext/socket/getnameinfo.c (getnameinfo): use VALIDATE_SOCKLEN,
+ instead of SA_LEN.
+
+ * ext/socket/socket.c (sock_s_getnameinfo): use VALIDATE_SOCKLEN
+ instead of SS_LEN.
+
+Thu Feb 14 22:25:54 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/socket.c (sockaddr_len): extracted from sockaddr_obj.
+ (sockaddr_obj): add an argument to length of socket address.
+ (socket_s_ip_address_list): call sockaddr_obj with actual socket
+ address length if given, use sockaddr_len otherwise.
+
+Thu Feb 14 20:11:23 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket: always operate length of socket address companion with
+ socket address.
+
+ * ext/socket/rubysocket.h (rsock_make_ipaddr): add an argument for
+ socket address length.
+ (rsock_ipaddr): ditto.
+
+ * ext/socket/ipsocket.c (ip_addr): pass length to rsock_ipaddr.
+ (ip_peeraddr): ditto.
+ (ip_s_getaddress): pass length to rsock_make_ipaddr.
+
+ * ext/socket/socket.c (make_addrinfo): pass length to rsock_ipaddr.
+ (sock_s_getnameinfo): pass actual address length to rb_getnameinfo.
+ (sock_s_unpack_sockaddr_in): pass length to rsock_make_ipaddr.
+
+ * ext/socket/init.c (rsock_s_recvfrom): pass length to rsock_ipaddr.
+ (rsock_s_recvfrom_nonblock): ditto.
+
+ * ext/socket/tcpsocket.c (tcp_sockaddr): pass length to
+ rsock_make_ipaddr.
+
+ * ext/socket/raddrinfo.c (make_ipaddr0): add an argument for socket
+ address length. pass the length to rb_getnameinfo.
+ (rsock_ipaddr): ditto.
+ (rsock_make_ipaddr): add an argument for socket address length.
+ pass the length to make_ipaddr0.
+ (make_inetaddr): pass length to make_ipaddr0.
+ a local variable renamed.
+ (host_str): a local variable renamed.
+ (port_str): ditto.
+
+Thu Feb 14 14:31:43 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/net/http.rb: Removed OpenSSL dependency from Net::HTTP.
+
+ * test/net/http/test_http.rb: Remove Zlib dependency from tests.
+ * test/net/http/test_http_request.rb: ditto.
+
+Thu Feb 14 11:08:15 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * class.c (include_modules_at): detect cyclic prepend with original
+ method table. [ruby-core:52205] [Bug #7841]
+
+Thu Feb 14 10:30:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * vm_method.c: call method_removed hook on called class, not on
+ prepending iclass. [ruby-core:52207] [Bug #7843]
+
+Thu Feb 14 10:05:57 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/net/http: Do not handle Content-Encoding when the user sets
+ Accept-Encoding. This allows users to handle Content-Encoding for
+ themselves. This restores backwards-compatibility with Ruby 1.x.
+ [ruby-trunk - Bug #7831]
+ * lib/net/http/generic_request.rb: ditto.
+ * lib/net/http/response.rb: ditto
+ * test/net/http/test_http.rb: Test for the above.
+ * test/net/http/test_http_request.rb: ditto.
+ * test/net/http/test_httpresponse.rb: ditto.
+
+Thu Feb 14 08:18:47 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: don't define HAVE_SA_LEN and HAVE_SA_LEN.
+ use HAVE_STRUCT_SOCKADDR_SA_LEN and HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
+ instead.
+
+Wed Feb 13 20:59:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: don't define socklen_t here, just test.
+
+ * ext/socket/rubysocket.h: define socklen_t if not available.
+
+Wed Feb 13 18:37:50 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (mnew): skip prepending modules and return the method bound
+ on the given class. [ruby-core:52160] [Bug #7836]
+
+Wed Feb 13 18:11:59 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * proc.c (method_original_name): new methods Method#original_name and
+ UnboundMethod#original_name. [ruby-core:52048] [Bug #7806]
+ [EXPERIMENTAL]
+
+ * proc.c (method_inspect): show the given name primarily, and
+ original_id if aliased. [ruby-core:52048] [Bug #7806]
+
+Wed Feb 13 17:56:39 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (warnflags): disable -Werror by default unless
+ development. [ruby-core:52131] [Bug #7830]
+
+Wed Feb 13 06:05:52 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems.rb: Return BINARY strings from Gem.gzip and Gem.gunzip.
+ Fixes intermittent test failures. RubyGems issue #450 by Jeremey
+ Kemper.
+ * test/rubygems/test_gem.rb: Test for the above.
+
+Wed Feb 13 05:49:21 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: test functions just after struct members.
+
+Tue Feb 12 12:02:35 2013 NARUSE, Yui <naruse@ruby-lang.org>
+
+ * ext/json: merge JSON 1.7.7.
+ This includes security fix. [CVE-2013-0269]
+ https://github.com/flori/json/commit/d0a62f3ced7560daba2ad546d83f0479a5ae2cf2
+ https://groups.google.com/d/topic/rubyonrails-security/4_YvCpLzL58/discussion
+
+Mon Feb 11 23:08:48 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: enable rb_cv_page_size_log test for MirOS BSD.
+
+Mon Feb 11 20:06:38 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: use -pthread on mirbsd*.
+
+Mon Feb 11 16:07:09 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: add SOLIBS and LIBRUBY_SO definition for mirbsd*.
+
+Mon Feb 11 13:17:20 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in (rubysitearchprefix): sitearchdir and vendorarchdir
+ should use sitearch, not arch. [ruby-dev:46964] [Bug #7823]
+
+ * win32/Makefile.sub (config.status): site and vendor directories
+ should use sitearch, not arch. [ruby-dev:46964] [Bug #7823]
+
+Mon Feb 11 12:31:25 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: move OS specific header/function knowledge before
+ automatic header tests.
+
+Mon Feb 11 11:04:29 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: move the test for -march=i486 just after
+ RUBY_UNIVERSAL_ARCH/RUBY_DEFAULT_ARCH.
+
+Sun Feb 10 23:42:26 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: test structure members just after types test.
+
+Sun Feb 10 20:58:17 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: test types just after headers test.
+
+Sun Feb 10 16:00:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/rake/doc/MIT-LICENSE: Add license file from upstream
+ * lib/rake/doc/README.rdoc: Link to license file from Rake README
+ * lib/rake/version.rb: Include README rdoc for Rake module overview
+
+Sun Feb 10 15:26:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/rake/doc/*: Sync Rake rdoc files from upstream
+
+Sun Feb 10 15:50:02 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * vm_exec.h (DISPATCH_ARCH_DEPEND_WAY): use __asm__ __volatile__
+ instead of asm volatile.
+
+Sun Feb 10 15:50:02 2013 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * gc.h (SET_MACHINE_STACK_END): use __volatile__ instead of volatile.
+
+Sun Feb 10 14:25:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * doc/rake/, lib/rake/doc/: Move Rake rdoc files to lib/rake
+
+Sun Feb 10 12:10:25 2013 Tanaka Akira <akr@fsij.org>
+
+ * ext/socket/extconf.rb: test headers at first.
+
+Sun Feb 10 12:00:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * doc/rake/*: Removed stale Rake static files
+
+Sun Feb 10 09:10:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * lib/pp.rb, lib/prettyprint.rb: Documentation for PP and PrettyPrint
+ Based on a patch by Vincent Batts [ruby-core:51253] [Bug #7656]
+
+Sat Feb 9 21:11:21 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: move header files check to the beginning of
+ "header and library section".
+ test rlim_t with sys/types.h and sys/time.h for MirOS BSD.
+ sys/types.h and sys/time.h is guarded by #ifdef and the above
+ move is required for this change.
+
+Sat Feb 9 17:45:58 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in, version.c: prevent duplicated load paths by empty
+ version string, it does not work right now.
+
+Sat Feb 9 17:38:41 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * configure.in: fix arch parameters in help message. [Bug #7804]
+
+Sat Feb 9 13:13:00 2013 Zachary Scott <zachary@zacharyscott.net>
+
+ * vm_trace.c: Note about TracePoint events set, and comment on
+ Kernel#set_trace_func to prefer new TracePoint API
+
+Sat Feb 9 10:07:47 2013 Kazuki Tsujimoto <kazuki@callcc.net>
+
+ * BSDL: update copyright notice for 2013.
+
+Sat Feb 9 09:24:38 2013 Eric Hodel <drbrain@segment7.net>
+
+ * lib/rubygems/package/old.rb: Fix behavior only on ruby 1.8.
+
+ * lib/rubygems/package.rb: Include checksums.yaml.gz signatures for
+ verification.
+ * test/rubygems/test_gem_package.rb: Test for the above.
+
+Sat Feb 9 01:23:24 2013 Tanaka Akira <akr@fsij.org>
+
+ * test/fiddle/helper.rb: specify libc and libm locations for MirOS BSD.
+
+ * test/dl/test_base.rb: ditto.
+
+Fri Feb 8 23:25:33 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: change CFLAGS temporally to test
+ ARCH_FLAG="-march=i486".
+
+Fri Feb 8 21:19:41 2013 Tanaka Akira <akr@fsij.org>
+
+ * configure.in: don't define ARCH_FLAG="-march=i486" if it causes
+ compilation problem.
+
+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/doc/NEWS-2.0.0 b/doc/NEWS-2.0.0
index f99ba3e882..9ad7254317 100644
--- a/doc/NEWS-2.0.0
+++ b/doc/NEWS-2.0.0
@@ -168,7 +168,7 @@ with all sufficient information, see the ChangeLog file.
* RUBY_FIBER_VM_STACK_SIZE: vm stack size used at fiber creation.
default: 64KB or 128KB.
* RUBY_FIBER_MACHINE_STACK_SIZE: machine stack size used at fiber
- creation. default: 256KB or 256KB.
+ creation. default: 256KB or 512KB.
These variables are checked only at launched time.
* added constant DEFAULT_PARAMS to get above default parameters.
diff --git a/doc/NEWS-2.1.0 b/doc/NEWS-2.1.0
new file mode 100644
index 0000000000..5d4152b8dc
--- /dev/null
+++ b/doc/NEWS-2.1.0
@@ -0,0 +1,376 @@
+# -*- rdoc -*-
+
+= NEWS for Ruby 2.1.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.
+
+== Changes since the 2.0.0 release
+
+=== Language changes
+
+* Now the default values of keyword arguments can be omitted. Those
+ "required keyword arguments" need giving explicitly at the call time.
+
+* Added suffixes for integer and float literals: 'r', 'i', and 'ri'.
+ * "42r" and "3.14r" are evaluated as Rational(42, 1) and 3.14.rationalize,
+ respectively. But exponential form with 'r' suffix like "6.022e+23r" is
+ not accepted because it is misleading.
+ * "42i" and "3.14i" are evaluated as Complex(0, 42) and Complex(0, 3.14),
+ respectively.
+ * "42ri" and "3.14ri" are evaluated as Complex(0, 42r) and Complex(0, 3.14r),
+ respectively.
+
+* def-expr now returns the symbol of its name instead of nil.
+
+=== Core classes updates (outstanding ones only)
+
+* Array
+ * New methods
+ * Array#to_h converts an array of key-value pairs into a Hash.
+
+* Binding
+ * New methods
+ * Binding#local_variable_get(symbol)
+ * Binding#local_variable_set(symbol, obj)
+ * Binding#local_variable_defined?(symbol)
+
+* Enumerable
+ * New methods
+ * Enumerable#to_h converts a list of key-value pairs into a Hash.
+
+* Exception
+ * New methods
+ * Exception#cause provides the previous exception which has been caught
+ at where raising the new exception.
+
+* GC
+ * improvements:
+ * introduced the generational GC a.k.a RGenGC.
+ * added environment variables:
+ * RUBY_GC_HEAP_INIT_SLOTS
+ * RUBY_GC_HEAP_FREE_SLOTS
+ * RUBY_GC_HEAP_GROWTH_FACTOR
+ * RUBY_GC_HEAP_GROWTH_MAX_SLOTS
+ * RUBY_GC_MALLOC_LIMIT_MAX
+ * RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR
+ * RUBY_GC_OLDMALLOC_LIMIT
+ * RUBY_GC_OLDMALLOC_LIMIT_MAX
+ * RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR
+ * obsoleted environment variables:
+ * RUBY_FREE_MIN (Use RUBY_GC_HEAP_FREE_SLOTS instead)
+ * RUBY_HEAP_MIN_SLOTS (Use RUBY_GC_HEAP_INIT_SLOTS instead)
+
+* Integer
+ * New methods
+ * Fixnum#bit_length
+ * Bignum#bit_length
+ * Bignum performance improvement
+ * Use GMP if available.
+ GMP is used only for several operations:
+ multiplication, division, radix conversion, GCD
+
+* IO
+ * extended methods:
+ * IO#seek supports SEEK_DATA and SEEK_HOLE as whence.
+ * IO#seek accepts symbols (:CUR, :END, :SET, :DATA, :HOLE) for 2nd argument.
+ * IO#read_nonblock accepts optional `exception: false` to return symbols
+ * IO#write_nonblock accepts optional `exception: false` to return symbols
+
+* Kernel
+ * New methods:
+ * Kernel#singleton_method
+
+* Module
+ * New methods:
+ * Module#using, which activates refinements of the specified module only
+ in the current class or module definition.
+ * Module#singleton_class? returns true if the receiver is a singleton class
+ or false if it is an ordinary class or module.
+ * extended methods:
+ * Module#refine is no longer experimental.
+ * Module#include and Module#prepend are now public methods.
+
+* Mutex
+ * misc
+ * Mutex#owned? is no longer experimental.
+
+* Numeric
+ * extended methods:
+ * Numeric#step allows the limit argument to be omitted, in which
+ case an infinite sequence of numbers is generated. Keyword
+ arguments `to` and `by` are introduced for ease of use.
+ `by` can be 0, in which case the same value will be generated
+ indefinitely.
+
+* Process
+ * New methods:
+ * alternative methods to $0/$0=:
+ * Process.argv0() returns the original value of $0.
+ * Process.setproctitle() sets the process title without affecting $0.
+ * Process.clock_gettime
+ * Process.clock_getres
+
+* String
+ * "literal".freeze is now optimized to return the same object
+ * New methods:
+ * String#scrub and String#scrub! verify and fix invalid byte sequence.
+ If you want to use this function with older Ruby,
+ consider to use string-scrub.gem.
+
+* Symbol
+ * All symbols are now frozen.
+
+* pack/unpack (Array/String)
+ * Q! and q! directives for long long type if platform has the type.
+
+* toplevel
+ * extended methods:
+ * main.using is no longer experimental. The method activates refinements
+ in the ancestors of the argument module to support refinement
+ inheritance by Module#include.
+
+=== Core classes compatibility issues (excluding feature bug fixes)
+
+* Hash
+ * incompatible changes:
+ * Hash#reject will return plain Hash object in the future versions, that
+ is the original object's subclass, instance variables, default value,
+ and taintedness will be no longer copied, so now warnings are emitted
+ when called with such Hash.
+
+* IO
+ * incompatible changes:
+ * open ignore internal encoding if external encoding is ASCII-8BIT.
+
+* Kernel#eval, Kernel#instance_eval, and Module#module_eval.
+ * Copies the scope information of the original environment, which means
+ that private, protected, public, and module_function without arguments
+ do not affect the environment outside the eval string.
+ For example, `class Foo; eval "private"; def foo; end; end' doesn't make
+ Foo#foo private.
+
+* Kernel#untrusted?, untrust, and trust
+ * These methods are deprecated and their behavior is same as tainted?,
+ taint, and untaint, respectively. If $VERBOSE is true, they show warnings.
+
+* Module#ancestors
+ * The ancestors of a singleton class now include singleton classes,
+ in particular itself.
+
+* Module#define_method and Object#define_singleton_method
+ * Now they return the symbols of the defined methods, not the methods/procs
+ themselves.
+
+* Numeric#quo
+ * Raises TypeError instead of ArgumentError if the receiver doesn't have
+ to_r method.
+
+* Proc
+ * Returning from lambda proc now always exits from the Proc, not from the
+ method where the lambda is created. Returning from non-lambda proc exits
+ from the method, same as the former behavior.
+
+String
+ * If invalid: :replace is specified for String#encode, replace
+ invalid byte sequence even if the destination encoding equals to
+ the source encoding.
+
+=== Stdlib updates (outstanding ones only)
+
+* CGI::Util
+ * All class methods modulized.
+
+* Digest
+ * extended methods:
+ * Digest::Class.file takes optional arguments for its constructor
+
+* Matrix
+ * Added Vector#cross_product.
+
+* Net::SMTP
+ * Added Net::SMTP#rset to implement the RSET command
+
+* objspace
+ * new method:
+ * ObjectSpace.trace_object_allocations
+ * ObjectSpace.trace_object_allocations_start
+ * ObjectSpace.trace_object_allocations_stop
+ * ObjectSpace.trace_object_allocations_clear
+ * ObjectSpace.allocation_sourcefile
+ * ObjectSpace.allocation_sourceline
+ * ObjectSpace.allocation_class_path
+ * ObjectSpace.allocation_method_id
+ * ObjectSpace.allocation_generation
+ * ObjectSpace.reachable_objects_from_root
+ * ObjectSpace.dump
+ * ObjectSpace.dump_all
+
+* OpenSSL::BN
+ * extended methods:
+ * OpenSSL::BN.new allows Fixnum/Bignum argument.
+
+* open-uri
+ * Support multiple fields with same field name (like Set-Cookie).
+
+* Pathname
+ * New methods:
+ * Pathname#write
+ * Pathname#binwrite
+
+* rake
+ * Updated to 10.1.0. Major changes include removal of the class namespace,
+ Rake::DSL to hold the rake DSL methods and removal of support for legacy
+ rake features.
+
+ For a complete list of changes since rake 0.9.6 see:
+
+ http://rake.rubyforge.org/doc/release_notes/rake-10_1_0_rdoc.html
+
+ http://rake.rubyforge.org/doc/release_notes/rake-10_0_3_rdoc.html
+
+* RbConfig
+ * New constants:
+ * RbConfig::SIZEOF is added to provide the size of C types.
+
+* RDoc
+ * Updated to 4.1.0. Major enhancements include a modified default template
+ * and accessibility enhancements.
+
+ For a list of minor enhancements and bug fixes see:
+ https://github.com/rdoc/rdoc/blob/v4.1.0.preview.1/History.rdoc
+
+* Resolv
+ * New methods:
+ * Resolv::DNS.fetch_resource
+ * One-shot multicast DNS support
+ * Support LOC resources
+
+* REXML::Parsers::SAX2Parser
+ * Fixes wrong number of arguments of entitydecl event. Document of the event
+ says "an array of the entity declaration" but implementation passes two
+ or more arguments. It is an implementation bug but it breaks backward
+ compatibility.
+
+* REXML::Parsers::StreamParser
+ * Supports "entity" event.
+
+* REXML::Text
+ * REXML::Text#<< supports method chain like 'text << "XXX" << "YYY"'.
+ * REXML::Text#<< supports not "raw" mode.
+
+* Rinda::RingServer, Rinda::RingFinger
+ * Rinda now supports multicast sockets. See Rinda::RingServer and
+ Rinda::RingFinger for details.
+
+* RubyGems
+ * Updated to 2.2.0. Notable new features include:
+
+ * Gemfile or gem.deps.rb support including Gem.file.lock (experimental)
+ * Improved, iterative resolver (compared to RubyGems 2.1 and earlier)
+ * Support for a sharing a GEM_HOME across ruby platforms and versions
+
+ For a complete list of enhancements and bug fixes see:
+ https://github.com/rubygems/rubygems/tree/master/History.txt
+
+* Set
+ * New methods:
+ * Set#intersect?
+ * Set#disjoint?
+
+* Socket
+ * New methods:
+ * Socket.getifaddrs
+
+* StringScanner
+ * extended methods:
+ * StringScanner#[] supports named captures.
+
+* Syslog::Logger
+ * Added facility.
+
+* Tempfile
+ * New methods:
+ * Tempfile.create
+
+* Timeout
+ * The exception to terminate the given block can no longer be rescued
+ inside the block, by default, unless the exception class is given
+ explicitly.
+
+* TSort
+ * New methods:
+ * TSort.tsort
+ * TSort.tsort_each
+ * TSort.strongly_connected_components
+ * TSort.each_strongly_connected_component
+ * TSort.each_strongly_connected_component_from
+
+* WEBrick
+ * The body of a response may now be a StringIO or other IO-like that responds
+ to #readpartial and #read.
+
+* XMLRPC::Client
+ * New methods:
+ * XMLRPC::Client#http. It returns Net::HTTP for the client. Normally,
+ it is not needed. It is useful when you want to change minor HTTP client
+ options. You can change major HTTP client options by XMLRPC::Client
+ methods. You should use XMLRPC::Client methods for changing major
+ HTTP client options instead of XMLRPC::Client#http.
+
+=== Stdlib compatibility issues (excluding feature bug fixes)
+
+* Set
+ * incompatible changes:
+ * Set#to_set now returns self instead of generating a copy.
+
+* URI
+ * incompatible changes:
+ * URI.decode_www_form follows current WHATWG URL Standard.
+ It gets encoding argument to specify the character encoding.
+ It now allows loose percent encoded strings, but denies ;-separator.
+ * URI.encode_www_form follows current WHATWG URL Standard.
+ It gets encoding argument to convert before percent encode.
+ UTF-16 strings aren't converted to UTF-8 before percent encode by default.
+
+* curses
+ * Removed.
+ curses is now available as a gem.
+ See https://rubygems.org/gems/curses for details.
+
+=== Built-in global variables compatibility issues
+
+* $SAFE
+ * $SAFE=4 is obsolete. If $SAFE is set to 4 or larger, an ArgumentError
+ is raised.
+
+=== C API updates
+
+* rb_gc_set_params() is deprecated. This is only used in Ruby internal.
+
+* rb_gc_count() added. This returns the number of times GC occurred.
+
+* rb_gc_stat() added. This allows access to specific GC.stat() values from C
+ without any allocation overhead.
+
+* rb_gc_latest_gc_info() added. This allows access to GC.latest_gc_info().
+
+* rb_postponed_job_register() added. Takes a function callback which is invoked
+ when the VM is in a consistent state, i.e. to perform work from a C signal
+ handler.
+
+* rb_profile_frames() added. Provides low-cost access to the current ruby stack
+ for callstack profiling.
+
+* rb_tracepoint_new() supports new internal events accessible only from C:
+ * RUBY_INTERNAL_EVENT_NEWOBJ
+ * RUBY_INTERNAL_EVENT_FREEOBJ
+ * RUBY_INTERNAL_EVENT_GC_START
+ * RUBY_INTERNAL_EVENT_GC_END_MARK
+ * RUBY_INTERNAL_EVENT_GC_END_SWEEP
+ * Note that you *can not* specify "internal events" with normal events
+ (such as RUBY_EVENT_CALL, RUBY_EVENT_RETURN) simultaneously.
diff --git a/doc/contributing.rdoc b/doc/contributing.rdoc
index 9d9fbdf2da..c6ccc68302 100644
--- a/doc/contributing.rdoc
+++ b/doc/contributing.rdoc
@@ -436,7 +436,8 @@ your working branch:
Now that you've got some code you want to contribute, let's get set up to
generate a patch. Start by forking the github mirror, check the {github docs on
forking}[https://help.github.com/articles/fork-a-repo] if you get stuck here.
-here. You will also need a github account if you don't yet have one.
+here. You will only need a github account if you intend to host your repository
+on github.
Next copy the writable url for your fork and add it as a git remote, replace
"my_username" with your github account name:
@@ -454,6 +455,12 @@ the patch for you, save the file to your computer and upload it to the bug
tracker. Alternatively you can submit a pull request, but for the best chances
to receive feedback add it is recommended you add it to redmine.
-
-
+Since git is a distributed system, you are welcome to host your git repository
+on any {publically accessible hosting
+site}[https://git.wiki.kernel.org/index.php/GitHosting], including {hosting your
+own}[https://www.kernel.org/pub/software/scm/git/docs/user-manual.html#public-repositories]
+You may use the {'git format-patch'}[http://git-scm.com/docs/git-format-patch]
+command to generate patch files to upload to redmine. You may also use
+the {'git request-pull'}[http://git-scm.com/docs/git-request-pull] command for
+formatting pull request messages to redmine.
diff --git a/doc/globals.rdoc b/doc/globals.rdoc
index f82b6f8796..3bc7e05623 100644
--- a/doc/globals.rdoc
+++ b/doc/globals.rdoc
@@ -31,6 +31,7 @@ $DEBUG:: The debug flag, which is set by the -d switch. Enabling debug
backtrace). Setting this to a true value enables debug output as
if -d were given on the command line. Setting this to a false
value disables debug output.
+$LOADED_FEATURES:: The alias to the $".
$FILENAME:: Current input file from $<. Same as $<.filename.
$LOAD_PATH:: The alias to the $:.
$stderr:: The current standard error output.
diff --git a/doc/keywords.rdoc b/doc/keywords.rdoc
new file mode 100644
index 0000000000..98bbd5e864
--- /dev/null
+++ b/doc/keywords.rdoc
@@ -0,0 +1,158 @@
+== Keywords
+
+The following keywords are used by Ruby.
+
+__ENCODING__::
+ The script encoding of the current file. See Encoding.
+
+__LINE__::
+ The line number of this keyword in the current file.
+
+__FILE__::
+ The path to the current file.
+
+BEGIN::
+ Runs before any other code in the current file. See {miscellaneous
+ syntax}[rdoc-ref:syntax/miscellaneous.rdoc]
+
+END::
+ Runs after any other code in the current file. See {miscellaneous
+ syntax}[rdoc-ref:syntax/miscellaneous.rdoc]
+
+alias::
+ Creates an alias between two methods (and other things). See {modules and
+ classes syntax}[rdoc-ref:syntax/modules_and_classes.rdoc]
+
+and::
+ Short-circuit Boolean and with lower precedence than <code>&&</code>
+
+begin::
+ Starts an exception handling block. See {exceptions
+ syntax}[rdoc-ref:syntax/exceptions.rdoc]
+
+break::
+ Leaves a block early. See {control expressions
+ syntax}[rdoc-ref:syntax/control_expressions.rdoc]
+
+case::
+ Starts a +case+ expression. See {control expressions
+ syntax}[rdoc-ref:syntax/control_expressions.rdoc]
+
+class::
+ Creates or opens a class. See {modules and classes
+ syntax}[rdoc-ref:syntax/modules_and_classes.rdoc]
+
+def::
+ Defines a method. See {methods syntax}[rdoc-ref:syntax/methods.rdoc]
+
+defined?::
+ Returns a string describing its argument. See {miscellaneous
+ syntax}[rdoc-ref:syntax/miscellaneous.rdoc]
+
+do::
+ Starts a block.
+
+else::
+ The unhandled condition in +case+, +if+ and +unless+ expressions. See
+ {control expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+elsif::
+ An alternate condition for an +if+ expression. See {control
+ expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+end::
+ The end of a syntax block. Used by classes, modules, methods, exception
+ handling and control expressions.
+
+ensure::
+ Starts a section of code that is always run when an exception is raised.
+ See {exception handling}[rdoc-ref:syntax/exceptions.rdoc]
+
+false::
+ Boolean false. See {literals}[rdoc-ref:syntax/literals.rdoc]
+
+for::
+ A loop that is similar to using the +each+ method. See {control
+ expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+if::
+ Used for +if+ and modifier +if+ expressions. See {control
+ expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+in::
+ Used to separate the iterable object and iterator variable in a +for+ loop.
+ See {control expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+module::
+ Creates or opens a module. See {modules and classes
+ syntax}[rdoc-ref:syntax/modules_and_classes.rdoc]
+
+next::
+ Skips the rest of the block. See {control
+ expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+nil::
+ A false value usually indicating "no value" or "unknown". See
+ {literals}[rdoc-ref:syntax/literals.rdoc]
+
+not::
+ Inverts the following boolean expression. Has a lower precedence than
+ <code>!</code>
+
+or::
+ Boolean or with lower precedence than <code>||</code>
+
+redo::
+ Restarts execution in the current block. See {control
+ expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+rescue::
+ Starts an exception section of code in a +begin+ block. See {exception
+ handling}[rdoc-ref:syntax/exceptions.rdoc]
+
+retry::
+ Retries an exception block. See {exception
+ handling}[rdoc-ref:syntax/exceptions.rdoc]
+
+return::
+ Exits a method. See {methods}[rdoc-ref:syntax/methods.rdoc]
+
+self::
+ The object the current method is attached to. See
+ {methods}[rdoc-ref:syntax/methods.rdoc]
+
+super::
+ Calls the current method in a superclass. See
+ {methods}[rdoc-ref:syntax/methods.rdoc]
+
+then::
+ Indicates the end of conditional blocks in control structures. See
+ {control expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+true::
+ Boolean true. See {literals}[rdoc-ref:syntax/literals.rdoc]
+
+undef::
+ Prevents a class or module from responding to a method call.
+ See {modules and classes}[rdoc-ref:syntax/modules_and_classes.rdoc]
+
+unless::
+ Used for +unless+ and modifier +unless+ expressions. See {control
+ expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+until::
+ Creates a loop that executes until the condition is true. See
+ {control expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+when::
+ A condition in a +case+ expression. See
+ {control expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+while::
+ Creates a loop that executes while the condition is true. See
+ {control expressions}[rdoc-ref:syntax/control_expressions.rdoc]
+
+yield::
+ Starts execution of the block sent to the current method. See
+ {methods}[rdoc-ref:syntax/methods.rdoc]
+
diff --git a/doc/regexp.rdoc b/doc/regexp.rdoc
index 3c13b6683f..810f15ce1a 100644
--- a/doc/regexp.rdoc
+++ b/doc/regexp.rdoc
@@ -545,7 +545,7 @@ Options may also be used with <tt>Regexp.new</tt>:
As mentioned above, the <tt>x</tt> option enables <i>free-spacing</i>
mode. Literal white space inside the pattern is ignored, and the
octothorpe (<tt>#</tt>) character introduces a comment until the end of
-the line. This allows the components of the pattern to be organised in a
+the line. This allows the components of the pattern to be organized in a
potentially more readable fashion.
A contrived pattern to match a number with optional decimal places:
@@ -558,8 +558,11 @@ A contrived pattern to match a number with optional decimal places:
\Z/x
float_pat.match('3.14') #=> #<MatchData "3.14" 1:".14">
-*Note*: To match whitespace in an <tt>x</tt> pattern use an escape such as
-<tt>\s</tt> or <tt>\p{Space}</tt>.
+There are a number of strategies for matching whitespace:
+
+* Use a pattern such as <tt>\s</tt> or <tt>\p{Space}</tt>.
+* Use escaped whitespace such as <tt>\ </tt>, i.e. a space preceded by a backslash.
+* Use a character class such as <tt>[ ]</tt>.
Comments can be included in a non-<tt>x</tt> pattern with the
<tt>(?#</tt><i>comment</i><tt>)</tt> construct, where <i>comment</i> is
diff --git a/doc/syntax/assignment.rdoc b/doc/syntax/assignment.rdoc
index 7424d4885f..adfe6485a4 100644
--- a/doc/syntax/assignment.rdoc
+++ b/doc/syntax/assignment.rdoc
@@ -354,7 +354,7 @@ Here is an example:
p a # prints 1
-Note that these two operators behave more like <code>a || a = 0<code> than
+Note that these two operators behave more like <code>a || a = 0</code> than
<code>a = a || 0</code>.
== Implicit Array Assignment
@@ -374,7 +374,7 @@ assigning. This is similar to multiple assignment:
p a # prints [1, 2, 3]
-You can splat anywhere in the left-hand side of the assignment:
+You can splat anywhere in the right-hand side of the assignment:
a = 1, *[2, 3]
@@ -382,7 +382,7 @@ You can splat anywhere in the left-hand side of the assignment:
== Multiple Assignment
-You can assign multiple values on the left-hand side to multiple variables:
+You can assign multiple values on the right-hand side to multiple variables:
a, b = 1, 2
@@ -408,8 +408,8 @@ You can use multiple assignment to swap two values in-place:
p new_value: new_value, old_value: old_value
# prints {:new_value=>1, :old_value=>2}
-If you have more values on the left hand side of the assignment than variables
-on the right hand side the extra values are ignored:
+If you have more values on the right hand side of the assignment than variables
+on the left hand side the extra values are ignored:
a, b = 1, 2, 3
@@ -422,7 +422,7 @@ the assignment.
p a: a, b: b # prints {:a=>1, :b=>[2, 3]}
-The <code>*</code> can appear anywhere on the right-hand side:
+The <code>*</code> can appear anywhere on the left-hand side:
*a, b = 1, 2, 3
diff --git a/doc/syntax/literals.rdoc b/doc/syntax/literals.rdoc
index e01b6875d4..32e10edd30 100644
--- a/doc/syntax/literals.rdoc
+++ b/doc/syntax/literals.rdoc
@@ -100,7 +100,8 @@ single-quote strings:
'#{1 + 1}' #=> "\#{1 + 1}"
In addition to disabling interpolation, single-quoted strings also disable all
-escape sequences except for the single-quote (<tt>\'</tt>).
+escape sequences except for the single-quote (<tt>\'</tt>) and backslash
+(<tt>\\\\</tt>).
You may also create strings using <tt>%</tt>:
diff --git a/doc/syntax/methods.rdoc b/doc/syntax/methods.rdoc
index 7fd69983f3..648843e753 100644
--- a/doc/syntax/methods.rdoc
+++ b/doc/syntax/methods.rdoc
@@ -8,8 +8,8 @@ definition:
end
A method definition consists of the +def+ keyword, a method name, the body of
-the method, then the +end+ keyword. When called the method will execute the
-body of the method. This method returns +2+.
+the method, +return+ value and the +end+ keyword. When called the method will
+execute the body of the method. This method returns +2+.
This section only covers defining methods. See also the {syntax documentation
on calling methods}[rdoc-ref:syntax/calling_methods.rdoc].
@@ -17,27 +17,50 @@ on calling methods}[rdoc-ref:syntax/calling_methods.rdoc].
== Method Names
Method names may be one of the operators or must start a letter or a character
-with the eight bit set. Typically method names are US-ASCII compatible since
-the keys to type them exist on all keyboards.
+with the eight bit set. It may contain letters, numbers, an <code>_</code>
+(underscore or low line) or a character with the eight bit set. The convention
+is to use underscores to separate words in a multiword method name:
-(Ruby programs must be written in a US-ASCII-compatible character set. In
-such character sets if the eight bit is set it indicates an extended
-character. Ruby allows method names and other identifiers to contain such
-characters.)
+ def method_name
+ puts "use underscores to separate words"
+ end
+
+Ruby programs must be written in a US-ASCII-compatible character set such as
+UTF-8, ISO-8859-1 etc. In such character sets if the eight bit is set it
+indicates an extended character. Ruby allows method names and other identifiers
+to contain such characters. Ruby programs cannot contain some characters like
+ASCII NUL (<code>\x00<code>).
+
+The following are the examples of valid ruby methods:
+
+ def hello
+ "hello"
+ end
+
+ def ã“ã‚“ã«ã¡ã¯
+ puts "means hello in Japanese"
+ end
-Method names may contain letters, numbers, an <code>_</code> (underscore or
-low line) or a character with the eight bit set.
+Typically method names are US-ASCII compatible since the keys to type them
+exist on all keyboards.
Method names may end with a <code>!</code> (bang or exclamation mark), a
<code>?</code> (question mark) or <code>=</code> equals sign.
-In the ruby core library when a method ends with a bang it indicates there is
-a non-bang method that has does not modify the receiver. This is typically
-true for the standard library but does not hold true for other ruby libraries.
-
-Methods that end with a question mark do not always return just +true+ or
-+false+. Often they will may return an object to indicate a true value (or
-"truthy" value).
+The bang methods(<code>!</code> at the end of method name) are called and
+executed just like any other method. However, by convention, a method with an
+exclamation point or bang is considered dangerous. In ruby core library the
+dangerous method implies that when a method ends with a bang(<code>!</code>),
+it indicates that unlike its non-bang equivalent, permanently modifies its
+receiver. Almost always, Ruby core library will have a non-bang
+counterpart(method name which does NOT end with <code>!</code>) of every bang
+method (method name which does end with <code>!</code>) that has does not
+modify the receiver. This convention is typically true for ruby core libary but
+may/may not hold true for other ruby libraries.
+
+Methods that end with a question mark by convention return boolean. But they
+may not always return just +true+ or +false+. Often they will may return an
+object to indicate a true value (or "truthy" value).
Methods that end with an equals sign indicate an assignment method. For
assignment methods the return value is ignored, the arguments are returned
@@ -360,7 +383,7 @@ arguments must appear before any keyword arguments.
The block argument is indicated by <code>&</code> and must come last:
def my_method(&my_block)
- my_method.call(self)
+ my_block.call(self)
end
Most frequently the block argument is used to pass a block to another method:
diff --git a/doc/syntax/refinements.rdoc b/doc/syntax/refinements.rdoc
index 1a516ed8b2..62405a78b7 100644
--- a/doc/syntax/refinements.rdoc
+++ b/doc/syntax/refinements.rdoc
@@ -42,7 +42,7 @@ Activate the refinement with #using:
using M
- x = C.new
+ c = C.new
c.foo # prints "C#foo in M"
diff --git a/enc/big5.c b/enc/big5.c
index 9d7738d8f9..27315c4ba9 100644
--- a/enc/big5.c
+++ b/enc/big5.c
@@ -167,19 +167,19 @@ big5_mbc_enc_len0(const UChar* p, const UChar* e, int tridx, const int tbl[])
static int
big5_mbc_enc_len(const UChar* p, const UChar* e, OnigEncoding enc ARG_UNUSED)
{
- return big5_mbc_enc_len0(p, e, 0, EncLen_BIG5);
+ return big5_mbc_enc_len0(p, e, 0, EncLen_BIG5);
}
static int
big5_hkscs_mbc_enc_len(const UChar* p, const UChar* e, OnigEncoding enc ARG_UNUSED)
{
- return big5_mbc_enc_len0(p, e, 2, EncLen_BIG5_HKSCS);
+ return big5_mbc_enc_len0(p, e, 2, EncLen_BIG5_HKSCS);
}
static int
big5_uao_mbc_enc_len(const UChar* p, const UChar* e, OnigEncoding enc ARG_UNUSED)
{
- return big5_mbc_enc_len0(p, e, 2, EncLen_BIG5_UAO);
+ return big5_mbc_enc_len0(p, e, 2, EncLen_BIG5_UAO);
}
static OnigCodePoint
diff --git a/enc/depend b/enc/depend
index 5750a0dc49..d3e1f3c74b 100644
--- a/enc/depend
+++ b/enc/depend
@@ -144,6 +144,7 @@ clean:
% @ignore_error = $nmake ? '' : ' 2> /dev/null || true'
% unless inplace
$(Q)$(RM) enc/unicode/name2ctype.h
+ $(Q)$(RM) enc/jis/props.h
-$(Q)$(RMDIR) enc/unicode<%=@ignore_error%>
% end
% workdirs.reverse_each do|d|
@@ -154,7 +155,9 @@ clean-srcs:
$(Q)$(RM) <%=pathrep['$(TRANSCSRCS)']%>
-$(Q)$(RMDIR) <%=pathrep['enc/trans']%><%=@ignore_error%>
$(Q)$(RM) enc/unicode/name2ctype.h
+ $(Q)$(RM) enc/jis/props.h
-$(Q)$(RMDIR) <%=pathrep['enc/unicode']%><%=@ignore_error%>
+ -$(Q)$(RMDIR) <%=pathrep['enc/props']%><%=@ignore_error%>
-$(Q)$(RMDIR) <%=pathrep['enc']%><%=@ignore_error%>
<%# vim: set ft=eruby noexpandtab ts=8 sw=2 : -%>
diff --git a/enc/euc_jp.c b/enc/euc_jp.c
index d7af1abaee..61bb8ba65a 100644
--- a/enc/euc_jp.c
+++ b/enc/euc_jp.c
@@ -293,7 +293,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigApplyAllCaseFoldFunc f, void* arg, OnigEncoding enc)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, f, arg);
}
@@ -418,12 +418,6 @@ is_allowed_reverse_match(const UChar* s, const UChar* end, OnigEncoding enc ARG_
}
-static int PropertyInited = 0;
-static const OnigCodePoint** PropertyList;
-static int PropertyListNum;
-static int PropertyListSize;
-static hash_table_type* PropertyNameTable;
-
static const OnigCodePoint CR_Hiragana[] = {
1,
#ifdef ENC_EUC_JIS_2004
@@ -504,41 +498,20 @@ static const OnigCodePoint CR_Cyrillic[] = {
/* TODO: add JIS X 0212 row 7 */
}; /* CR_Cyrillic */
-static int
-init_property_list(void)
-{
- int r;
-
- PROPERTY_LIST_ADD_PROP("hiragana", CR_Hiragana);
- PROPERTY_LIST_ADD_PROP("katakana", CR_Katakana);
- PROPERTY_LIST_ADD_PROP("han", CR_Han);
- PROPERTY_LIST_ADD_PROP("latin", CR_Latin);
- PROPERTY_LIST_ADD_PROP("greek", CR_Greek);
- PROPERTY_LIST_ADD_PROP("cyrillic", CR_Cyrillic);
- PropertyInited = 1;
-
- end:
- return r;
-}
+#include "enc/jis/props.h"
static int
property_name_to_ctype(OnigEncoding enc, UChar* p, UChar* end)
{
- st_data_t ctype;
- UChar *s, *e;
-
- PROPERTY_LIST_INIT_CHECK;
+ UChar *s = p, *e = end;
+ const struct enc_property *prop =
+ onig_jis_property((const char* )s, (unsigned int )(e - s));
- s = e = ALLOCA_N(UChar, end-p+1);
- for (; p < end; p++) {
- *e++ = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);
- }
-
- if (onig_st_lookup_strend(PropertyNameTable, s, e, &ctype) == 0) {
+ if (!prop) {
return onigenc_minimum_property_name_to_ctype(enc, s, e);
}
- return (int )ctype;
+ return (int )prop->ctype;
}
static int
@@ -554,8 +527,6 @@ is_code_ctype(OnigCodePoint code, unsigned int ctype, OnigEncoding enc ARG_UNUSE
}
}
else {
- PROPERTY_LIST_INIT_CHECK;
-
ctype -= (ONIGENC_MAX_STD_CTYPE + 1);
if (ctype >= (unsigned int )PropertyListNum)
return ONIGERR_TYPE_BUG;
@@ -576,8 +547,6 @@ get_ctype_code_range(OnigCtype ctype, OnigCodePoint* sb_out,
else {
*sb_out = 0x80;
- PROPERTY_LIST_INIT_CHECK;
-
ctype -= (ONIGENC_MAX_STD_CTYPE + 1);
if (ctype >= (OnigCtype )PropertyListNum)
return ONIGERR_TYPE_BUG;
diff --git a/enc/iso_8859_1.c b/enc/iso_8859_1.c
index 92dc14f978..088b427d1c 100644
--- a/enc/iso_8859_1.c
+++ b/enc/iso_8859_1.c
@@ -29,8 +29,6 @@
#include "regenc.h"
-#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
-
#define ENC_IS_ISO_8859_1_CTYPE(code,ctype) \
((EncISO_8859_1_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)
diff --git a/enc/iso_8859_10.c b/enc/iso_8859_10.c
index ec20a15baa..ab71a5adcf 100644
--- a/enc/iso_8859_10.c
+++ b/enc/iso_8859_10.c
@@ -208,7 +208,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, f, arg);
}
@@ -219,7 +219,7 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, p, end, items);
}
diff --git a/enc/iso_8859_13.c b/enc/iso_8859_13.c
index 4d7b328818..11b3dda1c9 100644
--- a/enc/iso_8859_13.c
+++ b/enc/iso_8859_13.c
@@ -197,7 +197,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, f, arg);
}
@@ -208,7 +208,7 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, p, end, items);
}
diff --git a/enc/iso_8859_14.c b/enc/iso_8859_14.c
index 1271c8a7a6..2939e89b7b 100644
--- a/enc/iso_8859_14.c
+++ b/enc/iso_8859_14.c
@@ -210,7 +210,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, f, arg);
}
@@ -221,7 +221,7 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, p, end, items);
}
diff --git a/enc/iso_8859_15.c b/enc/iso_8859_15.c
index 451033e158..fdb7ca12d7 100644
--- a/enc/iso_8859_15.c
+++ b/enc/iso_8859_15.c
@@ -204,7 +204,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, f, arg);
}
@@ -215,7 +215,7 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, p, end, items);
}
diff --git a/enc/iso_8859_16.c b/enc/iso_8859_16.c
index 5234cf0e7f..5e53f3b6d0 100644
--- a/enc/iso_8859_16.c
+++ b/enc/iso_8859_16.c
@@ -206,7 +206,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, f, arg);
}
@@ -217,7 +217,7 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, p, end, items);
}
diff --git a/enc/iso_8859_2.c b/enc/iso_8859_2.c
index f4cb9100df..94613e661b 100644
--- a/enc/iso_8859_2.c
+++ b/enc/iso_8859_2.c
@@ -29,8 +29,6 @@
#include "regenc.h"
-#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
-
#define ENC_ISO_8859_2_TO_LOWER_CASE(c) EncISO_8859_2_ToLowerCaseTable[c]
#define ENC_IS_ISO_8859_2_CTYPE(code,ctype) \
((EncISO_8859_2_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)
diff --git a/enc/iso_8859_3.c b/enc/iso_8859_3.c
index 85572574b8..863a575020 100644
--- a/enc/iso_8859_3.c
+++ b/enc/iso_8859_3.c
@@ -204,7 +204,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, f, arg);
}
@@ -215,7 +215,7 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, p, end, items);
}
diff --git a/enc/iso_8859_4.c b/enc/iso_8859_4.c
index 771a2cf6e7..48b999e756 100644
--- a/enc/iso_8859_4.c
+++ b/enc/iso_8859_4.c
@@ -206,7 +206,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, f, arg);
}
@@ -217,7 +217,7 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, p, end, items);
}
diff --git a/enc/iso_8859_5.c b/enc/iso_8859_5.c
index 4ee27b10d8..e71a488c4c 100644
--- a/enc/iso_8859_5.c
+++ b/enc/iso_8859_5.c
@@ -194,7 +194,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, f, arg);
}
@@ -205,7 +205,7 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, p, end, items);
}
diff --git a/enc/iso_8859_7.c b/enc/iso_8859_7.c
index aa82f880f9..8d07cb6310 100644
--- a/enc/iso_8859_7.c
+++ b/enc/iso_8859_7.c
@@ -190,7 +190,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, f, arg);
}
@@ -201,7 +201,7 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, p, end, items);
}
diff --git a/enc/iso_8859_9.c b/enc/iso_8859_9.c
index 0adafa3ed4..211ba3b2f3 100644
--- a/enc/iso_8859_9.c
+++ b/enc/iso_8859_9.c
@@ -197,7 +197,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, f, arg);
}
@@ -208,7 +208,7 @@ get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,
+ numberof(CaseFoldMap), CaseFoldMap, 1,
flag, p, end, items);
}
diff --git a/enc/jis/props.h b/enc/jis/props.h
new file mode 100644
index 0000000000..4ae2e1fd23
--- /dev/null
+++ b/enc/jis/props.h
@@ -0,0 +1,227 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: gperf -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 enc/jis/props.kwd */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646. */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+#line 1 "enc/jis/props.kwd"
+/* -*- c -*- */
+#define GPERF_DOWNCASE 1
+#define GPERF_CASE_STRNCMP 1
+
+static inline int
+gperf_case_strncmp(const char *s1, const char *s2, unsigned int n)
+{
+ const UChar *str = (const UChar *)s1;
+ const UChar *s = (const UChar *)s2;
+ return onigenc_with_ascii_strnicmp(ONIG_ENCODING_ASCII, str, str + n, s, n);
+}
+
+enum onigenc_jis_ctype {
+ onigenc_jis_min = ONIGENC_MAX_STD_CTYPE,
+ onigenc_jis_hiragana,
+ onigenc_jis_katakana,
+ onigenc_jis_han,
+ onigenc_jis_latin,
+ onigenc_jis_greek,
+ onigenc_jis_cyrillic,
+ onigenc_jis_max
+};
+
+enum {PropertyListNum = onigenc_jis_max - onigenc_jis_min - 1};
+
+static const OnigCodePoint* const PropertyList[PropertyListNum] = {
+ CR_Hiragana,
+ CR_Katakana,
+ CR_Han,
+ CR_Latin,
+ CR_Greek,
+ CR_Cyrillic,
+};
+
+struct enc_property {
+ signed char name;
+ unsigned char ctype;
+};
+
+static const struct enc_property *onig_jis_property(const char *str, unsigned int len);
+#line 43 "enc/jis/props.kwd"
+struct enc_property;
+
+#define TOTAL_KEYWORDS 6
+#define MIN_WORD_LENGTH 3
+#define MAX_WORD_LENGTH 8
+#define MIN_HASH_VALUE 5
+#define MAX_HASH_VALUE 12
+/* maximum key range = 8, duplicates = 0 */
+
+#ifndef GPERF_DOWNCASE
+#define GPERF_DOWNCASE 1
+static unsigned char gperf_downcase[256] =
+ {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
+ 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
+ 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
+ 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
+ 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
+ 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
+ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
+ 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
+ 255
+ };
+#endif
+
+#ifndef GPERF_CASE_STRNCMP
+#define GPERF_CASE_STRNCMP 1
+static int
+gperf_case_strncmp (s1, s2, n)
+ register const char *s1;
+ register const char *s2;
+ register unsigned int n;
+{
+ for (; n > 0;)
+ {
+ unsigned char c1 = gperf_downcase[(unsigned char)*s1++];
+ unsigned char c2 = gperf_downcase[(unsigned char)*s2++];
+ if (c1 != 0 && c1 == c2)
+ {
+ n--;
+ continue;
+ }
+ return (int)c1 - (int)c2;
+ }
+ return 0;
+}
+#endif
+
+#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) || defined(__GNUC_STDC_INLINE__)
+inline
+#elif defined(__GNUC__)
+__inline
+#endif
+static unsigned int
+onig_jis_property_hash (str, len)
+ register const char *str;
+ register unsigned int len;
+{
+ static const unsigned char asso_values[] =
+ {
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 3, 13, 2,
+ 13, 1, 1, 13, 13, 2, 1, 13, 1, 13,
+ 13, 13, 1, 13, 1, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 3,
+ 13, 2, 13, 1, 1, 13, 13, 2, 1, 13,
+ 1, 13, 13, 13, 1, 13, 1, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13
+ };
+ return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]];
+}
+
+struct onig_jis_property_pool_t
+ {
+ char onig_jis_property_pool_str5[sizeof("han")];
+ char onig_jis_property_pool_str7[sizeof("latin")];
+ char onig_jis_property_pool_str8[sizeof("greek")];
+ char onig_jis_property_pool_str10[sizeof("hiragana")];
+ char onig_jis_property_pool_str11[sizeof("katakana")];
+ char onig_jis_property_pool_str12[sizeof("cyrillic")];
+ };
+static const struct onig_jis_property_pool_t onig_jis_property_pool_contents =
+ {
+ "han",
+ "latin",
+ "greek",
+ "hiragana",
+ "katakana",
+ "cyrillic"
+ };
+#define onig_jis_property_pool ((const char *) &onig_jis_property_pool_contents)
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+const struct enc_property *
+onig_jis_property (str, len)
+ register const char *str;
+ register unsigned int len;
+{
+ static const struct enc_property wordlist[] =
+ {
+ {-1}, {-1}, {-1}, {-1}, {-1},
+#line 48 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str5), onigenc_jis_han},
+ {-1},
+#line 49 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str7), onigenc_jis_latin},
+#line 50 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str8), onigenc_jis_greek},
+ {-1},
+#line 46 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str10), onigenc_jis_hiragana},
+#line 47 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str11), onigenc_jis_katakana},
+#line 51 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str12), onigenc_jis_cyrillic}
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ register int key = onig_jis_property_hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= 0)
+ {
+ register int o = wordlist[key].name;
+ if (o >= 0)
+ {
+ register const char *s = o + onig_jis_property_pool;
+
+ if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strncmp (str, s, len) && s[len] == '\0')
+ return &wordlist[key];
+ }
+ }
+ }
+ return 0;
+}
+#line 52 "enc/jis/props.kwd"
+
diff --git a/enc/jis/props.h.blt b/enc/jis/props.h.blt
new file mode 100644
index 0000000000..4ae2e1fd23
--- /dev/null
+++ b/enc/jis/props.h.blt
@@ -0,0 +1,227 @@
+/* C code produced by gperf version 3.0.4 */
+/* Command-line: gperf -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 enc/jis/props.kwd */
+
+#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
+ && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
+ && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
+ && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
+ && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
+ && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
+ && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
+ && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
+ && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
+ && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
+ && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
+ && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
+ && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
+ && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
+ && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
+ && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
+ && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
+ && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
+ && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
+ && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
+ && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
+ && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
+ && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
+/* The character set is not based on ISO-646. */
+error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
+#endif
+
+#line 1 "enc/jis/props.kwd"
+/* -*- c -*- */
+#define GPERF_DOWNCASE 1
+#define GPERF_CASE_STRNCMP 1
+
+static inline int
+gperf_case_strncmp(const char *s1, const char *s2, unsigned int n)
+{
+ const UChar *str = (const UChar *)s1;
+ const UChar *s = (const UChar *)s2;
+ return onigenc_with_ascii_strnicmp(ONIG_ENCODING_ASCII, str, str + n, s, n);
+}
+
+enum onigenc_jis_ctype {
+ onigenc_jis_min = ONIGENC_MAX_STD_CTYPE,
+ onigenc_jis_hiragana,
+ onigenc_jis_katakana,
+ onigenc_jis_han,
+ onigenc_jis_latin,
+ onigenc_jis_greek,
+ onigenc_jis_cyrillic,
+ onigenc_jis_max
+};
+
+enum {PropertyListNum = onigenc_jis_max - onigenc_jis_min - 1};
+
+static const OnigCodePoint* const PropertyList[PropertyListNum] = {
+ CR_Hiragana,
+ CR_Katakana,
+ CR_Han,
+ CR_Latin,
+ CR_Greek,
+ CR_Cyrillic,
+};
+
+struct enc_property {
+ signed char name;
+ unsigned char ctype;
+};
+
+static const struct enc_property *onig_jis_property(const char *str, unsigned int len);
+#line 43 "enc/jis/props.kwd"
+struct enc_property;
+
+#define TOTAL_KEYWORDS 6
+#define MIN_WORD_LENGTH 3
+#define MAX_WORD_LENGTH 8
+#define MIN_HASH_VALUE 5
+#define MAX_HASH_VALUE 12
+/* maximum key range = 8, duplicates = 0 */
+
+#ifndef GPERF_DOWNCASE
+#define GPERF_DOWNCASE 1
+static unsigned char gperf_downcase[256] =
+ {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
+ 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106,
+ 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121,
+ 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104,
+ 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
+ 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134,
+ 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
+ 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164,
+ 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
+ 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194,
+ 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
+ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224,
+ 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239,
+ 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254,
+ 255
+ };
+#endif
+
+#ifndef GPERF_CASE_STRNCMP
+#define GPERF_CASE_STRNCMP 1
+static int
+gperf_case_strncmp (s1, s2, n)
+ register const char *s1;
+ register const char *s2;
+ register unsigned int n;
+{
+ for (; n > 0;)
+ {
+ unsigned char c1 = gperf_downcase[(unsigned char)*s1++];
+ unsigned char c2 = gperf_downcase[(unsigned char)*s2++];
+ if (c1 != 0 && c1 == c2)
+ {
+ n--;
+ continue;
+ }
+ return (int)c1 - (int)c2;
+ }
+ return 0;
+}
+#endif
+
+#if (defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || defined(__cplusplus) || defined(__GNUC_STDC_INLINE__)
+inline
+#elif defined(__GNUC__)
+__inline
+#endif
+static unsigned int
+onig_jis_property_hash (str, len)
+ register const char *str;
+ register unsigned int len;
+{
+ static const unsigned char asso_values[] =
+ {
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 3, 13, 2,
+ 13, 1, 1, 13, 13, 2, 1, 13, 1, 13,
+ 13, 13, 1, 13, 1, 13, 13, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13, 13, 3,
+ 13, 2, 13, 1, 1, 13, 13, 2, 1, 13,
+ 1, 13, 13, 13, 1, 13, 1, 13, 13, 13,
+ 13, 13, 13, 13, 13, 13, 13, 13
+ };
+ return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]];
+}
+
+struct onig_jis_property_pool_t
+ {
+ char onig_jis_property_pool_str5[sizeof("han")];
+ char onig_jis_property_pool_str7[sizeof("latin")];
+ char onig_jis_property_pool_str8[sizeof("greek")];
+ char onig_jis_property_pool_str10[sizeof("hiragana")];
+ char onig_jis_property_pool_str11[sizeof("katakana")];
+ char onig_jis_property_pool_str12[sizeof("cyrillic")];
+ };
+static const struct onig_jis_property_pool_t onig_jis_property_pool_contents =
+ {
+ "han",
+ "latin",
+ "greek",
+ "hiragana",
+ "katakana",
+ "cyrillic"
+ };
+#define onig_jis_property_pool ((const char *) &onig_jis_property_pool_contents)
+#ifdef __GNUC__
+__inline
+#if defined __GNUC_STDC_INLINE__ || defined __GNUC_GNU_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+const struct enc_property *
+onig_jis_property (str, len)
+ register const char *str;
+ register unsigned int len;
+{
+ static const struct enc_property wordlist[] =
+ {
+ {-1}, {-1}, {-1}, {-1}, {-1},
+#line 48 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str5), onigenc_jis_han},
+ {-1},
+#line 49 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str7), onigenc_jis_latin},
+#line 50 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str8), onigenc_jis_greek},
+ {-1},
+#line 46 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str10), onigenc_jis_hiragana},
+#line 47 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str11), onigenc_jis_katakana},
+#line 51 "enc/jis/props.kwd"
+ {(char)offsetof(struct onig_jis_property_pool_t, onig_jis_property_pool_str12), onigenc_jis_cyrillic}
+ };
+
+ if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
+ {
+ register int key = onig_jis_property_hash (str, len);
+
+ if (key <= MAX_HASH_VALUE && key >= 0)
+ {
+ register int o = wordlist[key].name;
+ if (o >= 0)
+ {
+ register const char *s = o + onig_jis_property_pool;
+
+ if ((((unsigned char)*str ^ (unsigned char)*s) & ~32) == 0 && !gperf_case_strncmp (str, s, len) && s[len] == '\0')
+ return &wordlist[key];
+ }
+ }
+ }
+ return 0;
+}
+#line 52 "enc/jis/props.kwd"
+
diff --git a/enc/jis/props.kwd b/enc/jis/props.kwd
new file mode 100644
index 0000000000..f3235c0100
--- /dev/null
+++ b/enc/jis/props.kwd
@@ -0,0 +1,52 @@
+%{/* -*- c -*- */
+#define GPERF_DOWNCASE 1
+#define GPERF_CASE_STRNCMP 1
+
+static inline int
+gperf_case_strncmp(const char *s1, const char *s2, unsigned int n)
+{
+ const UChar *str = (const UChar *)s1;
+ const UChar *s = (const UChar *)s2;
+ return onigenc_with_ascii_strnicmp(ONIG_ENCODING_ASCII, str, str + n, s, n);
+}
+
+enum onigenc_jis_ctype {
+ onigenc_jis_min = ONIGENC_MAX_STD_CTYPE,
+ onigenc_jis_hiragana,
+ onigenc_jis_katakana,
+ onigenc_jis_han,
+ onigenc_jis_latin,
+ onigenc_jis_greek,
+ onigenc_jis_cyrillic,
+ onigenc_jis_max
+};
+
+enum {PropertyListNum = onigenc_jis_max - onigenc_jis_min - 1};
+
+static const OnigCodePoint* const PropertyList[PropertyListNum] = {
+ CR_Hiragana,
+ CR_Katakana,
+ CR_Han,
+ CR_Latin,
+ CR_Greek,
+ CR_Cyrillic,
+};
+
+struct enc_property {
+ signed char name;
+ unsigned char ctype;
+};
+
+static const struct enc_property *onig_jis_property(const char *str, unsigned int len);
+%}
+
+struct enc_property;
+
+%%
+hiragana, onigenc_jis_hiragana
+katakana, onigenc_jis_katakana
+han, onigenc_jis_han
+latin, onigenc_jis_latin
+greek, onigenc_jis_greek
+cyrillic, onigenc_jis_cyrillic
+%%
diff --git a/enc/jis/props.src b/enc/jis/props.src
new file mode 100644
index 0000000000..f3235c0100
--- /dev/null
+++ b/enc/jis/props.src
@@ -0,0 +1,52 @@
+%{/* -*- c -*- */
+#define GPERF_DOWNCASE 1
+#define GPERF_CASE_STRNCMP 1
+
+static inline int
+gperf_case_strncmp(const char *s1, const char *s2, unsigned int n)
+{
+ const UChar *str = (const UChar *)s1;
+ const UChar *s = (const UChar *)s2;
+ return onigenc_with_ascii_strnicmp(ONIG_ENCODING_ASCII, str, str + n, s, n);
+}
+
+enum onigenc_jis_ctype {
+ onigenc_jis_min = ONIGENC_MAX_STD_CTYPE,
+ onigenc_jis_hiragana,
+ onigenc_jis_katakana,
+ onigenc_jis_han,
+ onigenc_jis_latin,
+ onigenc_jis_greek,
+ onigenc_jis_cyrillic,
+ onigenc_jis_max
+};
+
+enum {PropertyListNum = onigenc_jis_max - onigenc_jis_min - 1};
+
+static const OnigCodePoint* const PropertyList[PropertyListNum] = {
+ CR_Hiragana,
+ CR_Katakana,
+ CR_Han,
+ CR_Latin,
+ CR_Greek,
+ CR_Cyrillic,
+};
+
+struct enc_property {
+ signed char name;
+ unsigned char ctype;
+};
+
+static const struct enc_property *onig_jis_property(const char *str, unsigned int len);
+%}
+
+struct enc_property;
+
+%%
+hiragana, onigenc_jis_hiragana
+katakana, onigenc_jis_katakana
+han, onigenc_jis_han
+latin, onigenc_jis_latin
+greek, onigenc_jis_greek
+cyrillic, onigenc_jis_cyrillic
+%%
diff --git a/enc/koi8_r.c b/enc/koi8_r.c
index 8ec48747f8..85fa72287e 100644
--- a/enc/koi8_r.c
+++ b/enc/koi8_r.c
@@ -183,7 +183,7 @@ koi8_r_apply_all_case_fold(OnigCaseFoldType flag,
void* arg, OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, f, arg);
}
@@ -193,7 +193,7 @@ koi8_r_get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigCaseFoldCodeItem items[], OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, p, end, items);
}
diff --git a/enc/koi8_u.c b/enc/koi8_u.c
index 0e51b6eb80..0ae449ca21 100644
--- a/enc/koi8_u.c
+++ b/enc/koi8_u.c
@@ -187,7 +187,7 @@ koi8_u_apply_all_case_fold(OnigCaseFoldType flag,
void* arg, OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, f, arg);
}
@@ -197,7 +197,7 @@ koi8_u_get_case_fold_codes_by_str(OnigCaseFoldType flag,
OnigCaseFoldCodeItem items[], OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, p, end, items);
}
diff --git a/enc/shift_jis.c b/enc/shift_jis.c
index 5f5a802874..cbd3f02051 100644
--- a/enc/shift_jis.c
+++ b/enc/shift_jis.c
@@ -278,7 +278,7 @@ apply_all_case_fold(OnigCaseFoldType flag,
OnigApplyAllCaseFoldFunc f, void* arg, OnigEncoding enc)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, f, arg);
}
@@ -433,12 +433,6 @@ is_allowed_reverse_match(const UChar* s, const UChar* end, OnigEncoding enc ARG_
}
-static int PropertyInited = 0;
-static const OnigCodePoint** PropertyList;
-static int PropertyListNum;
-static int PropertyListSize;
-static hash_table_type* PropertyNameTable;
-
static const OnigCodePoint CR_Hiragana[] = {
1,
0x829f, 0x82f1
@@ -493,41 +487,20 @@ static const OnigCodePoint CR_Cyrillic[] = {
0x8480, 0x8491,
}; /* CR_Cyrillic */
-static int
-init_property_list(void)
-{
- int r;
-
- PROPERTY_LIST_ADD_PROP("hiragana", CR_Hiragana);
- PROPERTY_LIST_ADD_PROP("katakana", CR_Katakana);
- PROPERTY_LIST_ADD_PROP("han", CR_Han);
- PROPERTY_LIST_ADD_PROP("latin", CR_Latin);
- PROPERTY_LIST_ADD_PROP("greek", CR_Greek);
- PROPERTY_LIST_ADD_PROP("cyrillic", CR_Cyrillic);
- PropertyInited = 1;
-
- end:
- return r;
-}
+#include "enc/jis/props.h"
static int
property_name_to_ctype(OnigEncoding enc, UChar* p, UChar* end)
{
- hash_data_type ctype;
- UChar *s, *e;
-
- PROPERTY_LIST_INIT_CHECK;
+ UChar *s = p, *e = end;
+ const struct enc_property *prop =
+ onig_jis_property((const char* )s, (unsigned int )(e - s));
- s = e = ALLOCA_N(UChar, end-p+1);
- for (; p < end; p++) {
- *e++ = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);
- }
-
- if (onig_st_lookup_strend(PropertyNameTable, s, e, &ctype) == 0) {
+ if (!prop) {
return onigenc_minimum_property_name_to_ctype(enc, s, e);
}
- return (int )ctype;
+ return (int )prop->ctype;
}
static int
@@ -543,8 +516,6 @@ is_code_ctype(OnigCodePoint code, unsigned int ctype, OnigEncoding enc)
}
}
else {
- PROPERTY_LIST_INIT_CHECK;
-
ctype -= (ONIGENC_MAX_STD_CTYPE + 1);
if (ctype >= (unsigned int )PropertyListNum)
return ONIGERR_TYPE_BUG;
@@ -565,8 +536,6 @@ get_ctype_code_range(OnigCtype ctype, OnigCodePoint* sb_out,
else {
*sb_out = 0x80;
- PROPERTY_LIST_INIT_CHECK;
-
ctype -= (ONIGENC_MAX_STD_CTYPE + 1);
if (ctype >= (OnigCtype )PropertyListNum)
return ONIGERR_TYPE_BUG;
diff --git a/enc/trans/escape.trans b/enc/trans/escape.trans
index 550e4ac767..c76ffa0e06 100644
--- a/enc/trans/escape.trans
+++ b/enc/trans/escape.trans
@@ -6,19 +6,19 @@
end
transcode_tblgen("", "amp_escape", [
- ["{00-25,27-FF}", :nomap],
+ ["{00-25,27-FF}", :nomap],
["26", hexstr("&amp;")]
], nil)
transcode_tblgen("", "xml_text_escape", [
- ["{00-25,27-3B,3D,3F-FF}", :nomap],
+ ["{00-25,27-3B,3D,3F-FF}", :nomap],
["26", hexstr("&amp;")],
["3C", hexstr("&lt;")],
["3E", hexstr("&gt;")]
], nil)
transcode_tblgen("", "xml_attr_content_escape", [
- ["{00-21,23-25,27-3B,3D,3F-FF}", :nomap],
+ ["{00-21,23-25,27-3B,3D,3F-FF}", :nomap],
["22", hexstr("&quot;")],
["26", hexstr("&amp;")],
["3C", hexstr("&lt;")],
diff --git a/enc/trans/gb18030.trans b/enc/trans/gb18030.trans
index 94c866eb39..f42f8fd2d5 100644
--- a/enc/trans/gb18030.trans
+++ b/enc/trans/gb18030.trans
@@ -2,9 +2,9 @@
<%
require "gb18030-tbl"
-
+
def linear(code)
- bytes = [code].pack('H8').unpack 'C4'
+ bytes = [code].pack('H8').unpack 'C4'
((bytes[0]*10+bytes[1])*126+bytes[2])*10+bytes[3]
end
@@ -31,7 +31,7 @@
code
end
end
-
+
def calculate_differences_utf_gb(table)
table_rev = table.map{|a,b| [b,a]}
table_rev.collect do |code|
@@ -123,7 +123,7 @@ fun_sio_to_gb18030(void *statep, const unsigned char *s, size_t l, VALUE info, u
{
unsigned int diff = (unsigned int)(info >> 8);
unsigned int u; /* Unicode Scalar Value */
-
+
u = ((s[0]&0x0F)<<12) | ((s[1]&0x3F)<<6) | (s[2]&0x3F);
if (diff & 0x20000) { /* GB18030 4 bytes */
diff --git a/enc/unicode.c b/enc/unicode.c
index 20990c1e54..f0ef89880f 100644
--- a/enc/unicode.c
+++ b/enc/unicode.c
@@ -71,8 +71,6 @@ static const unsigned short EncUNICODE_ISO_8859_1_CtypeTable[256] = {
0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2
};
-#include "enc/unicode/name2ctype.h"
-
typedef struct {
int n;
OnigCodePoint code[3];
@@ -103,10 +101,46 @@ typedef struct {
CodePointList2 to;
} CaseUnfold_13_Type;
+static inline int
+bits_of(const OnigCodePoint c, const int n)
+{
+ return (c >> (2 - n) * 7) & 127;
+}
+
+static inline int
+bits_at(const OnigCodePoint *c, const int n)
+{
+ return bits_of(c[n / 3], n % 3);
+}
+
+static int
+code1_equal(const OnigCodePoint x, const OnigCodePoint y)
+{
+ if (x != y) return 0;
+ return 1;
+}
+
+static int
+code2_equal(const OnigCodePoint *x, const OnigCodePoint *y)
+{
+ if (x[0] != y[0]) return 0;
+ if (x[1] != y[1]) return 0;
+ return 1;
+}
+
+static int
+code3_equal(const OnigCodePoint *x, const OnigCodePoint *y)
+{
+ if (x[0] != y[0]) return 0;
+ if (x[1] != y[1]) return 0;
+ if (x[2] != y[2]) return 0;
+ return 1;
+}
+
#include "enc/unicode/casefold.h"
+#include "enc/unicode/name2ctype.h"
-#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))
#define CODE_RANGES_NUM numberof(CodeRanges)
extern int
@@ -143,7 +177,7 @@ onigenc_unicode_ctype_code_range(int ctype, const OnigCodePoint* ranges[])
extern int
onigenc_utf16_32_get_ctype_code_range(OnigCtype ctype, OnigCodePoint* sb_out,
const OnigCodePoint* ranges[],
- struct OnigEncodingTypeST* enc ARG_UNUSED)
+ OnigEncoding enc ARG_UNUSED)
{
*sb_out = 0x00;
return onigenc_unicode_ctype_code_range(ctype, ranges);
@@ -184,120 +218,21 @@ onigenc_unicode_property_name_to_ctype(OnigEncoding enc, UChar* name, UChar* end
return ctype;
}
-
-static int
-code2_cmp(OnigCodePoint* x, OnigCodePoint* y)
-{
- if (x[0] == y[0] && x[1] == y[1]) return 0;
- return 1;
-}
-
-static st_index_t
-code2_hash(OnigCodePoint* x)
-{
- return (st_index_t )(x[0] + x[1]);
-}
-
-static const struct st_hash_type type_code2_hash = {
- code2_cmp,
- code2_hash,
-};
-
-static int
-code3_cmp(OnigCodePoint* x, OnigCodePoint* y)
-{
- if (x[0] == y[0] && x[1] == y[1] && x[2] == y[2]) return 0;
- return 1;
-}
-
-static st_index_t
-code3_hash(OnigCodePoint* x)
-{
- return (st_index_t )(x[0] + x[1] + x[2]);
-}
-
-static const struct st_hash_type type_code3_hash = {
- code3_cmp,
- code3_hash,
-};
-
-
-static st_table* FoldTable; /* fold-1, fold-2, fold-3 */
-static st_table* Unfold1Table;
-static st_table* Unfold2Table;
-static st_table* Unfold3Table;
-static int CaseFoldInited = 0;
-
-static int init_case_fold_table(void)
-{
- const CaseFold_11_Type *p;
- const CaseUnfold_11_Type *p1;
- const CaseUnfold_12_Type *p2;
- const CaseUnfold_13_Type *p3;
- int i;
-
- THREAD_ATOMIC_START;
-
- FoldTable = st_init_numtable_with_size(FOLD_TABLE_SIZE);
- if (ONIG_IS_NULL(FoldTable)) return ONIGERR_MEMORY;
- for (i = 0; i < numberof(CaseFold); i++) {
- p = &CaseFold[i];
- st_add_direct(FoldTable, (st_data_t )p->from, (st_data_t )&(p->to));
- }
- for (i = 0; i < numberof(CaseFold_Locale); i++) {
- p = &CaseFold_Locale[i];
- st_add_direct(FoldTable, (st_data_t )p->from, (st_data_t )&(p->to));
- }
-
- Unfold1Table = st_init_numtable_with_size(UNFOLD1_TABLE_SIZE);
- if (ONIG_IS_NULL(Unfold1Table)) return ONIGERR_MEMORY;
-
- for (i = 0; i < numberof(CaseUnfold_11); i++) {
- p1 = &CaseUnfold_11[i];
- st_add_direct(Unfold1Table, (st_data_t )p1->from, (st_data_t )&(p1->to));
- }
- for (i = 0; i < numberof(CaseUnfold_11_Locale); i++) {
- p1 = &CaseUnfold_11_Locale[i];
- st_add_direct(Unfold1Table, (st_data_t )p1->from, (st_data_t )&(p1->to));
- }
-
- Unfold2Table = st_init_table_with_size(&type_code2_hash, UNFOLD2_TABLE_SIZE);
- if (ONIG_IS_NULL(Unfold2Table)) return ONIGERR_MEMORY;
-
- for (i = 0; i < numberof(CaseUnfold_12); i++) {
- p2 = &CaseUnfold_12[i];
- st_add_direct(Unfold2Table, (st_data_t )p2->from, (st_data_t )(&p2->to));
- }
- for (i = 0; i < numberof(CaseUnfold_12_Locale); i++) {
- p2 = &CaseUnfold_12_Locale[i];
- st_add_direct(Unfold2Table, (st_data_t )p2->from, (st_data_t )(&p2->to));
- }
-
- Unfold3Table = st_init_table_with_size(&type_code3_hash, UNFOLD3_TABLE_SIZE);
- if (ONIG_IS_NULL(Unfold3Table)) return ONIGERR_MEMORY;
-
- for (i = 0; i < numberof(CaseUnfold_13); i++) {
- p3 = &CaseUnfold_13[i];
- st_add_direct(Unfold3Table, (st_data_t )p3->from, (st_data_t )(&p3->to));
- }
-
- CaseFoldInited = 1;
- THREAD_ATOMIC_END;
- return 0;
-}
+#define onigenc_unicode_fold_lookup onigenc_unicode_CaseFold_11_lookup
+#define onigenc_unicode_unfold1_lookup onigenc_unicode_CaseUnfold_11_lookup
+#define onigenc_unicode_unfold2_lookup onigenc_unicode_CaseUnfold_12_lookup
+#define onigenc_unicode_unfold3_lookup onigenc_unicode_CaseUnfold_13_lookup
extern int
onigenc_unicode_mbc_case_fold(OnigEncoding enc,
OnigCaseFoldType flag ARG_UNUSED, const UChar** pp, const UChar* end,
UChar* fold)
{
- CodePointList3 *to;
+ const CodePointList3 *to;
OnigCodePoint code;
int i, len, rlen;
const UChar *p = *pp;
- if (CaseFoldInited == 0) init_case_fold_table();
-
code = ONIGENC_MBC_TO_CODE(enc, p, end);
len = enclen(enc, p, end);
*pp += len;
@@ -313,7 +248,7 @@ onigenc_unicode_mbc_case_fold(OnigEncoding enc,
}
#endif
- if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0) {
+ if ((to = onigenc_unicode_fold_lookup(code)) != 0) {
if (to->n == 1) {
return ONIGENC_CODE_TO_MBC(enc, to->code[0], fold);
}
@@ -349,8 +284,6 @@ onigenc_unicode_apply_all_case_fold(OnigCaseFoldType flag,
OnigCodePoint code;
int i, j, k, r;
- /* if (CaseFoldInited == 0) init_case_fold_table(); */
-
for (i = 0; i < numberof(CaseUnfold_11); i++) {
p11 = &CaseUnfold_11[i];
for (j = 0; j < p11->to.n; j++) {
@@ -483,10 +416,8 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
{
int n, i, j, k, len;
OnigCodePoint code, codes[3];
- CodePointList3 *to, *z3;
- CodePointList2 *z2;
-
- if (CaseFoldInited == 0) init_case_fold_table();
+ const CodePointList3 *to, *z3;
+ const CodePointList2 *z2;
n = 0;
@@ -522,7 +453,7 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
}
#endif
- if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0) {
+ if ((to = onigenc_unicode_fold_lookup(code)) != 0) {
if (to->n == 1) {
OnigCodePoint orig_code = code;
@@ -532,7 +463,7 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
n++;
code = to->code[0];
- if (onig_st_lookup(Unfold1Table, (st_data_t )code, (void* )&to) != 0) {
+ if ((to = onigenc_unicode_unfold1_lookup(code)) != 0) {
for (i = 0; i < to->n; i++) {
if (to->code[i] != orig_code) {
items[n].byte_len = len;
@@ -549,8 +480,7 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
for (fn = 0; fn < to->n; fn++) {
cs[fn][0] = to->code[fn];
- if (onig_st_lookup(Unfold1Table, (st_data_t )cs[fn][0],
- (void* )&z3) != 0) {
+ if ((z3 = onigenc_unicode_unfold1_lookup(cs[fn][0])) != 0) {
for (i = 0; i < z3->n; i++) {
cs[fn][i+1] = z3->code[i];
}
@@ -571,8 +501,7 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
}
}
- if (onig_st_lookup(Unfold2Table, (st_data_t )to->code,
- (void* )&z2) != 0) {
+ if ((z2 = onigenc_unicode_unfold2_lookup(to->code)) != 0) {
for (i = 0; i < z2->n; i++) {
if (z2->code[i] == code) continue;
@@ -597,8 +526,7 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
}
}
- if (onig_st_lookup(Unfold3Table, (st_data_t )to->code,
- (void* )&z2) != 0) {
+ if ((z2 = onigenc_unicode_unfold3_lookup(to->code)) != 0) {
for (i = 0; i < z2->n; i++) {
if (z2->code[i] == code) continue;
@@ -615,7 +543,7 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
}
}
else {
- if (onig_st_lookup(Unfold1Table, (st_data_t )code, (void* )&to) != 0) {
+ if ((to = onigenc_unicode_unfold1_lookup(code)) != 0) {
for (i = 0; i < to->n; i++) {
items[n].byte_len = len;
items[n].code_len = 1;
@@ -633,7 +561,7 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
codes[0] = code;
code = ONIGENC_MBC_TO_CODE(enc, p, end);
- if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0
+ if ((to = onigenc_unicode_fold_lookup(code)) != 0
&& to->n == 1) {
codes[1] = to->code[0];
}
@@ -642,7 +570,7 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
clen = enclen(enc, p, end);
len += clen;
- if (onig_st_lookup(Unfold2Table, (st_data_t )codes, (void* )&z2) != 0) {
+ if ((z2 = onigenc_unicode_unfold2_lookup(codes)) != 0) {
for (i = 0; i < z2->n; i++) {
items[n].byte_len = len;
items[n].code_len = 1;
@@ -654,7 +582,7 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
p += clen;
if (p < end) {
code = ONIGENC_MBC_TO_CODE(enc, p, end);
- if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0
+ if ((to = onigenc_unicode_fold_lookup(code)) != 0
&& to->n == 1) {
codes[2] = to->code[0];
}
@@ -663,8 +591,7 @@ onigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,
clen = enclen(enc, p, end);
len += clen;
- if (onig_st_lookup(Unfold3Table, (st_data_t )codes,
- (void* )&z2) != 0) {
+ if ((z2 = onigenc_unicode_unfold3_lookup(codes)) != 0) {
for (i = 0; i < z2->n; i++) {
items[n].byte_len = len;
items[n].code_len = 1;
diff --git a/enc/unicode/case-folding.rb b/enc/unicode/case-folding.rb
new file mode 100755
index 0000000000..d93de6581b
--- /dev/null
+++ b/enc/unicode/case-folding.rb
@@ -0,0 +1,196 @@
+#!/usr/bin/ruby
+
+# Usage:
+# $ wget http://www.unicode.org/Public/UNIDATA/CaseFolding.txt
+# $ ruby case-folding.rb CaseFolding.txt -o casefold.h
+
+class CaseFolding
+ module Util
+ module_function
+
+ def hex_seq(v)
+ v.map {|i| "0x%04x" % i}.join(", ")
+ end
+
+ def print_table_1(dest, data)
+ for k, v in data = data.sort
+ sk = (Array === k and k.length > 1) ? "{#{hex_seq(k)}}" : ("0x%04x" % k)
+ dest.print(" {#{sk}, {#{v.length}, {#{hex_seq(v)}}}},\n")
+ end
+ data
+ end
+
+ def print_table(dest, type, data)
+ dest.print("static const #{type}_Type #{type}_Table[] = {\n")
+ i = 0
+ ret = data.inject([]) do |a, (n, d)|
+ dest.print("#define #{n} (*(#{type}_Type (*)[#{d.size}])(#{type}_Table+#{i}))\n")
+ i += d.size
+ a.concat(print_table_1(dest, d))
+ end
+ dest.print("};\n\n")
+ ret
+ end
+ end
+
+ include Util
+
+ attr_reader :fold, :fold_locale, :unfold, :unfold_locale
+
+ def load(filename)
+ pattern = /([0-9A-F]{4,6}); ([CFT]); ([0-9A-F]{4,6})(?: ([0-9A-F]{4,6}))?(?: ([0-9A-F]{4,6}))?;/
+
+ @fold = fold = {}
+ @unfold = unfold = [{}, {}, {}]
+ turkic = []
+
+ IO.foreach(filename) do |line|
+ next unless res = pattern.match(line)
+ ch_from = res[1].to_i(16)
+
+ if res[2] == 'T'
+ # Turkic case folding
+ turkic << ch_from
+ next
+ end
+
+ # store folding data
+ ch_to = res[3..6].inject([]) do |a, i|
+ break a unless i
+ a << i.to_i(16)
+ end
+ fold[ch_from] = ch_to
+
+ # store unfolding data
+ i = ch_to.length - 1
+ (unfold[i][ch_to] ||= []) << ch_from
+ end
+
+ # move locale dependent data to (un)fold_locale
+ @fold_locale = fold_locale = {}
+ @unfold_locale = unfold_locale = [{}, {}]
+ for ch_from in turkic
+ key = fold[ch_from]
+ i = key.length - 1
+ unfold_locale[i][i == 0 ? key[0] : key] = unfold[i].delete(key)
+ fold_locale[ch_from] = fold.delete(ch_from)
+ end
+ self
+ end
+
+ def range_check(code)
+ "#{code} <= MAX_CODE_VALUE && #{code} >= MIN_CODE_VALUE"
+ end
+
+ def lookup_hash(key, type, data)
+ hash = "onigenc_unicode_#{key}_hash"
+ lookup = "onigenc_unicode_#{key}_lookup"
+ arity = Array(data[0][0]).size
+ gperf = %W"gperf -7 -k#{[*1..(arity*3)].join(",")} -F,-1 -c -j1 -i1 -t -T -E -C -H #{hash} -N #{lookup} -n"
+ argname = arity > 1 ? "codes" : "code"
+ argdecl = "const OnigCodePoint #{arity > 1 ? "*": ""}#{argname}"
+ n = 7
+ m = (1 << n) - 1
+ min, max = data.map {|c, *|c}.flatten.minmax
+ src = IO.popen(gperf, "r+") {|f|
+ f << "short\n%%\n"
+ data.each_with_index {|(k, _), i|
+ k = Array(k)
+ ks = k.map {|j| [(j >> n*2) & m, (j >> n) & m, (j) & m]}.flatten.map {|c| "\\x%.2x" % c}.join("")
+ f.printf "\"%s\", ::::/*%s*/ %d\n", ks, k.map {|c| "0x%.4x" % c}.join(","), i
+ }
+ f << "%%\n"
+ f.close_write
+ f.read
+ }
+ src.sub!(/^(#{hash})\s*\(.*?\).*?\n\{\n(.*)^\}/m) {
+ name = $1
+ body = $2
+ body.gsub!(/\(unsigned char\)str\[(\d+)\]/, "bits_#{arity > 1 ? 'at' : 'of'}(#{argname}, \\1)")
+ "#{name}(#{argdecl})\n{\n#{body}}"
+ }
+ src.sub!(/const short *\*\n^(#{lookup})\s*\(.*?\).*?\n\{\n(.*)^\}/m) {
+ name = $1
+ body = $2
+ body.sub!(/\benum\s+\{(\n[ \t]+)/, "\\&MIN_CODE_VALUE = 0x#{min.to_s(16)},\\1""MAX_CODE_VALUE = 0x#{max.to_s(16)},\\1")
+ body.gsub!(/(#{hash})\s*\(.*?\)/, "\\1(#{argname})")
+ body.gsub!(/\{"",-1}/, "-1")
+ body.gsub!(/\{"(?:[^"]|\\")+", *::::(.*)\}/, '\1')
+ body.sub!(/(\s+if\s)\(len\b.*\)/) do
+ "#$1(" <<
+ (arity > 1 ? (0...arity).map {|i| range_check("#{argname}[#{i}]")}.join(" &&\n ") : range_check(argname)) <<
+ ")"
+ end
+ v = nil
+ body.sub!(/(if\s*\(.*MAX_HASH_VALUE.*\)\n([ \t]*))\{(.*?)\n\2\}/m) {
+ pre = $1
+ indent = $2
+ s = $3
+ s.sub!(/const char *\* *(\w+)( *= *wordlist\[\w+\]).\w+/, 'short \1 = wordlist[key]')
+ v = $1
+ s.sub!(/\bif *\(.*\)/, "if (#{v} >= 0 && code#{arity}_equal(#{argname}, #{key}_Table[#{v}].from))")
+ "#{pre}{#{s}\n#{indent}}"
+ }
+ body.sub!(/\b(return\s+&)([^;]+);/, '\1'"#{key}_Table[#{v}].to;")
+ "static const #{type} *\n#{name}(#{argdecl})\n{\n#{body}}"
+ }
+ src
+ end
+
+ def display(dest)
+ # print the header
+ dest.print("/* DO NOT EDIT THIS FILE. */\n")
+ dest.print("/* Generated by enc/unicode/case-folding.rb */\n\n")
+
+ # print folding data
+
+ # CaseFold + CaseFold_Locale
+ name = "CaseFold_11"
+ data = print_table(dest, name, "CaseFold"=>fold, "CaseFold_Locale"=>fold_locale)
+ dest.print lookup_hash(name, "CodePointList3", data)
+
+ # print unfolding data
+
+ # CaseUnfold_11 + CaseUnfold_11_Locale
+ name = "CaseUnfold_11"
+ data = print_table(dest, name, name=>unfold[0], "#{name}_Locale"=>unfold_locale[0])
+ dest.print lookup_hash(name, "CodePointList3", data)
+
+ # CaseUnfold_12 + CaseUnfold_12_Locale
+ name = "CaseUnfold_12"
+ data = print_table(dest, name, name=>unfold[1], "#{name}_Locale"=>unfold_locale[1])
+ dest.print lookup_hash(name, "CodePointList2", data)
+
+ # CaseUnfold_13
+ name = "CaseUnfold_13"
+ data = print_table(dest, name, name=>unfold[2])
+ dest.print lookup_hash(name, "CodePointList2", data)
+ end
+
+ def self.load(*args)
+ new.load(*args)
+ end
+end
+
+if $0 == __FILE__
+ require 'optparse'
+ dest = nil
+ fold_1 = false
+ ARGV.options do |opt|
+ opt.banner << " [INPUT]"
+ opt.on("--output-file=FILE", "-o", "output to the FILE instead of STDOUT") {|output|
+ dest = (output unless output == '-')
+ }
+ opt.parse!
+ abort(opt.to_s) if ARGV.size > 1
+ end
+ filename = ARGV[0] || 'CaseFolding.txt'
+ data = CaseFolding.load(filename)
+ if dest
+ open(dest, "wb") do |f|
+ data.display(f)
+ end
+ else
+ data.display(STDOUT)
+ end
+end
diff --git a/enc/unicode/casefold.h b/enc/unicode/casefold.h
index b9559de4a3..475a20a48e 100644
--- a/enc/unicode/casefold.h
+++ b/enc/unicode/casefold.h
@@ -1,2238 +1,5619 @@
/* DO NOT EDIT THIS FILE. */
-/* Generated by tool/CaseFolding.py */
+/* Generated by enc/unicode/case-folding.rb */
-static const CaseFold_11_Type CaseFold[] = {
- { 0x0041, {1, {0x0061}}},
- { 0x0042, {1, {0x0062}}},
- { 0x0043, {1, {0x0063}}},
- { 0x0044, {1, {0x0064}}},
- { 0x0045, {1, {0x0065}}},
- { 0x0046, {1, {0x0066}}},
- { 0x0047, {1, {0x0067}}},
- { 0x0048, {1, {0x0068}}},
- { 0x004a, {1, {0x006a}}},
- { 0x004b, {1, {0x006b}}},
- { 0x004c, {1, {0x006c}}},
- { 0x004d, {1, {0x006d}}},
- { 0x004e, {1, {0x006e}}},
- { 0x004f, {1, {0x006f}}},
- { 0x0050, {1, {0x0070}}},
- { 0x0051, {1, {0x0071}}},
- { 0x0052, {1, {0x0072}}},
- { 0x0053, {1, {0x0073}}},
- { 0x0054, {1, {0x0074}}},
- { 0x0055, {1, {0x0075}}},
- { 0x0056, {1, {0x0076}}},
- { 0x0057, {1, {0x0077}}},
- { 0x0058, {1, {0x0078}}},
- { 0x0059, {1, {0x0079}}},
- { 0x005a, {1, {0x007a}}},
- { 0x00b5, {1, {0x03bc}}},
- { 0x00c0, {1, {0x00e0}}},
- { 0x00c1, {1, {0x00e1}}},
- { 0x00c2, {1, {0x00e2}}},
- { 0x00c3, {1, {0x00e3}}},
- { 0x00c4, {1, {0x00e4}}},
- { 0x00c5, {1, {0x00e5}}},
- { 0x00c6, {1, {0x00e6}}},
- { 0x00c7, {1, {0x00e7}}},
- { 0x00c8, {1, {0x00e8}}},
- { 0x00c9, {1, {0x00e9}}},
- { 0x00ca, {1, {0x00ea}}},
- { 0x00cb, {1, {0x00eb}}},
- { 0x00cc, {1, {0x00ec}}},
- { 0x00cd, {1, {0x00ed}}},
- { 0x00ce, {1, {0x00ee}}},
- { 0x00cf, {1, {0x00ef}}},
- { 0x00d0, {1, {0x00f0}}},
- { 0x00d1, {1, {0x00f1}}},
- { 0x00d2, {1, {0x00f2}}},
- { 0x00d3, {1, {0x00f3}}},
- { 0x00d4, {1, {0x00f4}}},
- { 0x00d5, {1, {0x00f5}}},
- { 0x00d6, {1, {0x00f6}}},
- { 0x00d8, {1, {0x00f8}}},
- { 0x00d9, {1, {0x00f9}}},
- { 0x00da, {1, {0x00fa}}},
- { 0x00db, {1, {0x00fb}}},
- { 0x00dc, {1, {0x00fc}}},
- { 0x00dd, {1, {0x00fd}}},
- { 0x00de, {1, {0x00fe}}},
- { 0x00df, {2, {0x0073, 0x0073}}},
- { 0x0100, {1, {0x0101}}},
- { 0x0102, {1, {0x0103}}},
- { 0x0104, {1, {0x0105}}},
- { 0x0106, {1, {0x0107}}},
- { 0x0108, {1, {0x0109}}},
- { 0x010a, {1, {0x010b}}},
- { 0x010c, {1, {0x010d}}},
- { 0x010e, {1, {0x010f}}},
- { 0x0110, {1, {0x0111}}},
- { 0x0112, {1, {0x0113}}},
- { 0x0114, {1, {0x0115}}},
- { 0x0116, {1, {0x0117}}},
- { 0x0118, {1, {0x0119}}},
- { 0x011a, {1, {0x011b}}},
- { 0x011c, {1, {0x011d}}},
- { 0x011e, {1, {0x011f}}},
- { 0x0120, {1, {0x0121}}},
- { 0x0122, {1, {0x0123}}},
- { 0x0124, {1, {0x0125}}},
- { 0x0126, {1, {0x0127}}},
- { 0x0128, {1, {0x0129}}},
- { 0x012a, {1, {0x012b}}},
- { 0x012c, {1, {0x012d}}},
- { 0x012e, {1, {0x012f}}},
- { 0x0132, {1, {0x0133}}},
- { 0x0134, {1, {0x0135}}},
- { 0x0136, {1, {0x0137}}},
- { 0x0139, {1, {0x013a}}},
- { 0x013b, {1, {0x013c}}},
- { 0x013d, {1, {0x013e}}},
- { 0x013f, {1, {0x0140}}},
- { 0x0141, {1, {0x0142}}},
- { 0x0143, {1, {0x0144}}},
- { 0x0145, {1, {0x0146}}},
- { 0x0147, {1, {0x0148}}},
- { 0x0149, {2, {0x02bc, 0x006e}}},
- { 0x014a, {1, {0x014b}}},
- { 0x014c, {1, {0x014d}}},
- { 0x014e, {1, {0x014f}}},
- { 0x0150, {1, {0x0151}}},
- { 0x0152, {1, {0x0153}}},
- { 0x0154, {1, {0x0155}}},
- { 0x0156, {1, {0x0157}}},
- { 0x0158, {1, {0x0159}}},
- { 0x015a, {1, {0x015b}}},
- { 0x015c, {1, {0x015d}}},
- { 0x015e, {1, {0x015f}}},
- { 0x0160, {1, {0x0161}}},
- { 0x0162, {1, {0x0163}}},
- { 0x0164, {1, {0x0165}}},
- { 0x0166, {1, {0x0167}}},
- { 0x0168, {1, {0x0169}}},
- { 0x016a, {1, {0x016b}}},
- { 0x016c, {1, {0x016d}}},
- { 0x016e, {1, {0x016f}}},
- { 0x0170, {1, {0x0171}}},
- { 0x0172, {1, {0x0173}}},
- { 0x0174, {1, {0x0175}}},
- { 0x0176, {1, {0x0177}}},
- { 0x0178, {1, {0x00ff}}},
- { 0x0179, {1, {0x017a}}},
- { 0x017b, {1, {0x017c}}},
- { 0x017d, {1, {0x017e}}},
- { 0x017f, {1, {0x0073}}},
- { 0x0181, {1, {0x0253}}},
- { 0x0182, {1, {0x0183}}},
- { 0x0184, {1, {0x0185}}},
- { 0x0186, {1, {0x0254}}},
- { 0x0187, {1, {0x0188}}},
- { 0x0189, {1, {0x0256}}},
- { 0x018a, {1, {0x0257}}},
- { 0x018b, {1, {0x018c}}},
- { 0x018e, {1, {0x01dd}}},
- { 0x018f, {1, {0x0259}}},
- { 0x0190, {1, {0x025b}}},
- { 0x0191, {1, {0x0192}}},
- { 0x0193, {1, {0x0260}}},
- { 0x0194, {1, {0x0263}}},
- { 0x0196, {1, {0x0269}}},
- { 0x0197, {1, {0x0268}}},
- { 0x0198, {1, {0x0199}}},
- { 0x019c, {1, {0x026f}}},
- { 0x019d, {1, {0x0272}}},
- { 0x019f, {1, {0x0275}}},
- { 0x01a0, {1, {0x01a1}}},
- { 0x01a2, {1, {0x01a3}}},
- { 0x01a4, {1, {0x01a5}}},
- { 0x01a6, {1, {0x0280}}},
- { 0x01a7, {1, {0x01a8}}},
- { 0x01a9, {1, {0x0283}}},
- { 0x01ac, {1, {0x01ad}}},
- { 0x01ae, {1, {0x0288}}},
- { 0x01af, {1, {0x01b0}}},
- { 0x01b1, {1, {0x028a}}},
- { 0x01b2, {1, {0x028b}}},
- { 0x01b3, {1, {0x01b4}}},
- { 0x01b5, {1, {0x01b6}}},
- { 0x01b7, {1, {0x0292}}},
- { 0x01b8, {1, {0x01b9}}},
- { 0x01bc, {1, {0x01bd}}},
- { 0x01c4, {1, {0x01c6}}},
- { 0x01c5, {1, {0x01c6}}},
- { 0x01c7, {1, {0x01c9}}},
- { 0x01c8, {1, {0x01c9}}},
- { 0x01ca, {1, {0x01cc}}},
- { 0x01cb, {1, {0x01cc}}},
- { 0x01cd, {1, {0x01ce}}},
- { 0x01cf, {1, {0x01d0}}},
- { 0x01d1, {1, {0x01d2}}},
- { 0x01d3, {1, {0x01d4}}},
- { 0x01d5, {1, {0x01d6}}},
- { 0x01d7, {1, {0x01d8}}},
- { 0x01d9, {1, {0x01da}}},
- { 0x01db, {1, {0x01dc}}},
- { 0x01de, {1, {0x01df}}},
- { 0x01e0, {1, {0x01e1}}},
- { 0x01e2, {1, {0x01e3}}},
- { 0x01e4, {1, {0x01e5}}},
- { 0x01e6, {1, {0x01e7}}},
- { 0x01e8, {1, {0x01e9}}},
- { 0x01ea, {1, {0x01eb}}},
- { 0x01ec, {1, {0x01ed}}},
- { 0x01ee, {1, {0x01ef}}},
- { 0x01f0, {2, {0x006a, 0x030c}}},
- { 0x01f1, {1, {0x01f3}}},
- { 0x01f2, {1, {0x01f3}}},
- { 0x01f4, {1, {0x01f5}}},
- { 0x01f6, {1, {0x0195}}},
- { 0x01f7, {1, {0x01bf}}},
- { 0x01f8, {1, {0x01f9}}},
- { 0x01fa, {1, {0x01fb}}},
- { 0x01fc, {1, {0x01fd}}},
- { 0x01fe, {1, {0x01ff}}},
- { 0x0200, {1, {0x0201}}},
- { 0x0202, {1, {0x0203}}},
- { 0x0204, {1, {0x0205}}},
- { 0x0206, {1, {0x0207}}},
- { 0x0208, {1, {0x0209}}},
- { 0x020a, {1, {0x020b}}},
- { 0x020c, {1, {0x020d}}},
- { 0x020e, {1, {0x020f}}},
- { 0x0210, {1, {0x0211}}},
- { 0x0212, {1, {0x0213}}},
- { 0x0214, {1, {0x0215}}},
- { 0x0216, {1, {0x0217}}},
- { 0x0218, {1, {0x0219}}},
- { 0x021a, {1, {0x021b}}},
- { 0x021c, {1, {0x021d}}},
- { 0x021e, {1, {0x021f}}},
- { 0x0220, {1, {0x019e}}},
- { 0x0222, {1, {0x0223}}},
- { 0x0224, {1, {0x0225}}},
- { 0x0226, {1, {0x0227}}},
- { 0x0228, {1, {0x0229}}},
- { 0x022a, {1, {0x022b}}},
- { 0x022c, {1, {0x022d}}},
- { 0x022e, {1, {0x022f}}},
- { 0x0230, {1, {0x0231}}},
- { 0x0232, {1, {0x0233}}},
- { 0x023a, {1, {0x2c65}}},
- { 0x023b, {1, {0x023c}}},
- { 0x023d, {1, {0x019a}}},
- { 0x023e, {1, {0x2c66}}},
- { 0x0241, {1, {0x0242}}},
- { 0x0243, {1, {0x0180}}},
- { 0x0244, {1, {0x0289}}},
- { 0x0245, {1, {0x028c}}},
- { 0x0246, {1, {0x0247}}},
- { 0x0248, {1, {0x0249}}},
- { 0x024a, {1, {0x024b}}},
- { 0x024c, {1, {0x024d}}},
- { 0x024e, {1, {0x024f}}},
- { 0x0345, {1, {0x03b9}}},
- { 0x0370, {1, {0x0371}}},
- { 0x0372, {1, {0x0373}}},
- { 0x0376, {1, {0x0377}}},
- { 0x0386, {1, {0x03ac}}},
- { 0x0388, {1, {0x03ad}}},
- { 0x0389, {1, {0x03ae}}},
- { 0x038a, {1, {0x03af}}},
- { 0x038c, {1, {0x03cc}}},
- { 0x038e, {1, {0x03cd}}},
- { 0x038f, {1, {0x03ce}}},
- { 0x0390, {3, {0x03b9, 0x0308, 0x0301}}},
- { 0x0391, {1, {0x03b1}}},
- { 0x0392, {1, {0x03b2}}},
- { 0x0393, {1, {0x03b3}}},
- { 0x0394, {1, {0x03b4}}},
- { 0x0395, {1, {0x03b5}}},
- { 0x0396, {1, {0x03b6}}},
- { 0x0397, {1, {0x03b7}}},
- { 0x0398, {1, {0x03b8}}},
- { 0x0399, {1, {0x03b9}}},
- { 0x039a, {1, {0x03ba}}},
- { 0x039b, {1, {0x03bb}}},
- { 0x039c, {1, {0x03bc}}},
- { 0x039d, {1, {0x03bd}}},
- { 0x039e, {1, {0x03be}}},
- { 0x039f, {1, {0x03bf}}},
- { 0x03a0, {1, {0x03c0}}},
- { 0x03a1, {1, {0x03c1}}},
- { 0x03a3, {1, {0x03c3}}},
- { 0x03a4, {1, {0x03c4}}},
- { 0x03a5, {1, {0x03c5}}},
- { 0x03a6, {1, {0x03c6}}},
- { 0x03a7, {1, {0x03c7}}},
- { 0x03a8, {1, {0x03c8}}},
- { 0x03a9, {1, {0x03c9}}},
- { 0x03aa, {1, {0x03ca}}},
- { 0x03ab, {1, {0x03cb}}},
- { 0x03b0, {3, {0x03c5, 0x0308, 0x0301}}},
- { 0x03c2, {1, {0x03c3}}},
- { 0x03cf, {1, {0x03d7}}},
- { 0x03d0, {1, {0x03b2}}},
- { 0x03d1, {1, {0x03b8}}},
- { 0x03d5, {1, {0x03c6}}},
- { 0x03d6, {1, {0x03c0}}},
- { 0x03d8, {1, {0x03d9}}},
- { 0x03da, {1, {0x03db}}},
- { 0x03dc, {1, {0x03dd}}},
- { 0x03de, {1, {0x03df}}},
- { 0x03e0, {1, {0x03e1}}},
- { 0x03e2, {1, {0x03e3}}},
- { 0x03e4, {1, {0x03e5}}},
- { 0x03e6, {1, {0x03e7}}},
- { 0x03e8, {1, {0x03e9}}},
- { 0x03ea, {1, {0x03eb}}},
- { 0x03ec, {1, {0x03ed}}},
- { 0x03ee, {1, {0x03ef}}},
- { 0x03f0, {1, {0x03ba}}},
- { 0x03f1, {1, {0x03c1}}},
- { 0x03f4, {1, {0x03b8}}},
- { 0x03f5, {1, {0x03b5}}},
- { 0x03f7, {1, {0x03f8}}},
- { 0x03f9, {1, {0x03f2}}},
- { 0x03fa, {1, {0x03fb}}},
- { 0x03fd, {1, {0x037b}}},
- { 0x03fe, {1, {0x037c}}},
- { 0x03ff, {1, {0x037d}}},
- { 0x0400, {1, {0x0450}}},
- { 0x0401, {1, {0x0451}}},
- { 0x0402, {1, {0x0452}}},
- { 0x0403, {1, {0x0453}}},
- { 0x0404, {1, {0x0454}}},
- { 0x0405, {1, {0x0455}}},
- { 0x0406, {1, {0x0456}}},
- { 0x0407, {1, {0x0457}}},
- { 0x0408, {1, {0x0458}}},
- { 0x0409, {1, {0x0459}}},
- { 0x040a, {1, {0x045a}}},
- { 0x040b, {1, {0x045b}}},
- { 0x040c, {1, {0x045c}}},
- { 0x040d, {1, {0x045d}}},
- { 0x040e, {1, {0x045e}}},
- { 0x040f, {1, {0x045f}}},
- { 0x0410, {1, {0x0430}}},
- { 0x0411, {1, {0x0431}}},
- { 0x0412, {1, {0x0432}}},
- { 0x0413, {1, {0x0433}}},
- { 0x0414, {1, {0x0434}}},
- { 0x0415, {1, {0x0435}}},
- { 0x0416, {1, {0x0436}}},
- { 0x0417, {1, {0x0437}}},
- { 0x0418, {1, {0x0438}}},
- { 0x0419, {1, {0x0439}}},
- { 0x041a, {1, {0x043a}}},
- { 0x041b, {1, {0x043b}}},
- { 0x041c, {1, {0x043c}}},
- { 0x041d, {1, {0x043d}}},
- { 0x041e, {1, {0x043e}}},
- { 0x041f, {1, {0x043f}}},
- { 0x0420, {1, {0x0440}}},
- { 0x0421, {1, {0x0441}}},
- { 0x0422, {1, {0x0442}}},
- { 0x0423, {1, {0x0443}}},
- { 0x0424, {1, {0x0444}}},
- { 0x0425, {1, {0x0445}}},
- { 0x0426, {1, {0x0446}}},
- { 0x0427, {1, {0x0447}}},
- { 0x0428, {1, {0x0448}}},
- { 0x0429, {1, {0x0449}}},
- { 0x042a, {1, {0x044a}}},
- { 0x042b, {1, {0x044b}}},
- { 0x042c, {1, {0x044c}}},
- { 0x042d, {1, {0x044d}}},
- { 0x042e, {1, {0x044e}}},
- { 0x042f, {1, {0x044f}}},
- { 0x0460, {1, {0x0461}}},
- { 0x0462, {1, {0x0463}}},
- { 0x0464, {1, {0x0465}}},
- { 0x0466, {1, {0x0467}}},
- { 0x0468, {1, {0x0469}}},
- { 0x046a, {1, {0x046b}}},
- { 0x046c, {1, {0x046d}}},
- { 0x046e, {1, {0x046f}}},
- { 0x0470, {1, {0x0471}}},
- { 0x0472, {1, {0x0473}}},
- { 0x0474, {1, {0x0475}}},
- { 0x0476, {1, {0x0477}}},
- { 0x0478, {1, {0x0479}}},
- { 0x047a, {1, {0x047b}}},
- { 0x047c, {1, {0x047d}}},
- { 0x047e, {1, {0x047f}}},
- { 0x0480, {1, {0x0481}}},
- { 0x048a, {1, {0x048b}}},
- { 0x048c, {1, {0x048d}}},
- { 0x048e, {1, {0x048f}}},
- { 0x0490, {1, {0x0491}}},
- { 0x0492, {1, {0x0493}}},
- { 0x0494, {1, {0x0495}}},
- { 0x0496, {1, {0x0497}}},
- { 0x0498, {1, {0x0499}}},
- { 0x049a, {1, {0x049b}}},
- { 0x049c, {1, {0x049d}}},
- { 0x049e, {1, {0x049f}}},
- { 0x04a0, {1, {0x04a1}}},
- { 0x04a2, {1, {0x04a3}}},
- { 0x04a4, {1, {0x04a5}}},
- { 0x04a6, {1, {0x04a7}}},
- { 0x04a8, {1, {0x04a9}}},
- { 0x04aa, {1, {0x04ab}}},
- { 0x04ac, {1, {0x04ad}}},
- { 0x04ae, {1, {0x04af}}},
- { 0x04b0, {1, {0x04b1}}},
- { 0x04b2, {1, {0x04b3}}},
- { 0x04b4, {1, {0x04b5}}},
- { 0x04b6, {1, {0x04b7}}},
- { 0x04b8, {1, {0x04b9}}},
- { 0x04ba, {1, {0x04bb}}},
- { 0x04bc, {1, {0x04bd}}},
- { 0x04be, {1, {0x04bf}}},
- { 0x04c0, {1, {0x04cf}}},
- { 0x04c1, {1, {0x04c2}}},
- { 0x04c3, {1, {0x04c4}}},
- { 0x04c5, {1, {0x04c6}}},
- { 0x04c7, {1, {0x04c8}}},
- { 0x04c9, {1, {0x04ca}}},
- { 0x04cb, {1, {0x04cc}}},
- { 0x04cd, {1, {0x04ce}}},
- { 0x04d0, {1, {0x04d1}}},
- { 0x04d2, {1, {0x04d3}}},
- { 0x04d4, {1, {0x04d5}}},
- { 0x04d6, {1, {0x04d7}}},
- { 0x04d8, {1, {0x04d9}}},
- { 0x04da, {1, {0x04db}}},
- { 0x04dc, {1, {0x04dd}}},
- { 0x04de, {1, {0x04df}}},
- { 0x04e0, {1, {0x04e1}}},
- { 0x04e2, {1, {0x04e3}}},
- { 0x04e4, {1, {0x04e5}}},
- { 0x04e6, {1, {0x04e7}}},
- { 0x04e8, {1, {0x04e9}}},
- { 0x04ea, {1, {0x04eb}}},
- { 0x04ec, {1, {0x04ed}}},
- { 0x04ee, {1, {0x04ef}}},
- { 0x04f0, {1, {0x04f1}}},
- { 0x04f2, {1, {0x04f3}}},
- { 0x04f4, {1, {0x04f5}}},
- { 0x04f6, {1, {0x04f7}}},
- { 0x04f8, {1, {0x04f9}}},
- { 0x04fa, {1, {0x04fb}}},
- { 0x04fc, {1, {0x04fd}}},
- { 0x04fe, {1, {0x04ff}}},
- { 0x0500, {1, {0x0501}}},
- { 0x0502, {1, {0x0503}}},
- { 0x0504, {1, {0x0505}}},
- { 0x0506, {1, {0x0507}}},
- { 0x0508, {1, {0x0509}}},
- { 0x050a, {1, {0x050b}}},
- { 0x050c, {1, {0x050d}}},
- { 0x050e, {1, {0x050f}}},
- { 0x0510, {1, {0x0511}}},
- { 0x0512, {1, {0x0513}}},
- { 0x0514, {1, {0x0515}}},
- { 0x0516, {1, {0x0517}}},
- { 0x0518, {1, {0x0519}}},
- { 0x051a, {1, {0x051b}}},
- { 0x051c, {1, {0x051d}}},
- { 0x051e, {1, {0x051f}}},
- { 0x0520, {1, {0x0521}}},
- { 0x0522, {1, {0x0523}}},
- { 0x0524, {1, {0x0525}}},
- { 0x0526, {1, {0x0527}}},
- { 0x0531, {1, {0x0561}}},
- { 0x0532, {1, {0x0562}}},
- { 0x0533, {1, {0x0563}}},
- { 0x0534, {1, {0x0564}}},
- { 0x0535, {1, {0x0565}}},
- { 0x0536, {1, {0x0566}}},
- { 0x0537, {1, {0x0567}}},
- { 0x0538, {1, {0x0568}}},
- { 0x0539, {1, {0x0569}}},
- { 0x053a, {1, {0x056a}}},
- { 0x053b, {1, {0x056b}}},
- { 0x053c, {1, {0x056c}}},
- { 0x053d, {1, {0x056d}}},
- { 0x053e, {1, {0x056e}}},
- { 0x053f, {1, {0x056f}}},
- { 0x0540, {1, {0x0570}}},
- { 0x0541, {1, {0x0571}}},
- { 0x0542, {1, {0x0572}}},
- { 0x0543, {1, {0x0573}}},
- { 0x0544, {1, {0x0574}}},
- { 0x0545, {1, {0x0575}}},
- { 0x0546, {1, {0x0576}}},
- { 0x0547, {1, {0x0577}}},
- { 0x0548, {1, {0x0578}}},
- { 0x0549, {1, {0x0579}}},
- { 0x054a, {1, {0x057a}}},
- { 0x054b, {1, {0x057b}}},
- { 0x054c, {1, {0x057c}}},
- { 0x054d, {1, {0x057d}}},
- { 0x054e, {1, {0x057e}}},
- { 0x054f, {1, {0x057f}}},
- { 0x0550, {1, {0x0580}}},
- { 0x0551, {1, {0x0581}}},
- { 0x0552, {1, {0x0582}}},
- { 0x0553, {1, {0x0583}}},
- { 0x0554, {1, {0x0584}}},
- { 0x0555, {1, {0x0585}}},
- { 0x0556, {1, {0x0586}}},
- { 0x0587, {2, {0x0565, 0x0582}}},
- { 0x10a0, {1, {0x2d00}}},
- { 0x10a1, {1, {0x2d01}}},
- { 0x10a2, {1, {0x2d02}}},
- { 0x10a3, {1, {0x2d03}}},
- { 0x10a4, {1, {0x2d04}}},
- { 0x10a5, {1, {0x2d05}}},
- { 0x10a6, {1, {0x2d06}}},
- { 0x10a7, {1, {0x2d07}}},
- { 0x10a8, {1, {0x2d08}}},
- { 0x10a9, {1, {0x2d09}}},
- { 0x10aa, {1, {0x2d0a}}},
- { 0x10ab, {1, {0x2d0b}}},
- { 0x10ac, {1, {0x2d0c}}},
- { 0x10ad, {1, {0x2d0d}}},
- { 0x10ae, {1, {0x2d0e}}},
- { 0x10af, {1, {0x2d0f}}},
- { 0x10b0, {1, {0x2d10}}},
- { 0x10b1, {1, {0x2d11}}},
- { 0x10b2, {1, {0x2d12}}},
- { 0x10b3, {1, {0x2d13}}},
- { 0x10b4, {1, {0x2d14}}},
- { 0x10b5, {1, {0x2d15}}},
- { 0x10b6, {1, {0x2d16}}},
- { 0x10b7, {1, {0x2d17}}},
- { 0x10b8, {1, {0x2d18}}},
- { 0x10b9, {1, {0x2d19}}},
- { 0x10ba, {1, {0x2d1a}}},
- { 0x10bb, {1, {0x2d1b}}},
- { 0x10bc, {1, {0x2d1c}}},
- { 0x10bd, {1, {0x2d1d}}},
- { 0x10be, {1, {0x2d1e}}},
- { 0x10bf, {1, {0x2d1f}}},
- { 0x10c0, {1, {0x2d20}}},
- { 0x10c1, {1, {0x2d21}}},
- { 0x10c2, {1, {0x2d22}}},
- { 0x10c3, {1, {0x2d23}}},
- { 0x10c4, {1, {0x2d24}}},
- { 0x10c5, {1, {0x2d25}}},
- { 0x10c7, {1, {0x2d27}}},
- { 0x10cd, {1, {0x2d2d}}},
- { 0x1e00, {1, {0x1e01}}},
- { 0x1e02, {1, {0x1e03}}},
- { 0x1e04, {1, {0x1e05}}},
- { 0x1e06, {1, {0x1e07}}},
- { 0x1e08, {1, {0x1e09}}},
- { 0x1e0a, {1, {0x1e0b}}},
- { 0x1e0c, {1, {0x1e0d}}},
- { 0x1e0e, {1, {0x1e0f}}},
- { 0x1e10, {1, {0x1e11}}},
- { 0x1e12, {1, {0x1e13}}},
- { 0x1e14, {1, {0x1e15}}},
- { 0x1e16, {1, {0x1e17}}},
- { 0x1e18, {1, {0x1e19}}},
- { 0x1e1a, {1, {0x1e1b}}},
- { 0x1e1c, {1, {0x1e1d}}},
- { 0x1e1e, {1, {0x1e1f}}},
- { 0x1e20, {1, {0x1e21}}},
- { 0x1e22, {1, {0x1e23}}},
- { 0x1e24, {1, {0x1e25}}},
- { 0x1e26, {1, {0x1e27}}},
- { 0x1e28, {1, {0x1e29}}},
- { 0x1e2a, {1, {0x1e2b}}},
- { 0x1e2c, {1, {0x1e2d}}},
- { 0x1e2e, {1, {0x1e2f}}},
- { 0x1e30, {1, {0x1e31}}},
- { 0x1e32, {1, {0x1e33}}},
- { 0x1e34, {1, {0x1e35}}},
- { 0x1e36, {1, {0x1e37}}},
- { 0x1e38, {1, {0x1e39}}},
- { 0x1e3a, {1, {0x1e3b}}},
- { 0x1e3c, {1, {0x1e3d}}},
- { 0x1e3e, {1, {0x1e3f}}},
- { 0x1e40, {1, {0x1e41}}},
- { 0x1e42, {1, {0x1e43}}},
- { 0x1e44, {1, {0x1e45}}},
- { 0x1e46, {1, {0x1e47}}},
- { 0x1e48, {1, {0x1e49}}},
- { 0x1e4a, {1, {0x1e4b}}},
- { 0x1e4c, {1, {0x1e4d}}},
- { 0x1e4e, {1, {0x1e4f}}},
- { 0x1e50, {1, {0x1e51}}},
- { 0x1e52, {1, {0x1e53}}},
- { 0x1e54, {1, {0x1e55}}},
- { 0x1e56, {1, {0x1e57}}},
- { 0x1e58, {1, {0x1e59}}},
- { 0x1e5a, {1, {0x1e5b}}},
- { 0x1e5c, {1, {0x1e5d}}},
- { 0x1e5e, {1, {0x1e5f}}},
- { 0x1e60, {1, {0x1e61}}},
- { 0x1e62, {1, {0x1e63}}},
- { 0x1e64, {1, {0x1e65}}},
- { 0x1e66, {1, {0x1e67}}},
- { 0x1e68, {1, {0x1e69}}},
- { 0x1e6a, {1, {0x1e6b}}},
- { 0x1e6c, {1, {0x1e6d}}},
- { 0x1e6e, {1, {0x1e6f}}},
- { 0x1e70, {1, {0x1e71}}},
- { 0x1e72, {1, {0x1e73}}},
- { 0x1e74, {1, {0x1e75}}},
- { 0x1e76, {1, {0x1e77}}},
- { 0x1e78, {1, {0x1e79}}},
- { 0x1e7a, {1, {0x1e7b}}},
- { 0x1e7c, {1, {0x1e7d}}},
- { 0x1e7e, {1, {0x1e7f}}},
- { 0x1e80, {1, {0x1e81}}},
- { 0x1e82, {1, {0x1e83}}},
- { 0x1e84, {1, {0x1e85}}},
- { 0x1e86, {1, {0x1e87}}},
- { 0x1e88, {1, {0x1e89}}},
- { 0x1e8a, {1, {0x1e8b}}},
- { 0x1e8c, {1, {0x1e8d}}},
- { 0x1e8e, {1, {0x1e8f}}},
- { 0x1e90, {1, {0x1e91}}},
- { 0x1e92, {1, {0x1e93}}},
- { 0x1e94, {1, {0x1e95}}},
- { 0x1e96, {2, {0x0068, 0x0331}}},
- { 0x1e97, {2, {0x0074, 0x0308}}},
- { 0x1e98, {2, {0x0077, 0x030a}}},
- { 0x1e99, {2, {0x0079, 0x030a}}},
- { 0x1e9a, {2, {0x0061, 0x02be}}},
- { 0x1e9b, {1, {0x1e61}}},
- { 0x1e9e, {2, {0x0073, 0x0073}}},
- { 0x1ea0, {1, {0x1ea1}}},
- { 0x1ea2, {1, {0x1ea3}}},
- { 0x1ea4, {1, {0x1ea5}}},
- { 0x1ea6, {1, {0x1ea7}}},
- { 0x1ea8, {1, {0x1ea9}}},
- { 0x1eaa, {1, {0x1eab}}},
- { 0x1eac, {1, {0x1ead}}},
- { 0x1eae, {1, {0x1eaf}}},
- { 0x1eb0, {1, {0x1eb1}}},
- { 0x1eb2, {1, {0x1eb3}}},
- { 0x1eb4, {1, {0x1eb5}}},
- { 0x1eb6, {1, {0x1eb7}}},
- { 0x1eb8, {1, {0x1eb9}}},
- { 0x1eba, {1, {0x1ebb}}},
- { 0x1ebc, {1, {0x1ebd}}},
- { 0x1ebe, {1, {0x1ebf}}},
- { 0x1ec0, {1, {0x1ec1}}},
- { 0x1ec2, {1, {0x1ec3}}},
- { 0x1ec4, {1, {0x1ec5}}},
- { 0x1ec6, {1, {0x1ec7}}},
- { 0x1ec8, {1, {0x1ec9}}},
- { 0x1eca, {1, {0x1ecb}}},
- { 0x1ecc, {1, {0x1ecd}}},
- { 0x1ece, {1, {0x1ecf}}},
- { 0x1ed0, {1, {0x1ed1}}},
- { 0x1ed2, {1, {0x1ed3}}},
- { 0x1ed4, {1, {0x1ed5}}},
- { 0x1ed6, {1, {0x1ed7}}},
- { 0x1ed8, {1, {0x1ed9}}},
- { 0x1eda, {1, {0x1edb}}},
- { 0x1edc, {1, {0x1edd}}},
- { 0x1ede, {1, {0x1edf}}},
- { 0x1ee0, {1, {0x1ee1}}},
- { 0x1ee2, {1, {0x1ee3}}},
- { 0x1ee4, {1, {0x1ee5}}},
- { 0x1ee6, {1, {0x1ee7}}},
- { 0x1ee8, {1, {0x1ee9}}},
- { 0x1eea, {1, {0x1eeb}}},
- { 0x1eec, {1, {0x1eed}}},
- { 0x1eee, {1, {0x1eef}}},
- { 0x1ef0, {1, {0x1ef1}}},
- { 0x1ef2, {1, {0x1ef3}}},
- { 0x1ef4, {1, {0x1ef5}}},
- { 0x1ef6, {1, {0x1ef7}}},
- { 0x1ef8, {1, {0x1ef9}}},
- { 0x1efa, {1, {0x1efb}}},
- { 0x1efc, {1, {0x1efd}}},
- { 0x1efe, {1, {0x1eff}}},
- { 0x1f08, {1, {0x1f00}}},
- { 0x1f09, {1, {0x1f01}}},
- { 0x1f0a, {1, {0x1f02}}},
- { 0x1f0b, {1, {0x1f03}}},
- { 0x1f0c, {1, {0x1f04}}},
- { 0x1f0d, {1, {0x1f05}}},
- { 0x1f0e, {1, {0x1f06}}},
- { 0x1f0f, {1, {0x1f07}}},
- { 0x1f18, {1, {0x1f10}}},
- { 0x1f19, {1, {0x1f11}}},
- { 0x1f1a, {1, {0x1f12}}},
- { 0x1f1b, {1, {0x1f13}}},
- { 0x1f1c, {1, {0x1f14}}},
- { 0x1f1d, {1, {0x1f15}}},
- { 0x1f28, {1, {0x1f20}}},
- { 0x1f29, {1, {0x1f21}}},
- { 0x1f2a, {1, {0x1f22}}},
- { 0x1f2b, {1, {0x1f23}}},
- { 0x1f2c, {1, {0x1f24}}},
- { 0x1f2d, {1, {0x1f25}}},
- { 0x1f2e, {1, {0x1f26}}},
- { 0x1f2f, {1, {0x1f27}}},
- { 0x1f38, {1, {0x1f30}}},
- { 0x1f39, {1, {0x1f31}}},
- { 0x1f3a, {1, {0x1f32}}},
- { 0x1f3b, {1, {0x1f33}}},
- { 0x1f3c, {1, {0x1f34}}},
- { 0x1f3d, {1, {0x1f35}}},
- { 0x1f3e, {1, {0x1f36}}},
- { 0x1f3f, {1, {0x1f37}}},
- { 0x1f48, {1, {0x1f40}}},
- { 0x1f49, {1, {0x1f41}}},
- { 0x1f4a, {1, {0x1f42}}},
- { 0x1f4b, {1, {0x1f43}}},
- { 0x1f4c, {1, {0x1f44}}},
- { 0x1f4d, {1, {0x1f45}}},
- { 0x1f50, {2, {0x03c5, 0x0313}}},
- { 0x1f52, {3, {0x03c5, 0x0313, 0x0300}}},
- { 0x1f54, {3, {0x03c5, 0x0313, 0x0301}}},
- { 0x1f56, {3, {0x03c5, 0x0313, 0x0342}}},
- { 0x1f59, {1, {0x1f51}}},
- { 0x1f5b, {1, {0x1f53}}},
- { 0x1f5d, {1, {0x1f55}}},
- { 0x1f5f, {1, {0x1f57}}},
- { 0x1f68, {1, {0x1f60}}},
- { 0x1f69, {1, {0x1f61}}},
- { 0x1f6a, {1, {0x1f62}}},
- { 0x1f6b, {1, {0x1f63}}},
- { 0x1f6c, {1, {0x1f64}}},
- { 0x1f6d, {1, {0x1f65}}},
- { 0x1f6e, {1, {0x1f66}}},
- { 0x1f6f, {1, {0x1f67}}},
- { 0x1f80, {2, {0x1f00, 0x03b9}}},
- { 0x1f81, {2, {0x1f01, 0x03b9}}},
- { 0x1f82, {2, {0x1f02, 0x03b9}}},
- { 0x1f83, {2, {0x1f03, 0x03b9}}},
- { 0x1f84, {2, {0x1f04, 0x03b9}}},
- { 0x1f85, {2, {0x1f05, 0x03b9}}},
- { 0x1f86, {2, {0x1f06, 0x03b9}}},
- { 0x1f87, {2, {0x1f07, 0x03b9}}},
- { 0x1f88, {2, {0x1f00, 0x03b9}}},
- { 0x1f89, {2, {0x1f01, 0x03b9}}},
- { 0x1f8a, {2, {0x1f02, 0x03b9}}},
- { 0x1f8b, {2, {0x1f03, 0x03b9}}},
- { 0x1f8c, {2, {0x1f04, 0x03b9}}},
- { 0x1f8d, {2, {0x1f05, 0x03b9}}},
- { 0x1f8e, {2, {0x1f06, 0x03b9}}},
- { 0x1f8f, {2, {0x1f07, 0x03b9}}},
- { 0x1f90, {2, {0x1f20, 0x03b9}}},
- { 0x1f91, {2, {0x1f21, 0x03b9}}},
- { 0x1f92, {2, {0x1f22, 0x03b9}}},
- { 0x1f93, {2, {0x1f23, 0x03b9}}},
- { 0x1f94, {2, {0x1f24, 0x03b9}}},
- { 0x1f95, {2, {0x1f25, 0x03b9}}},
- { 0x1f96, {2, {0x1f26, 0x03b9}}},
- { 0x1f97, {2, {0x1f27, 0x03b9}}},
- { 0x1f98, {2, {0x1f20, 0x03b9}}},
- { 0x1f99, {2, {0x1f21, 0x03b9}}},
- { 0x1f9a, {2, {0x1f22, 0x03b9}}},
- { 0x1f9b, {2, {0x1f23, 0x03b9}}},
- { 0x1f9c, {2, {0x1f24, 0x03b9}}},
- { 0x1f9d, {2, {0x1f25, 0x03b9}}},
- { 0x1f9e, {2, {0x1f26, 0x03b9}}},
- { 0x1f9f, {2, {0x1f27, 0x03b9}}},
- { 0x1fa0, {2, {0x1f60, 0x03b9}}},
- { 0x1fa1, {2, {0x1f61, 0x03b9}}},
- { 0x1fa2, {2, {0x1f62, 0x03b9}}},
- { 0x1fa3, {2, {0x1f63, 0x03b9}}},
- { 0x1fa4, {2, {0x1f64, 0x03b9}}},
- { 0x1fa5, {2, {0x1f65, 0x03b9}}},
- { 0x1fa6, {2, {0x1f66, 0x03b9}}},
- { 0x1fa7, {2, {0x1f67, 0x03b9}}},
- { 0x1fa8, {2, {0x1f60, 0x03b9}}},
- { 0x1fa9, {2, {0x1f61, 0x03b9}}},
- { 0x1faa, {2, {0x1f62, 0x03b9}}},
- { 0x1fab, {2, {0x1f63, 0x03b9}}},
- { 0x1fac, {2, {0x1f64, 0x03b9}}},
- { 0x1fad, {2, {0x1f65, 0x03b9}}},
- { 0x1fae, {2, {0x1f66, 0x03b9}}},
- { 0x1faf, {2, {0x1f67, 0x03b9}}},
- { 0x1fb2, {2, {0x1f70, 0x03b9}}},
- { 0x1fb3, {2, {0x03b1, 0x03b9}}},
- { 0x1fb4, {2, {0x03ac, 0x03b9}}},
- { 0x1fb6, {2, {0x03b1, 0x0342}}},
- { 0x1fb7, {3, {0x03b1, 0x0342, 0x03b9}}},
- { 0x1fb8, {1, {0x1fb0}}},
- { 0x1fb9, {1, {0x1fb1}}},
- { 0x1fba, {1, {0x1f70}}},
- { 0x1fbb, {1, {0x1f71}}},
- { 0x1fbc, {2, {0x03b1, 0x03b9}}},
- { 0x1fbe, {1, {0x03b9}}},
- { 0x1fc2, {2, {0x1f74, 0x03b9}}},
- { 0x1fc3, {2, {0x03b7, 0x03b9}}},
- { 0x1fc4, {2, {0x03ae, 0x03b9}}},
- { 0x1fc6, {2, {0x03b7, 0x0342}}},
- { 0x1fc7, {3, {0x03b7, 0x0342, 0x03b9}}},
- { 0x1fc8, {1, {0x1f72}}},
- { 0x1fc9, {1, {0x1f73}}},
- { 0x1fca, {1, {0x1f74}}},
- { 0x1fcb, {1, {0x1f75}}},
- { 0x1fcc, {2, {0x03b7, 0x03b9}}},
- { 0x1fd2, {3, {0x03b9, 0x0308, 0x0300}}},
- { 0x1fd3, {3, {0x03b9, 0x0308, 0x0301}}},
- { 0x1fd6, {2, {0x03b9, 0x0342}}},
- { 0x1fd7, {3, {0x03b9, 0x0308, 0x0342}}},
- { 0x1fd8, {1, {0x1fd0}}},
- { 0x1fd9, {1, {0x1fd1}}},
- { 0x1fda, {1, {0x1f76}}},
- { 0x1fdb, {1, {0x1f77}}},
- { 0x1fe2, {3, {0x03c5, 0x0308, 0x0300}}},
- { 0x1fe3, {3, {0x03c5, 0x0308, 0x0301}}},
- { 0x1fe4, {2, {0x03c1, 0x0313}}},
- { 0x1fe6, {2, {0x03c5, 0x0342}}},
- { 0x1fe7, {3, {0x03c5, 0x0308, 0x0342}}},
- { 0x1fe8, {1, {0x1fe0}}},
- { 0x1fe9, {1, {0x1fe1}}},
- { 0x1fea, {1, {0x1f7a}}},
- { 0x1feb, {1, {0x1f7b}}},
- { 0x1fec, {1, {0x1fe5}}},
- { 0x1ff2, {2, {0x1f7c, 0x03b9}}},
- { 0x1ff3, {2, {0x03c9, 0x03b9}}},
- { 0x1ff4, {2, {0x03ce, 0x03b9}}},
- { 0x1ff6, {2, {0x03c9, 0x0342}}},
- { 0x1ff7, {3, {0x03c9, 0x0342, 0x03b9}}},
- { 0x1ff8, {1, {0x1f78}}},
- { 0x1ff9, {1, {0x1f79}}},
- { 0x1ffa, {1, {0x1f7c}}},
- { 0x1ffb, {1, {0x1f7d}}},
- { 0x1ffc, {2, {0x03c9, 0x03b9}}},
- { 0x2126, {1, {0x03c9}}},
- { 0x212a, {1, {0x006b}}},
- { 0x212b, {1, {0x00e5}}},
- { 0x2132, {1, {0x214e}}},
- { 0x2160, {1, {0x2170}}},
- { 0x2161, {1, {0x2171}}},
- { 0x2162, {1, {0x2172}}},
- { 0x2163, {1, {0x2173}}},
- { 0x2164, {1, {0x2174}}},
- { 0x2165, {1, {0x2175}}},
- { 0x2166, {1, {0x2176}}},
- { 0x2167, {1, {0x2177}}},
- { 0x2168, {1, {0x2178}}},
- { 0x2169, {1, {0x2179}}},
- { 0x216a, {1, {0x217a}}},
- { 0x216b, {1, {0x217b}}},
- { 0x216c, {1, {0x217c}}},
- { 0x216d, {1, {0x217d}}},
- { 0x216e, {1, {0x217e}}},
- { 0x216f, {1, {0x217f}}},
- { 0x2183, {1, {0x2184}}},
- { 0x24b6, {1, {0x24d0}}},
- { 0x24b7, {1, {0x24d1}}},
- { 0x24b8, {1, {0x24d2}}},
- { 0x24b9, {1, {0x24d3}}},
- { 0x24ba, {1, {0x24d4}}},
- { 0x24bb, {1, {0x24d5}}},
- { 0x24bc, {1, {0x24d6}}},
- { 0x24bd, {1, {0x24d7}}},
- { 0x24be, {1, {0x24d8}}},
- { 0x24bf, {1, {0x24d9}}},
- { 0x24c0, {1, {0x24da}}},
- { 0x24c1, {1, {0x24db}}},
- { 0x24c2, {1, {0x24dc}}},
- { 0x24c3, {1, {0x24dd}}},
- { 0x24c4, {1, {0x24de}}},
- { 0x24c5, {1, {0x24df}}},
- { 0x24c6, {1, {0x24e0}}},
- { 0x24c7, {1, {0x24e1}}},
- { 0x24c8, {1, {0x24e2}}},
- { 0x24c9, {1, {0x24e3}}},
- { 0x24ca, {1, {0x24e4}}},
- { 0x24cb, {1, {0x24e5}}},
- { 0x24cc, {1, {0x24e6}}},
- { 0x24cd, {1, {0x24e7}}},
- { 0x24ce, {1, {0x24e8}}},
- { 0x24cf, {1, {0x24e9}}},
- { 0x2c00, {1, {0x2c30}}},
- { 0x2c01, {1, {0x2c31}}},
- { 0x2c02, {1, {0x2c32}}},
- { 0x2c03, {1, {0x2c33}}},
- { 0x2c04, {1, {0x2c34}}},
- { 0x2c05, {1, {0x2c35}}},
- { 0x2c06, {1, {0x2c36}}},
- { 0x2c07, {1, {0x2c37}}},
- { 0x2c08, {1, {0x2c38}}},
- { 0x2c09, {1, {0x2c39}}},
- { 0x2c0a, {1, {0x2c3a}}},
- { 0x2c0b, {1, {0x2c3b}}},
- { 0x2c0c, {1, {0x2c3c}}},
- { 0x2c0d, {1, {0x2c3d}}},
- { 0x2c0e, {1, {0x2c3e}}},
- { 0x2c0f, {1, {0x2c3f}}},
- { 0x2c10, {1, {0x2c40}}},
- { 0x2c11, {1, {0x2c41}}},
- { 0x2c12, {1, {0x2c42}}},
- { 0x2c13, {1, {0x2c43}}},
- { 0x2c14, {1, {0x2c44}}},
- { 0x2c15, {1, {0x2c45}}},
- { 0x2c16, {1, {0x2c46}}},
- { 0x2c17, {1, {0x2c47}}},
- { 0x2c18, {1, {0x2c48}}},
- { 0x2c19, {1, {0x2c49}}},
- { 0x2c1a, {1, {0x2c4a}}},
- { 0x2c1b, {1, {0x2c4b}}},
- { 0x2c1c, {1, {0x2c4c}}},
- { 0x2c1d, {1, {0x2c4d}}},
- { 0x2c1e, {1, {0x2c4e}}},
- { 0x2c1f, {1, {0x2c4f}}},
- { 0x2c20, {1, {0x2c50}}},
- { 0x2c21, {1, {0x2c51}}},
- { 0x2c22, {1, {0x2c52}}},
- { 0x2c23, {1, {0x2c53}}},
- { 0x2c24, {1, {0x2c54}}},
- { 0x2c25, {1, {0x2c55}}},
- { 0x2c26, {1, {0x2c56}}},
- { 0x2c27, {1, {0x2c57}}},
- { 0x2c28, {1, {0x2c58}}},
- { 0x2c29, {1, {0x2c59}}},
- { 0x2c2a, {1, {0x2c5a}}},
- { 0x2c2b, {1, {0x2c5b}}},
- { 0x2c2c, {1, {0x2c5c}}},
- { 0x2c2d, {1, {0x2c5d}}},
- { 0x2c2e, {1, {0x2c5e}}},
- { 0x2c60, {1, {0x2c61}}},
- { 0x2c62, {1, {0x026b}}},
- { 0x2c63, {1, {0x1d7d}}},
- { 0x2c64, {1, {0x027d}}},
- { 0x2c67, {1, {0x2c68}}},
- { 0x2c69, {1, {0x2c6a}}},
- { 0x2c6b, {1, {0x2c6c}}},
- { 0x2c6d, {1, {0x0251}}},
- { 0x2c6e, {1, {0x0271}}},
- { 0x2c6f, {1, {0x0250}}},
- { 0x2c70, {1, {0x0252}}},
- { 0x2c72, {1, {0x2c73}}},
- { 0x2c75, {1, {0x2c76}}},
- { 0x2c7e, {1, {0x023f}}},
- { 0x2c7f, {1, {0x0240}}},
- { 0x2c80, {1, {0x2c81}}},
- { 0x2c82, {1, {0x2c83}}},
- { 0x2c84, {1, {0x2c85}}},
- { 0x2c86, {1, {0x2c87}}},
- { 0x2c88, {1, {0x2c89}}},
- { 0x2c8a, {1, {0x2c8b}}},
- { 0x2c8c, {1, {0x2c8d}}},
- { 0x2c8e, {1, {0x2c8f}}},
- { 0x2c90, {1, {0x2c91}}},
- { 0x2c92, {1, {0x2c93}}},
- { 0x2c94, {1, {0x2c95}}},
- { 0x2c96, {1, {0x2c97}}},
- { 0x2c98, {1, {0x2c99}}},
- { 0x2c9a, {1, {0x2c9b}}},
- { 0x2c9c, {1, {0x2c9d}}},
- { 0x2c9e, {1, {0x2c9f}}},
- { 0x2ca0, {1, {0x2ca1}}},
- { 0x2ca2, {1, {0x2ca3}}},
- { 0x2ca4, {1, {0x2ca5}}},
- { 0x2ca6, {1, {0x2ca7}}},
- { 0x2ca8, {1, {0x2ca9}}},
- { 0x2caa, {1, {0x2cab}}},
- { 0x2cac, {1, {0x2cad}}},
- { 0x2cae, {1, {0x2caf}}},
- { 0x2cb0, {1, {0x2cb1}}},
- { 0x2cb2, {1, {0x2cb3}}},
- { 0x2cb4, {1, {0x2cb5}}},
- { 0x2cb6, {1, {0x2cb7}}},
- { 0x2cb8, {1, {0x2cb9}}},
- { 0x2cba, {1, {0x2cbb}}},
- { 0x2cbc, {1, {0x2cbd}}},
- { 0x2cbe, {1, {0x2cbf}}},
- { 0x2cc0, {1, {0x2cc1}}},
- { 0x2cc2, {1, {0x2cc3}}},
- { 0x2cc4, {1, {0x2cc5}}},
- { 0x2cc6, {1, {0x2cc7}}},
- { 0x2cc8, {1, {0x2cc9}}},
- { 0x2cca, {1, {0x2ccb}}},
- { 0x2ccc, {1, {0x2ccd}}},
- { 0x2cce, {1, {0x2ccf}}},
- { 0x2cd0, {1, {0x2cd1}}},
- { 0x2cd2, {1, {0x2cd3}}},
- { 0x2cd4, {1, {0x2cd5}}},
- { 0x2cd6, {1, {0x2cd7}}},
- { 0x2cd8, {1, {0x2cd9}}},
- { 0x2cda, {1, {0x2cdb}}},
- { 0x2cdc, {1, {0x2cdd}}},
- { 0x2cde, {1, {0x2cdf}}},
- { 0x2ce0, {1, {0x2ce1}}},
- { 0x2ce2, {1, {0x2ce3}}},
- { 0x2ceb, {1, {0x2cec}}},
- { 0x2ced, {1, {0x2cee}}},
- { 0x2cf2, {1, {0x2cf3}}},
- { 0xa640, {1, {0xa641}}},
- { 0xa642, {1, {0xa643}}},
- { 0xa644, {1, {0xa645}}},
- { 0xa646, {1, {0xa647}}},
- { 0xa648, {1, {0xa649}}},
- { 0xa64a, {1, {0xa64b}}},
- { 0xa64c, {1, {0xa64d}}},
- { 0xa64e, {1, {0xa64f}}},
- { 0xa650, {1, {0xa651}}},
- { 0xa652, {1, {0xa653}}},
- { 0xa654, {1, {0xa655}}},
- { 0xa656, {1, {0xa657}}},
- { 0xa658, {1, {0xa659}}},
- { 0xa65a, {1, {0xa65b}}},
- { 0xa65c, {1, {0xa65d}}},
- { 0xa65e, {1, {0xa65f}}},
- { 0xa660, {1, {0xa661}}},
- { 0xa662, {1, {0xa663}}},
- { 0xa664, {1, {0xa665}}},
- { 0xa666, {1, {0xa667}}},
- { 0xa668, {1, {0xa669}}},
- { 0xa66a, {1, {0xa66b}}},
- { 0xa66c, {1, {0xa66d}}},
- { 0xa680, {1, {0xa681}}},
- { 0xa682, {1, {0xa683}}},
- { 0xa684, {1, {0xa685}}},
- { 0xa686, {1, {0xa687}}},
- { 0xa688, {1, {0xa689}}},
- { 0xa68a, {1, {0xa68b}}},
- { 0xa68c, {1, {0xa68d}}},
- { 0xa68e, {1, {0xa68f}}},
- { 0xa690, {1, {0xa691}}},
- { 0xa692, {1, {0xa693}}},
- { 0xa694, {1, {0xa695}}},
- { 0xa696, {1, {0xa697}}},
- { 0xa722, {1, {0xa723}}},
- { 0xa724, {1, {0xa725}}},
- { 0xa726, {1, {0xa727}}},
- { 0xa728, {1, {0xa729}}},
- { 0xa72a, {1, {0xa72b}}},
- { 0xa72c, {1, {0xa72d}}},
- { 0xa72e, {1, {0xa72f}}},
- { 0xa732, {1, {0xa733}}},
- { 0xa734, {1, {0xa735}}},
- { 0xa736, {1, {0xa737}}},
- { 0xa738, {1, {0xa739}}},
- { 0xa73a, {1, {0xa73b}}},
- { 0xa73c, {1, {0xa73d}}},
- { 0xa73e, {1, {0xa73f}}},
- { 0xa740, {1, {0xa741}}},
- { 0xa742, {1, {0xa743}}},
- { 0xa744, {1, {0xa745}}},
- { 0xa746, {1, {0xa747}}},
- { 0xa748, {1, {0xa749}}},
- { 0xa74a, {1, {0xa74b}}},
- { 0xa74c, {1, {0xa74d}}},
- { 0xa74e, {1, {0xa74f}}},
- { 0xa750, {1, {0xa751}}},
- { 0xa752, {1, {0xa753}}},
- { 0xa754, {1, {0xa755}}},
- { 0xa756, {1, {0xa757}}},
- { 0xa758, {1, {0xa759}}},
- { 0xa75a, {1, {0xa75b}}},
- { 0xa75c, {1, {0xa75d}}},
- { 0xa75e, {1, {0xa75f}}},
- { 0xa760, {1, {0xa761}}},
- { 0xa762, {1, {0xa763}}},
- { 0xa764, {1, {0xa765}}},
- { 0xa766, {1, {0xa767}}},
- { 0xa768, {1, {0xa769}}},
- { 0xa76a, {1, {0xa76b}}},
- { 0xa76c, {1, {0xa76d}}},
- { 0xa76e, {1, {0xa76f}}},
- { 0xa779, {1, {0xa77a}}},
- { 0xa77b, {1, {0xa77c}}},
- { 0xa77d, {1, {0x1d79}}},
- { 0xa77e, {1, {0xa77f}}},
- { 0xa780, {1, {0xa781}}},
- { 0xa782, {1, {0xa783}}},
- { 0xa784, {1, {0xa785}}},
- { 0xa786, {1, {0xa787}}},
- { 0xa78b, {1, {0xa78c}}},
- { 0xa78d, {1, {0x0265}}},
- { 0xa790, {1, {0xa791}}},
- { 0xa792, {1, {0xa793}}},
- { 0xa7a0, {1, {0xa7a1}}},
- { 0xa7a2, {1, {0xa7a3}}},
- { 0xa7a4, {1, {0xa7a5}}},
- { 0xa7a6, {1, {0xa7a7}}},
- { 0xa7a8, {1, {0xa7a9}}},
- { 0xa7aa, {1, {0x0266}}},
- { 0xfb00, {2, {0x0066, 0x0066}}},
- { 0xfb01, {2, {0x0066, 0x0069}}},
- { 0xfb02, {2, {0x0066, 0x006c}}},
- { 0xfb03, {3, {0x0066, 0x0066, 0x0069}}},
- { 0xfb04, {3, {0x0066, 0x0066, 0x006c}}},
- { 0xfb05, {2, {0x0073, 0x0074}}},
- { 0xfb06, {2, {0x0073, 0x0074}}},
- { 0xfb13, {2, {0x0574, 0x0576}}},
- { 0xfb14, {2, {0x0574, 0x0565}}},
- { 0xfb15, {2, {0x0574, 0x056b}}},
- { 0xfb16, {2, {0x057e, 0x0576}}},
- { 0xfb17, {2, {0x0574, 0x056d}}},
- { 0xff21, {1, {0xff41}}},
- { 0xff22, {1, {0xff42}}},
- { 0xff23, {1, {0xff43}}},
- { 0xff24, {1, {0xff44}}},
- { 0xff25, {1, {0xff45}}},
- { 0xff26, {1, {0xff46}}},
- { 0xff27, {1, {0xff47}}},
- { 0xff28, {1, {0xff48}}},
- { 0xff29, {1, {0xff49}}},
- { 0xff2a, {1, {0xff4a}}},
- { 0xff2b, {1, {0xff4b}}},
- { 0xff2c, {1, {0xff4c}}},
- { 0xff2d, {1, {0xff4d}}},
- { 0xff2e, {1, {0xff4e}}},
- { 0xff2f, {1, {0xff4f}}},
- { 0xff30, {1, {0xff50}}},
- { 0xff31, {1, {0xff51}}},
- { 0xff32, {1, {0xff52}}},
- { 0xff33, {1, {0xff53}}},
- { 0xff34, {1, {0xff54}}},
- { 0xff35, {1, {0xff55}}},
- { 0xff36, {1, {0xff56}}},
- { 0xff37, {1, {0xff57}}},
- { 0xff38, {1, {0xff58}}},
- { 0xff39, {1, {0xff59}}},
- { 0xff3a, {1, {0xff5a}}},
- { 0x10400, {1, {0x10428}}},
- { 0x10401, {1, {0x10429}}},
- { 0x10402, {1, {0x1042a}}},
- { 0x10403, {1, {0x1042b}}},
- { 0x10404, {1, {0x1042c}}},
- { 0x10405, {1, {0x1042d}}},
- { 0x10406, {1, {0x1042e}}},
- { 0x10407, {1, {0x1042f}}},
- { 0x10408, {1, {0x10430}}},
- { 0x10409, {1, {0x10431}}},
- { 0x1040a, {1, {0x10432}}},
- { 0x1040b, {1, {0x10433}}},
- { 0x1040c, {1, {0x10434}}},
- { 0x1040d, {1, {0x10435}}},
- { 0x1040e, {1, {0x10436}}},
- { 0x1040f, {1, {0x10437}}},
- { 0x10410, {1, {0x10438}}},
- { 0x10411, {1, {0x10439}}},
- { 0x10412, {1, {0x1043a}}},
- { 0x10413, {1, {0x1043b}}},
- { 0x10414, {1, {0x1043c}}},
- { 0x10415, {1, {0x1043d}}},
- { 0x10416, {1, {0x1043e}}},
- { 0x10417, {1, {0x1043f}}},
- { 0x10418, {1, {0x10440}}},
- { 0x10419, {1, {0x10441}}},
- { 0x1041a, {1, {0x10442}}},
- { 0x1041b, {1, {0x10443}}},
- { 0x1041c, {1, {0x10444}}},
- { 0x1041d, {1, {0x10445}}},
- { 0x1041e, {1, {0x10446}}},
- { 0x1041f, {1, {0x10447}}},
- { 0x10420, {1, {0x10448}}},
- { 0x10421, {1, {0x10449}}},
- { 0x10422, {1, {0x1044a}}},
- { 0x10423, {1, {0x1044b}}},
- { 0x10424, {1, {0x1044c}}},
- { 0x10425, {1, {0x1044d}}},
- { 0x10426, {1, {0x1044e}}},
- { 0x10427, {1, {0x1044f}}},
+static const CaseFold_11_Type CaseFold_11_Table[] = {
+#define CaseFold (*(CaseFold_11_Type (*)[1178])(CaseFold_11_Table+0))
+ {0x0041, {1, {0x0061}}},
+ {0x0042, {1, {0x0062}}},
+ {0x0043, {1, {0x0063}}},
+ {0x0044, {1, {0x0064}}},
+ {0x0045, {1, {0x0065}}},
+ {0x0046, {1, {0x0066}}},
+ {0x0047, {1, {0x0067}}},
+ {0x0048, {1, {0x0068}}},
+ {0x004a, {1, {0x006a}}},
+ {0x004b, {1, {0x006b}}},
+ {0x004c, {1, {0x006c}}},
+ {0x004d, {1, {0x006d}}},
+ {0x004e, {1, {0x006e}}},
+ {0x004f, {1, {0x006f}}},
+ {0x0050, {1, {0x0070}}},
+ {0x0051, {1, {0x0071}}},
+ {0x0052, {1, {0x0072}}},
+ {0x0053, {1, {0x0073}}},
+ {0x0054, {1, {0x0074}}},
+ {0x0055, {1, {0x0075}}},
+ {0x0056, {1, {0x0076}}},
+ {0x0057, {1, {0x0077}}},
+ {0x0058, {1, {0x0078}}},
+ {0x0059, {1, {0x0079}}},
+ {0x005a, {1, {0x007a}}},
+ {0x00b5, {1, {0x03bc}}},
+ {0x00c0, {1, {0x00e0}}},
+ {0x00c1, {1, {0x00e1}}},
+ {0x00c2, {1, {0x00e2}}},
+ {0x00c3, {1, {0x00e3}}},
+ {0x00c4, {1, {0x00e4}}},
+ {0x00c5, {1, {0x00e5}}},
+ {0x00c6, {1, {0x00e6}}},
+ {0x00c7, {1, {0x00e7}}},
+ {0x00c8, {1, {0x00e8}}},
+ {0x00c9, {1, {0x00e9}}},
+ {0x00ca, {1, {0x00ea}}},
+ {0x00cb, {1, {0x00eb}}},
+ {0x00cc, {1, {0x00ec}}},
+ {0x00cd, {1, {0x00ed}}},
+ {0x00ce, {1, {0x00ee}}},
+ {0x00cf, {1, {0x00ef}}},
+ {0x00d0, {1, {0x00f0}}},
+ {0x00d1, {1, {0x00f1}}},
+ {0x00d2, {1, {0x00f2}}},
+ {0x00d3, {1, {0x00f3}}},
+ {0x00d4, {1, {0x00f4}}},
+ {0x00d5, {1, {0x00f5}}},
+ {0x00d6, {1, {0x00f6}}},
+ {0x00d8, {1, {0x00f8}}},
+ {0x00d9, {1, {0x00f9}}},
+ {0x00da, {1, {0x00fa}}},
+ {0x00db, {1, {0x00fb}}},
+ {0x00dc, {1, {0x00fc}}},
+ {0x00dd, {1, {0x00fd}}},
+ {0x00de, {1, {0x00fe}}},
+ {0x00df, {2, {0x0073, 0x0073}}},
+ {0x0100, {1, {0x0101}}},
+ {0x0102, {1, {0x0103}}},
+ {0x0104, {1, {0x0105}}},
+ {0x0106, {1, {0x0107}}},
+ {0x0108, {1, {0x0109}}},
+ {0x010a, {1, {0x010b}}},
+ {0x010c, {1, {0x010d}}},
+ {0x010e, {1, {0x010f}}},
+ {0x0110, {1, {0x0111}}},
+ {0x0112, {1, {0x0113}}},
+ {0x0114, {1, {0x0115}}},
+ {0x0116, {1, {0x0117}}},
+ {0x0118, {1, {0x0119}}},
+ {0x011a, {1, {0x011b}}},
+ {0x011c, {1, {0x011d}}},
+ {0x011e, {1, {0x011f}}},
+ {0x0120, {1, {0x0121}}},
+ {0x0122, {1, {0x0123}}},
+ {0x0124, {1, {0x0125}}},
+ {0x0126, {1, {0x0127}}},
+ {0x0128, {1, {0x0129}}},
+ {0x012a, {1, {0x012b}}},
+ {0x012c, {1, {0x012d}}},
+ {0x012e, {1, {0x012f}}},
+ {0x0132, {1, {0x0133}}},
+ {0x0134, {1, {0x0135}}},
+ {0x0136, {1, {0x0137}}},
+ {0x0139, {1, {0x013a}}},
+ {0x013b, {1, {0x013c}}},
+ {0x013d, {1, {0x013e}}},
+ {0x013f, {1, {0x0140}}},
+ {0x0141, {1, {0x0142}}},
+ {0x0143, {1, {0x0144}}},
+ {0x0145, {1, {0x0146}}},
+ {0x0147, {1, {0x0148}}},
+ {0x0149, {2, {0x02bc, 0x006e}}},
+ {0x014a, {1, {0x014b}}},
+ {0x014c, {1, {0x014d}}},
+ {0x014e, {1, {0x014f}}},
+ {0x0150, {1, {0x0151}}},
+ {0x0152, {1, {0x0153}}},
+ {0x0154, {1, {0x0155}}},
+ {0x0156, {1, {0x0157}}},
+ {0x0158, {1, {0x0159}}},
+ {0x015a, {1, {0x015b}}},
+ {0x015c, {1, {0x015d}}},
+ {0x015e, {1, {0x015f}}},
+ {0x0160, {1, {0x0161}}},
+ {0x0162, {1, {0x0163}}},
+ {0x0164, {1, {0x0165}}},
+ {0x0166, {1, {0x0167}}},
+ {0x0168, {1, {0x0169}}},
+ {0x016a, {1, {0x016b}}},
+ {0x016c, {1, {0x016d}}},
+ {0x016e, {1, {0x016f}}},
+ {0x0170, {1, {0x0171}}},
+ {0x0172, {1, {0x0173}}},
+ {0x0174, {1, {0x0175}}},
+ {0x0176, {1, {0x0177}}},
+ {0x0178, {1, {0x00ff}}},
+ {0x0179, {1, {0x017a}}},
+ {0x017b, {1, {0x017c}}},
+ {0x017d, {1, {0x017e}}},
+ {0x017f, {1, {0x0073}}},
+ {0x0181, {1, {0x0253}}},
+ {0x0182, {1, {0x0183}}},
+ {0x0184, {1, {0x0185}}},
+ {0x0186, {1, {0x0254}}},
+ {0x0187, {1, {0x0188}}},
+ {0x0189, {1, {0x0256}}},
+ {0x018a, {1, {0x0257}}},
+ {0x018b, {1, {0x018c}}},
+ {0x018e, {1, {0x01dd}}},
+ {0x018f, {1, {0x0259}}},
+ {0x0190, {1, {0x025b}}},
+ {0x0191, {1, {0x0192}}},
+ {0x0193, {1, {0x0260}}},
+ {0x0194, {1, {0x0263}}},
+ {0x0196, {1, {0x0269}}},
+ {0x0197, {1, {0x0268}}},
+ {0x0198, {1, {0x0199}}},
+ {0x019c, {1, {0x026f}}},
+ {0x019d, {1, {0x0272}}},
+ {0x019f, {1, {0x0275}}},
+ {0x01a0, {1, {0x01a1}}},
+ {0x01a2, {1, {0x01a3}}},
+ {0x01a4, {1, {0x01a5}}},
+ {0x01a6, {1, {0x0280}}},
+ {0x01a7, {1, {0x01a8}}},
+ {0x01a9, {1, {0x0283}}},
+ {0x01ac, {1, {0x01ad}}},
+ {0x01ae, {1, {0x0288}}},
+ {0x01af, {1, {0x01b0}}},
+ {0x01b1, {1, {0x028a}}},
+ {0x01b2, {1, {0x028b}}},
+ {0x01b3, {1, {0x01b4}}},
+ {0x01b5, {1, {0x01b6}}},
+ {0x01b7, {1, {0x0292}}},
+ {0x01b8, {1, {0x01b9}}},
+ {0x01bc, {1, {0x01bd}}},
+ {0x01c4, {1, {0x01c6}}},
+ {0x01c5, {1, {0x01c6}}},
+ {0x01c7, {1, {0x01c9}}},
+ {0x01c8, {1, {0x01c9}}},
+ {0x01ca, {1, {0x01cc}}},
+ {0x01cb, {1, {0x01cc}}},
+ {0x01cd, {1, {0x01ce}}},
+ {0x01cf, {1, {0x01d0}}},
+ {0x01d1, {1, {0x01d2}}},
+ {0x01d3, {1, {0x01d4}}},
+ {0x01d5, {1, {0x01d6}}},
+ {0x01d7, {1, {0x01d8}}},
+ {0x01d9, {1, {0x01da}}},
+ {0x01db, {1, {0x01dc}}},
+ {0x01de, {1, {0x01df}}},
+ {0x01e0, {1, {0x01e1}}},
+ {0x01e2, {1, {0x01e3}}},
+ {0x01e4, {1, {0x01e5}}},
+ {0x01e6, {1, {0x01e7}}},
+ {0x01e8, {1, {0x01e9}}},
+ {0x01ea, {1, {0x01eb}}},
+ {0x01ec, {1, {0x01ed}}},
+ {0x01ee, {1, {0x01ef}}},
+ {0x01f0, {2, {0x006a, 0x030c}}},
+ {0x01f1, {1, {0x01f3}}},
+ {0x01f2, {1, {0x01f3}}},
+ {0x01f4, {1, {0x01f5}}},
+ {0x01f6, {1, {0x0195}}},
+ {0x01f7, {1, {0x01bf}}},
+ {0x01f8, {1, {0x01f9}}},
+ {0x01fa, {1, {0x01fb}}},
+ {0x01fc, {1, {0x01fd}}},
+ {0x01fe, {1, {0x01ff}}},
+ {0x0200, {1, {0x0201}}},
+ {0x0202, {1, {0x0203}}},
+ {0x0204, {1, {0x0205}}},
+ {0x0206, {1, {0x0207}}},
+ {0x0208, {1, {0x0209}}},
+ {0x020a, {1, {0x020b}}},
+ {0x020c, {1, {0x020d}}},
+ {0x020e, {1, {0x020f}}},
+ {0x0210, {1, {0x0211}}},
+ {0x0212, {1, {0x0213}}},
+ {0x0214, {1, {0x0215}}},
+ {0x0216, {1, {0x0217}}},
+ {0x0218, {1, {0x0219}}},
+ {0x021a, {1, {0x021b}}},
+ {0x021c, {1, {0x021d}}},
+ {0x021e, {1, {0x021f}}},
+ {0x0220, {1, {0x019e}}},
+ {0x0222, {1, {0x0223}}},
+ {0x0224, {1, {0x0225}}},
+ {0x0226, {1, {0x0227}}},
+ {0x0228, {1, {0x0229}}},
+ {0x022a, {1, {0x022b}}},
+ {0x022c, {1, {0x022d}}},
+ {0x022e, {1, {0x022f}}},
+ {0x0230, {1, {0x0231}}},
+ {0x0232, {1, {0x0233}}},
+ {0x023a, {1, {0x2c65}}},
+ {0x023b, {1, {0x023c}}},
+ {0x023d, {1, {0x019a}}},
+ {0x023e, {1, {0x2c66}}},
+ {0x0241, {1, {0x0242}}},
+ {0x0243, {1, {0x0180}}},
+ {0x0244, {1, {0x0289}}},
+ {0x0245, {1, {0x028c}}},
+ {0x0246, {1, {0x0247}}},
+ {0x0248, {1, {0x0249}}},
+ {0x024a, {1, {0x024b}}},
+ {0x024c, {1, {0x024d}}},
+ {0x024e, {1, {0x024f}}},
+ {0x0345, {1, {0x03b9}}},
+ {0x0370, {1, {0x0371}}},
+ {0x0372, {1, {0x0373}}},
+ {0x0376, {1, {0x0377}}},
+ {0x037f, {1, {0x03f3}}},
+ {0x0386, {1, {0x03ac}}},
+ {0x0388, {1, {0x03ad}}},
+ {0x0389, {1, {0x03ae}}},
+ {0x038a, {1, {0x03af}}},
+ {0x038c, {1, {0x03cc}}},
+ {0x038e, {1, {0x03cd}}},
+ {0x038f, {1, {0x03ce}}},
+ {0x0390, {3, {0x03b9, 0x0308, 0x0301}}},
+ {0x0391, {1, {0x03b1}}},
+ {0x0392, {1, {0x03b2}}},
+ {0x0393, {1, {0x03b3}}},
+ {0x0394, {1, {0x03b4}}},
+ {0x0395, {1, {0x03b5}}},
+ {0x0396, {1, {0x03b6}}},
+ {0x0397, {1, {0x03b7}}},
+ {0x0398, {1, {0x03b8}}},
+ {0x0399, {1, {0x03b9}}},
+ {0x039a, {1, {0x03ba}}},
+ {0x039b, {1, {0x03bb}}},
+ {0x039c, {1, {0x03bc}}},
+ {0x039d, {1, {0x03bd}}},
+ {0x039e, {1, {0x03be}}},
+ {0x039f, {1, {0x03bf}}},
+ {0x03a0, {1, {0x03c0}}},
+ {0x03a1, {1, {0x03c1}}},
+ {0x03a3, {1, {0x03c3}}},
+ {0x03a4, {1, {0x03c4}}},
+ {0x03a5, {1, {0x03c5}}},
+ {0x03a6, {1, {0x03c6}}},
+ {0x03a7, {1, {0x03c7}}},
+ {0x03a8, {1, {0x03c8}}},
+ {0x03a9, {1, {0x03c9}}},
+ {0x03aa, {1, {0x03ca}}},
+ {0x03ab, {1, {0x03cb}}},
+ {0x03b0, {3, {0x03c5, 0x0308, 0x0301}}},
+ {0x03c2, {1, {0x03c3}}},
+ {0x03cf, {1, {0x03d7}}},
+ {0x03d0, {1, {0x03b2}}},
+ {0x03d1, {1, {0x03b8}}},
+ {0x03d5, {1, {0x03c6}}},
+ {0x03d6, {1, {0x03c0}}},
+ {0x03d8, {1, {0x03d9}}},
+ {0x03da, {1, {0x03db}}},
+ {0x03dc, {1, {0x03dd}}},
+ {0x03de, {1, {0x03df}}},
+ {0x03e0, {1, {0x03e1}}},
+ {0x03e2, {1, {0x03e3}}},
+ {0x03e4, {1, {0x03e5}}},
+ {0x03e6, {1, {0x03e7}}},
+ {0x03e8, {1, {0x03e9}}},
+ {0x03ea, {1, {0x03eb}}},
+ {0x03ec, {1, {0x03ed}}},
+ {0x03ee, {1, {0x03ef}}},
+ {0x03f0, {1, {0x03ba}}},
+ {0x03f1, {1, {0x03c1}}},
+ {0x03f4, {1, {0x03b8}}},
+ {0x03f5, {1, {0x03b5}}},
+ {0x03f7, {1, {0x03f8}}},
+ {0x03f9, {1, {0x03f2}}},
+ {0x03fa, {1, {0x03fb}}},
+ {0x03fd, {1, {0x037b}}},
+ {0x03fe, {1, {0x037c}}},
+ {0x03ff, {1, {0x037d}}},
+ {0x0400, {1, {0x0450}}},
+ {0x0401, {1, {0x0451}}},
+ {0x0402, {1, {0x0452}}},
+ {0x0403, {1, {0x0453}}},
+ {0x0404, {1, {0x0454}}},
+ {0x0405, {1, {0x0455}}},
+ {0x0406, {1, {0x0456}}},
+ {0x0407, {1, {0x0457}}},
+ {0x0408, {1, {0x0458}}},
+ {0x0409, {1, {0x0459}}},
+ {0x040a, {1, {0x045a}}},
+ {0x040b, {1, {0x045b}}},
+ {0x040c, {1, {0x045c}}},
+ {0x040d, {1, {0x045d}}},
+ {0x040e, {1, {0x045e}}},
+ {0x040f, {1, {0x045f}}},
+ {0x0410, {1, {0x0430}}},
+ {0x0411, {1, {0x0431}}},
+ {0x0412, {1, {0x0432}}},
+ {0x0413, {1, {0x0433}}},
+ {0x0414, {1, {0x0434}}},
+ {0x0415, {1, {0x0435}}},
+ {0x0416, {1, {0x0436}}},
+ {0x0417, {1, {0x0437}}},
+ {0x0418, {1, {0x0438}}},
+ {0x0419, {1, {0x0439}}},
+ {0x041a, {1, {0x043a}}},
+ {0x041b, {1, {0x043b}}},
+ {0x041c, {1, {0x043c}}},
+ {0x041d, {1, {0x043d}}},
+ {0x041e, {1, {0x043e}}},
+ {0x041f, {1, {0x043f}}},
+ {0x0420, {1, {0x0440}}},
+ {0x0421, {1, {0x0441}}},
+ {0x0422, {1, {0x0442}}},
+ {0x0423, {1, {0x0443}}},
+ {0x0424, {1, {0x0444}}},
+ {0x0425, {1, {0x0445}}},
+ {0x0426, {1, {0x0446}}},
+ {0x0427, {1, {0x0447}}},
+ {0x0428, {1, {0x0448}}},
+ {0x0429, {1, {0x0449}}},
+ {0x042a, {1, {0x044a}}},
+ {0x042b, {1, {0x044b}}},
+ {0x042c, {1, {0x044c}}},
+ {0x042d, {1, {0x044d}}},
+ {0x042e, {1, {0x044e}}},
+ {0x042f, {1, {0x044f}}},
+ {0x0460, {1, {0x0461}}},
+ {0x0462, {1, {0x0463}}},
+ {0x0464, {1, {0x0465}}},
+ {0x0466, {1, {0x0467}}},
+ {0x0468, {1, {0x0469}}},
+ {0x046a, {1, {0x046b}}},
+ {0x046c, {1, {0x046d}}},
+ {0x046e, {1, {0x046f}}},
+ {0x0470, {1, {0x0471}}},
+ {0x0472, {1, {0x0473}}},
+ {0x0474, {1, {0x0475}}},
+ {0x0476, {1, {0x0477}}},
+ {0x0478, {1, {0x0479}}},
+ {0x047a, {1, {0x047b}}},
+ {0x047c, {1, {0x047d}}},
+ {0x047e, {1, {0x047f}}},
+ {0x0480, {1, {0x0481}}},
+ {0x048a, {1, {0x048b}}},
+ {0x048c, {1, {0x048d}}},
+ {0x048e, {1, {0x048f}}},
+ {0x0490, {1, {0x0491}}},
+ {0x0492, {1, {0x0493}}},
+ {0x0494, {1, {0x0495}}},
+ {0x0496, {1, {0x0497}}},
+ {0x0498, {1, {0x0499}}},
+ {0x049a, {1, {0x049b}}},
+ {0x049c, {1, {0x049d}}},
+ {0x049e, {1, {0x049f}}},
+ {0x04a0, {1, {0x04a1}}},
+ {0x04a2, {1, {0x04a3}}},
+ {0x04a4, {1, {0x04a5}}},
+ {0x04a6, {1, {0x04a7}}},
+ {0x04a8, {1, {0x04a9}}},
+ {0x04aa, {1, {0x04ab}}},
+ {0x04ac, {1, {0x04ad}}},
+ {0x04ae, {1, {0x04af}}},
+ {0x04b0, {1, {0x04b1}}},
+ {0x04b2, {1, {0x04b3}}},
+ {0x04b4, {1, {0x04b5}}},
+ {0x04b6, {1, {0x04b7}}},
+ {0x04b8, {1, {0x04b9}}},
+ {0x04ba, {1, {0x04bb}}},
+ {0x04bc, {1, {0x04bd}}},
+ {0x04be, {1, {0x04bf}}},
+ {0x04c0, {1, {0x04cf}}},
+ {0x04c1, {1, {0x04c2}}},
+ {0x04c3, {1, {0x04c4}}},
+ {0x04c5, {1, {0x04c6}}},
+ {0x04c7, {1, {0x04c8}}},
+ {0x04c9, {1, {0x04ca}}},
+ {0x04cb, {1, {0x04cc}}},
+ {0x04cd, {1, {0x04ce}}},
+ {0x04d0, {1, {0x04d1}}},
+ {0x04d2, {1, {0x04d3}}},
+ {0x04d4, {1, {0x04d5}}},
+ {0x04d6, {1, {0x04d7}}},
+ {0x04d8, {1, {0x04d9}}},
+ {0x04da, {1, {0x04db}}},
+ {0x04dc, {1, {0x04dd}}},
+ {0x04de, {1, {0x04df}}},
+ {0x04e0, {1, {0x04e1}}},
+ {0x04e2, {1, {0x04e3}}},
+ {0x04e4, {1, {0x04e5}}},
+ {0x04e6, {1, {0x04e7}}},
+ {0x04e8, {1, {0x04e9}}},
+ {0x04ea, {1, {0x04eb}}},
+ {0x04ec, {1, {0x04ed}}},
+ {0x04ee, {1, {0x04ef}}},
+ {0x04f0, {1, {0x04f1}}},
+ {0x04f2, {1, {0x04f3}}},
+ {0x04f4, {1, {0x04f5}}},
+ {0x04f6, {1, {0x04f7}}},
+ {0x04f8, {1, {0x04f9}}},
+ {0x04fa, {1, {0x04fb}}},
+ {0x04fc, {1, {0x04fd}}},
+ {0x04fe, {1, {0x04ff}}},
+ {0x0500, {1, {0x0501}}},
+ {0x0502, {1, {0x0503}}},
+ {0x0504, {1, {0x0505}}},
+ {0x0506, {1, {0x0507}}},
+ {0x0508, {1, {0x0509}}},
+ {0x050a, {1, {0x050b}}},
+ {0x050c, {1, {0x050d}}},
+ {0x050e, {1, {0x050f}}},
+ {0x0510, {1, {0x0511}}},
+ {0x0512, {1, {0x0513}}},
+ {0x0514, {1, {0x0515}}},
+ {0x0516, {1, {0x0517}}},
+ {0x0518, {1, {0x0519}}},
+ {0x051a, {1, {0x051b}}},
+ {0x051c, {1, {0x051d}}},
+ {0x051e, {1, {0x051f}}},
+ {0x0520, {1, {0x0521}}},
+ {0x0522, {1, {0x0523}}},
+ {0x0524, {1, {0x0525}}},
+ {0x0526, {1, {0x0527}}},
+ {0x0528, {1, {0x0529}}},
+ {0x052a, {1, {0x052b}}},
+ {0x052c, {1, {0x052d}}},
+ {0x052e, {1, {0x052f}}},
+ {0x0531, {1, {0x0561}}},
+ {0x0532, {1, {0x0562}}},
+ {0x0533, {1, {0x0563}}},
+ {0x0534, {1, {0x0564}}},
+ {0x0535, {1, {0x0565}}},
+ {0x0536, {1, {0x0566}}},
+ {0x0537, {1, {0x0567}}},
+ {0x0538, {1, {0x0568}}},
+ {0x0539, {1, {0x0569}}},
+ {0x053a, {1, {0x056a}}},
+ {0x053b, {1, {0x056b}}},
+ {0x053c, {1, {0x056c}}},
+ {0x053d, {1, {0x056d}}},
+ {0x053e, {1, {0x056e}}},
+ {0x053f, {1, {0x056f}}},
+ {0x0540, {1, {0x0570}}},
+ {0x0541, {1, {0x0571}}},
+ {0x0542, {1, {0x0572}}},
+ {0x0543, {1, {0x0573}}},
+ {0x0544, {1, {0x0574}}},
+ {0x0545, {1, {0x0575}}},
+ {0x0546, {1, {0x0576}}},
+ {0x0547, {1, {0x0577}}},
+ {0x0548, {1, {0x0578}}},
+ {0x0549, {1, {0x0579}}},
+ {0x054a, {1, {0x057a}}},
+ {0x054b, {1, {0x057b}}},
+ {0x054c, {1, {0x057c}}},
+ {0x054d, {1, {0x057d}}},
+ {0x054e, {1, {0x057e}}},
+ {0x054f, {1, {0x057f}}},
+ {0x0550, {1, {0x0580}}},
+ {0x0551, {1, {0x0581}}},
+ {0x0552, {1, {0x0582}}},
+ {0x0553, {1, {0x0583}}},
+ {0x0554, {1, {0x0584}}},
+ {0x0555, {1, {0x0585}}},
+ {0x0556, {1, {0x0586}}},
+ {0x0587, {2, {0x0565, 0x0582}}},
+ {0x10a0, {1, {0x2d00}}},
+ {0x10a1, {1, {0x2d01}}},
+ {0x10a2, {1, {0x2d02}}},
+ {0x10a3, {1, {0x2d03}}},
+ {0x10a4, {1, {0x2d04}}},
+ {0x10a5, {1, {0x2d05}}},
+ {0x10a6, {1, {0x2d06}}},
+ {0x10a7, {1, {0x2d07}}},
+ {0x10a8, {1, {0x2d08}}},
+ {0x10a9, {1, {0x2d09}}},
+ {0x10aa, {1, {0x2d0a}}},
+ {0x10ab, {1, {0x2d0b}}},
+ {0x10ac, {1, {0x2d0c}}},
+ {0x10ad, {1, {0x2d0d}}},
+ {0x10ae, {1, {0x2d0e}}},
+ {0x10af, {1, {0x2d0f}}},
+ {0x10b0, {1, {0x2d10}}},
+ {0x10b1, {1, {0x2d11}}},
+ {0x10b2, {1, {0x2d12}}},
+ {0x10b3, {1, {0x2d13}}},
+ {0x10b4, {1, {0x2d14}}},
+ {0x10b5, {1, {0x2d15}}},
+ {0x10b6, {1, {0x2d16}}},
+ {0x10b7, {1, {0x2d17}}},
+ {0x10b8, {1, {0x2d18}}},
+ {0x10b9, {1, {0x2d19}}},
+ {0x10ba, {1, {0x2d1a}}},
+ {0x10bb, {1, {0x2d1b}}},
+ {0x10bc, {1, {0x2d1c}}},
+ {0x10bd, {1, {0x2d1d}}},
+ {0x10be, {1, {0x2d1e}}},
+ {0x10bf, {1, {0x2d1f}}},
+ {0x10c0, {1, {0x2d20}}},
+ {0x10c1, {1, {0x2d21}}},
+ {0x10c2, {1, {0x2d22}}},
+ {0x10c3, {1, {0x2d23}}},
+ {0x10c4, {1, {0x2d24}}},
+ {0x10c5, {1, {0x2d25}}},
+ {0x10c7, {1, {0x2d27}}},
+ {0x10cd, {1, {0x2d2d}}},
+ {0x1e00, {1, {0x1e01}}},
+ {0x1e02, {1, {0x1e03}}},
+ {0x1e04, {1, {0x1e05}}},
+ {0x1e06, {1, {0x1e07}}},
+ {0x1e08, {1, {0x1e09}}},
+ {0x1e0a, {1, {0x1e0b}}},
+ {0x1e0c, {1, {0x1e0d}}},
+ {0x1e0e, {1, {0x1e0f}}},
+ {0x1e10, {1, {0x1e11}}},
+ {0x1e12, {1, {0x1e13}}},
+ {0x1e14, {1, {0x1e15}}},
+ {0x1e16, {1, {0x1e17}}},
+ {0x1e18, {1, {0x1e19}}},
+ {0x1e1a, {1, {0x1e1b}}},
+ {0x1e1c, {1, {0x1e1d}}},
+ {0x1e1e, {1, {0x1e1f}}},
+ {0x1e20, {1, {0x1e21}}},
+ {0x1e22, {1, {0x1e23}}},
+ {0x1e24, {1, {0x1e25}}},
+ {0x1e26, {1, {0x1e27}}},
+ {0x1e28, {1, {0x1e29}}},
+ {0x1e2a, {1, {0x1e2b}}},
+ {0x1e2c, {1, {0x1e2d}}},
+ {0x1e2e, {1, {0x1e2f}}},
+ {0x1e30, {1, {0x1e31}}},
+ {0x1e32, {1, {0x1e33}}},
+ {0x1e34, {1, {0x1e35}}},
+ {0x1e36, {1, {0x1e37}}},
+ {0x1e38, {1, {0x1e39}}},
+ {0x1e3a, {1, {0x1e3b}}},
+ {0x1e3c, {1, {0x1e3d}}},
+ {0x1e3e, {1, {0x1e3f}}},
+ {0x1e40, {1, {0x1e41}}},
+ {0x1e42, {1, {0x1e43}}},
+ {0x1e44, {1, {0x1e45}}},
+ {0x1e46, {1, {0x1e47}}},
+ {0x1e48, {1, {0x1e49}}},
+ {0x1e4a, {1, {0x1e4b}}},
+ {0x1e4c, {1, {0x1e4d}}},
+ {0x1e4e, {1, {0x1e4f}}},
+ {0x1e50, {1, {0x1e51}}},
+ {0x1e52, {1, {0x1e53}}},
+ {0x1e54, {1, {0x1e55}}},
+ {0x1e56, {1, {0x1e57}}},
+ {0x1e58, {1, {0x1e59}}},
+ {0x1e5a, {1, {0x1e5b}}},
+ {0x1e5c, {1, {0x1e5d}}},
+ {0x1e5e, {1, {0x1e5f}}},
+ {0x1e60, {1, {0x1e61}}},
+ {0x1e62, {1, {0x1e63}}},
+ {0x1e64, {1, {0x1e65}}},
+ {0x1e66, {1, {0x1e67}}},
+ {0x1e68, {1, {0x1e69}}},
+ {0x1e6a, {1, {0x1e6b}}},
+ {0x1e6c, {1, {0x1e6d}}},
+ {0x1e6e, {1, {0x1e6f}}},
+ {0x1e70, {1, {0x1e71}}},
+ {0x1e72, {1, {0x1e73}}},
+ {0x1e74, {1, {0x1e75}}},
+ {0x1e76, {1, {0x1e77}}},
+ {0x1e78, {1, {0x1e79}}},
+ {0x1e7a, {1, {0x1e7b}}},
+ {0x1e7c, {1, {0x1e7d}}},
+ {0x1e7e, {1, {0x1e7f}}},
+ {0x1e80, {1, {0x1e81}}},
+ {0x1e82, {1, {0x1e83}}},
+ {0x1e84, {1, {0x1e85}}},
+ {0x1e86, {1, {0x1e87}}},
+ {0x1e88, {1, {0x1e89}}},
+ {0x1e8a, {1, {0x1e8b}}},
+ {0x1e8c, {1, {0x1e8d}}},
+ {0x1e8e, {1, {0x1e8f}}},
+ {0x1e90, {1, {0x1e91}}},
+ {0x1e92, {1, {0x1e93}}},
+ {0x1e94, {1, {0x1e95}}},
+ {0x1e96, {2, {0x0068, 0x0331}}},
+ {0x1e97, {2, {0x0074, 0x0308}}},
+ {0x1e98, {2, {0x0077, 0x030a}}},
+ {0x1e99, {2, {0x0079, 0x030a}}},
+ {0x1e9a, {2, {0x0061, 0x02be}}},
+ {0x1e9b, {1, {0x1e61}}},
+ {0x1e9e, {2, {0x0073, 0x0073}}},
+ {0x1ea0, {1, {0x1ea1}}},
+ {0x1ea2, {1, {0x1ea3}}},
+ {0x1ea4, {1, {0x1ea5}}},
+ {0x1ea6, {1, {0x1ea7}}},
+ {0x1ea8, {1, {0x1ea9}}},
+ {0x1eaa, {1, {0x1eab}}},
+ {0x1eac, {1, {0x1ead}}},
+ {0x1eae, {1, {0x1eaf}}},
+ {0x1eb0, {1, {0x1eb1}}},
+ {0x1eb2, {1, {0x1eb3}}},
+ {0x1eb4, {1, {0x1eb5}}},
+ {0x1eb6, {1, {0x1eb7}}},
+ {0x1eb8, {1, {0x1eb9}}},
+ {0x1eba, {1, {0x1ebb}}},
+ {0x1ebc, {1, {0x1ebd}}},
+ {0x1ebe, {1, {0x1ebf}}},
+ {0x1ec0, {1, {0x1ec1}}},
+ {0x1ec2, {1, {0x1ec3}}},
+ {0x1ec4, {1, {0x1ec5}}},
+ {0x1ec6, {1, {0x1ec7}}},
+ {0x1ec8, {1, {0x1ec9}}},
+ {0x1eca, {1, {0x1ecb}}},
+ {0x1ecc, {1, {0x1ecd}}},
+ {0x1ece, {1, {0x1ecf}}},
+ {0x1ed0, {1, {0x1ed1}}},
+ {0x1ed2, {1, {0x1ed3}}},
+ {0x1ed4, {1, {0x1ed5}}},
+ {0x1ed6, {1, {0x1ed7}}},
+ {0x1ed8, {1, {0x1ed9}}},
+ {0x1eda, {1, {0x1edb}}},
+ {0x1edc, {1, {0x1edd}}},
+ {0x1ede, {1, {0x1edf}}},
+ {0x1ee0, {1, {0x1ee1}}},
+ {0x1ee2, {1, {0x1ee3}}},
+ {0x1ee4, {1, {0x1ee5}}},
+ {0x1ee6, {1, {0x1ee7}}},
+ {0x1ee8, {1, {0x1ee9}}},
+ {0x1eea, {1, {0x1eeb}}},
+ {0x1eec, {1, {0x1eed}}},
+ {0x1eee, {1, {0x1eef}}},
+ {0x1ef0, {1, {0x1ef1}}},
+ {0x1ef2, {1, {0x1ef3}}},
+ {0x1ef4, {1, {0x1ef5}}},
+ {0x1ef6, {1, {0x1ef7}}},
+ {0x1ef8, {1, {0x1ef9}}},
+ {0x1efa, {1, {0x1efb}}},
+ {0x1efc, {1, {0x1efd}}},
+ {0x1efe, {1, {0x1eff}}},
+ {0x1f08, {1, {0x1f00}}},
+ {0x1f09, {1, {0x1f01}}},
+ {0x1f0a, {1, {0x1f02}}},
+ {0x1f0b, {1, {0x1f03}}},
+ {0x1f0c, {1, {0x1f04}}},
+ {0x1f0d, {1, {0x1f05}}},
+ {0x1f0e, {1, {0x1f06}}},
+ {0x1f0f, {1, {0x1f07}}},
+ {0x1f18, {1, {0x1f10}}},
+ {0x1f19, {1, {0x1f11}}},
+ {0x1f1a, {1, {0x1f12}}},
+ {0x1f1b, {1, {0x1f13}}},
+ {0x1f1c, {1, {0x1f14}}},
+ {0x1f1d, {1, {0x1f15}}},
+ {0x1f28, {1, {0x1f20}}},
+ {0x1f29, {1, {0x1f21}}},
+ {0x1f2a, {1, {0x1f22}}},
+ {0x1f2b, {1, {0x1f23}}},
+ {0x1f2c, {1, {0x1f24}}},
+ {0x1f2d, {1, {0x1f25}}},
+ {0x1f2e, {1, {0x1f26}}},
+ {0x1f2f, {1, {0x1f27}}},
+ {0x1f38, {1, {0x1f30}}},
+ {0x1f39, {1, {0x1f31}}},
+ {0x1f3a, {1, {0x1f32}}},
+ {0x1f3b, {1, {0x1f33}}},
+ {0x1f3c, {1, {0x1f34}}},
+ {0x1f3d, {1, {0x1f35}}},
+ {0x1f3e, {1, {0x1f36}}},
+ {0x1f3f, {1, {0x1f37}}},
+ {0x1f48, {1, {0x1f40}}},
+ {0x1f49, {1, {0x1f41}}},
+ {0x1f4a, {1, {0x1f42}}},
+ {0x1f4b, {1, {0x1f43}}},
+ {0x1f4c, {1, {0x1f44}}},
+ {0x1f4d, {1, {0x1f45}}},
+ {0x1f50, {2, {0x03c5, 0x0313}}},
+ {0x1f52, {3, {0x03c5, 0x0313, 0x0300}}},
+ {0x1f54, {3, {0x03c5, 0x0313, 0x0301}}},
+ {0x1f56, {3, {0x03c5, 0x0313, 0x0342}}},
+ {0x1f59, {1, {0x1f51}}},
+ {0x1f5b, {1, {0x1f53}}},
+ {0x1f5d, {1, {0x1f55}}},
+ {0x1f5f, {1, {0x1f57}}},
+ {0x1f68, {1, {0x1f60}}},
+ {0x1f69, {1, {0x1f61}}},
+ {0x1f6a, {1, {0x1f62}}},
+ {0x1f6b, {1, {0x1f63}}},
+ {0x1f6c, {1, {0x1f64}}},
+ {0x1f6d, {1, {0x1f65}}},
+ {0x1f6e, {1, {0x1f66}}},
+ {0x1f6f, {1, {0x1f67}}},
+ {0x1f80, {2, {0x1f00, 0x03b9}}},
+ {0x1f81, {2, {0x1f01, 0x03b9}}},
+ {0x1f82, {2, {0x1f02, 0x03b9}}},
+ {0x1f83, {2, {0x1f03, 0x03b9}}},
+ {0x1f84, {2, {0x1f04, 0x03b9}}},
+ {0x1f85, {2, {0x1f05, 0x03b9}}},
+ {0x1f86, {2, {0x1f06, 0x03b9}}},
+ {0x1f87, {2, {0x1f07, 0x03b9}}},
+ {0x1f88, {2, {0x1f00, 0x03b9}}},
+ {0x1f89, {2, {0x1f01, 0x03b9}}},
+ {0x1f8a, {2, {0x1f02, 0x03b9}}},
+ {0x1f8b, {2, {0x1f03, 0x03b9}}},
+ {0x1f8c, {2, {0x1f04, 0x03b9}}},
+ {0x1f8d, {2, {0x1f05, 0x03b9}}},
+ {0x1f8e, {2, {0x1f06, 0x03b9}}},
+ {0x1f8f, {2, {0x1f07, 0x03b9}}},
+ {0x1f90, {2, {0x1f20, 0x03b9}}},
+ {0x1f91, {2, {0x1f21, 0x03b9}}},
+ {0x1f92, {2, {0x1f22, 0x03b9}}},
+ {0x1f93, {2, {0x1f23, 0x03b9}}},
+ {0x1f94, {2, {0x1f24, 0x03b9}}},
+ {0x1f95, {2, {0x1f25, 0x03b9}}},
+ {0x1f96, {2, {0x1f26, 0x03b9}}},
+ {0x1f97, {2, {0x1f27, 0x03b9}}},
+ {0x1f98, {2, {0x1f20, 0x03b9}}},
+ {0x1f99, {2, {0x1f21, 0x03b9}}},
+ {0x1f9a, {2, {0x1f22, 0x03b9}}},
+ {0x1f9b, {2, {0x1f23, 0x03b9}}},
+ {0x1f9c, {2, {0x1f24, 0x03b9}}},
+ {0x1f9d, {2, {0x1f25, 0x03b9}}},
+ {0x1f9e, {2, {0x1f26, 0x03b9}}},
+ {0x1f9f, {2, {0x1f27, 0x03b9}}},
+ {0x1fa0, {2, {0x1f60, 0x03b9}}},
+ {0x1fa1, {2, {0x1f61, 0x03b9}}},
+ {0x1fa2, {2, {0x1f62, 0x03b9}}},
+ {0x1fa3, {2, {0x1f63, 0x03b9}}},
+ {0x1fa4, {2, {0x1f64, 0x03b9}}},
+ {0x1fa5, {2, {0x1f65, 0x03b9}}},
+ {0x1fa6, {2, {0x1f66, 0x03b9}}},
+ {0x1fa7, {2, {0x1f67, 0x03b9}}},
+ {0x1fa8, {2, {0x1f60, 0x03b9}}},
+ {0x1fa9, {2, {0x1f61, 0x03b9}}},
+ {0x1faa, {2, {0x1f62, 0x03b9}}},
+ {0x1fab, {2, {0x1f63, 0x03b9}}},
+ {0x1fac, {2, {0x1f64, 0x03b9}}},
+ {0x1fad, {2, {0x1f65, 0x03b9}}},
+ {0x1fae, {2, {0x1f66, 0x03b9}}},
+ {0x1faf, {2, {0x1f67, 0x03b9}}},
+ {0x1fb2, {2, {0x1f70, 0x03b9}}},
+ {0x1fb3, {2, {0x03b1, 0x03b9}}},
+ {0x1fb4, {2, {0x03ac, 0x03b9}}},
+ {0x1fb6, {2, {0x03b1, 0x0342}}},
+ {0x1fb7, {3, {0x03b1, 0x0342, 0x03b9}}},
+ {0x1fb8, {1, {0x1fb0}}},
+ {0x1fb9, {1, {0x1fb1}}},
+ {0x1fba, {1, {0x1f70}}},
+ {0x1fbb, {1, {0x1f71}}},
+ {0x1fbc, {2, {0x03b1, 0x03b9}}},
+ {0x1fbe, {1, {0x03b9}}},
+ {0x1fc2, {2, {0x1f74, 0x03b9}}},
+ {0x1fc3, {2, {0x03b7, 0x03b9}}},
+ {0x1fc4, {2, {0x03ae, 0x03b9}}},
+ {0x1fc6, {2, {0x03b7, 0x0342}}},
+ {0x1fc7, {3, {0x03b7, 0x0342, 0x03b9}}},
+ {0x1fc8, {1, {0x1f72}}},
+ {0x1fc9, {1, {0x1f73}}},
+ {0x1fca, {1, {0x1f74}}},
+ {0x1fcb, {1, {0x1f75}}},
+ {0x1fcc, {2, {0x03b7, 0x03b9}}},
+ {0x1fd2, {3, {0x03b9, 0x0308, 0x0300}}},
+ {0x1fd3, {3, {0x03b9, 0x0308, 0x0301}}},
+ {0x1fd6, {2, {0x03b9, 0x0342}}},
+ {0x1fd7, {3, {0x03b9, 0x0308, 0x0342}}},
+ {0x1fd8, {1, {0x1fd0}}},
+ {0x1fd9, {1, {0x1fd1}}},
+ {0x1fda, {1, {0x1f76}}},
+ {0x1fdb, {1, {0x1f77}}},
+ {0x1fe2, {3, {0x03c5, 0x0308, 0x0300}}},
+ {0x1fe3, {3, {0x03c5, 0x0308, 0x0301}}},
+ {0x1fe4, {2, {0x03c1, 0x0313}}},
+ {0x1fe6, {2, {0x03c5, 0x0342}}},
+ {0x1fe7, {3, {0x03c5, 0x0308, 0x0342}}},
+ {0x1fe8, {1, {0x1fe0}}},
+ {0x1fe9, {1, {0x1fe1}}},
+ {0x1fea, {1, {0x1f7a}}},
+ {0x1feb, {1, {0x1f7b}}},
+ {0x1fec, {1, {0x1fe5}}},
+ {0x1ff2, {2, {0x1f7c, 0x03b9}}},
+ {0x1ff3, {2, {0x03c9, 0x03b9}}},
+ {0x1ff4, {2, {0x03ce, 0x03b9}}},
+ {0x1ff6, {2, {0x03c9, 0x0342}}},
+ {0x1ff7, {3, {0x03c9, 0x0342, 0x03b9}}},
+ {0x1ff8, {1, {0x1f78}}},
+ {0x1ff9, {1, {0x1f79}}},
+ {0x1ffa, {1, {0x1f7c}}},
+ {0x1ffb, {1, {0x1f7d}}},
+ {0x1ffc, {2, {0x03c9, 0x03b9}}},
+ {0x2126, {1, {0x03c9}}},
+ {0x212a, {1, {0x006b}}},
+ {0x212b, {1, {0x00e5}}},
+ {0x2132, {1, {0x214e}}},
+ {0x2160, {1, {0x2170}}},
+ {0x2161, {1, {0x2171}}},
+ {0x2162, {1, {0x2172}}},
+ {0x2163, {1, {0x2173}}},
+ {0x2164, {1, {0x2174}}},
+ {0x2165, {1, {0x2175}}},
+ {0x2166, {1, {0x2176}}},
+ {0x2167, {1, {0x2177}}},
+ {0x2168, {1, {0x2178}}},
+ {0x2169, {1, {0x2179}}},
+ {0x216a, {1, {0x217a}}},
+ {0x216b, {1, {0x217b}}},
+ {0x216c, {1, {0x217c}}},
+ {0x216d, {1, {0x217d}}},
+ {0x216e, {1, {0x217e}}},
+ {0x216f, {1, {0x217f}}},
+ {0x2183, {1, {0x2184}}},
+ {0x24b6, {1, {0x24d0}}},
+ {0x24b7, {1, {0x24d1}}},
+ {0x24b8, {1, {0x24d2}}},
+ {0x24b9, {1, {0x24d3}}},
+ {0x24ba, {1, {0x24d4}}},
+ {0x24bb, {1, {0x24d5}}},
+ {0x24bc, {1, {0x24d6}}},
+ {0x24bd, {1, {0x24d7}}},
+ {0x24be, {1, {0x24d8}}},
+ {0x24bf, {1, {0x24d9}}},
+ {0x24c0, {1, {0x24da}}},
+ {0x24c1, {1, {0x24db}}},
+ {0x24c2, {1, {0x24dc}}},
+ {0x24c3, {1, {0x24dd}}},
+ {0x24c4, {1, {0x24de}}},
+ {0x24c5, {1, {0x24df}}},
+ {0x24c6, {1, {0x24e0}}},
+ {0x24c7, {1, {0x24e1}}},
+ {0x24c8, {1, {0x24e2}}},
+ {0x24c9, {1, {0x24e3}}},
+ {0x24ca, {1, {0x24e4}}},
+ {0x24cb, {1, {0x24e5}}},
+ {0x24cc, {1, {0x24e6}}},
+ {0x24cd, {1, {0x24e7}}},
+ {0x24ce, {1, {0x24e8}}},
+ {0x24cf, {1, {0x24e9}}},
+ {0x2c00, {1, {0x2c30}}},
+ {0x2c01, {1, {0x2c31}}},
+ {0x2c02, {1, {0x2c32}}},
+ {0x2c03, {1, {0x2c33}}},
+ {0x2c04, {1, {0x2c34}}},
+ {0x2c05, {1, {0x2c35}}},
+ {0x2c06, {1, {0x2c36}}},
+ {0x2c07, {1, {0x2c37}}},
+ {0x2c08, {1, {0x2c38}}},
+ {0x2c09, {1, {0x2c39}}},
+ {0x2c0a, {1, {0x2c3a}}},
+ {0x2c0b, {1, {0x2c3b}}},
+ {0x2c0c, {1, {0x2c3c}}},
+ {0x2c0d, {1, {0x2c3d}}},
+ {0x2c0e, {1, {0x2c3e}}},
+ {0x2c0f, {1, {0x2c3f}}},
+ {0x2c10, {1, {0x2c40}}},
+ {0x2c11, {1, {0x2c41}}},
+ {0x2c12, {1, {0x2c42}}},
+ {0x2c13, {1, {0x2c43}}},
+ {0x2c14, {1, {0x2c44}}},
+ {0x2c15, {1, {0x2c45}}},
+ {0x2c16, {1, {0x2c46}}},
+ {0x2c17, {1, {0x2c47}}},
+ {0x2c18, {1, {0x2c48}}},
+ {0x2c19, {1, {0x2c49}}},
+ {0x2c1a, {1, {0x2c4a}}},
+ {0x2c1b, {1, {0x2c4b}}},
+ {0x2c1c, {1, {0x2c4c}}},
+ {0x2c1d, {1, {0x2c4d}}},
+ {0x2c1e, {1, {0x2c4e}}},
+ {0x2c1f, {1, {0x2c4f}}},
+ {0x2c20, {1, {0x2c50}}},
+ {0x2c21, {1, {0x2c51}}},
+ {0x2c22, {1, {0x2c52}}},
+ {0x2c23, {1, {0x2c53}}},
+ {0x2c24, {1, {0x2c54}}},
+ {0x2c25, {1, {0x2c55}}},
+ {0x2c26, {1, {0x2c56}}},
+ {0x2c27, {1, {0x2c57}}},
+ {0x2c28, {1, {0x2c58}}},
+ {0x2c29, {1, {0x2c59}}},
+ {0x2c2a, {1, {0x2c5a}}},
+ {0x2c2b, {1, {0x2c5b}}},
+ {0x2c2c, {1, {0x2c5c}}},
+ {0x2c2d, {1, {0x2c5d}}},
+ {0x2c2e, {1, {0x2c5e}}},
+ {0x2c60, {1, {0x2c61}}},
+ {0x2c62, {1, {0x026b}}},
+ {0x2c63, {1, {0x1d7d}}},
+ {0x2c64, {1, {0x027d}}},
+ {0x2c67, {1, {0x2c68}}},
+ {0x2c69, {1, {0x2c6a}}},
+ {0x2c6b, {1, {0x2c6c}}},
+ {0x2c6d, {1, {0x0251}}},
+ {0x2c6e, {1, {0x0271}}},
+ {0x2c6f, {1, {0x0250}}},
+ {0x2c70, {1, {0x0252}}},
+ {0x2c72, {1, {0x2c73}}},
+ {0x2c75, {1, {0x2c76}}},
+ {0x2c7e, {1, {0x023f}}},
+ {0x2c7f, {1, {0x0240}}},
+ {0x2c80, {1, {0x2c81}}},
+ {0x2c82, {1, {0x2c83}}},
+ {0x2c84, {1, {0x2c85}}},
+ {0x2c86, {1, {0x2c87}}},
+ {0x2c88, {1, {0x2c89}}},
+ {0x2c8a, {1, {0x2c8b}}},
+ {0x2c8c, {1, {0x2c8d}}},
+ {0x2c8e, {1, {0x2c8f}}},
+ {0x2c90, {1, {0x2c91}}},
+ {0x2c92, {1, {0x2c93}}},
+ {0x2c94, {1, {0x2c95}}},
+ {0x2c96, {1, {0x2c97}}},
+ {0x2c98, {1, {0x2c99}}},
+ {0x2c9a, {1, {0x2c9b}}},
+ {0x2c9c, {1, {0x2c9d}}},
+ {0x2c9e, {1, {0x2c9f}}},
+ {0x2ca0, {1, {0x2ca1}}},
+ {0x2ca2, {1, {0x2ca3}}},
+ {0x2ca4, {1, {0x2ca5}}},
+ {0x2ca6, {1, {0x2ca7}}},
+ {0x2ca8, {1, {0x2ca9}}},
+ {0x2caa, {1, {0x2cab}}},
+ {0x2cac, {1, {0x2cad}}},
+ {0x2cae, {1, {0x2caf}}},
+ {0x2cb0, {1, {0x2cb1}}},
+ {0x2cb2, {1, {0x2cb3}}},
+ {0x2cb4, {1, {0x2cb5}}},
+ {0x2cb6, {1, {0x2cb7}}},
+ {0x2cb8, {1, {0x2cb9}}},
+ {0x2cba, {1, {0x2cbb}}},
+ {0x2cbc, {1, {0x2cbd}}},
+ {0x2cbe, {1, {0x2cbf}}},
+ {0x2cc0, {1, {0x2cc1}}},
+ {0x2cc2, {1, {0x2cc3}}},
+ {0x2cc4, {1, {0x2cc5}}},
+ {0x2cc6, {1, {0x2cc7}}},
+ {0x2cc8, {1, {0x2cc9}}},
+ {0x2cca, {1, {0x2ccb}}},
+ {0x2ccc, {1, {0x2ccd}}},
+ {0x2cce, {1, {0x2ccf}}},
+ {0x2cd0, {1, {0x2cd1}}},
+ {0x2cd2, {1, {0x2cd3}}},
+ {0x2cd4, {1, {0x2cd5}}},
+ {0x2cd6, {1, {0x2cd7}}},
+ {0x2cd8, {1, {0x2cd9}}},
+ {0x2cda, {1, {0x2cdb}}},
+ {0x2cdc, {1, {0x2cdd}}},
+ {0x2cde, {1, {0x2cdf}}},
+ {0x2ce0, {1, {0x2ce1}}},
+ {0x2ce2, {1, {0x2ce3}}},
+ {0x2ceb, {1, {0x2cec}}},
+ {0x2ced, {1, {0x2cee}}},
+ {0x2cf2, {1, {0x2cf3}}},
+ {0xa640, {1, {0xa641}}},
+ {0xa642, {1, {0xa643}}},
+ {0xa644, {1, {0xa645}}},
+ {0xa646, {1, {0xa647}}},
+ {0xa648, {1, {0xa649}}},
+ {0xa64a, {1, {0xa64b}}},
+ {0xa64c, {1, {0xa64d}}},
+ {0xa64e, {1, {0xa64f}}},
+ {0xa650, {1, {0xa651}}},
+ {0xa652, {1, {0xa653}}},
+ {0xa654, {1, {0xa655}}},
+ {0xa656, {1, {0xa657}}},
+ {0xa658, {1, {0xa659}}},
+ {0xa65a, {1, {0xa65b}}},
+ {0xa65c, {1, {0xa65d}}},
+ {0xa65e, {1, {0xa65f}}},
+ {0xa660, {1, {0xa661}}},
+ {0xa662, {1, {0xa663}}},
+ {0xa664, {1, {0xa665}}},
+ {0xa666, {1, {0xa667}}},
+ {0xa668, {1, {0xa669}}},
+ {0xa66a, {1, {0xa66b}}},
+ {0xa66c, {1, {0xa66d}}},
+ {0xa680, {1, {0xa681}}},
+ {0xa682, {1, {0xa683}}},
+ {0xa684, {1, {0xa685}}},
+ {0xa686, {1, {0xa687}}},
+ {0xa688, {1, {0xa689}}},
+ {0xa68a, {1, {0xa68b}}},
+ {0xa68c, {1, {0xa68d}}},
+ {0xa68e, {1, {0xa68f}}},
+ {0xa690, {1, {0xa691}}},
+ {0xa692, {1, {0xa693}}},
+ {0xa694, {1, {0xa695}}},
+ {0xa696, {1, {0xa697}}},
+ {0xa698, {1, {0xa699}}},
+ {0xa69a, {1, {0xa69b}}},
+ {0xa722, {1, {0xa723}}},
+ {0xa724, {1, {0xa725}}},
+ {0xa726, {1, {0xa727}}},
+ {0xa728, {1, {0xa729}}},
+ {0xa72a, {1, {0xa72b}}},
+ {0xa72c, {1, {0xa72d}}},
+ {0xa72e, {1, {0xa72f}}},
+ {0xa732, {1, {0xa733}}},
+ {0xa734, {1, {0xa735}}},
+ {0xa736, {1, {0xa737}}},
+ {0xa738, {1, {0xa739}}},
+ {0xa73a, {1, {0xa73b}}},
+ {0xa73c, {1, {0xa73d}}},
+ {0xa73e, {1, {0xa73f}}},
+ {0xa740, {1, {0xa741}}},
+ {0xa742, {1, {0xa743}}},
+ {0xa744, {1, {0xa745}}},
+ {0xa746, {1, {0xa747}}},
+ {0xa748, {1, {0xa749}}},
+ {0xa74a, {1, {0xa74b}}},
+ {0xa74c, {1, {0xa74d}}},
+ {0xa74e, {1, {0xa74f}}},
+ {0xa750, {1, {0xa751}}},
+ {0xa752, {1, {0xa753}}},
+ {0xa754, {1, {0xa755}}},
+ {0xa756, {1, {0xa757}}},
+ {0xa758, {1, {0xa759}}},
+ {0xa75a, {1, {0xa75b}}},
+ {0xa75c, {1, {0xa75d}}},
+ {0xa75e, {1, {0xa75f}}},
+ {0xa760, {1, {0xa761}}},
+ {0xa762, {1, {0xa763}}},
+ {0xa764, {1, {0xa765}}},
+ {0xa766, {1, {0xa767}}},
+ {0xa768, {1, {0xa769}}},
+ {0xa76a, {1, {0xa76b}}},
+ {0xa76c, {1, {0xa76d}}},
+ {0xa76e, {1, {0xa76f}}},
+ {0xa779, {1, {0xa77a}}},
+ {0xa77b, {1, {0xa77c}}},
+ {0xa77d, {1, {0x1d79}}},
+ {0xa77e, {1, {0xa77f}}},
+ {0xa780, {1, {0xa781}}},
+ {0xa782, {1, {0xa783}}},
+ {0xa784, {1, {0xa785}}},
+ {0xa786, {1, {0xa787}}},
+ {0xa78b, {1, {0xa78c}}},
+ {0xa78d, {1, {0x0265}}},
+ {0xa790, {1, {0xa791}}},
+ {0xa792, {1, {0xa793}}},
+ {0xa796, {1, {0xa797}}},
+ {0xa798, {1, {0xa799}}},
+ {0xa79a, {1, {0xa79b}}},
+ {0xa79c, {1, {0xa79d}}},
+ {0xa79e, {1, {0xa79f}}},
+ {0xa7a0, {1, {0xa7a1}}},
+ {0xa7a2, {1, {0xa7a3}}},
+ {0xa7a4, {1, {0xa7a5}}},
+ {0xa7a6, {1, {0xa7a7}}},
+ {0xa7a8, {1, {0xa7a9}}},
+ {0xa7aa, {1, {0x0266}}},
+ {0xa7ab, {1, {0x025c}}},
+ {0xa7ac, {1, {0x0261}}},
+ {0xa7ad, {1, {0x026c}}},
+ {0xa7b0, {1, {0x029e}}},
+ {0xa7b1, {1, {0x0287}}},
+ {0xfb00, {2, {0x0066, 0x0066}}},
+ {0xfb01, {2, {0x0066, 0x0069}}},
+ {0xfb02, {2, {0x0066, 0x006c}}},
+ {0xfb03, {3, {0x0066, 0x0066, 0x0069}}},
+ {0xfb04, {3, {0x0066, 0x0066, 0x006c}}},
+ {0xfb05, {2, {0x0073, 0x0074}}},
+ {0xfb06, {2, {0x0073, 0x0074}}},
+ {0xfb13, {2, {0x0574, 0x0576}}},
+ {0xfb14, {2, {0x0574, 0x0565}}},
+ {0xfb15, {2, {0x0574, 0x056b}}},
+ {0xfb16, {2, {0x057e, 0x0576}}},
+ {0xfb17, {2, {0x0574, 0x056d}}},
+ {0xff21, {1, {0xff41}}},
+ {0xff22, {1, {0xff42}}},
+ {0xff23, {1, {0xff43}}},
+ {0xff24, {1, {0xff44}}},
+ {0xff25, {1, {0xff45}}},
+ {0xff26, {1, {0xff46}}},
+ {0xff27, {1, {0xff47}}},
+ {0xff28, {1, {0xff48}}},
+ {0xff29, {1, {0xff49}}},
+ {0xff2a, {1, {0xff4a}}},
+ {0xff2b, {1, {0xff4b}}},
+ {0xff2c, {1, {0xff4c}}},
+ {0xff2d, {1, {0xff4d}}},
+ {0xff2e, {1, {0xff4e}}},
+ {0xff2f, {1, {0xff4f}}},
+ {0xff30, {1, {0xff50}}},
+ {0xff31, {1, {0xff51}}},
+ {0xff32, {1, {0xff52}}},
+ {0xff33, {1, {0xff53}}},
+ {0xff34, {1, {0xff54}}},
+ {0xff35, {1, {0xff55}}},
+ {0xff36, {1, {0xff56}}},
+ {0xff37, {1, {0xff57}}},
+ {0xff38, {1, {0xff58}}},
+ {0xff39, {1, {0xff59}}},
+ {0xff3a, {1, {0xff5a}}},
+ {0x10400, {1, {0x10428}}},
+ {0x10401, {1, {0x10429}}},
+ {0x10402, {1, {0x1042a}}},
+ {0x10403, {1, {0x1042b}}},
+ {0x10404, {1, {0x1042c}}},
+ {0x10405, {1, {0x1042d}}},
+ {0x10406, {1, {0x1042e}}},
+ {0x10407, {1, {0x1042f}}},
+ {0x10408, {1, {0x10430}}},
+ {0x10409, {1, {0x10431}}},
+ {0x1040a, {1, {0x10432}}},
+ {0x1040b, {1, {0x10433}}},
+ {0x1040c, {1, {0x10434}}},
+ {0x1040d, {1, {0x10435}}},
+ {0x1040e, {1, {0x10436}}},
+ {0x1040f, {1, {0x10437}}},
+ {0x10410, {1, {0x10438}}},
+ {0x10411, {1, {0x10439}}},
+ {0x10412, {1, {0x1043a}}},
+ {0x10413, {1, {0x1043b}}},
+ {0x10414, {1, {0x1043c}}},
+ {0x10415, {1, {0x1043d}}},
+ {0x10416, {1, {0x1043e}}},
+ {0x10417, {1, {0x1043f}}},
+ {0x10418, {1, {0x10440}}},
+ {0x10419, {1, {0x10441}}},
+ {0x1041a, {1, {0x10442}}},
+ {0x1041b, {1, {0x10443}}},
+ {0x1041c, {1, {0x10444}}},
+ {0x1041d, {1, {0x10445}}},
+ {0x1041e, {1, {0x10446}}},
+ {0x1041f, {1, {0x10447}}},
+ {0x10420, {1, {0x10448}}},
+ {0x10421, {1, {0x10449}}},
+ {0x10422, {1, {0x1044a}}},
+ {0x10423, {1, {0x1044b}}},
+ {0x10424, {1, {0x1044c}}},
+ {0x10425, {1, {0x1044d}}},
+ {0x10426, {1, {0x1044e}}},
+ {0x10427, {1, {0x1044f}}},
+ {0x118a0, {1, {0x118c0}}},
+ {0x118a1, {1, {0x118c1}}},
+ {0x118a2, {1, {0x118c2}}},
+ {0x118a3, {1, {0x118c3}}},
+ {0x118a4, {1, {0x118c4}}},
+ {0x118a5, {1, {0x118c5}}},
+ {0x118a6, {1, {0x118c6}}},
+ {0x118a7, {1, {0x118c7}}},
+ {0x118a8, {1, {0x118c8}}},
+ {0x118a9, {1, {0x118c9}}},
+ {0x118aa, {1, {0x118ca}}},
+ {0x118ab, {1, {0x118cb}}},
+ {0x118ac, {1, {0x118cc}}},
+ {0x118ad, {1, {0x118cd}}},
+ {0x118ae, {1, {0x118ce}}},
+ {0x118af, {1, {0x118cf}}},
+ {0x118b0, {1, {0x118d0}}},
+ {0x118b1, {1, {0x118d1}}},
+ {0x118b2, {1, {0x118d2}}},
+ {0x118b3, {1, {0x118d3}}},
+ {0x118b4, {1, {0x118d4}}},
+ {0x118b5, {1, {0x118d5}}},
+ {0x118b6, {1, {0x118d6}}},
+ {0x118b7, {1, {0x118d7}}},
+ {0x118b8, {1, {0x118d8}}},
+ {0x118b9, {1, {0x118d9}}},
+ {0x118ba, {1, {0x118da}}},
+ {0x118bb, {1, {0x118db}}},
+ {0x118bc, {1, {0x118dc}}},
+ {0x118bd, {1, {0x118dd}}},
+ {0x118be, {1, {0x118de}}},
+ {0x118bf, {1, {0x118df}}},
+#define CaseFold_Locale (*(CaseFold_11_Type (*)[2])(CaseFold_11_Table+1178))
+ {0x0049, {1, {0x0069}}},
+ {0x0130, {2, {0x0069, 0x0307}}},
};
-static const CaseFold_11_Type CaseFold_Locale[] = {
- { 0x0049, {1, {0x0069}}},
- { 0x0130, {2, {0x0069, 0x0307}}},
-};
+/* C code produced by gperf version 3.0.3 */
+/* Command-line: gperf -7 -k1,2,3 -F,-1 -c -j1 -i1 -t -T -E -C -H onigenc_unicode_CaseFold_11_hash -N onigenc_unicode_CaseFold_11_lookup -n */
-static const CaseUnfold_11_Type CaseUnfold_11[] = {
- { 0x0061, {1, {0x0041 }}},
- { 0x0062, {1, {0x0042 }}},
- { 0x0063, {1, {0x0043 }}},
- { 0x0064, {1, {0x0044 }}},
- { 0x0065, {1, {0x0045 }}},
- { 0x0066, {1, {0x0046 }}},
- { 0x0067, {1, {0x0047 }}},
- { 0x0068, {1, {0x0048 }}},
- { 0x006a, {1, {0x004a }}},
- { 0x006b, {2, {0x004b, 0x212a }}},
- { 0x006c, {1, {0x004c }}},
- { 0x006d, {1, {0x004d }}},
- { 0x006e, {1, {0x004e }}},
- { 0x006f, {1, {0x004f }}},
- { 0x0070, {1, {0x0050 }}},
- { 0x0071, {1, {0x0051 }}},
- { 0x0072, {1, {0x0052 }}},
- { 0x0073, {2, {0x0053, 0x017f }}},
- { 0x0074, {1, {0x0054 }}},
- { 0x0075, {1, {0x0055 }}},
- { 0x0076, {1, {0x0056 }}},
- { 0x0077, {1, {0x0057 }}},
- { 0x0078, {1, {0x0058 }}},
- { 0x0079, {1, {0x0059 }}},
- { 0x007a, {1, {0x005a }}},
- { 0x00e0, {1, {0x00c0 }}},
- { 0x00e1, {1, {0x00c1 }}},
- { 0x00e2, {1, {0x00c2 }}},
- { 0x00e3, {1, {0x00c3 }}},
- { 0x00e4, {1, {0x00c4 }}},
- { 0x00e5, {2, {0x00c5, 0x212b }}},
- { 0x00e6, {1, {0x00c6 }}},
- { 0x00e7, {1, {0x00c7 }}},
- { 0x00e8, {1, {0x00c8 }}},
- { 0x00e9, {1, {0x00c9 }}},
- { 0x00ea, {1, {0x00ca }}},
- { 0x00eb, {1, {0x00cb }}},
- { 0x00ec, {1, {0x00cc }}},
- { 0x00ed, {1, {0x00cd }}},
- { 0x00ee, {1, {0x00ce }}},
- { 0x00ef, {1, {0x00cf }}},
- { 0x00f0, {1, {0x00d0 }}},
- { 0x00f1, {1, {0x00d1 }}},
- { 0x00f2, {1, {0x00d2 }}},
- { 0x00f3, {1, {0x00d3 }}},
- { 0x00f4, {1, {0x00d4 }}},
- { 0x00f5, {1, {0x00d5 }}},
- { 0x00f6, {1, {0x00d6 }}},
- { 0x00f8, {1, {0x00d8 }}},
- { 0x00f9, {1, {0x00d9 }}},
- { 0x00fa, {1, {0x00da }}},
- { 0x00fb, {1, {0x00db }}},
- { 0x00fc, {1, {0x00dc }}},
- { 0x00fd, {1, {0x00dd }}},
- { 0x00fe, {1, {0x00de }}},
- { 0x00ff, {1, {0x0178 }}},
- { 0x0101, {1, {0x0100 }}},
- { 0x0103, {1, {0x0102 }}},
- { 0x0105, {1, {0x0104 }}},
- { 0x0107, {1, {0x0106 }}},
- { 0x0109, {1, {0x0108 }}},
- { 0x010b, {1, {0x010a }}},
- { 0x010d, {1, {0x010c }}},
- { 0x010f, {1, {0x010e }}},
- { 0x0111, {1, {0x0110 }}},
- { 0x0113, {1, {0x0112 }}},
- { 0x0115, {1, {0x0114 }}},
- { 0x0117, {1, {0x0116 }}},
- { 0x0119, {1, {0x0118 }}},
- { 0x011b, {1, {0x011a }}},
- { 0x011d, {1, {0x011c }}},
- { 0x011f, {1, {0x011e }}},
- { 0x0121, {1, {0x0120 }}},
- { 0x0123, {1, {0x0122 }}},
- { 0x0125, {1, {0x0124 }}},
- { 0x0127, {1, {0x0126 }}},
- { 0x0129, {1, {0x0128 }}},
- { 0x012b, {1, {0x012a }}},
- { 0x012d, {1, {0x012c }}},
- { 0x012f, {1, {0x012e }}},
- { 0x0133, {1, {0x0132 }}},
- { 0x0135, {1, {0x0134 }}},
- { 0x0137, {1, {0x0136 }}},
- { 0x013a, {1, {0x0139 }}},
- { 0x013c, {1, {0x013b }}},
- { 0x013e, {1, {0x013d }}},
- { 0x0140, {1, {0x013f }}},
- { 0x0142, {1, {0x0141 }}},
- { 0x0144, {1, {0x0143 }}},
- { 0x0146, {1, {0x0145 }}},
- { 0x0148, {1, {0x0147 }}},
- { 0x014b, {1, {0x014a }}},
- { 0x014d, {1, {0x014c }}},
- { 0x014f, {1, {0x014e }}},
- { 0x0151, {1, {0x0150 }}},
- { 0x0153, {1, {0x0152 }}},
- { 0x0155, {1, {0x0154 }}},
- { 0x0157, {1, {0x0156 }}},
- { 0x0159, {1, {0x0158 }}},
- { 0x015b, {1, {0x015a }}},
- { 0x015d, {1, {0x015c }}},
- { 0x015f, {1, {0x015e }}},
- { 0x0161, {1, {0x0160 }}},
- { 0x0163, {1, {0x0162 }}},
- { 0x0165, {1, {0x0164 }}},
- { 0x0167, {1, {0x0166 }}},
- { 0x0169, {1, {0x0168 }}},
- { 0x016b, {1, {0x016a }}},
- { 0x016d, {1, {0x016c }}},
- { 0x016f, {1, {0x016e }}},
- { 0x0171, {1, {0x0170 }}},
- { 0x0173, {1, {0x0172 }}},
- { 0x0175, {1, {0x0174 }}},
- { 0x0177, {1, {0x0176 }}},
- { 0x017a, {1, {0x0179 }}},
- { 0x017c, {1, {0x017b }}},
- { 0x017e, {1, {0x017d }}},
- { 0x0180, {1, {0x0243 }}},
- { 0x0183, {1, {0x0182 }}},
- { 0x0185, {1, {0x0184 }}},
- { 0x0188, {1, {0x0187 }}},
- { 0x018c, {1, {0x018b }}},
- { 0x0192, {1, {0x0191 }}},
- { 0x0195, {1, {0x01f6 }}},
- { 0x0199, {1, {0x0198 }}},
- { 0x019a, {1, {0x023d }}},
- { 0x019e, {1, {0x0220 }}},
- { 0x01a1, {1, {0x01a0 }}},
- { 0x01a3, {1, {0x01a2 }}},
- { 0x01a5, {1, {0x01a4 }}},
- { 0x01a8, {1, {0x01a7 }}},
- { 0x01ad, {1, {0x01ac }}},
- { 0x01b0, {1, {0x01af }}},
- { 0x01b4, {1, {0x01b3 }}},
- { 0x01b6, {1, {0x01b5 }}},
- { 0x01b9, {1, {0x01b8 }}},
- { 0x01bd, {1, {0x01bc }}},
- { 0x01bf, {1, {0x01f7 }}},
- { 0x01c6, {2, {0x01c4, 0x01c5 }}},
- { 0x01c9, {2, {0x01c7, 0x01c8 }}},
- { 0x01cc, {2, {0x01ca, 0x01cb }}},
- { 0x01ce, {1, {0x01cd }}},
- { 0x01d0, {1, {0x01cf }}},
- { 0x01d2, {1, {0x01d1 }}},
- { 0x01d4, {1, {0x01d3 }}},
- { 0x01d6, {1, {0x01d5 }}},
- { 0x01d8, {1, {0x01d7 }}},
- { 0x01da, {1, {0x01d9 }}},
- { 0x01dc, {1, {0x01db }}},
- { 0x01dd, {1, {0x018e }}},
- { 0x01df, {1, {0x01de }}},
- { 0x01e1, {1, {0x01e0 }}},
- { 0x01e3, {1, {0x01e2 }}},
- { 0x01e5, {1, {0x01e4 }}},
- { 0x01e7, {1, {0x01e6 }}},
- { 0x01e9, {1, {0x01e8 }}},
- { 0x01eb, {1, {0x01ea }}},
- { 0x01ed, {1, {0x01ec }}},
- { 0x01ef, {1, {0x01ee }}},
- { 0x01f3, {2, {0x01f1, 0x01f2 }}},
- { 0x01f5, {1, {0x01f4 }}},
- { 0x01f9, {1, {0x01f8 }}},
- { 0x01fb, {1, {0x01fa }}},
- { 0x01fd, {1, {0x01fc }}},
- { 0x01ff, {1, {0x01fe }}},
- { 0x0201, {1, {0x0200 }}},
- { 0x0203, {1, {0x0202 }}},
- { 0x0205, {1, {0x0204 }}},
- { 0x0207, {1, {0x0206 }}},
- { 0x0209, {1, {0x0208 }}},
- { 0x020b, {1, {0x020a }}},
- { 0x020d, {1, {0x020c }}},
- { 0x020f, {1, {0x020e }}},
- { 0x0211, {1, {0x0210 }}},
- { 0x0213, {1, {0x0212 }}},
- { 0x0215, {1, {0x0214 }}},
- { 0x0217, {1, {0x0216 }}},
- { 0x0219, {1, {0x0218 }}},
- { 0x021b, {1, {0x021a }}},
- { 0x021d, {1, {0x021c }}},
- { 0x021f, {1, {0x021e }}},
- { 0x0223, {1, {0x0222 }}},
- { 0x0225, {1, {0x0224 }}},
- { 0x0227, {1, {0x0226 }}},
- { 0x0229, {1, {0x0228 }}},
- { 0x022b, {1, {0x022a }}},
- { 0x022d, {1, {0x022c }}},
- { 0x022f, {1, {0x022e }}},
- { 0x0231, {1, {0x0230 }}},
- { 0x0233, {1, {0x0232 }}},
- { 0x023c, {1, {0x023b }}},
- { 0x023f, {1, {0x2c7e }}},
- { 0x0240, {1, {0x2c7f }}},
- { 0x0242, {1, {0x0241 }}},
- { 0x0247, {1, {0x0246 }}},
- { 0x0249, {1, {0x0248 }}},
- { 0x024b, {1, {0x024a }}},
- { 0x024d, {1, {0x024c }}},
- { 0x024f, {1, {0x024e }}},
- { 0x0250, {1, {0x2c6f }}},
- { 0x0251, {1, {0x2c6d }}},
- { 0x0252, {1, {0x2c70 }}},
- { 0x0253, {1, {0x0181 }}},
- { 0x0254, {1, {0x0186 }}},
- { 0x0256, {1, {0x0189 }}},
- { 0x0257, {1, {0x018a }}},
- { 0x0259, {1, {0x018f }}},
- { 0x025b, {1, {0x0190 }}},
- { 0x0260, {1, {0x0193 }}},
- { 0x0263, {1, {0x0194 }}},
- { 0x0265, {1, {0xa78d }}},
- { 0x0266, {1, {0xa7aa }}},
- { 0x0268, {1, {0x0197 }}},
- { 0x0269, {1, {0x0196 }}},
- { 0x026b, {1, {0x2c62 }}},
- { 0x026f, {1, {0x019c }}},
- { 0x0271, {1, {0x2c6e }}},
- { 0x0272, {1, {0x019d }}},
- { 0x0275, {1, {0x019f }}},
- { 0x027d, {1, {0x2c64 }}},
- { 0x0280, {1, {0x01a6 }}},
- { 0x0283, {1, {0x01a9 }}},
- { 0x0288, {1, {0x01ae }}},
- { 0x0289, {1, {0x0244 }}},
- { 0x028a, {1, {0x01b1 }}},
- { 0x028b, {1, {0x01b2 }}},
- { 0x028c, {1, {0x0245 }}},
- { 0x0292, {1, {0x01b7 }}},
- { 0x0371, {1, {0x0370 }}},
- { 0x0373, {1, {0x0372 }}},
- { 0x0377, {1, {0x0376 }}},
- { 0x037b, {1, {0x03fd }}},
- { 0x037c, {1, {0x03fe }}},
- { 0x037d, {1, {0x03ff }}},
- { 0x03ac, {1, {0x0386 }}},
- { 0x03ad, {1, {0x0388 }}},
- { 0x03ae, {1, {0x0389 }}},
- { 0x03af, {1, {0x038a }}},
- { 0x03b1, {1, {0x0391 }}},
- { 0x03b2, {2, {0x0392, 0x03d0 }}},
- { 0x03b3, {1, {0x0393 }}},
- { 0x03b4, {1, {0x0394 }}},
- { 0x03b5, {2, {0x0395, 0x03f5 }}},
- { 0x03b6, {1, {0x0396 }}},
- { 0x03b7, {1, {0x0397 }}},
- { 0x03b8, {3, {0x0398, 0x03d1, 0x03f4 }}},
- { 0x03b9, {3, {0x0345, 0x0399, 0x1fbe }}},
- { 0x03ba, {2, {0x039a, 0x03f0 }}},
- { 0x03bb, {1, {0x039b }}},
- { 0x03bc, {2, {0x00b5, 0x039c }}},
- { 0x03bd, {1, {0x039d }}},
- { 0x03be, {1, {0x039e }}},
- { 0x03bf, {1, {0x039f }}},
- { 0x03c0, {2, {0x03a0, 0x03d6 }}},
- { 0x03c1, {2, {0x03a1, 0x03f1 }}},
- { 0x03c3, {2, {0x03a3, 0x03c2 }}},
- { 0x03c4, {1, {0x03a4 }}},
- { 0x03c5, {1, {0x03a5 }}},
- { 0x03c6, {2, {0x03a6, 0x03d5 }}},
- { 0x03c7, {1, {0x03a7 }}},
- { 0x03c8, {1, {0x03a8 }}},
- { 0x03c9, {2, {0x03a9, 0x2126 }}},
- { 0x03ca, {1, {0x03aa }}},
- { 0x03cb, {1, {0x03ab }}},
- { 0x03cc, {1, {0x038c }}},
- { 0x03cd, {1, {0x038e }}},
- { 0x03ce, {1, {0x038f }}},
- { 0x03d7, {1, {0x03cf }}},
- { 0x03d9, {1, {0x03d8 }}},
- { 0x03db, {1, {0x03da }}},
- { 0x03dd, {1, {0x03dc }}},
- { 0x03df, {1, {0x03de }}},
- { 0x03e1, {1, {0x03e0 }}},
- { 0x03e3, {1, {0x03e2 }}},
- { 0x03e5, {1, {0x03e4 }}},
- { 0x03e7, {1, {0x03e6 }}},
- { 0x03e9, {1, {0x03e8 }}},
- { 0x03eb, {1, {0x03ea }}},
- { 0x03ed, {1, {0x03ec }}},
- { 0x03ef, {1, {0x03ee }}},
- { 0x03f2, {1, {0x03f9 }}},
- { 0x03f8, {1, {0x03f7 }}},
- { 0x03fb, {1, {0x03fa }}},
- { 0x0430, {1, {0x0410 }}},
- { 0x0431, {1, {0x0411 }}},
- { 0x0432, {1, {0x0412 }}},
- { 0x0433, {1, {0x0413 }}},
- { 0x0434, {1, {0x0414 }}},
- { 0x0435, {1, {0x0415 }}},
- { 0x0436, {1, {0x0416 }}},
- { 0x0437, {1, {0x0417 }}},
- { 0x0438, {1, {0x0418 }}},
- { 0x0439, {1, {0x0419 }}},
- { 0x043a, {1, {0x041a }}},
- { 0x043b, {1, {0x041b }}},
- { 0x043c, {1, {0x041c }}},
- { 0x043d, {1, {0x041d }}},
- { 0x043e, {1, {0x041e }}},
- { 0x043f, {1, {0x041f }}},
- { 0x0440, {1, {0x0420 }}},
- { 0x0441, {1, {0x0421 }}},
- { 0x0442, {1, {0x0422 }}},
- { 0x0443, {1, {0x0423 }}},
- { 0x0444, {1, {0x0424 }}},
- { 0x0445, {1, {0x0425 }}},
- { 0x0446, {1, {0x0426 }}},
- { 0x0447, {1, {0x0427 }}},
- { 0x0448, {1, {0x0428 }}},
- { 0x0449, {1, {0x0429 }}},
- { 0x044a, {1, {0x042a }}},
- { 0x044b, {1, {0x042b }}},
- { 0x044c, {1, {0x042c }}},
- { 0x044d, {1, {0x042d }}},
- { 0x044e, {1, {0x042e }}},
- { 0x044f, {1, {0x042f }}},
- { 0x0450, {1, {0x0400 }}},
- { 0x0451, {1, {0x0401 }}},
- { 0x0452, {1, {0x0402 }}},
- { 0x0453, {1, {0x0403 }}},
- { 0x0454, {1, {0x0404 }}},
- { 0x0455, {1, {0x0405 }}},
- { 0x0456, {1, {0x0406 }}},
- { 0x0457, {1, {0x0407 }}},
- { 0x0458, {1, {0x0408 }}},
- { 0x0459, {1, {0x0409 }}},
- { 0x045a, {1, {0x040a }}},
- { 0x045b, {1, {0x040b }}},
- { 0x045c, {1, {0x040c }}},
- { 0x045d, {1, {0x040d }}},
- { 0x045e, {1, {0x040e }}},
- { 0x045f, {1, {0x040f }}},
- { 0x0461, {1, {0x0460 }}},
- { 0x0463, {1, {0x0462 }}},
- { 0x0465, {1, {0x0464 }}},
- { 0x0467, {1, {0x0466 }}},
- { 0x0469, {1, {0x0468 }}},
- { 0x046b, {1, {0x046a }}},
- { 0x046d, {1, {0x046c }}},
- { 0x046f, {1, {0x046e }}},
- { 0x0471, {1, {0x0470 }}},
- { 0x0473, {1, {0x0472 }}},
- { 0x0475, {1, {0x0474 }}},
- { 0x0477, {1, {0x0476 }}},
- { 0x0479, {1, {0x0478 }}},
- { 0x047b, {1, {0x047a }}},
- { 0x047d, {1, {0x047c }}},
- { 0x047f, {1, {0x047e }}},
- { 0x0481, {1, {0x0480 }}},
- { 0x048b, {1, {0x048a }}},
- { 0x048d, {1, {0x048c }}},
- { 0x048f, {1, {0x048e }}},
- { 0x0491, {1, {0x0490 }}},
- { 0x0493, {1, {0x0492 }}},
- { 0x0495, {1, {0x0494 }}},
- { 0x0497, {1, {0x0496 }}},
- { 0x0499, {1, {0x0498 }}},
- { 0x049b, {1, {0x049a }}},
- { 0x049d, {1, {0x049c }}},
- { 0x049f, {1, {0x049e }}},
- { 0x04a1, {1, {0x04a0 }}},
- { 0x04a3, {1, {0x04a2 }}},
- { 0x04a5, {1, {0x04a4 }}},
- { 0x04a7, {1, {0x04a6 }}},
- { 0x04a9, {1, {0x04a8 }}},
- { 0x04ab, {1, {0x04aa }}},
- { 0x04ad, {1, {0x04ac }}},
- { 0x04af, {1, {0x04ae }}},
- { 0x04b1, {1, {0x04b0 }}},
- { 0x04b3, {1, {0x04b2 }}},
- { 0x04b5, {1, {0x04b4 }}},
- { 0x04b7, {1, {0x04b6 }}},
- { 0x04b9, {1, {0x04b8 }}},
- { 0x04bb, {1, {0x04ba }}},
- { 0x04bd, {1, {0x04bc }}},
- { 0x04bf, {1, {0x04be }}},
- { 0x04c2, {1, {0x04c1 }}},
- { 0x04c4, {1, {0x04c3 }}},
- { 0x04c6, {1, {0x04c5 }}},
- { 0x04c8, {1, {0x04c7 }}},
- { 0x04ca, {1, {0x04c9 }}},
- { 0x04cc, {1, {0x04cb }}},
- { 0x04ce, {1, {0x04cd }}},
- { 0x04cf, {1, {0x04c0 }}},
- { 0x04d1, {1, {0x04d0 }}},
- { 0x04d3, {1, {0x04d2 }}},
- { 0x04d5, {1, {0x04d4 }}},
- { 0x04d7, {1, {0x04d6 }}},
- { 0x04d9, {1, {0x04d8 }}},
- { 0x04db, {1, {0x04da }}},
- { 0x04dd, {1, {0x04dc }}},
- { 0x04df, {1, {0x04de }}},
- { 0x04e1, {1, {0x04e0 }}},
- { 0x04e3, {1, {0x04e2 }}},
- { 0x04e5, {1, {0x04e4 }}},
- { 0x04e7, {1, {0x04e6 }}},
- { 0x04e9, {1, {0x04e8 }}},
- { 0x04eb, {1, {0x04ea }}},
- { 0x04ed, {1, {0x04ec }}},
- { 0x04ef, {1, {0x04ee }}},
- { 0x04f1, {1, {0x04f0 }}},
- { 0x04f3, {1, {0x04f2 }}},
- { 0x04f5, {1, {0x04f4 }}},
- { 0x04f7, {1, {0x04f6 }}},
- { 0x04f9, {1, {0x04f8 }}},
- { 0x04fb, {1, {0x04fa }}},
- { 0x04fd, {1, {0x04fc }}},
- { 0x04ff, {1, {0x04fe }}},
- { 0x0501, {1, {0x0500 }}},
- { 0x0503, {1, {0x0502 }}},
- { 0x0505, {1, {0x0504 }}},
- { 0x0507, {1, {0x0506 }}},
- { 0x0509, {1, {0x0508 }}},
- { 0x050b, {1, {0x050a }}},
- { 0x050d, {1, {0x050c }}},
- { 0x050f, {1, {0x050e }}},
- { 0x0511, {1, {0x0510 }}},
- { 0x0513, {1, {0x0512 }}},
- { 0x0515, {1, {0x0514 }}},
- { 0x0517, {1, {0x0516 }}},
- { 0x0519, {1, {0x0518 }}},
- { 0x051b, {1, {0x051a }}},
- { 0x051d, {1, {0x051c }}},
- { 0x051f, {1, {0x051e }}},
- { 0x0521, {1, {0x0520 }}},
- { 0x0523, {1, {0x0522 }}},
- { 0x0525, {1, {0x0524 }}},
- { 0x0527, {1, {0x0526 }}},
- { 0x0561, {1, {0x0531 }}},
- { 0x0562, {1, {0x0532 }}},
- { 0x0563, {1, {0x0533 }}},
- { 0x0564, {1, {0x0534 }}},
- { 0x0565, {1, {0x0535 }}},
- { 0x0566, {1, {0x0536 }}},
- { 0x0567, {1, {0x0537 }}},
- { 0x0568, {1, {0x0538 }}},
- { 0x0569, {1, {0x0539 }}},
- { 0x056a, {1, {0x053a }}},
- { 0x056b, {1, {0x053b }}},
- { 0x056c, {1, {0x053c }}},
- { 0x056d, {1, {0x053d }}},
- { 0x056e, {1, {0x053e }}},
- { 0x056f, {1, {0x053f }}},
- { 0x0570, {1, {0x0540 }}},
- { 0x0571, {1, {0x0541 }}},
- { 0x0572, {1, {0x0542 }}},
- { 0x0573, {1, {0x0543 }}},
- { 0x0574, {1, {0x0544 }}},
- { 0x0575, {1, {0x0545 }}},
- { 0x0576, {1, {0x0546 }}},
- { 0x0577, {1, {0x0547 }}},
- { 0x0578, {1, {0x0548 }}},
- { 0x0579, {1, {0x0549 }}},
- { 0x057a, {1, {0x054a }}},
- { 0x057b, {1, {0x054b }}},
- { 0x057c, {1, {0x054c }}},
- { 0x057d, {1, {0x054d }}},
- { 0x057e, {1, {0x054e }}},
- { 0x057f, {1, {0x054f }}},
- { 0x0580, {1, {0x0550 }}},
- { 0x0581, {1, {0x0551 }}},
- { 0x0582, {1, {0x0552 }}},
- { 0x0583, {1, {0x0553 }}},
- { 0x0584, {1, {0x0554 }}},
- { 0x0585, {1, {0x0555 }}},
- { 0x0586, {1, {0x0556 }}},
- { 0x1d79, {1, {0xa77d }}},
- { 0x1d7d, {1, {0x2c63 }}},
- { 0x1e01, {1, {0x1e00 }}},
- { 0x1e03, {1, {0x1e02 }}},
- { 0x1e05, {1, {0x1e04 }}},
- { 0x1e07, {1, {0x1e06 }}},
- { 0x1e09, {1, {0x1e08 }}},
- { 0x1e0b, {1, {0x1e0a }}},
- { 0x1e0d, {1, {0x1e0c }}},
- { 0x1e0f, {1, {0x1e0e }}},
- { 0x1e11, {1, {0x1e10 }}},
- { 0x1e13, {1, {0x1e12 }}},
- { 0x1e15, {1, {0x1e14 }}},
- { 0x1e17, {1, {0x1e16 }}},
- { 0x1e19, {1, {0x1e18 }}},
- { 0x1e1b, {1, {0x1e1a }}},
- { 0x1e1d, {1, {0x1e1c }}},
- { 0x1e1f, {1, {0x1e1e }}},
- { 0x1e21, {1, {0x1e20 }}},
- { 0x1e23, {1, {0x1e22 }}},
- { 0x1e25, {1, {0x1e24 }}},
- { 0x1e27, {1, {0x1e26 }}},
- { 0x1e29, {1, {0x1e28 }}},
- { 0x1e2b, {1, {0x1e2a }}},
- { 0x1e2d, {1, {0x1e2c }}},
- { 0x1e2f, {1, {0x1e2e }}},
- { 0x1e31, {1, {0x1e30 }}},
- { 0x1e33, {1, {0x1e32 }}},
- { 0x1e35, {1, {0x1e34 }}},
- { 0x1e37, {1, {0x1e36 }}},
- { 0x1e39, {1, {0x1e38 }}},
- { 0x1e3b, {1, {0x1e3a }}},
- { 0x1e3d, {1, {0x1e3c }}},
- { 0x1e3f, {1, {0x1e3e }}},
- { 0x1e41, {1, {0x1e40 }}},
- { 0x1e43, {1, {0x1e42 }}},
- { 0x1e45, {1, {0x1e44 }}},
- { 0x1e47, {1, {0x1e46 }}},
- { 0x1e49, {1, {0x1e48 }}},
- { 0x1e4b, {1, {0x1e4a }}},
- { 0x1e4d, {1, {0x1e4c }}},
- { 0x1e4f, {1, {0x1e4e }}},
- { 0x1e51, {1, {0x1e50 }}},
- { 0x1e53, {1, {0x1e52 }}},
- { 0x1e55, {1, {0x1e54 }}},
- { 0x1e57, {1, {0x1e56 }}},
- { 0x1e59, {1, {0x1e58 }}},
- { 0x1e5b, {1, {0x1e5a }}},
- { 0x1e5d, {1, {0x1e5c }}},
- { 0x1e5f, {1, {0x1e5e }}},
- { 0x1e61, {2, {0x1e60, 0x1e9b }}},
- { 0x1e63, {1, {0x1e62 }}},
- { 0x1e65, {1, {0x1e64 }}},
- { 0x1e67, {1, {0x1e66 }}},
- { 0x1e69, {1, {0x1e68 }}},
- { 0x1e6b, {1, {0x1e6a }}},
- { 0x1e6d, {1, {0x1e6c }}},
- { 0x1e6f, {1, {0x1e6e }}},
- { 0x1e71, {1, {0x1e70 }}},
- { 0x1e73, {1, {0x1e72 }}},
- { 0x1e75, {1, {0x1e74 }}},
- { 0x1e77, {1, {0x1e76 }}},
- { 0x1e79, {1, {0x1e78 }}},
- { 0x1e7b, {1, {0x1e7a }}},
- { 0x1e7d, {1, {0x1e7c }}},
- { 0x1e7f, {1, {0x1e7e }}},
- { 0x1e81, {1, {0x1e80 }}},
- { 0x1e83, {1, {0x1e82 }}},
- { 0x1e85, {1, {0x1e84 }}},
- { 0x1e87, {1, {0x1e86 }}},
- { 0x1e89, {1, {0x1e88 }}},
- { 0x1e8b, {1, {0x1e8a }}},
- { 0x1e8d, {1, {0x1e8c }}},
- { 0x1e8f, {1, {0x1e8e }}},
- { 0x1e91, {1, {0x1e90 }}},
- { 0x1e93, {1, {0x1e92 }}},
- { 0x1e95, {1, {0x1e94 }}},
- { 0x1ea1, {1, {0x1ea0 }}},
- { 0x1ea3, {1, {0x1ea2 }}},
- { 0x1ea5, {1, {0x1ea4 }}},
- { 0x1ea7, {1, {0x1ea6 }}},
- { 0x1ea9, {1, {0x1ea8 }}},
- { 0x1eab, {1, {0x1eaa }}},
- { 0x1ead, {1, {0x1eac }}},
- { 0x1eaf, {1, {0x1eae }}},
- { 0x1eb1, {1, {0x1eb0 }}},
- { 0x1eb3, {1, {0x1eb2 }}},
- { 0x1eb5, {1, {0x1eb4 }}},
- { 0x1eb7, {1, {0x1eb6 }}},
- { 0x1eb9, {1, {0x1eb8 }}},
- { 0x1ebb, {1, {0x1eba }}},
- { 0x1ebd, {1, {0x1ebc }}},
- { 0x1ebf, {1, {0x1ebe }}},
- { 0x1ec1, {1, {0x1ec0 }}},
- { 0x1ec3, {1, {0x1ec2 }}},
- { 0x1ec5, {1, {0x1ec4 }}},
- { 0x1ec7, {1, {0x1ec6 }}},
- { 0x1ec9, {1, {0x1ec8 }}},
- { 0x1ecb, {1, {0x1eca }}},
- { 0x1ecd, {1, {0x1ecc }}},
- { 0x1ecf, {1, {0x1ece }}},
- { 0x1ed1, {1, {0x1ed0 }}},
- { 0x1ed3, {1, {0x1ed2 }}},
- { 0x1ed5, {1, {0x1ed4 }}},
- { 0x1ed7, {1, {0x1ed6 }}},
- { 0x1ed9, {1, {0x1ed8 }}},
- { 0x1edb, {1, {0x1eda }}},
- { 0x1edd, {1, {0x1edc }}},
- { 0x1edf, {1, {0x1ede }}},
- { 0x1ee1, {1, {0x1ee0 }}},
- { 0x1ee3, {1, {0x1ee2 }}},
- { 0x1ee5, {1, {0x1ee4 }}},
- { 0x1ee7, {1, {0x1ee6 }}},
- { 0x1ee9, {1, {0x1ee8 }}},
- { 0x1eeb, {1, {0x1eea }}},
- { 0x1eed, {1, {0x1eec }}},
- { 0x1eef, {1, {0x1eee }}},
- { 0x1ef1, {1, {0x1ef0 }}},
- { 0x1ef3, {1, {0x1ef2 }}},
- { 0x1ef5, {1, {0x1ef4 }}},
- { 0x1ef7, {1, {0x1ef6 }}},
- { 0x1ef9, {1, {0x1ef8 }}},
- { 0x1efb, {1, {0x1efa }}},
- { 0x1efd, {1, {0x1efc }}},
- { 0x1eff, {1, {0x1efe }}},
- { 0x1f00, {1, {0x1f08 }}},
- { 0x1f01, {1, {0x1f09 }}},
- { 0x1f02, {1, {0x1f0a }}},
- { 0x1f03, {1, {0x1f0b }}},
- { 0x1f04, {1, {0x1f0c }}},
- { 0x1f05, {1, {0x1f0d }}},
- { 0x1f06, {1, {0x1f0e }}},
- { 0x1f07, {1, {0x1f0f }}},
- { 0x1f10, {1, {0x1f18 }}},
- { 0x1f11, {1, {0x1f19 }}},
- { 0x1f12, {1, {0x1f1a }}},
- { 0x1f13, {1, {0x1f1b }}},
- { 0x1f14, {1, {0x1f1c }}},
- { 0x1f15, {1, {0x1f1d }}},
- { 0x1f20, {1, {0x1f28 }}},
- { 0x1f21, {1, {0x1f29 }}},
- { 0x1f22, {1, {0x1f2a }}},
- { 0x1f23, {1, {0x1f2b }}},
- { 0x1f24, {1, {0x1f2c }}},
- { 0x1f25, {1, {0x1f2d }}},
- { 0x1f26, {1, {0x1f2e }}},
- { 0x1f27, {1, {0x1f2f }}},
- { 0x1f30, {1, {0x1f38 }}},
- { 0x1f31, {1, {0x1f39 }}},
- { 0x1f32, {1, {0x1f3a }}},
- { 0x1f33, {1, {0x1f3b }}},
- { 0x1f34, {1, {0x1f3c }}},
- { 0x1f35, {1, {0x1f3d }}},
- { 0x1f36, {1, {0x1f3e }}},
- { 0x1f37, {1, {0x1f3f }}},
- { 0x1f40, {1, {0x1f48 }}},
- { 0x1f41, {1, {0x1f49 }}},
- { 0x1f42, {1, {0x1f4a }}},
- { 0x1f43, {1, {0x1f4b }}},
- { 0x1f44, {1, {0x1f4c }}},
- { 0x1f45, {1, {0x1f4d }}},
- { 0x1f51, {1, {0x1f59 }}},
- { 0x1f53, {1, {0x1f5b }}},
- { 0x1f55, {1, {0x1f5d }}},
- { 0x1f57, {1, {0x1f5f }}},
- { 0x1f60, {1, {0x1f68 }}},
- { 0x1f61, {1, {0x1f69 }}},
- { 0x1f62, {1, {0x1f6a }}},
- { 0x1f63, {1, {0x1f6b }}},
- { 0x1f64, {1, {0x1f6c }}},
- { 0x1f65, {1, {0x1f6d }}},
- { 0x1f66, {1, {0x1f6e }}},
- { 0x1f67, {1, {0x1f6f }}},
- { 0x1f70, {1, {0x1fba }}},
- { 0x1f71, {1, {0x1fbb }}},
- { 0x1f72, {1, {0x1fc8 }}},
- { 0x1f73, {1, {0x1fc9 }}},
- { 0x1f74, {1, {0x1fca }}},
- { 0x1f75, {1, {0x1fcb }}},
- { 0x1f76, {1, {0x1fda }}},
- { 0x1f77, {1, {0x1fdb }}},
- { 0x1f78, {1, {0x1ff8 }}},
- { 0x1f79, {1, {0x1ff9 }}},
- { 0x1f7a, {1, {0x1fea }}},
- { 0x1f7b, {1, {0x1feb }}},
- { 0x1f7c, {1, {0x1ffa }}},
- { 0x1f7d, {1, {0x1ffb }}},
- { 0x1fb0, {1, {0x1fb8 }}},
- { 0x1fb1, {1, {0x1fb9 }}},
- { 0x1fd0, {1, {0x1fd8 }}},
- { 0x1fd1, {1, {0x1fd9 }}},
- { 0x1fe0, {1, {0x1fe8 }}},
- { 0x1fe1, {1, {0x1fe9 }}},
- { 0x1fe5, {1, {0x1fec }}},
- { 0x214e, {1, {0x2132 }}},
- { 0x2170, {1, {0x2160 }}},
- { 0x2171, {1, {0x2161 }}},
- { 0x2172, {1, {0x2162 }}},
- { 0x2173, {1, {0x2163 }}},
- { 0x2174, {1, {0x2164 }}},
- { 0x2175, {1, {0x2165 }}},
- { 0x2176, {1, {0x2166 }}},
- { 0x2177, {1, {0x2167 }}},
- { 0x2178, {1, {0x2168 }}},
- { 0x2179, {1, {0x2169 }}},
- { 0x217a, {1, {0x216a }}},
- { 0x217b, {1, {0x216b }}},
- { 0x217c, {1, {0x216c }}},
- { 0x217d, {1, {0x216d }}},
- { 0x217e, {1, {0x216e }}},
- { 0x217f, {1, {0x216f }}},
- { 0x2184, {1, {0x2183 }}},
- { 0x24d0, {1, {0x24b6 }}},
- { 0x24d1, {1, {0x24b7 }}},
- { 0x24d2, {1, {0x24b8 }}},
- { 0x24d3, {1, {0x24b9 }}},
- { 0x24d4, {1, {0x24ba }}},
- { 0x24d5, {1, {0x24bb }}},
- { 0x24d6, {1, {0x24bc }}},
- { 0x24d7, {1, {0x24bd }}},
- { 0x24d8, {1, {0x24be }}},
- { 0x24d9, {1, {0x24bf }}},
- { 0x24da, {1, {0x24c0 }}},
- { 0x24db, {1, {0x24c1 }}},
- { 0x24dc, {1, {0x24c2 }}},
- { 0x24dd, {1, {0x24c3 }}},
- { 0x24de, {1, {0x24c4 }}},
- { 0x24df, {1, {0x24c5 }}},
- { 0x24e0, {1, {0x24c6 }}},
- { 0x24e1, {1, {0x24c7 }}},
- { 0x24e2, {1, {0x24c8 }}},
- { 0x24e3, {1, {0x24c9 }}},
- { 0x24e4, {1, {0x24ca }}},
- { 0x24e5, {1, {0x24cb }}},
- { 0x24e6, {1, {0x24cc }}},
- { 0x24e7, {1, {0x24cd }}},
- { 0x24e8, {1, {0x24ce }}},
- { 0x24e9, {1, {0x24cf }}},
- { 0x2c30, {1, {0x2c00 }}},
- { 0x2c31, {1, {0x2c01 }}},
- { 0x2c32, {1, {0x2c02 }}},
- { 0x2c33, {1, {0x2c03 }}},
- { 0x2c34, {1, {0x2c04 }}},
- { 0x2c35, {1, {0x2c05 }}},
- { 0x2c36, {1, {0x2c06 }}},
- { 0x2c37, {1, {0x2c07 }}},
- { 0x2c38, {1, {0x2c08 }}},
- { 0x2c39, {1, {0x2c09 }}},
- { 0x2c3a, {1, {0x2c0a }}},
- { 0x2c3b, {1, {0x2c0b }}},
- { 0x2c3c, {1, {0x2c0c }}},
- { 0x2c3d, {1, {0x2c0d }}},
- { 0x2c3e, {1, {0x2c0e }}},
- { 0x2c3f, {1, {0x2c0f }}},
- { 0x2c40, {1, {0x2c10 }}},
- { 0x2c41, {1, {0x2c11 }}},
- { 0x2c42, {1, {0x2c12 }}},
- { 0x2c43, {1, {0x2c13 }}},
- { 0x2c44, {1, {0x2c14 }}},
- { 0x2c45, {1, {0x2c15 }}},
- { 0x2c46, {1, {0x2c16 }}},
- { 0x2c47, {1, {0x2c17 }}},
- { 0x2c48, {1, {0x2c18 }}},
- { 0x2c49, {1, {0x2c19 }}},
- { 0x2c4a, {1, {0x2c1a }}},
- { 0x2c4b, {1, {0x2c1b }}},
- { 0x2c4c, {1, {0x2c1c }}},
- { 0x2c4d, {1, {0x2c1d }}},
- { 0x2c4e, {1, {0x2c1e }}},
- { 0x2c4f, {1, {0x2c1f }}},
- { 0x2c50, {1, {0x2c20 }}},
- { 0x2c51, {1, {0x2c21 }}},
- { 0x2c52, {1, {0x2c22 }}},
- { 0x2c53, {1, {0x2c23 }}},
- { 0x2c54, {1, {0x2c24 }}},
- { 0x2c55, {1, {0x2c25 }}},
- { 0x2c56, {1, {0x2c26 }}},
- { 0x2c57, {1, {0x2c27 }}},
- { 0x2c58, {1, {0x2c28 }}},
- { 0x2c59, {1, {0x2c29 }}},
- { 0x2c5a, {1, {0x2c2a }}},
- { 0x2c5b, {1, {0x2c2b }}},
- { 0x2c5c, {1, {0x2c2c }}},
- { 0x2c5d, {1, {0x2c2d }}},
- { 0x2c5e, {1, {0x2c2e }}},
- { 0x2c61, {1, {0x2c60 }}},
- { 0x2c65, {1, {0x023a }}},
- { 0x2c66, {1, {0x023e }}},
- { 0x2c68, {1, {0x2c67 }}},
- { 0x2c6a, {1, {0x2c69 }}},
- { 0x2c6c, {1, {0x2c6b }}},
- { 0x2c73, {1, {0x2c72 }}},
- { 0x2c76, {1, {0x2c75 }}},
- { 0x2c81, {1, {0x2c80 }}},
- { 0x2c83, {1, {0x2c82 }}},
- { 0x2c85, {1, {0x2c84 }}},
- { 0x2c87, {1, {0x2c86 }}},
- { 0x2c89, {1, {0x2c88 }}},
- { 0x2c8b, {1, {0x2c8a }}},
- { 0x2c8d, {1, {0x2c8c }}},
- { 0x2c8f, {1, {0x2c8e }}},
- { 0x2c91, {1, {0x2c90 }}},
- { 0x2c93, {1, {0x2c92 }}},
- { 0x2c95, {1, {0x2c94 }}},
- { 0x2c97, {1, {0x2c96 }}},
- { 0x2c99, {1, {0x2c98 }}},
- { 0x2c9b, {1, {0x2c9a }}},
- { 0x2c9d, {1, {0x2c9c }}},
- { 0x2c9f, {1, {0x2c9e }}},
- { 0x2ca1, {1, {0x2ca0 }}},
- { 0x2ca3, {1, {0x2ca2 }}},
- { 0x2ca5, {1, {0x2ca4 }}},
- { 0x2ca7, {1, {0x2ca6 }}},
- { 0x2ca9, {1, {0x2ca8 }}},
- { 0x2cab, {1, {0x2caa }}},
- { 0x2cad, {1, {0x2cac }}},
- { 0x2caf, {1, {0x2cae }}},
- { 0x2cb1, {1, {0x2cb0 }}},
- { 0x2cb3, {1, {0x2cb2 }}},
- { 0x2cb5, {1, {0x2cb4 }}},
- { 0x2cb7, {1, {0x2cb6 }}},
- { 0x2cb9, {1, {0x2cb8 }}},
- { 0x2cbb, {1, {0x2cba }}},
- { 0x2cbd, {1, {0x2cbc }}},
- { 0x2cbf, {1, {0x2cbe }}},
- { 0x2cc1, {1, {0x2cc0 }}},
- { 0x2cc3, {1, {0x2cc2 }}},
- { 0x2cc5, {1, {0x2cc4 }}},
- { 0x2cc7, {1, {0x2cc6 }}},
- { 0x2cc9, {1, {0x2cc8 }}},
- { 0x2ccb, {1, {0x2cca }}},
- { 0x2ccd, {1, {0x2ccc }}},
- { 0x2ccf, {1, {0x2cce }}},
- { 0x2cd1, {1, {0x2cd0 }}},
- { 0x2cd3, {1, {0x2cd2 }}},
- { 0x2cd5, {1, {0x2cd4 }}},
- { 0x2cd7, {1, {0x2cd6 }}},
- { 0x2cd9, {1, {0x2cd8 }}},
- { 0x2cdb, {1, {0x2cda }}},
- { 0x2cdd, {1, {0x2cdc }}},
- { 0x2cdf, {1, {0x2cde }}},
- { 0x2ce1, {1, {0x2ce0 }}},
- { 0x2ce3, {1, {0x2ce2 }}},
- { 0x2cec, {1, {0x2ceb }}},
- { 0x2cee, {1, {0x2ced }}},
- { 0x2cf3, {1, {0x2cf2 }}},
- { 0x2d00, {1, {0x10a0 }}},
- { 0x2d01, {1, {0x10a1 }}},
- { 0x2d02, {1, {0x10a2 }}},
- { 0x2d03, {1, {0x10a3 }}},
- { 0x2d04, {1, {0x10a4 }}},
- { 0x2d05, {1, {0x10a5 }}},
- { 0x2d06, {1, {0x10a6 }}},
- { 0x2d07, {1, {0x10a7 }}},
- { 0x2d08, {1, {0x10a8 }}},
- { 0x2d09, {1, {0x10a9 }}},
- { 0x2d0a, {1, {0x10aa }}},
- { 0x2d0b, {1, {0x10ab }}},
- { 0x2d0c, {1, {0x10ac }}},
- { 0x2d0d, {1, {0x10ad }}},
- { 0x2d0e, {1, {0x10ae }}},
- { 0x2d0f, {1, {0x10af }}},
- { 0x2d10, {1, {0x10b0 }}},
- { 0x2d11, {1, {0x10b1 }}},
- { 0x2d12, {1, {0x10b2 }}},
- { 0x2d13, {1, {0x10b3 }}},
- { 0x2d14, {1, {0x10b4 }}},
- { 0x2d15, {1, {0x10b5 }}},
- { 0x2d16, {1, {0x10b6 }}},
- { 0x2d17, {1, {0x10b7 }}},
- { 0x2d18, {1, {0x10b8 }}},
- { 0x2d19, {1, {0x10b9 }}},
- { 0x2d1a, {1, {0x10ba }}},
- { 0x2d1b, {1, {0x10bb }}},
- { 0x2d1c, {1, {0x10bc }}},
- { 0x2d1d, {1, {0x10bd }}},
- { 0x2d1e, {1, {0x10be }}},
- { 0x2d1f, {1, {0x10bf }}},
- { 0x2d20, {1, {0x10c0 }}},
- { 0x2d21, {1, {0x10c1 }}},
- { 0x2d22, {1, {0x10c2 }}},
- { 0x2d23, {1, {0x10c3 }}},
- { 0x2d24, {1, {0x10c4 }}},
- { 0x2d25, {1, {0x10c5 }}},
- { 0x2d27, {1, {0x10c7 }}},
- { 0x2d2d, {1, {0x10cd }}},
- { 0xa641, {1, {0xa640 }}},
- { 0xa643, {1, {0xa642 }}},
- { 0xa645, {1, {0xa644 }}},
- { 0xa647, {1, {0xa646 }}},
- { 0xa649, {1, {0xa648 }}},
- { 0xa64b, {1, {0xa64a }}},
- { 0xa64d, {1, {0xa64c }}},
- { 0xa64f, {1, {0xa64e }}},
- { 0xa651, {1, {0xa650 }}},
- { 0xa653, {1, {0xa652 }}},
- { 0xa655, {1, {0xa654 }}},
- { 0xa657, {1, {0xa656 }}},
- { 0xa659, {1, {0xa658 }}},
- { 0xa65b, {1, {0xa65a }}},
- { 0xa65d, {1, {0xa65c }}},
- { 0xa65f, {1, {0xa65e }}},
- { 0xa661, {1, {0xa660 }}},
- { 0xa663, {1, {0xa662 }}},
- { 0xa665, {1, {0xa664 }}},
- { 0xa667, {1, {0xa666 }}},
- { 0xa669, {1, {0xa668 }}},
- { 0xa66b, {1, {0xa66a }}},
- { 0xa66d, {1, {0xa66c }}},
- { 0xa681, {1, {0xa680 }}},
- { 0xa683, {1, {0xa682 }}},
- { 0xa685, {1, {0xa684 }}},
- { 0xa687, {1, {0xa686 }}},
- { 0xa689, {1, {0xa688 }}},
- { 0xa68b, {1, {0xa68a }}},
- { 0xa68d, {1, {0xa68c }}},
- { 0xa68f, {1, {0xa68e }}},
- { 0xa691, {1, {0xa690 }}},
- { 0xa693, {1, {0xa692 }}},
- { 0xa695, {1, {0xa694 }}},
- { 0xa697, {1, {0xa696 }}},
- { 0xa723, {1, {0xa722 }}},
- { 0xa725, {1, {0xa724 }}},
- { 0xa727, {1, {0xa726 }}},
- { 0xa729, {1, {0xa728 }}},
- { 0xa72b, {1, {0xa72a }}},
- { 0xa72d, {1, {0xa72c }}},
- { 0xa72f, {1, {0xa72e }}},
- { 0xa733, {1, {0xa732 }}},
- { 0xa735, {1, {0xa734 }}},
- { 0xa737, {1, {0xa736 }}},
- { 0xa739, {1, {0xa738 }}},
- { 0xa73b, {1, {0xa73a }}},
- { 0xa73d, {1, {0xa73c }}},
- { 0xa73f, {1, {0xa73e }}},
- { 0xa741, {1, {0xa740 }}},
- { 0xa743, {1, {0xa742 }}},
- { 0xa745, {1, {0xa744 }}},
- { 0xa747, {1, {0xa746 }}},
- { 0xa749, {1, {0xa748 }}},
- { 0xa74b, {1, {0xa74a }}},
- { 0xa74d, {1, {0xa74c }}},
- { 0xa74f, {1, {0xa74e }}},
- { 0xa751, {1, {0xa750 }}},
- { 0xa753, {1, {0xa752 }}},
- { 0xa755, {1, {0xa754 }}},
- { 0xa757, {1, {0xa756 }}},
- { 0xa759, {1, {0xa758 }}},
- { 0xa75b, {1, {0xa75a }}},
- { 0xa75d, {1, {0xa75c }}},
- { 0xa75f, {1, {0xa75e }}},
- { 0xa761, {1, {0xa760 }}},
- { 0xa763, {1, {0xa762 }}},
- { 0xa765, {1, {0xa764 }}},
- { 0xa767, {1, {0xa766 }}},
- { 0xa769, {1, {0xa768 }}},
- { 0xa76b, {1, {0xa76a }}},
- { 0xa76d, {1, {0xa76c }}},
- { 0xa76f, {1, {0xa76e }}},
- { 0xa77a, {1, {0xa779 }}},
- { 0xa77c, {1, {0xa77b }}},
- { 0xa77f, {1, {0xa77e }}},
- { 0xa781, {1, {0xa780 }}},
- { 0xa783, {1, {0xa782 }}},
- { 0xa785, {1, {0xa784 }}},
- { 0xa787, {1, {0xa786 }}},
- { 0xa78c, {1, {0xa78b }}},
- { 0xa791, {1, {0xa790 }}},
- { 0xa793, {1, {0xa792 }}},
- { 0xa7a1, {1, {0xa7a0 }}},
- { 0xa7a3, {1, {0xa7a2 }}},
- { 0xa7a5, {1, {0xa7a4 }}},
- { 0xa7a7, {1, {0xa7a6 }}},
- { 0xa7a9, {1, {0xa7a8 }}},
- { 0xff41, {1, {0xff21 }}},
- { 0xff42, {1, {0xff22 }}},
- { 0xff43, {1, {0xff23 }}},
- { 0xff44, {1, {0xff24 }}},
- { 0xff45, {1, {0xff25 }}},
- { 0xff46, {1, {0xff26 }}},
- { 0xff47, {1, {0xff27 }}},
- { 0xff48, {1, {0xff28 }}},
- { 0xff49, {1, {0xff29 }}},
- { 0xff4a, {1, {0xff2a }}},
- { 0xff4b, {1, {0xff2b }}},
- { 0xff4c, {1, {0xff2c }}},
- { 0xff4d, {1, {0xff2d }}},
- { 0xff4e, {1, {0xff2e }}},
- { 0xff4f, {1, {0xff2f }}},
- { 0xff50, {1, {0xff30 }}},
- { 0xff51, {1, {0xff31 }}},
- { 0xff52, {1, {0xff32 }}},
- { 0xff53, {1, {0xff33 }}},
- { 0xff54, {1, {0xff34 }}},
- { 0xff55, {1, {0xff35 }}},
- { 0xff56, {1, {0xff36 }}},
- { 0xff57, {1, {0xff37 }}},
- { 0xff58, {1, {0xff38 }}},
- { 0xff59, {1, {0xff39 }}},
- { 0xff5a, {1, {0xff3a }}},
- { 0x10428, {1, {0x10400 }}},
- { 0x10429, {1, {0x10401 }}},
- { 0x1042a, {1, {0x10402 }}},
- { 0x1042b, {1, {0x10403 }}},
- { 0x1042c, {1, {0x10404 }}},
- { 0x1042d, {1, {0x10405 }}},
- { 0x1042e, {1, {0x10406 }}},
- { 0x1042f, {1, {0x10407 }}},
- { 0x10430, {1, {0x10408 }}},
- { 0x10431, {1, {0x10409 }}},
- { 0x10432, {1, {0x1040a }}},
- { 0x10433, {1, {0x1040b }}},
- { 0x10434, {1, {0x1040c }}},
- { 0x10435, {1, {0x1040d }}},
- { 0x10436, {1, {0x1040e }}},
- { 0x10437, {1, {0x1040f }}},
- { 0x10438, {1, {0x10410 }}},
- { 0x10439, {1, {0x10411 }}},
- { 0x1043a, {1, {0x10412 }}},
- { 0x1043b, {1, {0x10413 }}},
- { 0x1043c, {1, {0x10414 }}},
- { 0x1043d, {1, {0x10415 }}},
- { 0x1043e, {1, {0x10416 }}},
- { 0x1043f, {1, {0x10417 }}},
- { 0x10440, {1, {0x10418 }}},
- { 0x10441, {1, {0x10419 }}},
- { 0x10442, {1, {0x1041a }}},
- { 0x10443, {1, {0x1041b }}},
- { 0x10444, {1, {0x1041c }}},
- { 0x10445, {1, {0x1041d }}},
- { 0x10446, {1, {0x1041e }}},
- { 0x10447, {1, {0x1041f }}},
- { 0x10448, {1, {0x10420 }}},
- { 0x10449, {1, {0x10421 }}},
- { 0x1044a, {1, {0x10422 }}},
- { 0x1044b, {1, {0x10423 }}},
- { 0x1044c, {1, {0x10424 }}},
- { 0x1044d, {1, {0x10425 }}},
- { 0x1044e, {1, {0x10426 }}},
- { 0x1044f, {1, {0x10427 }}},
-};
+/* maximum key range = 1867, duplicates = 0 */
-static const CaseUnfold_11_Type CaseUnfold_11_Locale[] = {
- { 0x0069, {1, {0x0049 }}},
-};
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+/*ARGSUSED*/
+static unsigned int
+onigenc_unicode_CaseFold_11_hash(const OnigCodePoint code)
+{
+ static const unsigned short asso_values[] =
+ {
+ 12, 212, 5, 217, 6, 1878, 173, 13, 2, 11,
+ 123, 5, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878,
+ 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878,
+ 1878, 1878, 1878, 220, 1878, 1878, 1878, 1878, 1878, 1878,
+ 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 382,
+ 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878, 1878,
+ 8, 4, 219, 1, 1878, 343, 607, 274, 1202, 305,
+ 1362, 209, 259, 412, 1443, 174, 290, 35, 442, 21,
+ 1434, 70, 1472, 105, 362, 193, 591, 51, 3, 7,
+ 1414, 86, 1391, 371, 1358, 398, 1456, 149, 1266, 245,
+ 1263, 135, 1231, 121, 1096, 446, 932, 323, 1033, 428,
+ 1155, 466, 1084, 991, 1160, 474, 1131, 977, 298, 749,
+ 990, 491, 1010, 482, 1021, 696, 161, 729, 46, 966,
+ 1209, 813, 1043, 616, 848, 917, 1019, 594, 1201, 526,
+ 1127, 540, 943, 900, 171, 774, 1283, 760, 626, 935,
+ 1025, 554, 288, 955, 103, 788, 423, 1113, 24, 1005,
+ 20, 711, 9, 573, 358, 668, 5, 885, 228, 649,
+ 102, 628, 612, 515, 800, 871, 77, 1132, 17, 1072,
+ 1, 1188, 47, 1276, 244, 1326, 887, 1289, 202, 740,
+ 258, 1168, 222
+ };
+ return asso_values[bits_of(code, 2)+65] + asso_values[bits_of(code, 1)] + asso_values[bits_of(code, 0)];
+}
+
+#ifdef __GNUC__
+__inline
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+static const CodePointList3 *
+onigenc_unicode_CaseFold_11_lookup(const OnigCodePoint code)
+{
+ enum
+ {
+ MIN_CODE_VALUE = 0x41,
+ MAX_CODE_VALUE = 0x118bf,
+ TOTAL_KEYWORDS = 1180,
+ MIN_WORD_LENGTH = 3,
+ MAX_WORD_LENGTH = 3,
+ MIN_HASH_VALUE = 11,
+ MAX_HASH_VALUE = 1877
+ };
+
+ static const short wordlist[] =
+ {
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1,
+ /*0x10417*/ 1129,
+ -1, -1,
+ /*0x1ff3*/ 794,
+ /*0x10418*/ 1130,
+ /*0x1f97*/ 729,
+ /*0x0417*/ 320,
+ /*0x2c17*/ 873,
+ /*0x1e97*/ 600,
+ /*0x1f98*/ 730,
+ /*0x0418*/ 321,
+ /*0x2c18*/ 874,
+ /*0x1e98*/ 601,
+ /*0x0118*/ 69,
+ /*0x0218*/ 202,
+ /*0x2c98*/ 924,
+ /*0x1e18*/ 536,
+ /*0x0397*/ 248,
+ /*0x1040e*/ 1120,
+ /*0x0498*/ 369,
+ -1,
+ /*0x0398*/ 249,
+ /*0xa798*/ 1053,
+ /*0x1f8e*/ 720,
+ /*0x040e*/ 311,
+ /*0x2c0e*/ 864,
+ /*0x1e8e*/ 595,
+ /*0x010e*/ 64,
+ /*0x020e*/ 197,
+ /*0x2c8e*/ 919,
+ /*0x1e0e*/ 531,
+ /*0x03f1*/ 288,
+ /*0x1040c*/ 1118,
+ /*0x048e*/ 364,
+ -1,
+ /*0x038e*/ 239,
+ /*0xa698*/ 1000,
+ /*0x1f8c*/ 718,
+ /*0x040c*/ 309,
+ /*0x2c0c*/ 862,
+ /*0x1e8c*/ 594,
+ /*0x010c*/ 63,
+ /*0x020c*/ 196,
+ /*0x2c8c*/ 918,
+ /*0x1e0c*/ 530,
+ -1, -1,
+ /*0x048c*/ 363,
+ /*0x10416*/ 1128,
+ /*0x038c*/ 238,
+ /*0xa68e*/ 995,
+ /*0x2c75*/ 909,
+ /*0x013f*/ 87,
+ /*0x1f96*/ 728,
+ /*0x0416*/ 319,
+ /*0x2c16*/ 872,
+ /*0x1e96*/ 599,
+ /*0x0116*/ 68,
+ /*0x0216*/ 201,
+ /*0x2c96*/ 923,
+ /*0x1e16*/ 535,
+ /*0x03f5*/ 290,
+ -1,
+ /*0x0496*/ 368,
+ /*0xa68c*/ 994,
+ /*0x0396*/ 247,
+ /*0xa796*/ 1052,
+ /*0x10410*/ 1122,
+ -1, -1, -1, -1,
+ /*0x1f90*/ 722,
+ /*0x0410*/ 313,
+ /*0x2c10*/ 866,
+ /*0x1e90*/ 596,
+ /*0x0110*/ 65,
+ /*0x0210*/ 198,
+ /*0x2c90*/ 920,
+ /*0x1e10*/ 532,
+ /*0xa696*/ 999,
+ /*0x2c6f*/ 906,
+ /*0x0490*/ 365,
+ /*0x1041a*/ 1132,
+ /*0x0390*/ 241,
+ /*0xa790*/ 1050,
+ -1, -1,
+ /*0x1f9a*/ 732,
+ /*0x041a*/ 323,
+ /*0x2c1a*/ 876,
+ /*0x1e9a*/ 603,
+ /*0x011a*/ 70,
+ /*0x021a*/ 203,
+ /*0x2c9a*/ 925,
+ /*0x1e1a*/ 537,
+ -1, -1,
+ /*0x049a*/ 370,
+ /*0xa690*/ 996,
+ /*0x039a*/ 251,
+ /*0xa79a*/ 1054,
+ /*0x10412*/ 1124,
+ -1,
+ /*0x1fe9*/ 789,
+ /*0x1fd9*/ 780,
+ /*0x2c69*/ 902,
+ /*0x1f92*/ 724,
+ /*0x0412*/ 315,
+ /*0x2c12*/ 868,
+ /*0x1e92*/ 597,
+ /*0x0112*/ 66,
+ /*0x0212*/ 199,
+ /*0x2c92*/ 921,
+ /*0x1e12*/ 533,
+ /*0xa69a*/ 1001,
+ /*0x0059*/ 23,
+ /*0x0492*/ 366,
+ /*0x10426*/ 1144,
+ /*0x0392*/ 243,
+ /*0xa792*/ 1051,
+ -1, -1,
+ /*0x1fa6*/ 744,
+ /*0x0426*/ 335,
+ /*0x2c26*/ 888,
+ /*0x1ea6*/ 609,
+ /*0x0126*/ 76,
+ /*0x0226*/ 209,
+ /*0x2ca6*/ 931,
+ /*0x1e26*/ 543,
+ /*0x0518*/ 433,
+ /*0x10424*/ 1142,
+ /*0x04a6*/ 376,
+ /*0xa692*/ 997,
+ /*0x03a6*/ 262,
+ /*0xa7a6*/ 1060,
+ /*0x1fa4*/ 742,
+ /*0x0424*/ 333,
+ /*0x2c24*/ 886,
+ /*0x1ea4*/ 608,
+ /*0x0124*/ 75,
+ /*0x0224*/ 208,
+ /*0x2ca4*/ 930,
+ /*0x1e24*/ 542,
+ /*0x050e*/ 428,
+ /*0x10420*/ 1138,
+ /*0x04a4*/ 375,
+ -1,
+ /*0x03a4*/ 260,
+ /*0xa7a4*/ 1059,
+ /*0x1fa0*/ 738,
+ /*0x0420*/ 329,
+ /*0x2c20*/ 882,
+ /*0x1ea0*/ 606,
+ /*0x0120*/ 73,
+ /*0x0220*/ 206,
+ /*0x2ca0*/ 928,
+ /*0x1e20*/ 540,
+ /*0x050c*/ 427,
+ -1,
+ /*0x04a0*/ 373,
+ -1,
+ /*0x03a0*/ 257,
+ /*0xa7a0*/ 1057,
+ -1, -1,
+ /*0x013d*/ 86,
+ /*0x023d*/ 218,
+ -1,
+ /*0x053f*/ 459,
+ /*0x1040a*/ 1116,
+ -1, -1, -1,
+ /*0x0516*/ 432,
+ /*0x1f8a*/ 716,
+ /*0x040a*/ 307,
+ /*0x2c0a*/ 860,
+ /*0x1e8a*/ 593,
+ /*0x010a*/ 62,
+ /*0x020a*/ 195,
+ /*0x2c8a*/ 917,
+ /*0x1e0a*/ 529,
+ /*0x004f*/ 13,
+ /*0x03cf*/ 270,
+ /*0x048a*/ 362,
+ -1,
+ /*0x038a*/ 237,
+ -1,
+ /*0x10414*/ 1126,
+ -1, -1, -1,
+ /*0x0510*/ 429,
+ /*0x1f94*/ 726,
+ /*0x0414*/ 317,
+ /*0x2c14*/ 870,
+ /*0x1e94*/ 598,
+ /*0x0114*/ 67,
+ /*0x0214*/ 200,
+ /*0x2c94*/ 922,
+ /*0x1e14*/ 534,
+ /*0xa68a*/ 993,
+ /*0x1ffb*/ 801,
+ /*0x0494*/ 367,
+ /*0x10406*/ 1112,
+ /*0x0394*/ 245,
+ /*0x017b*/ 118,
+ -1,
+ /*0x051a*/ 434,
+ /*0x1f86*/ 712,
+ /*0x0406*/ 303,
+ /*0x2c06*/ 856,
+ /*0x1e86*/ 591,
+ /*0x0106*/ 60,
+ /*0x0206*/ 193,
+ /*0x2c86*/ 915,
+ /*0x1e06*/ 527,
+ -1, -1,
+ /*0x0197*/ 136,
+ /*0xa694*/ 998,
+ /*0x0386*/ 234,
+ /*0xa786*/ 1047,
+ /*0x0198*/ 137,
+ /*0x2c7f*/ 911,
+ /*0x1f18*/ 662,
+ /*0x017f*/ 120,
+ /*0x0512*/ 430,
+ /*0x1fe7*/ 787,
+ -1,
+ /*0x2c67*/ 901,
+ /*0x00df*/ 56,
+ -1,
+ /*0x01f1*/ 181,
+ /*0x03ff*/ 296,
+ /*0x00dd*/ 54,
+ /*0xa686*/ 991,
+ /*0x018e*/ 129,
+ /*0x1f5f*/ 697,
+ /*0x1f0e*/ 660,
+ /*0x10422*/ 1140,
+ -1,
+ /*0x1f5d*/ 696,
+ /*0x0526*/ 440,
+ /*0x1ff7*/ 797,
+ /*0x1fa2*/ 740,
+ /*0x0422*/ 331,
+ /*0x2c22*/ 884,
+ /*0x1ea2*/ 607,
+ /*0x0122*/ 74,
+ /*0x0222*/ 207,
+ /*0x2ca2*/ 929,
+ /*0x1e22*/ 541,
+ /*0x1f0c*/ 658,
+ /*0x10407*/ 1113,
+ /*0x04a2*/ 374,
+ /*0x03f7*/ 291,
+ /*0x0524*/ 439,
+ /*0xa7a2*/ 1058,
+ /*0x1f87*/ 713,
+ /*0x0407*/ 304,
+ /*0x2c07*/ 857,
+ /*0x017d*/ 119,
+ /*0x0587*/ 483,
+ /*0x1f3f*/ 683,
+ /*0x10bf*/ 515,
+ -1,
+ /*0x0196*/ 135,
+ -1,
+ /*0x10402*/ 1108,
+ /*0x03fd*/ 294,
+ /*0x0520*/ 437,
+ -1, -1,
+ /*0x1f82*/ 708,
+ /*0x0402*/ 299,
+ /*0x2c02*/ 852,
+ /*0x1e82*/ 589,
+ /*0x0102*/ 58,
+ /*0x0202*/ 191,
+ /*0x2c82*/ 913,
+ /*0x1e02*/ 525,
+ -1,
+ /*0x053d*/ 457,
+ -1,
+ /*0x1040b*/ 1117,
+ /*0x0190*/ 131,
+ /*0xa782*/ 1045,
+ /*0x1fd7*/ 778,
+ -1,
+ /*0x1f8b*/ 717,
+ /*0x040b*/ 308,
+ /*0x2c0b*/ 861,
+ /*0x054f*/ 475,
+ -1,
+ /*0x1f6f*/ 705,
+ /*0x050a*/ 426,
+ -1, -1,
+ /*0x0057*/ 21,
+ /*0x10404*/ 1110,
+ /*0xa682*/ 989,
+ -1,
+ /*0xa78b*/ 1048,
+ /*0x1f1a*/ 664,
+ /*0x1f84*/ 710,
+ /*0x0404*/ 301,
+ /*0x2c04*/ 854,
+ /*0x1e84*/ 590,
+ /*0x0104*/ 59,
+ /*0x0204*/ 192,
+ /*0x2c84*/ 914,
+ /*0x1e04*/ 526,
+ -1,
+ /*0x00d9*/ 50,
+ /*0x0514*/ 431,
+ -1, -1,
+ /*0xa784*/ 1046,
+ /*0x01d9*/ 169,
+ /*0x1f69*/ 699,
+ /*0x1f59*/ 694,
+ -1,
+ /*0x1faa*/ 748,
+ /*0x042a*/ 339,
+ /*0x2c2a*/ 892,
+ /*0x1eaa*/ 611,
+ /*0x012a*/ 78,
+ /*0x022a*/ 211,
+ /*0x2caa*/ 933,
+ /*0x1e2a*/ 545,
+ /*0x0506*/ 424,
+ /*0xa684*/ 990,
+ /*0x04aa*/ 378,
+ -1,
+ /*0x03aa*/ 266,
+ /*0xa7aa*/ 1062,
+ /*0x01a6*/ 144,
+ /*0x10400*/ 1106,
+ -1,
+ /*0x10a6*/ 490,
+ -1, -1,
+ /*0x1f80*/ 706,
+ /*0x0400*/ 297,
+ /*0x2c00*/ 850,
+ /*0x1e80*/ 588,
+ /*0x0100*/ 57,
+ /*0x0200*/ 190,
+ /*0x2c80*/ 912,
+ /*0x1e00*/ 524,
+ /*0x01a4*/ 143,
+ -1,
+ /*0x0480*/ 361,
+ /*0x10a4*/ 488,
+ -1,
+ /*0xa780*/ 1044,
+ /*0x10413*/ 1125,
+ /*0x1fe3*/ 784,
+ -1,
+ /*0x2c63*/ 899,
+ -1,
+ /*0x1f93*/ 725,
+ /*0x0413*/ 316,
+ /*0x2c13*/ 869,
+ /*0x01a0*/ 141,
+ /*0x1041c*/ 1134,
+ /*0x0522*/ 438,
+ /*0x10a0*/ 484,
+ -1,
+ /*0xa680*/ 988,
+ /*0x1f9c*/ 734,
+ /*0x041c*/ 325,
+ /*0x2c1c*/ 878,
+ /*0x0393*/ 244,
+ /*0x011c*/ 71,
+ /*0x021c*/ 204,
+ /*0x2c9c*/ 926,
+ /*0x1e1c*/ 538,
+ /*0x1f3d*/ 681,
+ /*0x10bd*/ 513,
+ /*0x049c*/ 371,
+ /*0x00cf*/ 41,
+ /*0x039c*/ 253,
+ /*0xa79c*/ 1055,
+ -1, -1,
+ /*0x01cf*/ 164,
+ -1, -1,
+ /*0x018a*/ 127,
+ -1,
+ /*0x1f0a*/ 656,
+ /*0x1041e*/ 1136,
+ /*0x037f*/ 233,
+ -1,
+ /*0x0502*/ 422,
+ -1,
+ /*0x1f9e*/ 736,
+ /*0x041e*/ 327,
+ /*0x2c1e*/ 880,
+ /*0x1e9e*/ 605,
+ /*0x011e*/ 72,
+ /*0x021e*/ 205,
+ /*0x2c9e*/ 927,
+ /*0x1e1e*/ 539,
+ -1,
+ /*0x10408*/ 1114,
+ /*0x049e*/ 372,
+ /*0x0194*/ 134,
+ /*0x039e*/ 255,
+ /*0xa79e*/ 1056,
+ /*0x1f88*/ 714,
+ /*0x0408*/ 305,
+ /*0x2c08*/ 858,
+ /*0x1e88*/ 592,
+ /*0x0108*/ 61,
+ /*0x0208*/ 194,
+ /*0x2c88*/ 916,
+ /*0x1e08*/ 528,
+ /*0x0535*/ 449,
+ /*0x118bf*/ 1177,
+ -1,
+ /*0x1fdb*/ 782,
+ /*0x0388*/ 235,
+ /*0x0186*/ 124,
+ -1,
+ /*0x0504*/ 423,
+ /*0x1fac*/ 750,
+ /*0x042c*/ 341,
+ /*0x2c2c*/ 894,
+ /*0x1eac*/ 612,
+ /*0x012c*/ 79,
+ /*0x022c*/ 212,
+ /*0x2cac*/ 934,
+ /*0x1e2c*/ 546,
+ -1,
+ /*0x1040d*/ 1119,
+ /*0x04ac*/ 379,
+ /*0xa688*/ 992,
+ -1,
+ /*0xa7ac*/ 1064,
+ /*0x1f8d*/ 719,
+ /*0x040d*/ 310,
+ /*0x2c0d*/ 863,
+ /*0x052a*/ 442,
+ /*0x1fa8*/ 746,
+ /*0x0428*/ 337,
+ /*0x2c28*/ 890,
+ /*0x1ea8*/ 610,
+ /*0x0128*/ 77,
+ /*0x0228*/ 210,
+ /*0x2ca8*/ 932,
+ /*0x1e28*/ 544,
+ -1,
+ /*0xa78d*/ 1049,
+ /*0x04a8*/ 377,
+ /*0x24bf*/ 833,
+ /*0x03a8*/ 264,
+ /*0xa7a8*/ 1061,
+ /*0x01f7*/ 185,
+ /*0x01a2*/ 142,
+ -1, -1,
+ /*0x10a2*/ 486,
+ /*0x0500*/ 421,
+ /*0x1fae*/ 752,
+ /*0x042e*/ 343,
+ /*0x2c2e*/ 896,
+ /*0x1eae*/ 613,
+ /*0x012e*/ 80,
+ /*0x022e*/ 213,
+ /*0x2cae*/ 935,
+ /*0x1e2e*/ 547,
+ /*0x1fb2*/ 754,
+ /*0x0187*/ 125,
+ /*0x04ae*/ 380,
+ /*0x1eb2*/ 615,
+ /*0x0132*/ 81,
+ /*0x0232*/ 215,
+ /*0x2cb2*/ 937,
+ /*0x1e32*/ 549,
+ /*0x1fba*/ 761,
+ -1,
+ /*0x04b2*/ 382,
+ /*0x1eba*/ 619,
+ /*0xff26*/ 1085,
+ /*0x023a*/ 216,
+ /*0x2cba*/ 941,
+ /*0x1e3a*/ 553,
+ /*0x0182*/ 122,
+ /*0x1fb8*/ 759,
+ /*0x04ba*/ 386,
+ /*0x051c*/ 435,
+ /*0x1eb8*/ 618,
+ -1,
+ /*0x118a6*/ 1152,
+ /*0x2cb8*/ 940,
+ /*0x1e38*/ 552,
+ -1,
+ /*0xff24*/ 1083,
+ /*0x04b8*/ 385,
+ -1, -1,
+ /*0x01d7*/ 168,
+ /*0xfb17*/ 1079,
+ /*0x018b*/ 128,
+ -1,
+ /*0x1f0b*/ 657,
+ /*0x00b5*/ 25,
+ /*0x118a4*/ 1150,
+ -1, -1, -1,
+ /*0x01b5*/ 153,
+ /*0x1fec*/ 792,
+ /*0x046c*/ 351,
+ /*0x10b5*/ 505,
+ /*0x1eec*/ 644,
+ /*0x016c*/ 110,
+ /*0x051e*/ 436,
+ /*0x0184*/ 123,
+ /*0x1e6c*/ 578,
+ -1,
+ /*0x118a0*/ 1146,
+ /*0x04ec*/ 411,
+ /*0x1fca*/ 772,
+ /*0x03ec*/ 285,
+ -1,
+ /*0x1eca*/ 627,
+ /*0x014a*/ 93,
+ /*0x024a*/ 226,
+ /*0x2cca*/ 949,
+ /*0x1e4a*/ 561,
+ /*0x0508*/ 425,
+ -1,
+ /*0x118bd*/ 1175,
+ /*0x004a*/ 8,
+ -1, -1,
+ /*0x1fcc*/ 774,
+ /*0x1f2a*/ 670,
+ /*0x10aa*/ 494,
+ /*0x1ecc*/ 628,
+ /*0x014c*/ 94,
+ /*0x024c*/ 227,
+ /*0x2ccc*/ 950,
+ /*0x1e4c*/ 562,
+ -1, -1,
+ /*0x052c*/ 443,
+ /*0x004c*/ 10,
+ -1,
+ /*0xfb16*/ 1078,
+ /*0x1fd6*/ 777,
+ /*0xa726*/ 1004,
+ -1,
+ /*0x1ed6*/ 633,
+ /*0x0156*/ 99,
+ -1,
+ /*0x2cd6*/ 955,
+ /*0x1e56*/ 567,
+ -1, -1,
+ /*0x04d6*/ 400,
+ /*0x0056*/ 20,
+ /*0x03d6*/ 274,
+ -1,
+ /*0x0528*/ 441,
+ /*0xa724*/ 1003,
+ -1, -1,
+ /*0x24bd*/ 831,
+ /*0x1fe2*/ 783,
+ /*0x0462*/ 346,
+ /*0x2c62*/ 898,
+ /*0x1ee2*/ 639,
+ /*0x0162*/ 105,
+ /*0x0193*/ 133,
+ /*0x2ce2*/ 961,
+ /*0x1e62*/ 573,
+ -1,
+ /*0x24cf*/ 849,
+ /*0x04e2*/ 406,
+ -1,
+ /*0x03e2*/ 280,
+ /*0x10415*/ 1127,
+ /*0x019c*/ 138,
+ /*0x052e*/ 444,
+ /*0x1f1c*/ 666,
+ -1,
+ /*0x1f95*/ 727,
+ /*0x0415*/ 318,
+ /*0x2c15*/ 871,
+ /*0x1fc8*/ 770,
+ -1,
+ /*0x0532*/ 446,
+ /*0x1ec8*/ 626,
+ -1,
+ /*0x0248*/ 225,
+ /*0x2cc8*/ 948,
+ /*0x1e48*/ 560,
+ /*0x10401*/ 1107,
+ /*0x0395*/ 246,
+ /*0x053a*/ 454,
+ /*0x0048*/ 7,
+ -1,
+ /*0x1f81*/ 707,
+ /*0x0401*/ 298,
+ /*0x2c01*/ 851,
+ /*0xff22*/ 1081,
+ /*0x2165*/ 812,
+ /*0x1feb*/ 791,
+ /*0x0538*/ 452,
+ /*0x2c6b*/ 903,
+ /*0x2161*/ 808,
+ /*0x1fc4*/ 767,
+ -1,
+ /*0x2ceb*/ 962,
+ /*0x1ec4*/ 624,
+ /*0x118a2*/ 1148,
+ /*0x0244*/ 222,
+ /*0x2cc4*/ 946,
+ /*0x1e44*/ 558,
+ -1, -1,
+ /*0x1fd3*/ 776,
+ /*0x0044*/ 3,
+ /*0x1fea*/ 790,
+ /*0x046a*/ 350,
+ /*0x1f08*/ 654,
+ /*0x1eea*/ 643,
+ /*0x016a*/ 109,
+ -1,
+ /*0x00db*/ 52,
+ /*0x1e6a*/ 577,
+ /*0xa77b*/ 1041,
+ /*0x0053*/ 17,
+ /*0x04ea*/ 410,
+ /*0x01db*/ 170,
+ /*0x03ea*/ 284,
+ /*0x1f5b*/ 695,
+ -1, -1,
+ /*0x01ac*/ 147,
+ -1,
+ /*0x1f2c*/ 672,
+ /*0x10ac*/ 496,
+ /*0x054a*/ 470,
+ /*0x1fe8*/ 788,
+ /*0x0468*/ 349,
+ -1,
+ /*0x1ee8*/ 642,
+ /*0x0168*/ 108,
+ -1, -1,
+ /*0x1e68*/ 576,
+ -1, -1,
+ /*0x04e8*/ 409,
+ /*0x1f0d*/ 659,
+ /*0x03e8*/ 283,
+ /*0x054c*/ 472,
+ /*0xff35*/ 1100,
+ /*0x1f28*/ 668,
+ /*0x10a8*/ 492,
+ -1, -1,
+ /*0x1fe4*/ 785,
+ /*0x0464*/ 347,
+ /*0x2c64*/ 900,
+ /*0x1ee4*/ 640,
+ /*0x0164*/ 106,
+ /*0x118b5*/ 1167,
+ -1,
+ /*0x1e64*/ 574,
+ /*0x0556*/ 482,
+ -1,
+ /*0x04e4*/ 407,
+ /*0xa722*/ 1002,
+ /*0x03e4*/ 281,
+ -1,
+ /*0x01ae*/ 148,
+ /*0x216f*/ 822,
+ /*0x1f2e*/ 674,
+ /*0x10ae*/ 498,
+ -1, -1,
+ /*0xff2a*/ 1089,
+ -1,
+ /*0x01b2*/ 151,
+ -1,
+ /*0xa77d*/ 1042,
+ /*0x10b2*/ 502,
+ -1,
+ /*0xfb14*/ 1076,
+ /*0x1fbc*/ 763,
+ -1,
+ /*0x118aa*/ 1156,
+ /*0x1ebc*/ 620,
+ /*0x1f3a*/ 678,
+ /*0x10ba*/ 510,
+ /*0x2cbc*/ 942,
+ /*0x1e3c*/ 554,
+ -1, -1,
+ /*0x04bc*/ 387,
+ /*0x01b8*/ 155,
+ /*0x2169*/ 816,
+ /*0x1f38*/ 676,
+ /*0x10b8*/ 508,
+ /*0xfb06*/ 1074,
+ /*0x0460*/ 345,
+ /*0x2c60*/ 897,
+ /*0x1ee0*/ 638,
+ /*0x0160*/ 104,
+ /*0x0548*/ 468,
+ /*0x2ce0*/ 960,
+ /*0x1e60*/ 572,
+ -1, -1,
+ /*0x04e0*/ 405,
+ -1,
+ /*0x03e0*/ 279,
+ -1, -1, -1,
+ /*0x2126*/ 803,
+ -1,
+ /*0x1fbe*/ 764,
+ -1,
+ /*0x01ec*/ 178,
+ /*0x1ebe*/ 621,
+ /*0x1f6c*/ 702,
+ /*0x023e*/ 219,
+ /*0x2cbe*/ 943,
+ /*0x1e3e*/ 555,
+ /*0x00ca*/ 36,
+ /*0x0544*/ 464,
+ /*0x04be*/ 388,
+ /*0x1ffc*/ 802,
+ /*0x047c*/ 359,
+ /*0x01ca*/ 161,
+ /*0x1efc*/ 652,
+ /*0x1f4a*/ 686,
+ -1, -1,
+ /*0x1e7c*/ 586,
+ /*0x0553*/ 479,
+ /*0x1fb6*/ 757,
+ /*0x04fc*/ 419,
+ /*0x00cc*/ 38,
+ /*0x1eb6*/ 617,
+ /*0x0136*/ 83,
+ -1,
+ /*0x2cb6*/ 939,
+ /*0x1e36*/ 551,
+ /*0xa72a*/ 1006,
+ /*0x1f4c*/ 688,
+ /*0x04b6*/ 384,
+ /*0x1fd2*/ 775,
+ -1, -1,
+ /*0x1ed2*/ 631,
+ /*0x0152*/ 97,
+ /*0x00d6*/ 48,
+ /*0x2cd2*/ 953,
+ /*0x1e52*/ 565,
+ -1, -1,
+ /*0x04d2*/ 398,
+ /*0x0052*/ 16,
+ /*0x1f56*/ 693,
+ -1, -1, -1,
+ /*0xfb02*/ 1070,
+ /*0x1ed0*/ 630,
+ /*0x0150*/ 96,
+ -1,
+ /*0x2cd0*/ 952,
+ /*0x1e50*/ 564,
+ -1, -1,
+ /*0x04d0*/ 397,
+ /*0x0050*/ 14,
+ /*0x03d0*/ 271,
+ -1,
+ /*0x1fda*/ 781,
+ /*0x01e2*/ 173,
+ -1,
+ /*0x1eda*/ 635,
+ /*0x015a*/ 101,
+ /*0xff2c*/ 1091,
+ /*0x2cda*/ 957,
+ /*0x1e5a*/ 569,
+ -1,
+ /*0xa66c*/ 987,
+ /*0x04da*/ 402,
+ /*0x005a*/ 24,
+ /*0x03da*/ 276,
+ -1,
+ /*0x2c6d*/ 904,
+ /*0x118ac*/ 1158,
+ -1,
+ /*0x00c8*/ 34,
+ /*0x2ced*/ 963,
+ /*0xfb04*/ 1072,
+ /*0xa64a*/ 970,
+ -1,
+ /*0x01c8*/ 160,
+ /*0xff28*/ 1087,
+ /*0x1f48*/ 684,
+ /*0x1fc2*/ 765,
+ -1, -1,
+ /*0x1ec2*/ 623,
+ -1,
+ /*0x053c*/ 456,
+ /*0x2cc2*/ 945,
+ /*0x1e42*/ 557,
+ /*0x118a8*/ 1154,
+ /*0xa64c*/ 971,
+ /*0x0181*/ 121,
+ /*0x0042*/ 1,
+ /*0x03c2*/ 269,
+ -1,
+ /*0x00c4*/ 30,
+ -1, -1,
+ /*0x1f6b*/ 701,
+ /*0xff2e*/ 1093,
+ /*0x01c4*/ 157,
+ -1,
+ /*0x2167*/ 814,
+ /*0x10c4*/ 520,
+ /*0xa656*/ 976,
+ /*0x00d3*/ 45,
+ -1,
+ /*0xff32*/ 1097,
+ -1,
+ /*0x118ae*/ 1160,
+ /*0x01d3*/ 166,
+ -1,
+ /*0x01ea*/ 177,
+ /*0xfb00*/ 1068,
+ /*0x1f6a*/ 700,
+ /*0xff3a*/ 1105,
+ -1,
+ /*0x118b2*/ 1164,
+ -1,
+ /*0x053e*/ 458,
+ /*0x0145*/ 90,
+ /*0x0245*/ 223,
+ -1,
+ /*0xa662*/ 982,
+ /*0xff38*/ 1103,
+ /*0x118ba*/ 1172,
+ /*0x04c5*/ 392,
+ /*0x0045*/ 4,
+ -1, -1,
+ /*0xa72c*/ 1007,
+ -1,
+ /*0xfb13*/ 1075,
+ /*0x01e8*/ 176,
+ /*0x118b8*/ 1170,
+ /*0x1f68*/ 698,
+ -1, -1, -1,
+ /*0x0536*/ 450,
+ /*0x046e*/ 352,
+ /*0x2c6e*/ 905,
+ /*0x1eee*/ 645,
+ /*0x016e*/ 111,
+ /*0xa648*/ 969,
+ -1,
+ /*0x1e6e*/ 579,
+ -1,
+ /*0xa728*/ 1005,
+ /*0x04ee*/ 412,
+ /*0x0552*/ 478,
+ /*0x03ee*/ 286,
+ /*0x01e4*/ 174,
+ /*0x1fe6*/ 786,
+ /*0x0466*/ 348,
+ /*0x1ff9*/ 799,
+ /*0x1ee6*/ 641,
+ /*0x0166*/ 107,
+ -1,
+ /*0x0179*/ 117,
+ /*0x1e66*/ 575,
+ /*0x24ba*/ 828,
+ -1,
+ /*0x04e6*/ 408,
+ /*0x0550*/ 476,
+ /*0x03e6*/ 282,
+ /*0xa644*/ 967,
+ /*0x03f9*/ 292,
+ /*0xa72e*/ 1008,
+ -1,
+ /*0x24b8*/ 826,
+ /*0x1ece*/ 629,
+ /*0x014e*/ 95,
+ /*0x024e*/ 228,
+ /*0x2cce*/ 951,
+ /*0x1e4e*/ 563,
+ /*0xa732*/ 1009,
+ -1,
+ /*0xa66a*/ 986,
+ /*0x004e*/ 12,
+ /*0x01bc*/ 156,
+ -1,
+ /*0x1f3c*/ 680,
+ /*0x10bc*/ 512,
+ /*0xa73a*/ 1013,
+ /*0x1fc6*/ 768,
+ -1, -1,
+ /*0x1ec6*/ 625,
+ -1,
+ /*0x0246*/ 224,
+ /*0x2cc6*/ 947,
+ /*0x1e46*/ 559,
+ /*0xa738*/ 1012,
+ -1,
+ /*0x01e0*/ 172,
+ /*0x0046*/ 5,
+ /*0x212a*/ 804,
+ -1,
+ /*0xa668*/ 985,
+ /*0x1fa9*/ 747,
+ /*0x0429*/ 338,
+ /*0x2c29*/ 891,
+ /*0x0542*/ 462,
+ -1,
+ /*0x24ca*/ 844,
+ /*0x1ed4*/ 632,
+ /*0x0154*/ 98,
+ -1,
+ /*0x2cd4*/ 954,
+ /*0x1e54*/ 566,
+ -1,
+ /*0x03a9*/ 265,
+ /*0x04d4*/ 399,
+ /*0x0054*/ 18,
+ /*0x1f3e*/ 682,
+ /*0x10be*/ 514,
+ /*0xa76c*/ 1038,
+ /*0xa664*/ 983,
+ /*0x24cc*/ 846,
+ -1,
+ /*0x04cd*/ 396,
+ /*0x004d*/ 11,
+ /*0x1fd8*/ 779,
+ /*0x01fc*/ 188,
+ -1,
+ /*0x1ed8*/ 634,
+ /*0x0158*/ 100,
+ /*0xa74a*/ 1021,
+ /*0x2cd8*/ 956,
+ /*0x1e58*/ 568,
+ -1,
+ /*0x2163*/ 810,
+ /*0x04d8*/ 401,
+ /*0x0058*/ 22,
+ /*0x03d8*/ 275,
+ /*0x10b6*/ 506,
+ /*0x1ec0*/ 622,
+ /*0x0545*/ 465,
+ /*0x00d2*/ 44,
+ /*0x2cc0*/ 944,
+ /*0x1e40*/ 556,
+ /*0xa74c*/ 1022,
+ -1,
+ /*0x04c0*/ 389,
+ /*0x1fb4*/ 756,
+ /*0x1f52*/ 691,
+ -1,
+ /*0x1eb4*/ 616,
+ /*0x0134*/ 82,
+ -1,
+ /*0x2cb4*/ 938,
+ /*0x1e34*/ 550,
+ /*0x00d0*/ 42,
+ -1,
+ /*0x04b4*/ 383,
+ /*0xa756*/ 1027,
+ -1,
+ /*0x1fb7*/ 758,
+ -1,
+ /*0x1f50*/ 690,
+ /*0xa660*/ 981,
+ /*0x1eb0*/ 614,
+ /*0x0130*/ 1179,
+ /*0x0230*/ 214,
+ /*0x2cb0*/ 936,
+ /*0x1e30*/ 548,
+ /*0x00da*/ 51,
+ -1,
+ /*0x04b0*/ 381,
+ -1,
+ /*0x03b0*/ 268,
+ /*0xa7b0*/ 1066,
+ /*0x24c8*/ 842,
+ -1,
+ /*0xa762*/ 1033,
+ /*0x1ede*/ 637,
+ /*0x015e*/ 103,
+ /*0x1fb9*/ 760,
+ /*0x2cde*/ 959,
+ /*0x1e5e*/ 571,
+ -1,
+ /*0x0139*/ 84,
+ /*0x04de*/ 404,
+ -1,
+ /*0x03de*/ 278,
+ /*0x1f6d*/ 703,
+ /*0x1fc7*/ 769,
+ /*0x0345*/ 229,
+ /*0x1fbb*/ 762,
+ /*0x054e*/ 474,
+ /*0x0147*/ 91,
+ /*0x00c2*/ 28,
+ /*0x013b*/ 85,
+ /*0x023b*/ 217,
+ /*0x24c4*/ 838,
+ /*0xa748*/ 1020,
+ /*0x04c7*/ 393,
+ /*0x0047*/ 6,
+ -1,
+ /*0x10c2*/ 518,
+ /*0x1fab*/ 749,
+ /*0x042b*/ 340,
+ /*0x2c2b*/ 893,
+ /*0x0055*/ 19,
+ /*0x03d5*/ 273,
+ -1,
+ /*0x0546*/ 466,
+ -1, -1,
+ /*0xa652*/ 974,
+ /*0x1fc3*/ 766,
+ -1,
+ /*0x03ab*/ 267,
+ /*0xa7ab*/ 1063,
+ /*0x0143*/ 89,
+ /*0x0243*/ 221,
+ -1,
+ /*0xa744*/ 1018,
+ -1, -1,
+ /*0x04c3*/ 391,
+ /*0x0043*/ 2,
+ -1,
+ /*0xa650*/ 973,
+ /*0x0554*/ 480,
+ -1,
+ /*0x00c5*/ 31,
+ -1, -1,
+ /*0xa76a*/ 1037,
+ -1,
+ /*0x01c5*/ 158,
+ /*0x054d*/ 473,
+ -1,
+ /*0x10c5*/ 521,
+ -1, -1,
+ /*0xa65a*/ 978,
+ /*0x118bc*/ 1174,
+ /*0x1ff2*/ 793,
+ /*0x0472*/ 354,
+ /*0x2c72*/ 908,
+ /*0x1ef2*/ 647,
+ /*0x0172*/ 113,
+ -1,
+ /*0x2cf2*/ 964,
+ /*0x1e72*/ 581,
+ /*0x2132*/ 806,
+ -1,
+ /*0x04f2*/ 414,
+ /*0xa768*/ 1036,
+ /*0x1faf*/ 753,
+ /*0x042f*/ 344,
+ -1,
+ /*0x01ee*/ 179,
+ /*0x0540*/ 460,
+ /*0x1f6e*/ 704,
+ -1,
+ /*0x10427*/ 1145,
+ -1,
+ /*0xfb15*/ 1077,
+ -1,
+ /*0xa642*/ 966,
+ /*0x1fa7*/ 745,
+ /*0x0427*/ 336,
+ /*0x2c27*/ 889,
+ /*0x0534*/ 448,
+ -1,
+ /*0x01e6*/ 175,
+ /*0xa764*/ 1034,
+ -1,
+ /*0x118be*/ 1176,
+ -1, -1,
+ /*0x24bc*/ 830,
+ /*0x03a7*/ 263,
+ /*0xfb01*/ 1069,
+ -1,
+ /*0x00ce*/ 40,
+ /*0x0537*/ 451,
+ -1,
+ /*0xff36*/ 1101,
+ -1,
+ /*0x1edc*/ 636,
+ /*0x015c*/ 102,
+ -1,
+ /*0x2cdc*/ 958,
+ /*0x1e5c*/ 570,
+ /*0x216c*/ 819,
+ -1,
+ /*0x04dc*/ 403,
+ /*0x118b6*/ 1168,
+ /*0x03dc*/ 277,
+ -1,
+ /*0x1fcb*/ 773,
+ /*0x00c6*/ 32,
+ -1,
+ /*0xa73c*/ 1014,
+ /*0x1fb3*/ 755,
+ /*0x0539*/ 453,
+ /*0x0470*/ 353,
+ /*0x2c70*/ 907,
+ /*0x1ef0*/ 646,
+ /*0x0170*/ 112,
+ /*0x04cb*/ 395,
+ /*0x004b*/ 9,
+ /*0x1e70*/ 580,
+ /*0x24be*/ 832,
+ /*0x0547*/ 467,
+ /*0x04f0*/ 413,
+ /*0x053b*/ 455,
+ /*0x03f0*/ 287,
+ /*0xa760*/ 1032,
+ /*0x00d4*/ 46,
+ /*0x0555*/ 481,
+ /*0x01a9*/ 146,
+ -1,
+ /*0x1f29*/ 669,
+ /*0x10a9*/ 493,
+ -1,
+ /*0x1f54*/ 692,
+ /*0x00cd*/ 39,
+ /*0x1fad*/ 751,
+ /*0x042d*/ 342,
+ /*0x2c2d*/ 895,
+ -1,
+ /*0x01cd*/ 163,
+ /*0x24b6*/ 824,
+ /*0x1f4d*/ 689,
+ /*0x10cd*/ 523,
+ /*0xa73e*/ 1015,
+ -1,
+ /*0x0543*/ 463,
+ /*0x00d8*/ 49,
+ /*0xa666*/ 984,
+ /*0xa7ad*/ 1065,
+ /*0x047e*/ 360,
+ /*0x2c7e*/ 910,
+ /*0x1efe*/ 653,
+ -1,
+ /*0xa7b1*/ 1067,
+ -1,
+ /*0x1e7e*/ 587,
+ -1,
+ /*0x00c0*/ 26,
+ /*0x04fe*/ 420,
+ /*0x2162*/ 809,
+ /*0x03fe*/ 295,
+ -1,
+ /*0xa64e*/ 972,
+ /*0xa736*/ 1011,
+ -1,
+ /*0x10c0*/ 516,
+ -1, -1,
+ /*0x1ff4*/ 795,
+ /*0x0474*/ 355,
+ -1,
+ /*0x1ef4*/ 648,
+ /*0x0174*/ 114,
+ -1,
+ /*0xa752*/ 1025,
+ /*0x1e74*/ 582,
+ /*0x10b4*/ 504,
+ /*0x10403*/ 1109,
+ /*0x04f4*/ 415,
+ /*0xa646*/ 968,
+ /*0x03f4*/ 289,
+ /*0x1fc9*/ 771,
+ /*0x1f83*/ 709,
+ /*0x0403*/ 300,
+ /*0x2c03*/ 853,
+ /*0x0149*/ 92,
+ /*0x01b7*/ 154,
+ -1,
+ /*0xa750*/ 1024,
+ /*0x10b7*/ 507,
+ /*0x10b0*/ 500,
+ /*0x04c9*/ 394,
+ /*0x0049*/ 1178,
+ /*0x0141*/ 88,
+ /*0x0241*/ 220,
+ -1,
+ /*0x00de*/ 55,
+ /*0xa654*/ 975,
+ /*0x216b*/ 818,
+ /*0x04c1*/ 390,
+ /*0x0041*/ 0,
+ /*0x01de*/ 171,
+ /*0xa75a*/ 1029,
+ -1,
+ /*0x24c2*/ 836,
+ -1,
+ /*0x10425*/ 1143,
+ -1,
+ /*0x1f39*/ 677,
+ /*0x10b9*/ 509,
+ /*0x00c7*/ 33,
+ /*0x1fa5*/ 743,
+ /*0x0425*/ 334,
+ /*0x2c25*/ 887,
+ /*0x216a*/ 817,
+ /*0x01c7*/ 159,
+ /*0x00d5*/ 47,
+ /*0xa658*/ 977,
+ /*0x10c7*/ 522,
+ /*0x1f3b*/ 679,
+ /*0x10bb*/ 511,
+ /*0x01d5*/ 167,
+ -1,
+ /*0x03a5*/ 261,
+ /*0x0372*/ 231,
+ -1, -1,
+ /*0xa742*/ 1017,
+ /*0xa640*/ 965,
+ /*0x054b*/ 471,
+ -1,
+ /*0x1f2b*/ 671,
+ /*0x10ab*/ 495,
+ /*0x0533*/ 447,
+ /*0x00c3*/ 29,
+ /*0x2168*/ 815,
+ -1, -1,
+ /*0x10423*/ 1141,
+ /*0x24c5*/ 839,
+ -1,
+ /*0x10421*/ 1139,
+ /*0x10c3*/ 519,
+ /*0x1fa3*/ 741,
+ /*0x0423*/ 332,
+ /*0x2c23*/ 885,
+ /*0x1fa1*/ 739,
+ /*0x0421*/ 330,
+ /*0x2c21*/ 883,
+ -1, -1, -1, -1, -1,
+ /*0x2164*/ 811,
+ /*0x03a3*/ 259,
+ /*0x1ff6*/ 796,
+ /*0x0476*/ 356,
+ /*0x03a1*/ 258,
+ /*0x1ef6*/ 649,
+ /*0x0176*/ 115,
+ -1,
+ /*0x0531*/ 445,
+ /*0x1e76*/ 583,
+ -1, -1,
+ /*0x04f6*/ 416,
+ /*0xa65e*/ 980,
+ /*0x01f2*/ 182,
+ /*0x1ffa*/ 800,
+ /*0x047a*/ 358,
+ -1,
+ /*0x1efa*/ 651,
+ -1,
+ /*0x0051*/ 15,
+ /*0x03d1*/ 272,
+ /*0x1e7a*/ 585,
+ /*0xff29*/ 1088,
+ -1,
+ /*0x04fa*/ 418,
+ /*0x01af*/ 149,
+ /*0x03fa*/ 293,
+ /*0x1f2f*/ 675,
+ /*0x10af*/ 499,
+ /*0x0370*/ 230,
+ /*0xa76e*/ 1039,
+ -1,
+ /*0x118a9*/ 1155,
+ -1, -1, -1,
+ /*0x24ce*/ 848,
+ /*0x01a7*/ 145,
+ -1, -1,
+ /*0x10a7*/ 491,
+ -1,
+ /*0x2160*/ 807,
+ -1,
+ /*0xa766*/ 1035,
+ -1,
+ /*0xa779*/ 1040,
+ -1,
+ /*0x0549*/ 469,
+ /*0x00dc*/ 53,
+ -1,
+ /*0x1ff8*/ 798,
+ /*0x0478*/ 357,
+ /*0x24c6*/ 840,
+ /*0x1ef8*/ 650,
+ /*0x0178*/ 116,
+ /*0x0541*/ 461,
+ -1,
+ /*0x1e78*/ 584,
+ /*0xa74e*/ 1023,
+ -1,
+ /*0x04f8*/ 417,
+ -1,
+ /*0x00cb*/ 37,
+ -1, -1, -1,
+ /*0xff34*/ 1099,
+ /*0x01cb*/ 162,
+ -1,
+ /*0x1f4b*/ 687,
+ -1,
+ /*0x01b3*/ 152,
+ /*0x01f0*/ 180,
+ -1,
+ /*0x10b3*/ 503,
+ /*0xa746*/ 1019,
+ /*0x118b4*/ 1166,
+ /*0x1041d*/ 1135,
+ /*0x24cd*/ 847,
+ /*0xff37*/ 1102,
+ /*0xff30*/ 1095,
+ /*0x10405*/ 1111,
+ /*0x1f9d*/ 735,
+ /*0x041d*/ 326,
+ /*0x2c1d*/ 879,
+ -1,
+ /*0x1f85*/ 711,
+ /*0x0405*/ 302,
+ /*0x2c05*/ 855,
+ /*0x118b7*/ 1169,
+ /*0x118b0*/ 1162,
+ -1, -1,
+ /*0xa754*/ 1026,
+ /*0x039d*/ 254,
+ -1, -1,
+ /*0x1f2d*/ 673,
+ /*0x10ad*/ 497,
+ /*0xff39*/ 1104,
+ /*0x01b1*/ 150,
+ /*0x24c0*/ 834,
+ -1,
+ /*0x10b1*/ 501,
+ -1, -1, -1, -1,
+ /*0x01fe*/ 189,
+ /*0x118b9*/ 1171,
+ /*0x1041b*/ 1133,
+ -1, -1,
+ /*0xa758*/ 1028,
+ -1,
+ /*0x1f9b*/ 733,
+ /*0x041b*/ 324,
+ /*0x2c1b*/ 877,
+ /*0x1e9b*/ 604,
+ /*0xa65c*/ 979,
+ /*0x118bb*/ 1173,
+ -1,
+ /*0xff2b*/ 1090,
+ -1,
+ /*0xa740*/ 1016,
+ /*0x24b7*/ 825,
+ -1,
+ /*0x039b*/ 252,
+ /*0x01f4*/ 183,
+ /*0x0551*/ 477,
+ /*0x216d*/ 820,
+ -1,
+ /*0x118ab*/ 1157,
+ /*0x10419*/ 1131,
+ -1,
+ /*0xa734*/ 1010,
+ /*0x00c9*/ 35,
+ -1,
+ /*0x1f99*/ 731,
+ /*0x0419*/ 322,
+ /*0x2c19*/ 875,
+ /*0x1e99*/ 602,
+ -1,
+ /*0x1f49*/ 685,
+ /*0x00c1*/ 27,
+ /*0x24b9*/ 827,
+ -1, -1, -1, -1,
+ /*0x0399*/ 250,
+ -1,
+ /*0x10c1*/ 517,
+ /*0x1040f*/ 1121,
+ /*0x24c7*/ 841,
+ -1,
+ /*0x24bb*/ 829,
+ -1,
+ /*0x1f8f*/ 721,
+ /*0x040f*/ 312,
+ /*0x2c0f*/ 865,
+ -1,
+ /*0x10409*/ 1115,
+ /*0xa75e*/ 1031,
+ -1, -1, -1,
+ /*0x1f89*/ 715,
+ /*0x0409*/ 306,
+ /*0x2c09*/ 859,
+ /*0x038f*/ 240,
+ -1,
+ /*0x0376*/ 232,
+ /*0xff2f*/ 1094,
+ /*0x10a5*/ 489,
+ /*0x1041f*/ 1137,
+ -1, -1,
+ /*0x24c3*/ 837,
+ /*0x0389*/ 236,
+ /*0x1f9f*/ 737,
+ /*0x041f*/ 328,
+ /*0x2c1f*/ 881,
+ /*0x118af*/ 1161,
+ -1,
+ /*0xff27*/ 1086,
+ -1, -1, -1, -1, -1,
+ /*0x10411*/ 1123,
+ /*0x039f*/ 256,
+ -1, -1,
+ /*0x118a7*/ 1153,
+ /*0x1f91*/ 723,
+ /*0x0411*/ 314,
+ /*0x2c11*/ 867,
+ /*0x2183*/ 823,
+ -1,
+ /*0x216e*/ 821,
+ -1, -1, -1, -1,
+ /*0x10a3*/ 487,
+ -1,
+ /*0x0391*/ 242,
+ /*0x10a1*/ 485,
+ -1, -1, -1, -1, -1,
+ /*0x2166*/ 813,
+ /*0x01f6*/ 184,
+ -1,
+ /*0x00d1*/ 43,
+ -1,
+ /*0xff33*/ 1098,
+ -1, -1,
+ /*0x01d1*/ 165,
+ -1, -1, -1, -1, -1,
+ /*0x01fa*/ 187,
+ /*0x118b3*/ 1165,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1,
+ /*0xff2d*/ 1092,
+ -1, -1, -1, -1,
+ /*0xff31*/ 1096,
+ -1, -1, -1, -1,
+ /*0x118ad*/ 1159,
+ -1, -1, -1, -1,
+ /*0x118b1*/ 1163,
+ -1, -1,
+ /*0x24cb*/ 845,
+ -1, -1, -1,
+ /*0x01f8*/ 186,
+ -1, -1, -1, -1,
+ /*0xa75c*/ 1030,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1,
+ /*0x019d*/ 139,
+ -1,
+ /*0x1f1d*/ 667,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1,
+ /*0xff25*/ 1084,
+ -1, -1, -1, -1, -1,
+ /*0xa77e*/ 1043,
+ -1, -1, -1,
+ /*0x118a5*/ 1151,
+ -1, -1,
+ /*0x1f1b*/ 665,
+ -1, -1,
+ /*0x24c9*/ 843,
+ -1, -1, -1, -1, -1, -1,
+ -1,
+ /*0x24c1*/ 835,
+ -1, -1, -1, -1, -1, -1,
+ -1,
+ /*0xff23*/ 1082,
+ -1, -1,
+ /*0xff21*/ 1080,
+ /*0x1f19*/ 663,
+ -1, -1, -1, -1, -1,
+ /*0x118a3*/ 1149,
+ /*0x212b*/ 805,
+ -1,
+ /*0x118a1*/ 1147,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1,
+ /*0x018f*/ 130,
+ -1,
+ /*0x1f0f*/ 661,
+ -1, -1, -1, -1, -1, -1,
+ /*0x0189*/ 126,
+ -1,
+ /*0x1f09*/ 655,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ /*0x019f*/ 140,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1,
+ /*0x0191*/ 132,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1,
+ /*0xfb03*/ 1071,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1,
+ /*0xfb05*/ 1073
+ };
+
+ if (code <= MAX_CODE_VALUE && code >= MIN_CODE_VALUE)
+ {
+ register int key = onigenc_unicode_CaseFold_11_hash(code);
+
+ if (key <= MAX_HASH_VALUE && key >= 0)
+ {
+ register short s = wordlist[key];
+
+ if (s >= 0 && code1_equal(code, CaseFold_11_Table[s].from))
+ return &CaseFold_11_Table[s].to;
+ }
+ }
+ return 0;
+}
-static const CaseUnfold_12_Type CaseUnfold_12[] = {
- { {0x0061, 0x02be}, {1, {0x1e9a }}},
- { {0x0066, 0x0066}, {1, {0xfb00 }}},
- { {0x0066, 0x0069}, {1, {0xfb01 }}},
- { {0x0066, 0x006c}, {1, {0xfb02 }}},
- { {0x0068, 0x0331}, {1, {0x1e96 }}},
- { {0x006a, 0x030c}, {1, {0x01f0 }}},
- { {0x0073, 0x0073}, {2, {0x00df, 0x1e9e }}},
- { {0x0073, 0x0074}, {2, {0xfb05, 0xfb06 }}},
- { {0x0074, 0x0308}, {1, {0x1e97 }}},
- { {0x0077, 0x030a}, {1, {0x1e98 }}},
- { {0x0079, 0x030a}, {1, {0x1e99 }}},
- { {0x02bc, 0x006e}, {1, {0x0149 }}},
- { {0x03ac, 0x03b9}, {1, {0x1fb4 }}},
- { {0x03ae, 0x03b9}, {1, {0x1fc4 }}},
- { {0x03b1, 0x0342}, {1, {0x1fb6 }}},
- { {0x03b1, 0x03b9}, {2, {0x1fb3, 0x1fbc }}},
- { {0x03b7, 0x0342}, {1, {0x1fc6 }}},
- { {0x03b7, 0x03b9}, {2, {0x1fc3, 0x1fcc }}},
- { {0x03b9, 0x0342}, {1, {0x1fd6 }}},
- { {0x03c1, 0x0313}, {1, {0x1fe4 }}},
- { {0x03c5, 0x0313}, {1, {0x1f50 }}},
- { {0x03c5, 0x0342}, {1, {0x1fe6 }}},
- { {0x03c9, 0x0342}, {1, {0x1ff6 }}},
- { {0x03c9, 0x03b9}, {2, {0x1ff3, 0x1ffc }}},
- { {0x03ce, 0x03b9}, {1, {0x1ff4 }}},
- { {0x0565, 0x0582}, {1, {0x0587 }}},
- { {0x0574, 0x0565}, {1, {0xfb14 }}},
- { {0x0574, 0x056b}, {1, {0xfb15 }}},
- { {0x0574, 0x056d}, {1, {0xfb17 }}},
- { {0x0574, 0x0576}, {1, {0xfb13 }}},
- { {0x057e, 0x0576}, {1, {0xfb16 }}},
- { {0x1f00, 0x03b9}, {2, {0x1f80, 0x1f88 }}},
- { {0x1f01, 0x03b9}, {2, {0x1f81, 0x1f89 }}},
- { {0x1f02, 0x03b9}, {2, {0x1f82, 0x1f8a }}},
- { {0x1f03, 0x03b9}, {2, {0x1f83, 0x1f8b }}},
- { {0x1f04, 0x03b9}, {2, {0x1f84, 0x1f8c }}},
- { {0x1f05, 0x03b9}, {2, {0x1f85, 0x1f8d }}},
- { {0x1f06, 0x03b9}, {2, {0x1f86, 0x1f8e }}},
- { {0x1f07, 0x03b9}, {2, {0x1f87, 0x1f8f }}},
- { {0x1f20, 0x03b9}, {2, {0x1f90, 0x1f98 }}},
- { {0x1f21, 0x03b9}, {2, {0x1f91, 0x1f99 }}},
- { {0x1f22, 0x03b9}, {2, {0x1f92, 0x1f9a }}},
- { {0x1f23, 0x03b9}, {2, {0x1f93, 0x1f9b }}},
- { {0x1f24, 0x03b9}, {2, {0x1f94, 0x1f9c }}},
- { {0x1f25, 0x03b9}, {2, {0x1f95, 0x1f9d }}},
- { {0x1f26, 0x03b9}, {2, {0x1f96, 0x1f9e }}},
- { {0x1f27, 0x03b9}, {2, {0x1f97, 0x1f9f }}},
- { {0x1f60, 0x03b9}, {2, {0x1fa0, 0x1fa8 }}},
- { {0x1f61, 0x03b9}, {2, {0x1fa1, 0x1fa9 }}},
- { {0x1f62, 0x03b9}, {2, {0x1fa2, 0x1faa }}},
- { {0x1f63, 0x03b9}, {2, {0x1fa3, 0x1fab }}},
- { {0x1f64, 0x03b9}, {2, {0x1fa4, 0x1fac }}},
- { {0x1f65, 0x03b9}, {2, {0x1fa5, 0x1fad }}},
- { {0x1f66, 0x03b9}, {2, {0x1fa6, 0x1fae }}},
- { {0x1f67, 0x03b9}, {2, {0x1fa7, 0x1faf }}},
- { {0x1f70, 0x03b9}, {1, {0x1fb2 }}},
- { {0x1f74, 0x03b9}, {1, {0x1fc2 }}},
- { {0x1f7c, 0x03b9}, {1, {0x1ff2 }}},
+static const CaseUnfold_11_Type CaseUnfold_11_Table[] = {
+#define CaseUnfold_11 (*(CaseUnfold_11_Type (*)[1054])(CaseUnfold_11_Table+0))
+ {0x0061, {1, {0x0041}}},
+ {0x0062, {1, {0x0042}}},
+ {0x0063, {1, {0x0043}}},
+ {0x0064, {1, {0x0044}}},
+ {0x0065, {1, {0x0045}}},
+ {0x0066, {1, {0x0046}}},
+ {0x0067, {1, {0x0047}}},
+ {0x0068, {1, {0x0048}}},
+ {0x006a, {1, {0x004a}}},
+ {0x006b, {2, {0x004b, 0x212a}}},
+ {0x006c, {1, {0x004c}}},
+ {0x006d, {1, {0x004d}}},
+ {0x006e, {1, {0x004e}}},
+ {0x006f, {1, {0x004f}}},
+ {0x0070, {1, {0x0050}}},
+ {0x0071, {1, {0x0051}}},
+ {0x0072, {1, {0x0052}}},
+ {0x0073, {2, {0x0053, 0x017f}}},
+ {0x0074, {1, {0x0054}}},
+ {0x0075, {1, {0x0055}}},
+ {0x0076, {1, {0x0056}}},
+ {0x0077, {1, {0x0057}}},
+ {0x0078, {1, {0x0058}}},
+ {0x0079, {1, {0x0059}}},
+ {0x007a, {1, {0x005a}}},
+ {0x00e0, {1, {0x00c0}}},
+ {0x00e1, {1, {0x00c1}}},
+ {0x00e2, {1, {0x00c2}}},
+ {0x00e3, {1, {0x00c3}}},
+ {0x00e4, {1, {0x00c4}}},
+ {0x00e5, {2, {0x00c5, 0x212b}}},
+ {0x00e6, {1, {0x00c6}}},
+ {0x00e7, {1, {0x00c7}}},
+ {0x00e8, {1, {0x00c8}}},
+ {0x00e9, {1, {0x00c9}}},
+ {0x00ea, {1, {0x00ca}}},
+ {0x00eb, {1, {0x00cb}}},
+ {0x00ec, {1, {0x00cc}}},
+ {0x00ed, {1, {0x00cd}}},
+ {0x00ee, {1, {0x00ce}}},
+ {0x00ef, {1, {0x00cf}}},
+ {0x00f0, {1, {0x00d0}}},
+ {0x00f1, {1, {0x00d1}}},
+ {0x00f2, {1, {0x00d2}}},
+ {0x00f3, {1, {0x00d3}}},
+ {0x00f4, {1, {0x00d4}}},
+ {0x00f5, {1, {0x00d5}}},
+ {0x00f6, {1, {0x00d6}}},
+ {0x00f8, {1, {0x00d8}}},
+ {0x00f9, {1, {0x00d9}}},
+ {0x00fa, {1, {0x00da}}},
+ {0x00fb, {1, {0x00db}}},
+ {0x00fc, {1, {0x00dc}}},
+ {0x00fd, {1, {0x00dd}}},
+ {0x00fe, {1, {0x00de}}},
+ {0x00ff, {1, {0x0178}}},
+ {0x0101, {1, {0x0100}}},
+ {0x0103, {1, {0x0102}}},
+ {0x0105, {1, {0x0104}}},
+ {0x0107, {1, {0x0106}}},
+ {0x0109, {1, {0x0108}}},
+ {0x010b, {1, {0x010a}}},
+ {0x010d, {1, {0x010c}}},
+ {0x010f, {1, {0x010e}}},
+ {0x0111, {1, {0x0110}}},
+ {0x0113, {1, {0x0112}}},
+ {0x0115, {1, {0x0114}}},
+ {0x0117, {1, {0x0116}}},
+ {0x0119, {1, {0x0118}}},
+ {0x011b, {1, {0x011a}}},
+ {0x011d, {1, {0x011c}}},
+ {0x011f, {1, {0x011e}}},
+ {0x0121, {1, {0x0120}}},
+ {0x0123, {1, {0x0122}}},
+ {0x0125, {1, {0x0124}}},
+ {0x0127, {1, {0x0126}}},
+ {0x0129, {1, {0x0128}}},
+ {0x012b, {1, {0x012a}}},
+ {0x012d, {1, {0x012c}}},
+ {0x012f, {1, {0x012e}}},
+ {0x0133, {1, {0x0132}}},
+ {0x0135, {1, {0x0134}}},
+ {0x0137, {1, {0x0136}}},
+ {0x013a, {1, {0x0139}}},
+ {0x013c, {1, {0x013b}}},
+ {0x013e, {1, {0x013d}}},
+ {0x0140, {1, {0x013f}}},
+ {0x0142, {1, {0x0141}}},
+ {0x0144, {1, {0x0143}}},
+ {0x0146, {1, {0x0145}}},
+ {0x0148, {1, {0x0147}}},
+ {0x014b, {1, {0x014a}}},
+ {0x014d, {1, {0x014c}}},
+ {0x014f, {1, {0x014e}}},
+ {0x0151, {1, {0x0150}}},
+ {0x0153, {1, {0x0152}}},
+ {0x0155, {1, {0x0154}}},
+ {0x0157, {1, {0x0156}}},
+ {0x0159, {1, {0x0158}}},
+ {0x015b, {1, {0x015a}}},
+ {0x015d, {1, {0x015c}}},
+ {0x015f, {1, {0x015e}}},
+ {0x0161, {1, {0x0160}}},
+ {0x0163, {1, {0x0162}}},
+ {0x0165, {1, {0x0164}}},
+ {0x0167, {1, {0x0166}}},
+ {0x0169, {1, {0x0168}}},
+ {0x016b, {1, {0x016a}}},
+ {0x016d, {1, {0x016c}}},
+ {0x016f, {1, {0x016e}}},
+ {0x0171, {1, {0x0170}}},
+ {0x0173, {1, {0x0172}}},
+ {0x0175, {1, {0x0174}}},
+ {0x0177, {1, {0x0176}}},
+ {0x017a, {1, {0x0179}}},
+ {0x017c, {1, {0x017b}}},
+ {0x017e, {1, {0x017d}}},
+ {0x0180, {1, {0x0243}}},
+ {0x0183, {1, {0x0182}}},
+ {0x0185, {1, {0x0184}}},
+ {0x0188, {1, {0x0187}}},
+ {0x018c, {1, {0x018b}}},
+ {0x0192, {1, {0x0191}}},
+ {0x0195, {1, {0x01f6}}},
+ {0x0199, {1, {0x0198}}},
+ {0x019a, {1, {0x023d}}},
+ {0x019e, {1, {0x0220}}},
+ {0x01a1, {1, {0x01a0}}},
+ {0x01a3, {1, {0x01a2}}},
+ {0x01a5, {1, {0x01a4}}},
+ {0x01a8, {1, {0x01a7}}},
+ {0x01ad, {1, {0x01ac}}},
+ {0x01b0, {1, {0x01af}}},
+ {0x01b4, {1, {0x01b3}}},
+ {0x01b6, {1, {0x01b5}}},
+ {0x01b9, {1, {0x01b8}}},
+ {0x01bd, {1, {0x01bc}}},
+ {0x01bf, {1, {0x01f7}}},
+ {0x01c6, {2, {0x01c4, 0x01c5}}},
+ {0x01c9, {2, {0x01c7, 0x01c8}}},
+ {0x01cc, {2, {0x01ca, 0x01cb}}},
+ {0x01ce, {1, {0x01cd}}},
+ {0x01d0, {1, {0x01cf}}},
+ {0x01d2, {1, {0x01d1}}},
+ {0x01d4, {1, {0x01d3}}},
+ {0x01d6, {1, {0x01d5}}},
+ {0x01d8, {1, {0x01d7}}},
+ {0x01da, {1, {0x01d9}}},
+ {0x01dc, {1, {0x01db}}},
+ {0x01dd, {1, {0x018e}}},
+ {0x01df, {1, {0x01de}}},
+ {0x01e1, {1, {0x01e0}}},
+ {0x01e3, {1, {0x01e2}}},
+ {0x01e5, {1, {0x01e4}}},
+ {0x01e7, {1, {0x01e6}}},
+ {0x01e9, {1, {0x01e8}}},
+ {0x01eb, {1, {0x01ea}}},
+ {0x01ed, {1, {0x01ec}}},
+ {0x01ef, {1, {0x01ee}}},
+ {0x01f3, {2, {0x01f1, 0x01f2}}},
+ {0x01f5, {1, {0x01f4}}},
+ {0x01f9, {1, {0x01f8}}},
+ {0x01fb, {1, {0x01fa}}},
+ {0x01fd, {1, {0x01fc}}},
+ {0x01ff, {1, {0x01fe}}},
+ {0x0201, {1, {0x0200}}},
+ {0x0203, {1, {0x0202}}},
+ {0x0205, {1, {0x0204}}},
+ {0x0207, {1, {0x0206}}},
+ {0x0209, {1, {0x0208}}},
+ {0x020b, {1, {0x020a}}},
+ {0x020d, {1, {0x020c}}},
+ {0x020f, {1, {0x020e}}},
+ {0x0211, {1, {0x0210}}},
+ {0x0213, {1, {0x0212}}},
+ {0x0215, {1, {0x0214}}},
+ {0x0217, {1, {0x0216}}},
+ {0x0219, {1, {0x0218}}},
+ {0x021b, {1, {0x021a}}},
+ {0x021d, {1, {0x021c}}},
+ {0x021f, {1, {0x021e}}},
+ {0x0223, {1, {0x0222}}},
+ {0x0225, {1, {0x0224}}},
+ {0x0227, {1, {0x0226}}},
+ {0x0229, {1, {0x0228}}},
+ {0x022b, {1, {0x022a}}},
+ {0x022d, {1, {0x022c}}},
+ {0x022f, {1, {0x022e}}},
+ {0x0231, {1, {0x0230}}},
+ {0x0233, {1, {0x0232}}},
+ {0x023c, {1, {0x023b}}},
+ {0x023f, {1, {0x2c7e}}},
+ {0x0240, {1, {0x2c7f}}},
+ {0x0242, {1, {0x0241}}},
+ {0x0247, {1, {0x0246}}},
+ {0x0249, {1, {0x0248}}},
+ {0x024b, {1, {0x024a}}},
+ {0x024d, {1, {0x024c}}},
+ {0x024f, {1, {0x024e}}},
+ {0x0250, {1, {0x2c6f}}},
+ {0x0251, {1, {0x2c6d}}},
+ {0x0252, {1, {0x2c70}}},
+ {0x0253, {1, {0x0181}}},
+ {0x0254, {1, {0x0186}}},
+ {0x0256, {1, {0x0189}}},
+ {0x0257, {1, {0x018a}}},
+ {0x0259, {1, {0x018f}}},
+ {0x025b, {1, {0x0190}}},
+ {0x025c, {1, {0xa7ab}}},
+ {0x0260, {1, {0x0193}}},
+ {0x0261, {1, {0xa7ac}}},
+ {0x0263, {1, {0x0194}}},
+ {0x0265, {1, {0xa78d}}},
+ {0x0266, {1, {0xa7aa}}},
+ {0x0268, {1, {0x0197}}},
+ {0x0269, {1, {0x0196}}},
+ {0x026b, {1, {0x2c62}}},
+ {0x026c, {1, {0xa7ad}}},
+ {0x026f, {1, {0x019c}}},
+ {0x0271, {1, {0x2c6e}}},
+ {0x0272, {1, {0x019d}}},
+ {0x0275, {1, {0x019f}}},
+ {0x027d, {1, {0x2c64}}},
+ {0x0280, {1, {0x01a6}}},
+ {0x0283, {1, {0x01a9}}},
+ {0x0287, {1, {0xa7b1}}},
+ {0x0288, {1, {0x01ae}}},
+ {0x0289, {1, {0x0244}}},
+ {0x028a, {1, {0x01b1}}},
+ {0x028b, {1, {0x01b2}}},
+ {0x028c, {1, {0x0245}}},
+ {0x0292, {1, {0x01b7}}},
+ {0x029e, {1, {0xa7b0}}},
+ {0x0371, {1, {0x0370}}},
+ {0x0373, {1, {0x0372}}},
+ {0x0377, {1, {0x0376}}},
+ {0x037b, {1, {0x03fd}}},
+ {0x037c, {1, {0x03fe}}},
+ {0x037d, {1, {0x03ff}}},
+ {0x03ac, {1, {0x0386}}},
+ {0x03ad, {1, {0x0388}}},
+ {0x03ae, {1, {0x0389}}},
+ {0x03af, {1, {0x038a}}},
+ {0x03b1, {1, {0x0391}}},
+ {0x03b2, {2, {0x0392, 0x03d0}}},
+ {0x03b3, {1, {0x0393}}},
+ {0x03b4, {1, {0x0394}}},
+ {0x03b5, {2, {0x0395, 0x03f5}}},
+ {0x03b6, {1, {0x0396}}},
+ {0x03b7, {1, {0x0397}}},
+ {0x03b8, {3, {0x0398, 0x03d1, 0x03f4}}},
+ {0x03b9, {3, {0x0345, 0x0399, 0x1fbe}}},
+ {0x03ba, {2, {0x039a, 0x03f0}}},
+ {0x03bb, {1, {0x039b}}},
+ {0x03bc, {2, {0x00b5, 0x039c}}},
+ {0x03bd, {1, {0x039d}}},
+ {0x03be, {1, {0x039e}}},
+ {0x03bf, {1, {0x039f}}},
+ {0x03c0, {2, {0x03a0, 0x03d6}}},
+ {0x03c1, {2, {0x03a1, 0x03f1}}},
+ {0x03c3, {2, {0x03a3, 0x03c2}}},
+ {0x03c4, {1, {0x03a4}}},
+ {0x03c5, {1, {0x03a5}}},
+ {0x03c6, {2, {0x03a6, 0x03d5}}},
+ {0x03c7, {1, {0x03a7}}},
+ {0x03c8, {1, {0x03a8}}},
+ {0x03c9, {2, {0x03a9, 0x2126}}},
+ {0x03ca, {1, {0x03aa}}},
+ {0x03cb, {1, {0x03ab}}},
+ {0x03cc, {1, {0x038c}}},
+ {0x03cd, {1, {0x038e}}},
+ {0x03ce, {1, {0x038f}}},
+ {0x03d7, {1, {0x03cf}}},
+ {0x03d9, {1, {0x03d8}}},
+ {0x03db, {1, {0x03da}}},
+ {0x03dd, {1, {0x03dc}}},
+ {0x03df, {1, {0x03de}}},
+ {0x03e1, {1, {0x03e0}}},
+ {0x03e3, {1, {0x03e2}}},
+ {0x03e5, {1, {0x03e4}}},
+ {0x03e7, {1, {0x03e6}}},
+ {0x03e9, {1, {0x03e8}}},
+ {0x03eb, {1, {0x03ea}}},
+ {0x03ed, {1, {0x03ec}}},
+ {0x03ef, {1, {0x03ee}}},
+ {0x03f2, {1, {0x03f9}}},
+ {0x03f3, {1, {0x037f}}},
+ {0x03f8, {1, {0x03f7}}},
+ {0x03fb, {1, {0x03fa}}},
+ {0x0430, {1, {0x0410}}},
+ {0x0431, {1, {0x0411}}},
+ {0x0432, {1, {0x0412}}},
+ {0x0433, {1, {0x0413}}},
+ {0x0434, {1, {0x0414}}},
+ {0x0435, {1, {0x0415}}},
+ {0x0436, {1, {0x0416}}},
+ {0x0437, {1, {0x0417}}},
+ {0x0438, {1, {0x0418}}},
+ {0x0439, {1, {0x0419}}},
+ {0x043a, {1, {0x041a}}},
+ {0x043b, {1, {0x041b}}},
+ {0x043c, {1, {0x041c}}},
+ {0x043d, {1, {0x041d}}},
+ {0x043e, {1, {0x041e}}},
+ {0x043f, {1, {0x041f}}},
+ {0x0440, {1, {0x0420}}},
+ {0x0441, {1, {0x0421}}},
+ {0x0442, {1, {0x0422}}},
+ {0x0443, {1, {0x0423}}},
+ {0x0444, {1, {0x0424}}},
+ {0x0445, {1, {0x0425}}},
+ {0x0446, {1, {0x0426}}},
+ {0x0447, {1, {0x0427}}},
+ {0x0448, {1, {0x0428}}},
+ {0x0449, {1, {0x0429}}},
+ {0x044a, {1, {0x042a}}},
+ {0x044b, {1, {0x042b}}},
+ {0x044c, {1, {0x042c}}},
+ {0x044d, {1, {0x042d}}},
+ {0x044e, {1, {0x042e}}},
+ {0x044f, {1, {0x042f}}},
+ {0x0450, {1, {0x0400}}},
+ {0x0451, {1, {0x0401}}},
+ {0x0452, {1, {0x0402}}},
+ {0x0453, {1, {0x0403}}},
+ {0x0454, {1, {0x0404}}},
+ {0x0455, {1, {0x0405}}},
+ {0x0456, {1, {0x0406}}},
+ {0x0457, {1, {0x0407}}},
+ {0x0458, {1, {0x0408}}},
+ {0x0459, {1, {0x0409}}},
+ {0x045a, {1, {0x040a}}},
+ {0x045b, {1, {0x040b}}},
+ {0x045c, {1, {0x040c}}},
+ {0x045d, {1, {0x040d}}},
+ {0x045e, {1, {0x040e}}},
+ {0x045f, {1, {0x040f}}},
+ {0x0461, {1, {0x0460}}},
+ {0x0463, {1, {0x0462}}},
+ {0x0465, {1, {0x0464}}},
+ {0x0467, {1, {0x0466}}},
+ {0x0469, {1, {0x0468}}},
+ {0x046b, {1, {0x046a}}},
+ {0x046d, {1, {0x046c}}},
+ {0x046f, {1, {0x046e}}},
+ {0x0471, {1, {0x0470}}},
+ {0x0473, {1, {0x0472}}},
+ {0x0475, {1, {0x0474}}},
+ {0x0477, {1, {0x0476}}},
+ {0x0479, {1, {0x0478}}},
+ {0x047b, {1, {0x047a}}},
+ {0x047d, {1, {0x047c}}},
+ {0x047f, {1, {0x047e}}},
+ {0x0481, {1, {0x0480}}},
+ {0x048b, {1, {0x048a}}},
+ {0x048d, {1, {0x048c}}},
+ {0x048f, {1, {0x048e}}},
+ {0x0491, {1, {0x0490}}},
+ {0x0493, {1, {0x0492}}},
+ {0x0495, {1, {0x0494}}},
+ {0x0497, {1, {0x0496}}},
+ {0x0499, {1, {0x0498}}},
+ {0x049b, {1, {0x049a}}},
+ {0x049d, {1, {0x049c}}},
+ {0x049f, {1, {0x049e}}},
+ {0x04a1, {1, {0x04a0}}},
+ {0x04a3, {1, {0x04a2}}},
+ {0x04a5, {1, {0x04a4}}},
+ {0x04a7, {1, {0x04a6}}},
+ {0x04a9, {1, {0x04a8}}},
+ {0x04ab, {1, {0x04aa}}},
+ {0x04ad, {1, {0x04ac}}},
+ {0x04af, {1, {0x04ae}}},
+ {0x04b1, {1, {0x04b0}}},
+ {0x04b3, {1, {0x04b2}}},
+ {0x04b5, {1, {0x04b4}}},
+ {0x04b7, {1, {0x04b6}}},
+ {0x04b9, {1, {0x04b8}}},
+ {0x04bb, {1, {0x04ba}}},
+ {0x04bd, {1, {0x04bc}}},
+ {0x04bf, {1, {0x04be}}},
+ {0x04c2, {1, {0x04c1}}},
+ {0x04c4, {1, {0x04c3}}},
+ {0x04c6, {1, {0x04c5}}},
+ {0x04c8, {1, {0x04c7}}},
+ {0x04ca, {1, {0x04c9}}},
+ {0x04cc, {1, {0x04cb}}},
+ {0x04ce, {1, {0x04cd}}},
+ {0x04cf, {1, {0x04c0}}},
+ {0x04d1, {1, {0x04d0}}},
+ {0x04d3, {1, {0x04d2}}},
+ {0x04d5, {1, {0x04d4}}},
+ {0x04d7, {1, {0x04d6}}},
+ {0x04d9, {1, {0x04d8}}},
+ {0x04db, {1, {0x04da}}},
+ {0x04dd, {1, {0x04dc}}},
+ {0x04df, {1, {0x04de}}},
+ {0x04e1, {1, {0x04e0}}},
+ {0x04e3, {1, {0x04e2}}},
+ {0x04e5, {1, {0x04e4}}},
+ {0x04e7, {1, {0x04e6}}},
+ {0x04e9, {1, {0x04e8}}},
+ {0x04eb, {1, {0x04ea}}},
+ {0x04ed, {1, {0x04ec}}},
+ {0x04ef, {1, {0x04ee}}},
+ {0x04f1, {1, {0x04f0}}},
+ {0x04f3, {1, {0x04f2}}},
+ {0x04f5, {1, {0x04f4}}},
+ {0x04f7, {1, {0x04f6}}},
+ {0x04f9, {1, {0x04f8}}},
+ {0x04fb, {1, {0x04fa}}},
+ {0x04fd, {1, {0x04fc}}},
+ {0x04ff, {1, {0x04fe}}},
+ {0x0501, {1, {0x0500}}},
+ {0x0503, {1, {0x0502}}},
+ {0x0505, {1, {0x0504}}},
+ {0x0507, {1, {0x0506}}},
+ {0x0509, {1, {0x0508}}},
+ {0x050b, {1, {0x050a}}},
+ {0x050d, {1, {0x050c}}},
+ {0x050f, {1, {0x050e}}},
+ {0x0511, {1, {0x0510}}},
+ {0x0513, {1, {0x0512}}},
+ {0x0515, {1, {0x0514}}},
+ {0x0517, {1, {0x0516}}},
+ {0x0519, {1, {0x0518}}},
+ {0x051b, {1, {0x051a}}},
+ {0x051d, {1, {0x051c}}},
+ {0x051f, {1, {0x051e}}},
+ {0x0521, {1, {0x0520}}},
+ {0x0523, {1, {0x0522}}},
+ {0x0525, {1, {0x0524}}},
+ {0x0527, {1, {0x0526}}},
+ {0x0529, {1, {0x0528}}},
+ {0x052b, {1, {0x052a}}},
+ {0x052d, {1, {0x052c}}},
+ {0x052f, {1, {0x052e}}},
+ {0x0561, {1, {0x0531}}},
+ {0x0562, {1, {0x0532}}},
+ {0x0563, {1, {0x0533}}},
+ {0x0564, {1, {0x0534}}},
+ {0x0565, {1, {0x0535}}},
+ {0x0566, {1, {0x0536}}},
+ {0x0567, {1, {0x0537}}},
+ {0x0568, {1, {0x0538}}},
+ {0x0569, {1, {0x0539}}},
+ {0x056a, {1, {0x053a}}},
+ {0x056b, {1, {0x053b}}},
+ {0x056c, {1, {0x053c}}},
+ {0x056d, {1, {0x053d}}},
+ {0x056e, {1, {0x053e}}},
+ {0x056f, {1, {0x053f}}},
+ {0x0570, {1, {0x0540}}},
+ {0x0571, {1, {0x0541}}},
+ {0x0572, {1, {0x0542}}},
+ {0x0573, {1, {0x0543}}},
+ {0x0574, {1, {0x0544}}},
+ {0x0575, {1, {0x0545}}},
+ {0x0576, {1, {0x0546}}},
+ {0x0577, {1, {0x0547}}},
+ {0x0578, {1, {0x0548}}},
+ {0x0579, {1, {0x0549}}},
+ {0x057a, {1, {0x054a}}},
+ {0x057b, {1, {0x054b}}},
+ {0x057c, {1, {0x054c}}},
+ {0x057d, {1, {0x054d}}},
+ {0x057e, {1, {0x054e}}},
+ {0x057f, {1, {0x054f}}},
+ {0x0580, {1, {0x0550}}},
+ {0x0581, {1, {0x0551}}},
+ {0x0582, {1, {0x0552}}},
+ {0x0583, {1, {0x0553}}},
+ {0x0584, {1, {0x0554}}},
+ {0x0585, {1, {0x0555}}},
+ {0x0586, {1, {0x0556}}},
+ {0x1d79, {1, {0xa77d}}},
+ {0x1d7d, {1, {0x2c63}}},
+ {0x1e01, {1, {0x1e00}}},
+ {0x1e03, {1, {0x1e02}}},
+ {0x1e05, {1, {0x1e04}}},
+ {0x1e07, {1, {0x1e06}}},
+ {0x1e09, {1, {0x1e08}}},
+ {0x1e0b, {1, {0x1e0a}}},
+ {0x1e0d, {1, {0x1e0c}}},
+ {0x1e0f, {1, {0x1e0e}}},
+ {0x1e11, {1, {0x1e10}}},
+ {0x1e13, {1, {0x1e12}}},
+ {0x1e15, {1, {0x1e14}}},
+ {0x1e17, {1, {0x1e16}}},
+ {0x1e19, {1, {0x1e18}}},
+ {0x1e1b, {1, {0x1e1a}}},
+ {0x1e1d, {1, {0x1e1c}}},
+ {0x1e1f, {1, {0x1e1e}}},
+ {0x1e21, {1, {0x1e20}}},
+ {0x1e23, {1, {0x1e22}}},
+ {0x1e25, {1, {0x1e24}}},
+ {0x1e27, {1, {0x1e26}}},
+ {0x1e29, {1, {0x1e28}}},
+ {0x1e2b, {1, {0x1e2a}}},
+ {0x1e2d, {1, {0x1e2c}}},
+ {0x1e2f, {1, {0x1e2e}}},
+ {0x1e31, {1, {0x1e30}}},
+ {0x1e33, {1, {0x1e32}}},
+ {0x1e35, {1, {0x1e34}}},
+ {0x1e37, {1, {0x1e36}}},
+ {0x1e39, {1, {0x1e38}}},
+ {0x1e3b, {1, {0x1e3a}}},
+ {0x1e3d, {1, {0x1e3c}}},
+ {0x1e3f, {1, {0x1e3e}}},
+ {0x1e41, {1, {0x1e40}}},
+ {0x1e43, {1, {0x1e42}}},
+ {0x1e45, {1, {0x1e44}}},
+ {0x1e47, {1, {0x1e46}}},
+ {0x1e49, {1, {0x1e48}}},
+ {0x1e4b, {1, {0x1e4a}}},
+ {0x1e4d, {1, {0x1e4c}}},
+ {0x1e4f, {1, {0x1e4e}}},
+ {0x1e51, {1, {0x1e50}}},
+ {0x1e53, {1, {0x1e52}}},
+ {0x1e55, {1, {0x1e54}}},
+ {0x1e57, {1, {0x1e56}}},
+ {0x1e59, {1, {0x1e58}}},
+ {0x1e5b, {1, {0x1e5a}}},
+ {0x1e5d, {1, {0x1e5c}}},
+ {0x1e5f, {1, {0x1e5e}}},
+ {0x1e61, {2, {0x1e60, 0x1e9b}}},
+ {0x1e63, {1, {0x1e62}}},
+ {0x1e65, {1, {0x1e64}}},
+ {0x1e67, {1, {0x1e66}}},
+ {0x1e69, {1, {0x1e68}}},
+ {0x1e6b, {1, {0x1e6a}}},
+ {0x1e6d, {1, {0x1e6c}}},
+ {0x1e6f, {1, {0x1e6e}}},
+ {0x1e71, {1, {0x1e70}}},
+ {0x1e73, {1, {0x1e72}}},
+ {0x1e75, {1, {0x1e74}}},
+ {0x1e77, {1, {0x1e76}}},
+ {0x1e79, {1, {0x1e78}}},
+ {0x1e7b, {1, {0x1e7a}}},
+ {0x1e7d, {1, {0x1e7c}}},
+ {0x1e7f, {1, {0x1e7e}}},
+ {0x1e81, {1, {0x1e80}}},
+ {0x1e83, {1, {0x1e82}}},
+ {0x1e85, {1, {0x1e84}}},
+ {0x1e87, {1, {0x1e86}}},
+ {0x1e89, {1, {0x1e88}}},
+ {0x1e8b, {1, {0x1e8a}}},
+ {0x1e8d, {1, {0x1e8c}}},
+ {0x1e8f, {1, {0x1e8e}}},
+ {0x1e91, {1, {0x1e90}}},
+ {0x1e93, {1, {0x1e92}}},
+ {0x1e95, {1, {0x1e94}}},
+ {0x1ea1, {1, {0x1ea0}}},
+ {0x1ea3, {1, {0x1ea2}}},
+ {0x1ea5, {1, {0x1ea4}}},
+ {0x1ea7, {1, {0x1ea6}}},
+ {0x1ea9, {1, {0x1ea8}}},
+ {0x1eab, {1, {0x1eaa}}},
+ {0x1ead, {1, {0x1eac}}},
+ {0x1eaf, {1, {0x1eae}}},
+ {0x1eb1, {1, {0x1eb0}}},
+ {0x1eb3, {1, {0x1eb2}}},
+ {0x1eb5, {1, {0x1eb4}}},
+ {0x1eb7, {1, {0x1eb6}}},
+ {0x1eb9, {1, {0x1eb8}}},
+ {0x1ebb, {1, {0x1eba}}},
+ {0x1ebd, {1, {0x1ebc}}},
+ {0x1ebf, {1, {0x1ebe}}},
+ {0x1ec1, {1, {0x1ec0}}},
+ {0x1ec3, {1, {0x1ec2}}},
+ {0x1ec5, {1, {0x1ec4}}},
+ {0x1ec7, {1, {0x1ec6}}},
+ {0x1ec9, {1, {0x1ec8}}},
+ {0x1ecb, {1, {0x1eca}}},
+ {0x1ecd, {1, {0x1ecc}}},
+ {0x1ecf, {1, {0x1ece}}},
+ {0x1ed1, {1, {0x1ed0}}},
+ {0x1ed3, {1, {0x1ed2}}},
+ {0x1ed5, {1, {0x1ed4}}},
+ {0x1ed7, {1, {0x1ed6}}},
+ {0x1ed9, {1, {0x1ed8}}},
+ {0x1edb, {1, {0x1eda}}},
+ {0x1edd, {1, {0x1edc}}},
+ {0x1edf, {1, {0x1ede}}},
+ {0x1ee1, {1, {0x1ee0}}},
+ {0x1ee3, {1, {0x1ee2}}},
+ {0x1ee5, {1, {0x1ee4}}},
+ {0x1ee7, {1, {0x1ee6}}},
+ {0x1ee9, {1, {0x1ee8}}},
+ {0x1eeb, {1, {0x1eea}}},
+ {0x1eed, {1, {0x1eec}}},
+ {0x1eef, {1, {0x1eee}}},
+ {0x1ef1, {1, {0x1ef0}}},
+ {0x1ef3, {1, {0x1ef2}}},
+ {0x1ef5, {1, {0x1ef4}}},
+ {0x1ef7, {1, {0x1ef6}}},
+ {0x1ef9, {1, {0x1ef8}}},
+ {0x1efb, {1, {0x1efa}}},
+ {0x1efd, {1, {0x1efc}}},
+ {0x1eff, {1, {0x1efe}}},
+ {0x1f00, {1, {0x1f08}}},
+ {0x1f01, {1, {0x1f09}}},
+ {0x1f02, {1, {0x1f0a}}},
+ {0x1f03, {1, {0x1f0b}}},
+ {0x1f04, {1, {0x1f0c}}},
+ {0x1f05, {1, {0x1f0d}}},
+ {0x1f06, {1, {0x1f0e}}},
+ {0x1f07, {1, {0x1f0f}}},
+ {0x1f10, {1, {0x1f18}}},
+ {0x1f11, {1, {0x1f19}}},
+ {0x1f12, {1, {0x1f1a}}},
+ {0x1f13, {1, {0x1f1b}}},
+ {0x1f14, {1, {0x1f1c}}},
+ {0x1f15, {1, {0x1f1d}}},
+ {0x1f20, {1, {0x1f28}}},
+ {0x1f21, {1, {0x1f29}}},
+ {0x1f22, {1, {0x1f2a}}},
+ {0x1f23, {1, {0x1f2b}}},
+ {0x1f24, {1, {0x1f2c}}},
+ {0x1f25, {1, {0x1f2d}}},
+ {0x1f26, {1, {0x1f2e}}},
+ {0x1f27, {1, {0x1f2f}}},
+ {0x1f30, {1, {0x1f38}}},
+ {0x1f31, {1, {0x1f39}}},
+ {0x1f32, {1, {0x1f3a}}},
+ {0x1f33, {1, {0x1f3b}}},
+ {0x1f34, {1, {0x1f3c}}},
+ {0x1f35, {1, {0x1f3d}}},
+ {0x1f36, {1, {0x1f3e}}},
+ {0x1f37, {1, {0x1f3f}}},
+ {0x1f40, {1, {0x1f48}}},
+ {0x1f41, {1, {0x1f49}}},
+ {0x1f42, {1, {0x1f4a}}},
+ {0x1f43, {1, {0x1f4b}}},
+ {0x1f44, {1, {0x1f4c}}},
+ {0x1f45, {1, {0x1f4d}}},
+ {0x1f51, {1, {0x1f59}}},
+ {0x1f53, {1, {0x1f5b}}},
+ {0x1f55, {1, {0x1f5d}}},
+ {0x1f57, {1, {0x1f5f}}},
+ {0x1f60, {1, {0x1f68}}},
+ {0x1f61, {1, {0x1f69}}},
+ {0x1f62, {1, {0x1f6a}}},
+ {0x1f63, {1, {0x1f6b}}},
+ {0x1f64, {1, {0x1f6c}}},
+ {0x1f65, {1, {0x1f6d}}},
+ {0x1f66, {1, {0x1f6e}}},
+ {0x1f67, {1, {0x1f6f}}},
+ {0x1f70, {1, {0x1fba}}},
+ {0x1f71, {1, {0x1fbb}}},
+ {0x1f72, {1, {0x1fc8}}},
+ {0x1f73, {1, {0x1fc9}}},
+ {0x1f74, {1, {0x1fca}}},
+ {0x1f75, {1, {0x1fcb}}},
+ {0x1f76, {1, {0x1fda}}},
+ {0x1f77, {1, {0x1fdb}}},
+ {0x1f78, {1, {0x1ff8}}},
+ {0x1f79, {1, {0x1ff9}}},
+ {0x1f7a, {1, {0x1fea}}},
+ {0x1f7b, {1, {0x1feb}}},
+ {0x1f7c, {1, {0x1ffa}}},
+ {0x1f7d, {1, {0x1ffb}}},
+ {0x1fb0, {1, {0x1fb8}}},
+ {0x1fb1, {1, {0x1fb9}}},
+ {0x1fd0, {1, {0x1fd8}}},
+ {0x1fd1, {1, {0x1fd9}}},
+ {0x1fe0, {1, {0x1fe8}}},
+ {0x1fe1, {1, {0x1fe9}}},
+ {0x1fe5, {1, {0x1fec}}},
+ {0x214e, {1, {0x2132}}},
+ {0x2170, {1, {0x2160}}},
+ {0x2171, {1, {0x2161}}},
+ {0x2172, {1, {0x2162}}},
+ {0x2173, {1, {0x2163}}},
+ {0x2174, {1, {0x2164}}},
+ {0x2175, {1, {0x2165}}},
+ {0x2176, {1, {0x2166}}},
+ {0x2177, {1, {0x2167}}},
+ {0x2178, {1, {0x2168}}},
+ {0x2179, {1, {0x2169}}},
+ {0x217a, {1, {0x216a}}},
+ {0x217b, {1, {0x216b}}},
+ {0x217c, {1, {0x216c}}},
+ {0x217d, {1, {0x216d}}},
+ {0x217e, {1, {0x216e}}},
+ {0x217f, {1, {0x216f}}},
+ {0x2184, {1, {0x2183}}},
+ {0x24d0, {1, {0x24b6}}},
+ {0x24d1, {1, {0x24b7}}},
+ {0x24d2, {1, {0x24b8}}},
+ {0x24d3, {1, {0x24b9}}},
+ {0x24d4, {1, {0x24ba}}},
+ {0x24d5, {1, {0x24bb}}},
+ {0x24d6, {1, {0x24bc}}},
+ {0x24d7, {1, {0x24bd}}},
+ {0x24d8, {1, {0x24be}}},
+ {0x24d9, {1, {0x24bf}}},
+ {0x24da, {1, {0x24c0}}},
+ {0x24db, {1, {0x24c1}}},
+ {0x24dc, {1, {0x24c2}}},
+ {0x24dd, {1, {0x24c3}}},
+ {0x24de, {1, {0x24c4}}},
+ {0x24df, {1, {0x24c5}}},
+ {0x24e0, {1, {0x24c6}}},
+ {0x24e1, {1, {0x24c7}}},
+ {0x24e2, {1, {0x24c8}}},
+ {0x24e3, {1, {0x24c9}}},
+ {0x24e4, {1, {0x24ca}}},
+ {0x24e5, {1, {0x24cb}}},
+ {0x24e6, {1, {0x24cc}}},
+ {0x24e7, {1, {0x24cd}}},
+ {0x24e8, {1, {0x24ce}}},
+ {0x24e9, {1, {0x24cf}}},
+ {0x2c30, {1, {0x2c00}}},
+ {0x2c31, {1, {0x2c01}}},
+ {0x2c32, {1, {0x2c02}}},
+ {0x2c33, {1, {0x2c03}}},
+ {0x2c34, {1, {0x2c04}}},
+ {0x2c35, {1, {0x2c05}}},
+ {0x2c36, {1, {0x2c06}}},
+ {0x2c37, {1, {0x2c07}}},
+ {0x2c38, {1, {0x2c08}}},
+ {0x2c39, {1, {0x2c09}}},
+ {0x2c3a, {1, {0x2c0a}}},
+ {0x2c3b, {1, {0x2c0b}}},
+ {0x2c3c, {1, {0x2c0c}}},
+ {0x2c3d, {1, {0x2c0d}}},
+ {0x2c3e, {1, {0x2c0e}}},
+ {0x2c3f, {1, {0x2c0f}}},
+ {0x2c40, {1, {0x2c10}}},
+ {0x2c41, {1, {0x2c11}}},
+ {0x2c42, {1, {0x2c12}}},
+ {0x2c43, {1, {0x2c13}}},
+ {0x2c44, {1, {0x2c14}}},
+ {0x2c45, {1, {0x2c15}}},
+ {0x2c46, {1, {0x2c16}}},
+ {0x2c47, {1, {0x2c17}}},
+ {0x2c48, {1, {0x2c18}}},
+ {0x2c49, {1, {0x2c19}}},
+ {0x2c4a, {1, {0x2c1a}}},
+ {0x2c4b, {1, {0x2c1b}}},
+ {0x2c4c, {1, {0x2c1c}}},
+ {0x2c4d, {1, {0x2c1d}}},
+ {0x2c4e, {1, {0x2c1e}}},
+ {0x2c4f, {1, {0x2c1f}}},
+ {0x2c50, {1, {0x2c20}}},
+ {0x2c51, {1, {0x2c21}}},
+ {0x2c52, {1, {0x2c22}}},
+ {0x2c53, {1, {0x2c23}}},
+ {0x2c54, {1, {0x2c24}}},
+ {0x2c55, {1, {0x2c25}}},
+ {0x2c56, {1, {0x2c26}}},
+ {0x2c57, {1, {0x2c27}}},
+ {0x2c58, {1, {0x2c28}}},
+ {0x2c59, {1, {0x2c29}}},
+ {0x2c5a, {1, {0x2c2a}}},
+ {0x2c5b, {1, {0x2c2b}}},
+ {0x2c5c, {1, {0x2c2c}}},
+ {0x2c5d, {1, {0x2c2d}}},
+ {0x2c5e, {1, {0x2c2e}}},
+ {0x2c61, {1, {0x2c60}}},
+ {0x2c65, {1, {0x023a}}},
+ {0x2c66, {1, {0x023e}}},
+ {0x2c68, {1, {0x2c67}}},
+ {0x2c6a, {1, {0x2c69}}},
+ {0x2c6c, {1, {0x2c6b}}},
+ {0x2c73, {1, {0x2c72}}},
+ {0x2c76, {1, {0x2c75}}},
+ {0x2c81, {1, {0x2c80}}},
+ {0x2c83, {1, {0x2c82}}},
+ {0x2c85, {1, {0x2c84}}},
+ {0x2c87, {1, {0x2c86}}},
+ {0x2c89, {1, {0x2c88}}},
+ {0x2c8b, {1, {0x2c8a}}},
+ {0x2c8d, {1, {0x2c8c}}},
+ {0x2c8f, {1, {0x2c8e}}},
+ {0x2c91, {1, {0x2c90}}},
+ {0x2c93, {1, {0x2c92}}},
+ {0x2c95, {1, {0x2c94}}},
+ {0x2c97, {1, {0x2c96}}},
+ {0x2c99, {1, {0x2c98}}},
+ {0x2c9b, {1, {0x2c9a}}},
+ {0x2c9d, {1, {0x2c9c}}},
+ {0x2c9f, {1, {0x2c9e}}},
+ {0x2ca1, {1, {0x2ca0}}},
+ {0x2ca3, {1, {0x2ca2}}},
+ {0x2ca5, {1, {0x2ca4}}},
+ {0x2ca7, {1, {0x2ca6}}},
+ {0x2ca9, {1, {0x2ca8}}},
+ {0x2cab, {1, {0x2caa}}},
+ {0x2cad, {1, {0x2cac}}},
+ {0x2caf, {1, {0x2cae}}},
+ {0x2cb1, {1, {0x2cb0}}},
+ {0x2cb3, {1, {0x2cb2}}},
+ {0x2cb5, {1, {0x2cb4}}},
+ {0x2cb7, {1, {0x2cb6}}},
+ {0x2cb9, {1, {0x2cb8}}},
+ {0x2cbb, {1, {0x2cba}}},
+ {0x2cbd, {1, {0x2cbc}}},
+ {0x2cbf, {1, {0x2cbe}}},
+ {0x2cc1, {1, {0x2cc0}}},
+ {0x2cc3, {1, {0x2cc2}}},
+ {0x2cc5, {1, {0x2cc4}}},
+ {0x2cc7, {1, {0x2cc6}}},
+ {0x2cc9, {1, {0x2cc8}}},
+ {0x2ccb, {1, {0x2cca}}},
+ {0x2ccd, {1, {0x2ccc}}},
+ {0x2ccf, {1, {0x2cce}}},
+ {0x2cd1, {1, {0x2cd0}}},
+ {0x2cd3, {1, {0x2cd2}}},
+ {0x2cd5, {1, {0x2cd4}}},
+ {0x2cd7, {1, {0x2cd6}}},
+ {0x2cd9, {1, {0x2cd8}}},
+ {0x2cdb, {1, {0x2cda}}},
+ {0x2cdd, {1, {0x2cdc}}},
+ {0x2cdf, {1, {0x2cde}}},
+ {0x2ce1, {1, {0x2ce0}}},
+ {0x2ce3, {1, {0x2ce2}}},
+ {0x2cec, {1, {0x2ceb}}},
+ {0x2cee, {1, {0x2ced}}},
+ {0x2cf3, {1, {0x2cf2}}},
+ {0x2d00, {1, {0x10a0}}},
+ {0x2d01, {1, {0x10a1}}},
+ {0x2d02, {1, {0x10a2}}},
+ {0x2d03, {1, {0x10a3}}},
+ {0x2d04, {1, {0x10a4}}},
+ {0x2d05, {1, {0x10a5}}},
+ {0x2d06, {1, {0x10a6}}},
+ {0x2d07, {1, {0x10a7}}},
+ {0x2d08, {1, {0x10a8}}},
+ {0x2d09, {1, {0x10a9}}},
+ {0x2d0a, {1, {0x10aa}}},
+ {0x2d0b, {1, {0x10ab}}},
+ {0x2d0c, {1, {0x10ac}}},
+ {0x2d0d, {1, {0x10ad}}},
+ {0x2d0e, {1, {0x10ae}}},
+ {0x2d0f, {1, {0x10af}}},
+ {0x2d10, {1, {0x10b0}}},
+ {0x2d11, {1, {0x10b1}}},
+ {0x2d12, {1, {0x10b2}}},
+ {0x2d13, {1, {0x10b3}}},
+ {0x2d14, {1, {0x10b4}}},
+ {0x2d15, {1, {0x10b5}}},
+ {0x2d16, {1, {0x10b6}}},
+ {0x2d17, {1, {0x10b7}}},
+ {0x2d18, {1, {0x10b8}}},
+ {0x2d19, {1, {0x10b9}}},
+ {0x2d1a, {1, {0x10ba}}},
+ {0x2d1b, {1, {0x10bb}}},
+ {0x2d1c, {1, {0x10bc}}},
+ {0x2d1d, {1, {0x10bd}}},
+ {0x2d1e, {1, {0x10be}}},
+ {0x2d1f, {1, {0x10bf}}},
+ {0x2d20, {1, {0x10c0}}},
+ {0x2d21, {1, {0x10c1}}},
+ {0x2d22, {1, {0x10c2}}},
+ {0x2d23, {1, {0x10c3}}},
+ {0x2d24, {1, {0x10c4}}},
+ {0x2d25, {1, {0x10c5}}},
+ {0x2d27, {1, {0x10c7}}},
+ {0x2d2d, {1, {0x10cd}}},
+ {0xa641, {1, {0xa640}}},
+ {0xa643, {1, {0xa642}}},
+ {0xa645, {1, {0xa644}}},
+ {0xa647, {1, {0xa646}}},
+ {0xa649, {1, {0xa648}}},
+ {0xa64b, {1, {0xa64a}}},
+ {0xa64d, {1, {0xa64c}}},
+ {0xa64f, {1, {0xa64e}}},
+ {0xa651, {1, {0xa650}}},
+ {0xa653, {1, {0xa652}}},
+ {0xa655, {1, {0xa654}}},
+ {0xa657, {1, {0xa656}}},
+ {0xa659, {1, {0xa658}}},
+ {0xa65b, {1, {0xa65a}}},
+ {0xa65d, {1, {0xa65c}}},
+ {0xa65f, {1, {0xa65e}}},
+ {0xa661, {1, {0xa660}}},
+ {0xa663, {1, {0xa662}}},
+ {0xa665, {1, {0xa664}}},
+ {0xa667, {1, {0xa666}}},
+ {0xa669, {1, {0xa668}}},
+ {0xa66b, {1, {0xa66a}}},
+ {0xa66d, {1, {0xa66c}}},
+ {0xa681, {1, {0xa680}}},
+ {0xa683, {1, {0xa682}}},
+ {0xa685, {1, {0xa684}}},
+ {0xa687, {1, {0xa686}}},
+ {0xa689, {1, {0xa688}}},
+ {0xa68b, {1, {0xa68a}}},
+ {0xa68d, {1, {0xa68c}}},
+ {0xa68f, {1, {0xa68e}}},
+ {0xa691, {1, {0xa690}}},
+ {0xa693, {1, {0xa692}}},
+ {0xa695, {1, {0xa694}}},
+ {0xa697, {1, {0xa696}}},
+ {0xa699, {1, {0xa698}}},
+ {0xa69b, {1, {0xa69a}}},
+ {0xa723, {1, {0xa722}}},
+ {0xa725, {1, {0xa724}}},
+ {0xa727, {1, {0xa726}}},
+ {0xa729, {1, {0xa728}}},
+ {0xa72b, {1, {0xa72a}}},
+ {0xa72d, {1, {0xa72c}}},
+ {0xa72f, {1, {0xa72e}}},
+ {0xa733, {1, {0xa732}}},
+ {0xa735, {1, {0xa734}}},
+ {0xa737, {1, {0xa736}}},
+ {0xa739, {1, {0xa738}}},
+ {0xa73b, {1, {0xa73a}}},
+ {0xa73d, {1, {0xa73c}}},
+ {0xa73f, {1, {0xa73e}}},
+ {0xa741, {1, {0xa740}}},
+ {0xa743, {1, {0xa742}}},
+ {0xa745, {1, {0xa744}}},
+ {0xa747, {1, {0xa746}}},
+ {0xa749, {1, {0xa748}}},
+ {0xa74b, {1, {0xa74a}}},
+ {0xa74d, {1, {0xa74c}}},
+ {0xa74f, {1, {0xa74e}}},
+ {0xa751, {1, {0xa750}}},
+ {0xa753, {1, {0xa752}}},
+ {0xa755, {1, {0xa754}}},
+ {0xa757, {1, {0xa756}}},
+ {0xa759, {1, {0xa758}}},
+ {0xa75b, {1, {0xa75a}}},
+ {0xa75d, {1, {0xa75c}}},
+ {0xa75f, {1, {0xa75e}}},
+ {0xa761, {1, {0xa760}}},
+ {0xa763, {1, {0xa762}}},
+ {0xa765, {1, {0xa764}}},
+ {0xa767, {1, {0xa766}}},
+ {0xa769, {1, {0xa768}}},
+ {0xa76b, {1, {0xa76a}}},
+ {0xa76d, {1, {0xa76c}}},
+ {0xa76f, {1, {0xa76e}}},
+ {0xa77a, {1, {0xa779}}},
+ {0xa77c, {1, {0xa77b}}},
+ {0xa77f, {1, {0xa77e}}},
+ {0xa781, {1, {0xa780}}},
+ {0xa783, {1, {0xa782}}},
+ {0xa785, {1, {0xa784}}},
+ {0xa787, {1, {0xa786}}},
+ {0xa78c, {1, {0xa78b}}},
+ {0xa791, {1, {0xa790}}},
+ {0xa793, {1, {0xa792}}},
+ {0xa797, {1, {0xa796}}},
+ {0xa799, {1, {0xa798}}},
+ {0xa79b, {1, {0xa79a}}},
+ {0xa79d, {1, {0xa79c}}},
+ {0xa79f, {1, {0xa79e}}},
+ {0xa7a1, {1, {0xa7a0}}},
+ {0xa7a3, {1, {0xa7a2}}},
+ {0xa7a5, {1, {0xa7a4}}},
+ {0xa7a7, {1, {0xa7a6}}},
+ {0xa7a9, {1, {0xa7a8}}},
+ {0xff41, {1, {0xff21}}},
+ {0xff42, {1, {0xff22}}},
+ {0xff43, {1, {0xff23}}},
+ {0xff44, {1, {0xff24}}},
+ {0xff45, {1, {0xff25}}},
+ {0xff46, {1, {0xff26}}},
+ {0xff47, {1, {0xff27}}},
+ {0xff48, {1, {0xff28}}},
+ {0xff49, {1, {0xff29}}},
+ {0xff4a, {1, {0xff2a}}},
+ {0xff4b, {1, {0xff2b}}},
+ {0xff4c, {1, {0xff2c}}},
+ {0xff4d, {1, {0xff2d}}},
+ {0xff4e, {1, {0xff2e}}},
+ {0xff4f, {1, {0xff2f}}},
+ {0xff50, {1, {0xff30}}},
+ {0xff51, {1, {0xff31}}},
+ {0xff52, {1, {0xff32}}},
+ {0xff53, {1, {0xff33}}},
+ {0xff54, {1, {0xff34}}},
+ {0xff55, {1, {0xff35}}},
+ {0xff56, {1, {0xff36}}},
+ {0xff57, {1, {0xff37}}},
+ {0xff58, {1, {0xff38}}},
+ {0xff59, {1, {0xff39}}},
+ {0xff5a, {1, {0xff3a}}},
+ {0x10428, {1, {0x10400}}},
+ {0x10429, {1, {0x10401}}},
+ {0x1042a, {1, {0x10402}}},
+ {0x1042b, {1, {0x10403}}},
+ {0x1042c, {1, {0x10404}}},
+ {0x1042d, {1, {0x10405}}},
+ {0x1042e, {1, {0x10406}}},
+ {0x1042f, {1, {0x10407}}},
+ {0x10430, {1, {0x10408}}},
+ {0x10431, {1, {0x10409}}},
+ {0x10432, {1, {0x1040a}}},
+ {0x10433, {1, {0x1040b}}},
+ {0x10434, {1, {0x1040c}}},
+ {0x10435, {1, {0x1040d}}},
+ {0x10436, {1, {0x1040e}}},
+ {0x10437, {1, {0x1040f}}},
+ {0x10438, {1, {0x10410}}},
+ {0x10439, {1, {0x10411}}},
+ {0x1043a, {1, {0x10412}}},
+ {0x1043b, {1, {0x10413}}},
+ {0x1043c, {1, {0x10414}}},
+ {0x1043d, {1, {0x10415}}},
+ {0x1043e, {1, {0x10416}}},
+ {0x1043f, {1, {0x10417}}},
+ {0x10440, {1, {0x10418}}},
+ {0x10441, {1, {0x10419}}},
+ {0x10442, {1, {0x1041a}}},
+ {0x10443, {1, {0x1041b}}},
+ {0x10444, {1, {0x1041c}}},
+ {0x10445, {1, {0x1041d}}},
+ {0x10446, {1, {0x1041e}}},
+ {0x10447, {1, {0x1041f}}},
+ {0x10448, {1, {0x10420}}},
+ {0x10449, {1, {0x10421}}},
+ {0x1044a, {1, {0x10422}}},
+ {0x1044b, {1, {0x10423}}},
+ {0x1044c, {1, {0x10424}}},
+ {0x1044d, {1, {0x10425}}},
+ {0x1044e, {1, {0x10426}}},
+ {0x1044f, {1, {0x10427}}},
+ {0x118c0, {1, {0x118a0}}},
+ {0x118c1, {1, {0x118a1}}},
+ {0x118c2, {1, {0x118a2}}},
+ {0x118c3, {1, {0x118a3}}},
+ {0x118c4, {1, {0x118a4}}},
+ {0x118c5, {1, {0x118a5}}},
+ {0x118c6, {1, {0x118a6}}},
+ {0x118c7, {1, {0x118a7}}},
+ {0x118c8, {1, {0x118a8}}},
+ {0x118c9, {1, {0x118a9}}},
+ {0x118ca, {1, {0x118aa}}},
+ {0x118cb, {1, {0x118ab}}},
+ {0x118cc, {1, {0x118ac}}},
+ {0x118cd, {1, {0x118ad}}},
+ {0x118ce, {1, {0x118ae}}},
+ {0x118cf, {1, {0x118af}}},
+ {0x118d0, {1, {0x118b0}}},
+ {0x118d1, {1, {0x118b1}}},
+ {0x118d2, {1, {0x118b2}}},
+ {0x118d3, {1, {0x118b3}}},
+ {0x118d4, {1, {0x118b4}}},
+ {0x118d5, {1, {0x118b5}}},
+ {0x118d6, {1, {0x118b6}}},
+ {0x118d7, {1, {0x118b7}}},
+ {0x118d8, {1, {0x118b8}}},
+ {0x118d9, {1, {0x118b9}}},
+ {0x118da, {1, {0x118ba}}},
+ {0x118db, {1, {0x118bb}}},
+ {0x118dc, {1, {0x118bc}}},
+ {0x118dd, {1, {0x118bd}}},
+ {0x118de, {1, {0x118be}}},
+ {0x118df, {1, {0x118bf}}},
+#define CaseUnfold_11_Locale (*(CaseUnfold_11_Type (*)[1])(CaseUnfold_11_Table+1054))
+ {0x0069, {1, {0x0049}}},
};
-static const CaseUnfold_12_Type CaseUnfold_12_Locale[] = {
- { {0x0069, 0x0307}, {1, {0x0130 }}},
+/* C code produced by gperf version 3.0.3 */
+/* Command-line: gperf -7 -k1,2,3 -F,-1 -c -j1 -i1 -t -T -E -C -H onigenc_unicode_CaseUnfold_11_hash -N onigenc_unicode_CaseUnfold_11_lookup -n */
+
+/* maximum key range = 1907, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+/*ARGSUSED*/
+static unsigned int
+onigenc_unicode_CaseUnfold_11_hash(const OnigCodePoint code)
+{
+ static const unsigned short asso_values[] =
+ {
+ 1, 1915, 4, 12, 199, 716, 4, 230, 6, 134,
+ 355, 116, 9, 3, 7, 13, 1915, 1915, 1915, 1915,
+ 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915,
+ 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915,
+ 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915, 1915,
+ 1915, 1915, 1915, 40, 1915, 1915, 1915, 1915, 1915, 1915,
+ 1915, 1915, 21, 1915, 2, 1, 11, 49, 50, 667,
+ 131, 651, 26, 872, 251, 1136, 24, 42, 295, 1145,
+ 111, 27, 47, 12, 812, 806, 107, 786, 21, 1070,
+ 13, 967, 41, 5, 523, 1152, 71, 1077, 73, 948,
+ 14, 601, 10, 575, 15, 764, 1, 929, 27, 1057,
+ 23, 498, 15, 918, 1208, 753, 1211, 512, 1180, 736,
+ 1082, 711, 441, 898, 410, 1028, 277, 887, 238, 684,
+ 336, 425, 740, 406, 1016, 360, 972, 382, 1006, 354,
+ 1168, 302, 999, 286, 901, 252, 546, 106, 1159, 148,
+ 1121, 224, 1061, 132, 1152, 182, 871, 210, 1163, 235,
+ 1183, 371, 1197, 64, 954, 90, 339, 79, 604, 168,
+ 982, 159, 448, 328, 525, 634, 195, 620, 261, 852,
+ 934, 312, 210, 836, 668, 983, 586, 823, 460, 955,
+ 1176, 697, 119, 998
+ };
+ return asso_values[bits_of(code, 2)+66] + asso_values[bits_of(code, 1)+4] + asso_values[bits_of(code, 0)];
+}
+
+#ifdef __GNUC__
+__inline
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+static const CodePointList3 *
+onigenc_unicode_CaseUnfold_11_lookup(const OnigCodePoint code)
+{
+ enum
+ {
+ MIN_CODE_VALUE = 0x61,
+ MAX_CODE_VALUE = 0x118df,
+ TOTAL_KEYWORDS = 1055,
+ MIN_WORD_LENGTH = 3,
+ MAX_WORD_LENGTH = 3,
+ MIN_HASH_VALUE = 8,
+ MAX_HASH_VALUE = 1914
+ };
+
+ static const short wordlist[] =
+ {
+ -1, -1, -1, -1, -1, -1,
+ -1, -1,
+ /*0x1e1b*/ 490,
+ /*0x049b*/ 362,
+ /*0x011b*/ 69,
+ /*0x2c9b*/ 781,
+ /*0x021b*/ 178,
+ /*0x051b*/ 426,
+ /*0x1e91*/ 549,
+ /*0x1e11*/ 485,
+ /*0x0491*/ 357,
+ /*0x0111*/ 64,
+ /*0x2c91*/ 776,
+ /*0x0211*/ 173,
+ /*0x0511*/ 421,
+ /*0xa79b*/ 948,
+ /*0x1f24*/ 618,
+ /*0x1f00*/ 600,
+ /*0x1f11*/ 609,
+ /*0x0580*/ 468,
+ /*0x1f22*/ 616,
+ /*0x1f26*/ 620,
+ /*0xa791*/ 944,
+ /*0x1e8f*/ 548,
+ /*0x1e0f*/ 484,
+ /*0x048f*/ 356,
+ /*0x010f*/ 63,
+ /*0x2c8f*/ 775,
+ /*0x020f*/ 172,
+ /*0x050f*/ 420,
+ /*0xa69b*/ 897,
+ -1,
+ /*0x1f06*/ 606,
+ -1,
+ /*0x0586*/ 474,
+ -1, -1,
+ /*0xa691*/ 892,
+ /*0x1e8b*/ 546,
+ /*0x1e0b*/ 482,
+ /*0x048b*/ 354,
+ /*0x010b*/ 61,
+ /*0x2c8b*/ 773,
+ /*0x020b*/ 170,
+ /*0x050b*/ 418,
+ /*0x1e81*/ 541,
+ /*0x1e01*/ 477,
+ /*0x0481*/ 353,
+ /*0x0101*/ 56,
+ /*0x2c81*/ 768,
+ /*0x0201*/ 165,
+ /*0x0501*/ 413,
+ /*0xa68f*/ 891,
+ /*0x1f10*/ 608,
+ -1,
+ /*0x1f01*/ 601,
+ /*0x1f02*/ 602,
+ /*0x0581*/ 469,
+ /*0x0582*/ 470,
+ /*0xa781*/ 939,
+ /*0x1ee1*/ 584,
+ /*0x1e61*/ 525,
+ /*0x04e1*/ 397,
+ /*0x0161*/ 102,
+ /*0x2ce1*/ 816,
+ /*0x0261*/ 210,
+ /*0x0561*/ 437,
+ /*0xa68b*/ 889,
+ /*0x0461*/ 337,
+ -1,
+ /*0x1f61*/ 641,
+ -1, -1, -1,
+ /*0xa681*/ 884,
+ /*0x1ee5*/ 586,
+ /*0x1e65*/ 527,
+ /*0x04e5*/ 399,
+ /*0x0165*/ 104,
+ /*0x1f20*/ 614,
+ /*0x0265*/ 212,
+ /*0x0565*/ 441,
+ -1,
+ /*0x0465*/ 339,
+ -1,
+ /*0x1f65*/ 645,
+ /*0x1ee3*/ 585,
+ /*0x1e63*/ 526,
+ /*0x04e3*/ 398,
+ /*0x0163*/ 103,
+ /*0x2ce3*/ 817,
+ /*0x0263*/ 211,
+ /*0x0563*/ 439,
+ -1,
+ /*0x0463*/ 338,
+ -1,
+ /*0x1f63*/ 643,
+ -1, -1, -1,
+ /*0x2c61*/ 760,
+ /*0x24e1*/ 704,
+ /*0x1ed1*/ 576,
+ /*0x1e51*/ 517,
+ /*0x04d1*/ 389,
+ /*0x0151*/ 94,
+ /*0x2cd1*/ 808,
+ /*0x0251*/ 200,
+ /*0x1fe1*/ 667,
+ /*0xa761*/ 928,
+ /*0x0451*/ 322,
+ -1,
+ /*0x1f51*/ 636,
+ /*0x1f14*/ 612,
+ -1,
+ /*0x2c65*/ 761,
+ /*0x24e5*/ 708,
+ -1,
+ /*0x017e*/ 116,
+ -1, -1,
+ /*0x057e*/ 466,
+ -1,
+ /*0x1fe5*/ 668,
+ /*0xa765*/ 930,
+ -1,
+ /*0x03ae*/ 241,
+ /*0x24e3*/ 706,
+ /*0x1ed7*/ 579,
+ /*0x1e57*/ 520,
+ /*0x04d7*/ 392,
+ /*0x0157*/ 97,
+ /*0x2cd7*/ 811,
+ /*0x0257*/ 205,
+ /*0x03ac*/ 239,
+ /*0xa763*/ 929,
+ /*0x0457*/ 328,
+ /*0x1f04*/ 604,
+ /*0x1f57*/ 639,
+ /*0x0584*/ 472,
+ /*0x0280*/ 223,
+ -1,
+ /*0x2c51*/ 746,
+ /*0x24d1*/ 688,
+ /*0x1ed3*/ 577,
+ /*0x1e53*/ 518,
+ /*0x04d3*/ 390,
+ /*0x0153*/ 95,
+ /*0x2cd3*/ 809,
+ /*0x0253*/ 202,
+ /*0x1fd1*/ 665,
+ /*0xa751*/ 920,
+ /*0x0453*/ 324,
+ /*0x028a*/ 228,
+ /*0x1f53*/ 637,
+ /*0x1ee9*/ 588,
+ /*0x1e69*/ 529,
+ /*0x04e9*/ 401,
+ /*0x0169*/ 106,
+ -1,
+ /*0x0269*/ 215,
+ /*0x0569*/ 445,
+ -1,
+ /*0x0469*/ 341,
+ /*0x1ee7*/ 587,
+ /*0x1e67*/ 528,
+ /*0x04e7*/ 400,
+ /*0x0167*/ 105,
+ /*0x2c57*/ 752,
+ /*0x24d7*/ 694,
+ /*0x0567*/ 443,
+ /*0x028b*/ 229,
+ /*0x0467*/ 340,
+ /*0xa661*/ 877,
+ /*0x1f67*/ 647,
+ /*0x03e1*/ 277,
+ -1,
+ /*0xa757*/ 923,
+ /*0x1ed9*/ 580,
+ /*0x1e59*/ 521,
+ /*0x04d9*/ 393,
+ /*0x0159*/ 98,
+ /*0x2cd9*/ 812,
+ /*0x0259*/ 206,
+ /*0x2c53*/ 748,
+ /*0x24d3*/ 690,
+ /*0x0459*/ 330,
+ -1,
+ /*0xa665*/ 879,
+ -1,
+ /*0x03e5*/ 279,
+ -1, -1,
+ /*0xa753*/ 921,
+ -1,
+ /*0x2cee*/ 819,
+ /*0x24e9*/ 712,
+ /*0x056e*/ 450,
+ -1,
+ /*0xa663*/ 878,
+ /*0x029e*/ 232,
+ /*0x03e3*/ 278,
+ -1,
+ /*0x10428*/ 982,
+ /*0xa769*/ 932,
+ /*0x24e7*/ 710,
+ /*0x1edb*/ 581,
+ /*0x1e5b*/ 522,
+ /*0x04db*/ 394,
+ /*0x015b*/ 99,
+ /*0x2cdb*/ 813,
+ /*0x025b*/ 207,
+ /*0x0574*/ 456,
+ /*0xa767*/ 931,
+ /*0x045b*/ 332,
+ /*0xa651*/ 869,
+ /*0x1f74*/ 652,
+ /*0x1042e*/ 988,
+ /*0x2c59*/ 754,
+ /*0x24d9*/ 696,
+ /*0x1ed5*/ 578,
+ /*0x1e55*/ 519,
+ /*0x04d5*/ 391,
+ /*0x0155*/ 96,
+ /*0x2cd5*/ 810,
+ /*0x1042c*/ 986,
+ /*0x01a8*/ 130,
+ /*0xa759*/ 924,
+ /*0x0455*/ 326,
+ /*0x1042a*/ 984,
+ /*0x1f55*/ 638,
+ /*0x1edd*/ 582,
+ /*0x1e5d*/ 523,
+ /*0x04dd*/ 395,
+ /*0x015d*/ 100,
+ /*0x2cdd*/ 814,
+ /*0x0180*/ 117,
+ /*0x013e*/ 85,
+ -1,
+ /*0x045d*/ 334,
+ -1,
+ /*0xa657*/ 872,
+ /*0x043e*/ 303,
+ /*0x03d7*/ 272,
+ -1,
+ /*0x217e*/ 684,
+ /*0x2c5b*/ 756,
+ /*0x24db*/ 698,
+ /*0x1ecf*/ 575,
+ /*0x1e4f*/ 516,
+ /*0x04cf*/ 388,
+ /*0x014f*/ 93,
+ /*0x2ccf*/ 807,
+ /*0x024f*/ 198,
+ -1,
+ /*0xa75b*/ 925,
+ /*0x044f*/ 320,
+ /*0xa653*/ 870,
+ /*0x0061*/ 0,
+ -1,
+ /*0x2c55*/ 750,
+ /*0x24d5*/ 692,
+ -1,
+ /*0x0570*/ 452,
+ -1, -1,
+ /*0x019a*/ 125,
+ /*0x1f70*/ 648,
+ /*0xa669*/ 881,
+ /*0xa755*/ 922,
+ /*0x03e9*/ 281,
+ /*0x2c5d*/ 758,
+ /*0x24dd*/ 700,
+ /*0x0065*/ 4,
+ /*0x2c3e*/ 727,
+ -1,
+ /*0x013c*/ 84,
+ /*0xa667*/ 880,
+ /*0x023c*/ 190,
+ /*0x03e7*/ 280,
+ /*0xa75d*/ 926,
+ /*0x043c*/ 301,
+ /*0x1ecd*/ 574,
+ /*0x1e4d*/ 515,
+ /*0x0063*/ 2,
+ /*0x014d*/ 92,
+ /*0x2ccd*/ 806,
+ /*0x024d*/ 197,
+ /*0x2c4f*/ 744,
+ /*0x01e1*/ 151,
+ /*0x044d*/ 318,
+ /*0xa659*/ 873,
+ -1,
+ /*0x03d9*/ 273,
+ -1, -1,
+ /*0x019e*/ 126,
+ /*0xa74f*/ 919,
+ /*0x1ecb*/ 573,
+ /*0x1e4b*/ 514,
+ -1,
+ /*0x014b*/ 91,
+ /*0x2ccb*/ 805,
+ /*0x024b*/ 196,
+ /*0x01e5*/ 153,
+ /*0xa78c*/ 943,
+ /*0x044b*/ 316,
+ -1,
+ /*0x1ef3*/ 593,
+ /*0x1e73*/ 534,
+ /*0x04f3*/ 406,
+ /*0x0173*/ 111,
+ /*0x2cf3*/ 820,
+ /*0x2c3c*/ 725,
+ /*0x0573*/ 455,
+ /*0x01e3*/ 152,
+ /*0x0473*/ 346,
+ -1,
+ /*0x1f73*/ 651,
+ /*0xa65b*/ 874,
+ -1,
+ /*0x03db*/ 274,
+ /*0x2c4d*/ 742,
+ -1,
+ /*0x1eeb*/ 589,
+ /*0x1e6b*/ 530,
+ /*0x04eb*/ 402,
+ /*0x016b*/ 107,
+ -1,
+ /*0x026b*/ 216,
+ /*0x056b*/ 447,
+ /*0xa74d*/ 918,
+ /*0x046b*/ 342,
+ /*0xa655*/ 871,
+ -1,
+ /*0x0140*/ 86,
+ /*0x2174*/ 674,
+ /*0x0240*/ 192,
+ /*0x2c4b*/ 740,
+ /*0x118d1*/ 1039,
+ /*0x0440*/ 305,
+ /*0x0564*/ 440,
+ /*0x1f40*/ 630,
+ -1,
+ /*0xa65d*/ 875,
+ /*0x1f64*/ 644,
+ /*0x03dd*/ 275,
+ /*0xa74b*/ 917,
+ /*0x2c73*/ 766,
+ /*0x03be*/ 256,
+ /*0x1ec9*/ 572,
+ /*0x1e49*/ 513,
+ -1,
+ /*0x0069*/ 1054,
+ /*0x2cc9*/ 804,
+ /*0x0249*/ 195,
+ /*0x1ec5*/ 570,
+ /*0x1e45*/ 511,
+ /*0x0449*/ 314,
+ -1,
+ /*0x2cc5*/ 802,
+ /*0xa64f*/ 868,
+ /*0x0067*/ 6,
+ -1,
+ /*0x0445*/ 310,
+ /*0x118d7*/ 1045,
+ /*0x1f45*/ 635,
+ /*0x1edf*/ 583,
+ /*0x1e5f*/ 524,
+ /*0x04df*/ 396,
+ /*0x015f*/ 101,
+ /*0x2cdf*/ 815,
+ /*0x2c40*/ 729,
+ /*0xa76b*/ 933,
+ -1,
+ /*0x045f*/ 336,
+ /*0x24e4*/ 707,
+ -1,
+ /*0x1ec7*/ 571,
+ /*0x1e47*/ 512,
+ /*0x0288*/ 226,
+ /*0x118d3*/ 1041,
+ /*0x2cc7*/ 803,
+ /*0x0247*/ 194,
+ /*0x01e9*/ 155,
+ -1,
+ /*0x0447*/ 312,
+ /*0x2170*/ 670,
+ /*0x03bc*/ 254,
+ /*0x006e*/ 12,
+ /*0x2c49*/ 738,
+ -1, -1,
+ /*0x01e7*/ 154,
+ -1,
+ /*0xa64d*/ 867,
+ /*0x2c45*/ 734,
+ /*0x03cd*/ 270,
+ -1,
+ /*0xa749*/ 916,
+ -1, -1,
+ /*0x1ec3*/ 569,
+ /*0x1e43*/ 510,
+ /*0x0074*/ 18,
+ /*0xa745*/ 914,
+ /*0x2cc3*/ 801,
+ -1,
+ /*0x24df*/ 702,
+ /*0x013a*/ 83,
+ /*0x0443*/ 308,
+ /*0xa64b*/ 866,
+ /*0x1f43*/ 633,
+ /*0x03cb*/ 268,
+ /*0x043a*/ 299,
+ /*0x118d9*/ 1047,
+ /*0xa75f*/ 927,
+ -1,
+ /*0x2c47*/ 736,
+ -1, -1,
+ /*0x1ec1*/ 568,
+ /*0x1e41*/ 509,
+ /*0x03f3*/ 286,
+ /*0x028c*/ 230,
+ /*0x2cc1*/ 800,
+ -1,
+ /*0xa747*/ 915,
+ -1,
+ /*0x0441*/ 306,
+ -1,
+ /*0x1f41*/ 631,
+ -1, -1, -1, -1, -1,
+ /*0xa66b*/ 882,
+ /*0x2173*/ 673,
+ /*0x03eb*/ 282,
+ /*0x1043e*/ 1004,
+ -1,
+ /*0x2c43*/ 732,
+ /*0x118db*/ 1049,
+ -1,
+ /*0x0438*/ 297,
+ /*0x2c3a*/ 723,
+ /*0x03c0*/ 258,
+ /*0xff51*/ 972,
+ -1,
+ /*0x056a*/ 446,
+ /*0xa743*/ 913,
+ -1, -1,
+ /*0x1044f*/ 1021,
+ /*0x0070*/ 14,
+ -1,
+ /*0x118d5*/ 1043,
+ -1,
+ /*0x017a*/ 114,
+ /*0x01dd*/ 149,
+ /*0x2c41*/ 730,
+ /*0x057a*/ 462,
+ /*0xa649*/ 865,
+ -1,
+ /*0x03c9*/ 266,
+ /*0x1f7a*/ 658,
+ -1,
+ /*0x118dd*/ 1051,
+ /*0xa645*/ 863,
+ /*0xa741*/ 912,
+ /*0x03c5*/ 262,
+ -1, -1,
+ /*0xff57*/ 978,
+ -1,
+ /*0x0188*/ 120,
+ /*0x2c38*/ 721,
+ -1,
+ /*0x1043c*/ 1002,
+ /*0xa65f*/ 876,
+ -1,
+ /*0x03df*/ 276,
+ -1,
+ /*0x2c6a*/ 764,
+ /*0x118cf*/ 1037,
+ -1, -1,
+ /*0x1044d*/ 1019,
+ -1,
+ /*0xff53*/ 974,
+ /*0xa647*/ 864,
+ -1,
+ /*0x03c7*/ 264,
+ /*0x1ead*/ 558,
+ /*0x1e2d*/ 499,
+ /*0x04ad*/ 371,
+ /*0x012d*/ 78,
+ /*0x2cad*/ 790,
+ /*0x022d*/ 186,
+ /*0x052d*/ 435,
+ -1, -1, -1,
+ /*0x1044b*/ 1017,
+ /*0xa77a*/ 936,
+ /*0x0073*/ 17,
+ -1,
+ /*0x1eb3*/ 561,
+ /*0x1e33*/ 502,
+ /*0x04b3*/ 374,
+ /*0x0133*/ 80,
+ /*0x2cb3*/ 793,
+ /*0x0233*/ 189,
+ -1,
+ /*0xa643*/ 862,
+ /*0x0433*/ 292,
+ /*0x03c3*/ 260,
+ /*0x1f33*/ 625,
+ /*0x118cd*/ 1035,
+ /*0x018c*/ 121,
+ /*0x03ba*/ 252,
+ /*0x006b*/ 9,
+ /*0x2d1b*/ 848,
+ /*0xff59*/ 980,
+ /*0x2cec*/ 818,
+ /*0x026c*/ 217,
+ /*0x056c*/ 448,
+ /*0x2d24*/ 857,
+ /*0x2d00*/ 821,
+ /*0x2d11*/ 838,
+ /*0x2d18*/ 845,
+ /*0x2d22*/ 855,
+ /*0x0064*/ 3,
+ /*0xa641*/ 861,
+ /*0x118cb*/ 1033,
+ /*0x03c1*/ 259,
+ /*0x01f3*/ 159,
+ /*0x10440*/ 1006,
+ /*0x2d16*/ 843,
+ -1, -1,
+ /*0x2d0a*/ 831,
+ /*0xa72d*/ 903,
+ /*0x2d06*/ 827,
+ /*0x2d0f*/ 836,
+ -1,
+ /*0x0250*/ 199,
+ /*0x2c33*/ 716,
+ -1,
+ /*0x0450*/ 321,
+ -1,
+ /*0x03b8*/ 250,
+ /*0x01eb*/ 156,
+ -1, -1,
+ /*0x10449*/ 1015,
+ /*0xa733*/ 905,
+ -1,
+ /*0x2d1a*/ 847,
+ /*0x2d0b*/ 832,
+ /*0x2c6c*/ 765,
+ /*0x10445*/ 1011,
+ -1, -1,
+ /*0x2d10*/ 837,
+ /*0xff55*/ 976,
+ /*0x2d01*/ 822,
+ /*0x2d02*/ 823,
+ /*0x118c0*/ 1022,
+ -1,
+ /*0x1ea5*/ 554,
+ /*0x1e25*/ 495,
+ /*0x04a5*/ 367,
+ /*0x0125*/ 74,
+ /*0x2ca5*/ 786,
+ /*0x0225*/ 182,
+ /*0x0525*/ 431,
+ -1,
+ /*0x01c9*/ 139,
+ -1,
+ /*0x1f25*/ 619,
+ /*0x2c50*/ 745,
+ /*0x24d0*/ 687,
+ /*0x10447*/ 1013,
+ /*0xa7a5*/ 953,
+ /*0x217a*/ 680,
+ /*0x118c9*/ 1031,
+ /*0x0578*/ 460,
+ /*0x2d1e*/ 851,
+ /*0x1fd0*/ 664,
+ /*0x2d20*/ 853,
+ /*0x1f78*/ 656,
+ /*0x118c5*/ 1027,
+ /*0xff4f*/ 970,
+ -1,
+ /*0x01df*/ 150,
+ /*0x1ea3*/ 553,
+ /*0x1e23*/ 494,
+ /*0x04a3*/ 366,
+ /*0x0123*/ 73,
+ /*0x2ca3*/ 785,
+ /*0x0223*/ 181,
+ /*0x0523*/ 430,
+ /*0x118df*/ 1053,
+ /*0x0266*/ 213,
+ /*0x0566*/ 442,
+ /*0x1f23*/ 617,
+ /*0x10443*/ 1009,
+ /*0x03ad*/ 240,
+ /*0x1f66*/ 646,
+ /*0xa7a3*/ 952,
+ /*0x1043a*/ 1000,
+ -1, -1,
+ /*0x118c7*/ 1029,
+ /*0x1eef*/ 591,
+ /*0x1e6f*/ 532,
+ /*0x04ef*/ 404,
+ /*0x016f*/ 109,
+ /*0xa725*/ 899,
+ /*0x026f*/ 218,
+ /*0x056f*/ 451,
+ /*0x03b3*/ 245,
+ /*0x046f*/ 344,
+ /*0x2d14*/ 841,
+ -1,
+ /*0x10441*/ 1007,
+ /*0xff4d*/ 968,
+ /*0x2d0e*/ 835,
+ /*0x1eed*/ 590,
+ /*0x1e6d*/ 531,
+ /*0x04ed*/ 403,
+ /*0x016d*/ 108,
+ -1, -1,
+ /*0x056d*/ 449,
+ -1,
+ /*0x046d*/ 343,
+ /*0x118c3*/ 1025,
+ /*0x2c66*/ 762,
+ /*0x24e6*/ 709,
+ /*0x006a*/ 8,
+ /*0x10438*/ 998,
+ /*0xff4b*/ 966,
+ -1,
+ /*0xa723*/ 898,
+ /*0x1e85*/ 543,
+ /*0x1e05*/ 479,
+ /*0x2d04*/ 825,
+ /*0x0105*/ 58,
+ /*0x2c85*/ 770,
+ /*0x0205*/ 167,
+ /*0x0505*/ 415,
+ /*0x007a*/ 24,
+ -1, -1,
+ /*0x1f05*/ 605,
+ /*0x118c1*/ 1023,
+ /*0x0585*/ 473,
+ -1,
+ /*0xa785*/ 941,
+ /*0x0373*/ 234,
+ /*0x1e83*/ 542,
+ /*0x1e03*/ 478,
+ /*0xa76f*/ 935,
+ /*0x0103*/ 57,
+ /*0x2c83*/ 769,
+ /*0x0203*/ 166,
+ /*0x0503*/ 414,
+ /*0x0576*/ 458,
+ -1, -1,
+ /*0x1f03*/ 603,
+ /*0x1f76*/ 654,
+ /*0x0583*/ 471,
+ /*0xa685*/ 886,
+ /*0xa783*/ 940,
+ -1,
+ /*0xa76d*/ 934,
+ /*0x1ebf*/ 567,
+ /*0x1e3f*/ 508,
+ /*0x04bf*/ 380,
+ -1,
+ /*0x2cbf*/ 799,
+ /*0x023f*/ 191,
+ -1, -1,
+ /*0x043f*/ 304,
+ -1, -1, -1,
+ /*0xa683*/ 885,
+ /*0x1efd*/ 598,
+ /*0x1e7d*/ 539,
+ /*0x04fd*/ 411,
+ /*0xff49*/ 964,
+ /*0x03f8*/ 287,
+ /*0x027d*/ 222,
+ /*0x057d*/ 465,
+ /*0x1042d*/ 987,
+ /*0x047d*/ 351,
+ /*0xff45*/ 960,
+ /*0x1f7d*/ 661,
+ /*0x2c76*/ 767,
+ -1, -1,
+ /*0x1eb7*/ 563,
+ /*0x1e37*/ 504,
+ /*0x04b7*/ 376,
+ /*0x0137*/ 82,
+ /*0x2cb7*/ 795,
+ /*0x2178*/ 678,
+ /*0x1d7d*/ 476,
+ /*0x10433*/ 993,
+ /*0x0437*/ 296,
+ -1,
+ /*0x1f37*/ 629,
+ -1,
+ /*0x006c*/ 10,
+ /*0x2c3f*/ 728,
+ -1, -1,
+ /*0x01ad*/ 131,
+ /*0xff47*/ 962,
+ -1, -1, -1, -1,
+ /*0xa73f*/ 911,
+ -1,
+ /*0x03ef*/ 284,
+ /*0x1eb5*/ 562,
+ /*0x1e35*/ 503,
+ /*0x04b5*/ 375,
+ /*0x0135*/ 81,
+ /*0x2cb5*/ 794,
+ -1,
+ /*0x04c2*/ 381,
+ /*0x0142*/ 87,
+ /*0x0435*/ 294,
+ /*0x0242*/ 193,
+ /*0x1f35*/ 627,
+ /*0xa66d*/ 883,
+ /*0x0442*/ 307,
+ /*0x03ed*/ 283,
+ /*0x1f42*/ 632,
+ /*0x2c37*/ 720,
+ /*0xff43*/ 958,
+ /*0x1eb1*/ 560,
+ /*0x1e31*/ 501,
+ /*0x04b1*/ 373,
+ -1,
+ /*0x2cb1*/ 792,
+ /*0x0231*/ 188,
+ -1,
+ /*0xa737*/ 907,
+ /*0x0431*/ 290,
+ -1,
+ /*0x1f31*/ 623,
+ /*0x1ea7*/ 555,
+ /*0x1e27*/ 496,
+ /*0x04a7*/ 368,
+ /*0x0127*/ 75,
+ /*0x2ca7*/ 787,
+ /*0x0227*/ 183,
+ /*0x0527*/ 432,
+ /*0xff41*/ 956,
+ -1,
+ /*0x2d08*/ 829,
+ /*0x1f27*/ 621,
+ /*0x01d0*/ 142,
+ /*0x2c35*/ 718,
+ -1,
+ /*0xa7a7*/ 954,
+ /*0x00e1*/ 26,
+ /*0x2c42*/ 731,
+ /*0x2184*/ 686,
+ -1,
+ /*0x118d0*/ 1038,
+ /*0x0078*/ 22,
+ /*0xa735*/ 906,
+ /*0x1e95*/ 551,
+ /*0x1e15*/ 487,
+ /*0x0495*/ 359,
+ /*0x0115*/ 66,
+ /*0x2c95*/ 778,
+ /*0x0215*/ 175,
+ /*0x0515*/ 423,
+ /*0x2c31*/ 714,
+ /*0x00e5*/ 30,
+ -1,
+ /*0x1f15*/ 613,
+ -1,
+ /*0x2176*/ 676,
+ /*0x03bf*/ 257,
+ /*0x0283*/ 224,
+ /*0x1fb1*/ 663,
+ /*0x0066*/ 5,
+ -1,
+ /*0x01a5*/ 129,
+ /*0x00e3*/ 28,
+ /*0x1e93*/ 550,
+ /*0x1e13*/ 486,
+ /*0x0493*/ 358,
+ /*0x0113*/ 65,
+ /*0x2c93*/ 777,
+ /*0x0213*/ 174,
+ /*0x0513*/ 422,
+ /*0xa727*/ 900,
+ -1,
+ /*0xa695*/ 894,
+ /*0x1f13*/ 611,
+ /*0x2d0c*/ 833,
+ /*0x006f*/ 13,
+ -1,
+ /*0xa793*/ 945,
+ -1,
+ /*0x1f12*/ 610,
+ /*0x1ef9*/ 596,
+ /*0x1e79*/ 537,
+ /*0x04f9*/ 409,
+ /*0x03b7*/ 249,
+ /*0x217d*/ 683,
+ -1,
+ /*0x0579*/ 461,
+ /*0x01a3*/ 128,
+ /*0x0479*/ 349,
+ /*0x006d*/ 11,
+ /*0x1f79*/ 657,
+ /*0x00fe*/ 54,
+ /*0xa693*/ 893,
+ /*0x1ef5*/ 594,
+ /*0x1e75*/ 535,
+ /*0x04f5*/ 407,
+ /*0x0175*/ 112,
+ -1,
+ /*0x0275*/ 221,
+ /*0x0575*/ 457,
+ /*0x1d79*/ 475,
+ /*0x0475*/ 347,
+ -1,
+ /*0x1f75*/ 653,
+ -1, -1,
+ /*0x01ef*/ 158,
+ -1,
+ /*0x03b5*/ 247,
+ /*0x1ef1*/ 592,
+ /*0x1e71*/ 533,
+ /*0x04f1*/ 405,
+ /*0x0171*/ 110,
+ -1,
+ /*0x0271*/ 219,
+ /*0x0571*/ 453,
+ -1,
+ /*0x0471*/ 345,
+ -1,
+ /*0x1f71*/ 649,
+ /*0x01ed*/ 157,
+ -1, -1,
+ /*0x0076*/ 20,
+ -1,
+ /*0x03b1*/ 243,
+ -1, -1, -1,
+ /*0x1e87*/ 544,
+ /*0x1e07*/ 480,
+ /*0x00e9*/ 34,
+ /*0x0107*/ 59,
+ /*0x2c87*/ 771,
+ /*0x0207*/ 168,
+ /*0x0507*/ 416,
+ /*0x045a*/ 331,
+ /*0x0185*/ 119,
+ -1,
+ /*0x1f07*/ 607,
+ /*0x00e7*/ 32,
+ -1, -1,
+ /*0xa787*/ 942,
+ /*0x1ebd*/ 566,
+ /*0x1e3d*/ 507,
+ /*0x04bd*/ 379,
+ /*0x1043f*/ 1005,
+ /*0x2cbd*/ 798,
+ /*0xff50*/ 971,
+ -1, -1,
+ /*0x043d*/ 302,
+ /*0x0183*/ 118,
+ -1,
+ /*0x1eb9*/ 564,
+ /*0x1e39*/ 505,
+ /*0x04b9*/ 377,
+ /*0xa687*/ 887,
+ /*0x2cb9*/ 796,
+ /*0x04ce*/ 387,
+ -1, -1,
+ /*0x0439*/ 298,
+ -1, -1,
+ /*0x044e*/ 319,
+ /*0x00ee*/ 39,
+ /*0x2c5a*/ 755,
+ /*0x24da*/ 697,
+ /*0x01bf*/ 137,
+ -1, -1, -1,
+ /*0x10437*/ 997,
+ /*0x1eaf*/ 559,
+ /*0x1e2f*/ 500,
+ /*0x04af*/ 372,
+ /*0x012f*/ 79,
+ /*0x2caf*/ 791,
+ /*0x022f*/ 187,
+ /*0x052f*/ 436,
+ /*0x00f4*/ 45,
+ /*0x01fd*/ 163,
+ /*0x2c3d*/ 726,
+ -1,
+ /*0x1ea9*/ 556,
+ /*0x1e29*/ 497,
+ /*0x04a9*/ 369,
+ /*0x0129*/ 76,
+ /*0x2ca9*/ 788,
+ /*0x0229*/ 184,
+ /*0x0529*/ 433,
+ /*0xa73d*/ 910,
+ -1,
+ /*0x2c39*/ 722,
+ /*0x0272*/ 220,
+ /*0x0572*/ 454,
+ /*0x2c4e*/ 743,
+ /*0x10435*/ 995,
+ /*0xa7a9*/ 955,
+ /*0x1f72*/ 650,
+ /*0x0292*/ 231,
+ /*0x10442*/ 1008,
+ /*0xa739*/ 908,
+ /*0x1ea1*/ 552,
+ /*0x1e21*/ 493,
+ /*0x04a1*/ 365,
+ /*0x0121*/ 72,
+ /*0x2ca1*/ 784,
+ /*0x2179*/ 679,
+ /*0x0521*/ 429,
+ /*0x1efb*/ 597,
+ /*0x1e7b*/ 538,
+ /*0x04fb*/ 410,
+ /*0x1f21*/ 615,
+ /*0x10431*/ 991,
+ /*0x0562*/ 438,
+ /*0x057b*/ 463,
+ /*0xa7a1*/ 951,
+ /*0x047b*/ 350,
+ /*0x1f62*/ 642,
+ /*0x1f7b*/ 659,
+ /*0x2175*/ 675,
+ /*0xa72f*/ 904,
+ /*0x1e19*/ 489,
+ /*0x0499*/ 361,
+ /*0x0119*/ 68,
+ /*0x2c99*/ 780,
+ /*0x0219*/ 177,
+ /*0x0519*/ 425,
+ /*0x04c6*/ 383,
+ /*0x0146*/ 89,
+ /*0x00f0*/ 41,
+ /*0x118c2*/ 1024,
+ /*0xa729*/ 901,
+ -1,
+ /*0x0446*/ 311,
+ /*0xa799*/ 947,
+ /*0x2171*/ 671,
+ /*0x1ef7*/ 595,
+ /*0x1e77*/ 536,
+ /*0x04f7*/ 408,
+ /*0x0177*/ 113,
+ /*0x0268*/ 214,
+ /*0x0568*/ 444,
+ /*0x0577*/ 459,
+ -1,
+ /*0x0477*/ 348,
+ -1,
+ /*0x1f77*/ 655,
+ -1,
+ /*0x24e2*/ 705,
+ /*0xa699*/ 896,
+ -1,
+ /*0x1eff*/ 599,
+ /*0x1e7f*/ 540,
+ /*0x04ff*/ 412,
+ /*0x04cc*/ 386,
+ /*0x03bd*/ 255,
+ -1,
+ /*0x057f*/ 467,
+ /*0x0287*/ 225,
+ /*0x047f*/ 352,
+ /*0x044c*/ 317,
+ /*0x04c8*/ 384,
+ /*0x0148*/ 90,
+ -1, -1,
+ /*0x2c46*/ 735,
+ /*0x03b9*/ 251,
+ /*0x0448*/ 313,
+ /*0x0195*/ 123,
+ /*0x03ce*/ 271,
+ -1,
+ /*0x04c4*/ 382,
+ /*0x0144*/ 88,
+ /*0x2d2d*/ 860,
+ /*0x0079*/ 23,
+ /*0x2c68*/ 763,
+ /*0x24e8*/ 711,
+ /*0x0444*/ 309,
+ -1,
+ /*0x1f44*/ 634,
+ /*0x00f3*/ 44,
+ /*0x1ebb*/ 565,
+ /*0x1e3b*/ 506,
+ /*0x04bb*/ 378,
+ /*0x214e*/ 669,
+ /*0x2cbb*/ 797,
+ /*0x03af*/ 242,
+ /*0x0075*/ 19,
+ -1,
+ /*0x043b*/ 300,
+ -1, -1,
+ /*0x2c4c*/ 741,
+ -1,
+ /*0x0192*/ 122,
+ -1,
+ /*0x00eb*/ 36,
+ -1,
+ /*0x2d1c*/ 849,
+ /*0x2c48*/ 737,
+ /*0xa77f*/ 938,
+ -1,
+ /*0x03f2*/ 285,
+ /*0x0071*/ 15,
+ /*0x037d*/ 238,
+ /*0x01f9*/ 161,
+ -1,
+ /*0x00e4*/ 29,
+ -1,
+ /*0x2c44*/ 733,
+ /*0x1eab*/ 557,
+ /*0x1e2b*/ 498,
+ /*0x04ab*/ 370,
+ /*0x012b*/ 77,
+ /*0x2cab*/ 789,
+ /*0x022b*/ 185,
+ /*0x052b*/ 434,
+ /*0x2172*/ 672,
+ /*0x01f5*/ 160,
+ /*0x0256*/ 204,
+ -1,
+ /*0x2c3b*/ 724,
+ /*0x0456*/ 327,
+ /*0x03fb*/ 288,
+ /*0x1e17*/ 488,
+ /*0x0497*/ 360,
+ /*0x0117*/ 67,
+ /*0x2c97*/ 779,
+ /*0x0217*/ 176,
+ /*0x0517*/ 424,
+ /*0xa73b*/ 909,
+ /*0x1e1f*/ 492,
+ /*0x049f*/ 364,
+ /*0x011f*/ 71,
+ /*0x2c9f*/ 783,
+ /*0x021f*/ 180,
+ /*0x051f*/ 428,
+ /*0xa797*/ 946,
+ /*0x217b*/ 681,
+ /*0xff42*/ 957,
+ /*0x03c6*/ 263,
+ -1, -1,
+ /*0x0436*/ 295,
+ /*0xa79f*/ 950,
+ /*0x1f36*/ 628,
+ /*0x1043d*/ 1003,
+ -1, -1, -1,
+ /*0x2d25*/ 858,
+ -1,
+ /*0xa697*/ 895,
+ /*0x01da*/ 147,
+ /*0x2c56*/ 751,
+ /*0x24d6*/ 693,
+ -1,
+ /*0x10439*/ 999,
+ -1,
+ /*0xa72b*/ 902,
+ /*0x1044e*/ 1020,
+ /*0x118da*/ 1048,
+ -1, -1, -1, -1,
+ /*0x2177*/ 677,
+ /*0x03cc*/ 269,
+ -1,
+ /*0x01bd*/ 136,
+ -1, -1, -1, -1,
+ /*0x03c8*/ 265,
+ /*0x2c36*/ 719,
+ /*0x2d23*/ 856,
+ /*0x1042f*/ 989,
+ -1,
+ /*0x0254*/ 203,
+ /*0x01b9*/ 135,
+ /*0x217f*/ 685,
+ /*0x0454*/ 325,
+ /*0x01ce*/ 141,
+ /*0x03c4*/ 261,
+ /*0x0072*/ 16,
+ -1, -1,
+ /*0x10429*/ 983,
+ /*0x1e89*/ 545,
+ /*0x1e09*/ 481,
+ /*0x118ce*/ 1036,
+ /*0x0109*/ 60,
+ /*0x2c89*/ 772,
+ /*0x0209*/ 169,
+ /*0x0509*/ 417,
+ /*0x03bb*/ 253,
+ -1,
+ /*0x1e8d*/ 547,
+ /*0x1e0d*/ 483,
+ /*0x048d*/ 355,
+ /*0x010d*/ 62,
+ /*0x2c8d*/ 774,
+ /*0x020d*/ 171,
+ /*0x050d*/ 419,
+ /*0x0062*/ 1,
+ /*0x1e1d*/ 491,
+ /*0x049d*/ 363,
+ /*0x011d*/ 70,
+ /*0x2c9d*/ 782,
+ /*0x021d*/ 179,
+ /*0x051d*/ 427,
+ -1,
+ /*0x0458*/ 329,
+ /*0x2c54*/ 749,
+ /*0x24d4*/ 691,
+ /*0x00ea*/ 35,
+ /*0x0252*/ 201,
+ /*0xa689*/ 888,
+ /*0xa79d*/ 949,
+ /*0x0452*/ 323,
+ /*0x025c*/ 208,
+ -1,
+ /*0x04ca*/ 385,
+ /*0x045c*/ 333,
+ -1,
+ /*0x2d05*/ 826,
+ /*0xa68d*/ 890,
+ /*0x00fa*/ 50,
+ /*0x044a*/ 315,
+ /*0x01a1*/ 127,
+ /*0x10446*/ 1012,
+ /*0x017c*/ 115,
+ /*0x0068*/ 7,
+ /*0x0077*/ 21,
+ /*0x057c*/ 464,
+ -1,
+ /*0x01fb*/ 162,
+ -1,
+ /*0x1f7c*/ 660,
+ -1,
+ /*0x0434*/ 293,
+ /*0x2d03*/ 824,
+ /*0x1f34*/ 626,
+ /*0x045e*/ 335,
+ /*0x2c58*/ 753,
+ /*0x24d8*/ 695,
+ -1, -1,
+ /*0x0199*/ 124,
+ /*0x03b6*/ 248,
+ -1,
+ /*0x2c52*/ 747,
+ /*0x24d2*/ 689,
+ /*0x01c6*/ 138,
+ /*0x0260*/ 209,
+ /*0x2c5c*/ 757,
+ /*0x24dc*/ 699,
+ /*0x1044c*/ 1018,
+ /*0x0371*/ 233,
+ /*0x1f60*/ 640,
+ /*0x2c4a*/ 739,
+ /*0x118c6*/ 1028,
+ -1, -1,
+ /*0x10448*/ 1014,
+ -1, -1, -1,
+ /*0x0430*/ 289,
+ /*0xff5a*/ 981,
+ /*0x1f30*/ 622,
+ /*0x0432*/ 291,
+ /*0x2c34*/ 717,
+ /*0x1f32*/ 624,
+ /*0x10444*/ 1010,
+ /*0x2c5e*/ 759,
+ /*0x24de*/ 701,
+ /*0xa77c*/ 937,
+ -1,
+ /*0x01ff*/ 164,
+ /*0x01cc*/ 140,
+ -1, -1, -1, -1, -1,
+ /*0x1043b*/ 1001,
+ -1,
+ /*0x118cc*/ 1034,
+ -1,
+ /*0x24e0*/ 703,
+ -1,
+ /*0x00ec*/ 37,
+ -1, -1,
+ /*0x118c8*/ 1030,
+ -1,
+ /*0x1fe0*/ 666,
+ -1,
+ /*0xff4e*/ 969,
+ /*0x2c30*/ 713,
+ -1, -1,
+ /*0x2c32*/ 715,
+ -1,
+ /*0x118c4*/ 1026,
+ -1, -1,
+ /*0x1fb0*/ 662,
+ -1, -1, -1, -1, -1, -1,
+ /*0x1042b*/ 985,
+ -1, -1, -1, -1, -1,
+ /*0x0289*/ 227,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1,
+ /*0x03ca*/ 267,
+ -1, -1,
+ /*0x2d27*/ 859,
+ -1,
+ /*0x10436*/ 996,
+ -1,
+ /*0x01d6*/ 145,
+ -1, -1, -1, -1,
+ /*0x03b4*/ 246,
+ -1, -1,
+ /*0x118d6*/ 1044,
+ -1, -1,
+ /*0x00f8*/ 48,
+ -1, -1, -1, -1,
+ /*0x217c*/ 682,
+ -1,
+ /*0x2d15*/ 842,
+ /*0x037b*/ 236,
+ -1,
+ /*0x01b6*/ 134,
+ -1, -1, -1, -1, -1, -1,
+ /*0xff46*/ 961,
+ /*0x00e6*/ 31,
+ -1, -1, -1, -1, -1, -1,
+ /*0x03b2*/ 244,
+ -1,
+ /*0x2d13*/ 840,
+ -1, -1, -1, -1, -1,
+ /*0x2d12*/ 839,
+ /*0x00ef*/ 40,
+ -1,
+ /*0x0377*/ 235,
+ -1, -1, -1, -1, -1, -1,
+ -1,
+ /*0xff4c*/ 967,
+ -1, -1, -1,
+ /*0x00ed*/ 38,
+ /*0x01d4*/ 144,
+ -1,
+ /*0xff48*/ 963,
+ -1, -1, -1, -1, -1,
+ /*0x118d4*/ 1042,
+ -1, -1, -1,
+ /*0xff44*/ 959,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1,
+ /*0x1044a*/ 1016,
+ -1, -1, -1, -1, -1, -1,
+ /*0x01d8*/ 146,
+ -1,
+ /*0x00f6*/ 47,
+ -1, -1,
+ /*0x10434*/ 994,
+ -1,
+ /*0x01d2*/ 143,
+ /*0x118d8*/ 1046,
+ -1, -1,
+ /*0x01dc*/ 148,
+ -1,
+ /*0x2d07*/ 828,
+ -1,
+ /*0x118d2*/ 1040,
+ -1, -1, -1,
+ /*0x118dc*/ 1050,
+ -1, -1, -1, -1,
+ /*0x118ca*/ 1032,
+ -1,
+ /*0xff56*/ 977,
+ -1,
+ /*0x01b4*/ 133,
+ -1, -1,
+ /*0x00fd*/ 53,
+ -1,
+ /*0x10430*/ 990,
+ -1, -1,
+ /*0x10432*/ 992,
+ -1, -1,
+ /*0x118de*/ 1052,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ /*0x01b0*/ 132,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1,
+ /*0xff54*/ 975,
+ -1, -1,
+ /*0x2d21*/ 854,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ /*0x2d19*/ 846,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1,
+ /*0xff58*/ 979,
+ -1, -1, -1, -1, -1, -1,
+ /*0xff52*/ 973,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1,
+ /*0xff4a*/ 965,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1,
+ /*0x037c*/ 237,
+ -1, -1, -1, -1, -1, -1,
+ -1,
+ /*0x00f9*/ 49,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ /*0x00f5*/ 46,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1,
+ /*0x00f1*/ 42,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ /*0x2d17*/ 844,
+ -1, -1, -1, -1, -1, -1,
+ /*0x2d1f*/ 852,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1,
+ /*0x00f2*/ 43,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1,
+ /*0x2d09*/ 830,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1,
+ /*0x2d0d*/ 834,
+ -1,
+ /*0x00e2*/ 27,
+ /*0x00fb*/ 51,
+ -1, -1, -1,
+ /*0x2d1d*/ 850,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1,
+ /*0x00e8*/ 33,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1,
+ /*0x00ff*/ 55,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1,
+ /*0x00fc*/ 52,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1,
+ /*0x00e0*/ 25
+ };
+
+ if (code <= MAX_CODE_VALUE && code >= MIN_CODE_VALUE)
+ {
+ register int key = onigenc_unicode_CaseUnfold_11_hash(code);
+
+ if (key <= MAX_HASH_VALUE && key >= 0)
+ {
+ register short s = wordlist[key];
+
+ if (s >= 0 && code1_equal(code, CaseUnfold_11_Table[s].from))
+ return &CaseUnfold_11_Table[s].to;
+ }
+ }
+ return 0;
+}
+
+static const CaseUnfold_12_Type CaseUnfold_12_Table[] = {
+#define CaseUnfold_12 (*(CaseUnfold_12_Type (*)[58])(CaseUnfold_12_Table+0))
+ {{0x0061, 0x02be}, {1, {0x1e9a}}},
+ {{0x0066, 0x0066}, {1, {0xfb00}}},
+ {{0x0066, 0x0069}, {1, {0xfb01}}},
+ {{0x0066, 0x006c}, {1, {0xfb02}}},
+ {{0x0068, 0x0331}, {1, {0x1e96}}},
+ {{0x006a, 0x030c}, {1, {0x01f0}}},
+ {{0x0073, 0x0073}, {2, {0x00df, 0x1e9e}}},
+ {{0x0073, 0x0074}, {2, {0xfb05, 0xfb06}}},
+ {{0x0074, 0x0308}, {1, {0x1e97}}},
+ {{0x0077, 0x030a}, {1, {0x1e98}}},
+ {{0x0079, 0x030a}, {1, {0x1e99}}},
+ {{0x02bc, 0x006e}, {1, {0x0149}}},
+ {{0x03ac, 0x03b9}, {1, {0x1fb4}}},
+ {{0x03ae, 0x03b9}, {1, {0x1fc4}}},
+ {{0x03b1, 0x0342}, {1, {0x1fb6}}},
+ {{0x03b1, 0x03b9}, {2, {0x1fb3, 0x1fbc}}},
+ {{0x03b7, 0x0342}, {1, {0x1fc6}}},
+ {{0x03b7, 0x03b9}, {2, {0x1fc3, 0x1fcc}}},
+ {{0x03b9, 0x0342}, {1, {0x1fd6}}},
+ {{0x03c1, 0x0313}, {1, {0x1fe4}}},
+ {{0x03c5, 0x0313}, {1, {0x1f50}}},
+ {{0x03c5, 0x0342}, {1, {0x1fe6}}},
+ {{0x03c9, 0x0342}, {1, {0x1ff6}}},
+ {{0x03c9, 0x03b9}, {2, {0x1ff3, 0x1ffc}}},
+ {{0x03ce, 0x03b9}, {1, {0x1ff4}}},
+ {{0x0565, 0x0582}, {1, {0x0587}}},
+ {{0x0574, 0x0565}, {1, {0xfb14}}},
+ {{0x0574, 0x056b}, {1, {0xfb15}}},
+ {{0x0574, 0x056d}, {1, {0xfb17}}},
+ {{0x0574, 0x0576}, {1, {0xfb13}}},
+ {{0x057e, 0x0576}, {1, {0xfb16}}},
+ {{0x1f00, 0x03b9}, {2, {0x1f80, 0x1f88}}},
+ {{0x1f01, 0x03b9}, {2, {0x1f81, 0x1f89}}},
+ {{0x1f02, 0x03b9}, {2, {0x1f82, 0x1f8a}}},
+ {{0x1f03, 0x03b9}, {2, {0x1f83, 0x1f8b}}},
+ {{0x1f04, 0x03b9}, {2, {0x1f84, 0x1f8c}}},
+ {{0x1f05, 0x03b9}, {2, {0x1f85, 0x1f8d}}},
+ {{0x1f06, 0x03b9}, {2, {0x1f86, 0x1f8e}}},
+ {{0x1f07, 0x03b9}, {2, {0x1f87, 0x1f8f}}},
+ {{0x1f20, 0x03b9}, {2, {0x1f90, 0x1f98}}},
+ {{0x1f21, 0x03b9}, {2, {0x1f91, 0x1f99}}},
+ {{0x1f22, 0x03b9}, {2, {0x1f92, 0x1f9a}}},
+ {{0x1f23, 0x03b9}, {2, {0x1f93, 0x1f9b}}},
+ {{0x1f24, 0x03b9}, {2, {0x1f94, 0x1f9c}}},
+ {{0x1f25, 0x03b9}, {2, {0x1f95, 0x1f9d}}},
+ {{0x1f26, 0x03b9}, {2, {0x1f96, 0x1f9e}}},
+ {{0x1f27, 0x03b9}, {2, {0x1f97, 0x1f9f}}},
+ {{0x1f60, 0x03b9}, {2, {0x1fa0, 0x1fa8}}},
+ {{0x1f61, 0x03b9}, {2, {0x1fa1, 0x1fa9}}},
+ {{0x1f62, 0x03b9}, {2, {0x1fa2, 0x1faa}}},
+ {{0x1f63, 0x03b9}, {2, {0x1fa3, 0x1fab}}},
+ {{0x1f64, 0x03b9}, {2, {0x1fa4, 0x1fac}}},
+ {{0x1f65, 0x03b9}, {2, {0x1fa5, 0x1fad}}},
+ {{0x1f66, 0x03b9}, {2, {0x1fa6, 0x1fae}}},
+ {{0x1f67, 0x03b9}, {2, {0x1fa7, 0x1faf}}},
+ {{0x1f70, 0x03b9}, {1, {0x1fb2}}},
+ {{0x1f74, 0x03b9}, {1, {0x1fc2}}},
+ {{0x1f7c, 0x03b9}, {1, {0x1ff2}}},
+#define CaseUnfold_12_Locale (*(CaseUnfold_12_Type (*)[1])(CaseUnfold_12_Table+58))
+ {{0x0069, 0x0307}, {1, {0x0130}}},
};
-static const CaseUnfold_13_Type CaseUnfold_13[] = {
- { {0x0066, 0x0066, 0x0069}, {1, {0xfb03 }}},
- { {0x0066, 0x0066, 0x006c}, {1, {0xfb04 }}},
- { {0x03b1, 0x0342, 0x03b9}, {1, {0x1fb7 }}},
- { {0x03b7, 0x0342, 0x03b9}, {1, {0x1fc7 }}},
- { {0x03b9, 0x0308, 0x0300}, {1, {0x1fd2 }}},
- { {0x03b9, 0x0308, 0x0301}, {2, {0x0390, 0x1fd3 }}},
- { {0x03b9, 0x0308, 0x0342}, {1, {0x1fd7 }}},
- { {0x03c5, 0x0308, 0x0300}, {1, {0x1fe2 }}},
- { {0x03c5, 0x0308, 0x0301}, {2, {0x03b0, 0x1fe3 }}},
- { {0x03c5, 0x0308, 0x0342}, {1, {0x1fe7 }}},
- { {0x03c5, 0x0313, 0x0300}, {1, {0x1f52 }}},
- { {0x03c5, 0x0313, 0x0301}, {1, {0x1f54 }}},
- { {0x03c5, 0x0313, 0x0342}, {1, {0x1f56 }}},
- { {0x03c9, 0x0342, 0x03b9}, {1, {0x1ff7 }}},
+/* C code produced by gperf version 3.0.3 */
+/* Command-line: gperf -7 -k1,2,3,4,5,6 -F,-1 -c -j1 -i1 -t -T -E -C -H onigenc_unicode_CaseUnfold_12_hash -N onigenc_unicode_CaseUnfold_12_lookup -n */
+
+/* maximum key range = 71, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+/*ARGSUSED*/
+static unsigned int
+onigenc_unicode_CaseUnfold_12_hash(const OnigCodePoint *codes)
+{
+ static const unsigned char asso_values[] =
+ {
+ 3, 58, 54, 57, 56, 16, 8, 2, 43, 82,
+ 3, 1, 23, 82, 82, 82, 82, 82, 82, 4,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 52, 51, 50, 49, 48, 47, 46, 45,
+ 82, 82, 82, 82, 43, 82, 42, 82, 82, 13,
+ 82, 82, 82, 82, 82, 11, 82, 1, 82, 82,
+ 14, 82, 1, 82, 82, 31, 3, 82, 82, 30,
+ 82, 82, 82, 10, 82, 82, 82, 82, 37, 82,
+ 82, 82, 82, 82, 82, 82, 82, 82, 82, 82,
+ 82, 82, 82, 82, 82, 82, 37, 15, 36, 35,
+ 34, 17, 1, 33, 12, 4, 23, 23, 26, 21,
+ 13, 82, 27, 82, 82, 2, 5, 82, 11, 16,
+ 82, 15, 82, 82, 23, 82, 8, 82
+ };
+ return asso_values[bits_at(codes, 5)] + asso_values[bits_at(codes, 4)] + asso_values[bits_at(codes, 3)] + asso_values[bits_at(codes, 2)] + asso_values[bits_at(codes, 1)] + asso_values[bits_at(codes, 0)];
+}
+
+#ifdef __GNUC__
+__inline
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+static const CodePointList2 *
+onigenc_unicode_CaseUnfold_12_lookup(const OnigCodePoint *codes)
+{
+ enum
+ {
+ MIN_CODE_VALUE = 0x61,
+ MAX_CODE_VALUE = 0x1f7c,
+ TOTAL_KEYWORDS = 59,
+ MIN_WORD_LENGTH = 6,
+ MAX_WORD_LENGTH = 6,
+ MIN_HASH_VALUE = 11,
+ MAX_HASH_VALUE = 81
+ };
+
+ static const short wordlist[] =
+ {
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1,
+ /*0x1f66,0x03b9*/ 53,
+ /*0x1f07,0x03b9*/ 38,
+ /*0x1f00,0x03b9*/ 31,
+ /*0x0066,0x0066*/ 1,
+ /*0x1f74,0x03b9*/ 56,
+ /*0x0073,0x0073*/ 6,
+ /*0x0066,0x0069*/ 2,
+ /*0x1f06,0x03b9*/ 37,
+ /*0x0073,0x0074*/ 7,
+ /*0x03b9,0x0342*/ 18,
+ /*0x03c9,0x03b9*/ 23,
+ /*0x03b7,0x03b9*/ 17,
+ /*0x0069,0x0307*/ 58,
+ /*0x03b1,0x03b9*/ 15,
+ /*0x1f61,0x03b9*/ 48,
+ /*0x1f05,0x03b9*/ 36,
+ /*0x1f65,0x03b9*/ 52,
+ /*0x0574,0x0576*/ 29,
+ /*0x03c9,0x0342*/ 22,
+ /*0x03b7,0x0342*/ 16,
+ /*0x057e,0x0576*/ 30,
+ /*0x03b1,0x0342*/ 14,
+ /*0x1f7c,0x03b9*/ 57,
+ /*0x0574,0x0565*/ 26,
+ /*0x0079,0x030a*/ 10,
+ /*0x0077,0x030a*/ 9,
+ /*0x1f70,0x03b9*/ 55,
+ /*0x0574,0x056d*/ 28,
+ /*0x0066,0x006c*/ 3,
+ /*0x0574,0x056b*/ 27,
+ /*0x0061,0x02be*/ 0,
+ /*0x0068,0x0331*/ 4,
+ /*0x1f67,0x03b9*/ 54,
+ /*0x1f64,0x03b9*/ 51,
+ /*0x1f63,0x03b9*/ 50,
+ /*0x1f62,0x03b9*/ 49,
+ /*0x1f60,0x03b9*/ 47,
+ /*0x03ce,0x03b9*/ 24,
+ /*0x03c5,0x0342*/ 21,
+ /*0x03c5,0x0313*/ 20,
+ /*0x03c1,0x0313*/ 19,
+ /*0x02bc,0x006e*/ 11,
+ /*0x03ae,0x03b9*/ 13,
+ /*0x03ac,0x03b9*/ 12,
+ /*0x1f27,0x03b9*/ 46,
+ /*0x1f26,0x03b9*/ 45,
+ /*0x1f25,0x03b9*/ 44,
+ /*0x1f24,0x03b9*/ 43,
+ /*0x1f23,0x03b9*/ 42,
+ /*0x1f22,0x03b9*/ 41,
+ /*0x1f21,0x03b9*/ 40,
+ /*0x1f20,0x03b9*/ 39,
+ /*0x006a,0x030c*/ 5,
+ /*0x1f02,0x03b9*/ 33,
+ /*0x0074,0x0308*/ 8,
+ /*0x1f04,0x03b9*/ 35,
+ /*0x1f03,0x03b9*/ 34,
+ /*0x1f01,0x03b9*/ 32,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ /*0x0565,0x0582*/ 25
+ };
+
+ if (codes[0] <= MAX_CODE_VALUE && codes[0] >= MIN_CODE_VALUE &&
+ codes[1] <= MAX_CODE_VALUE && codes[1] >= MIN_CODE_VALUE)
+ {
+ register int key = onigenc_unicode_CaseUnfold_12_hash(codes);
+
+ if (key <= MAX_HASH_VALUE && key >= 0)
+ {
+ register short s = wordlist[key];
+
+ if (s >= 0 && code2_equal(codes, CaseUnfold_12_Table[s].from))
+ return &CaseUnfold_12_Table[s].to;
+ }
+ }
+ return 0;
+}
+
+static const CaseUnfold_13_Type CaseUnfold_13_Table[] = {
+#define CaseUnfold_13 (*(CaseUnfold_13_Type (*)[14])(CaseUnfold_13_Table+0))
+ {{0x0066, 0x0066, 0x0069}, {1, {0xfb03}}},
+ {{0x0066, 0x0066, 0x006c}, {1, {0xfb04}}},
+ {{0x03b1, 0x0342, 0x03b9}, {1, {0x1fb7}}},
+ {{0x03b7, 0x0342, 0x03b9}, {1, {0x1fc7}}},
+ {{0x03b9, 0x0308, 0x0300}, {1, {0x1fd2}}},
+ {{0x03b9, 0x0308, 0x0301}, {2, {0x0390, 0x1fd3}}},
+ {{0x03b9, 0x0308, 0x0342}, {1, {0x1fd7}}},
+ {{0x03c5, 0x0308, 0x0300}, {1, {0x1fe2}}},
+ {{0x03c5, 0x0308, 0x0301}, {2, {0x03b0, 0x1fe3}}},
+ {{0x03c5, 0x0308, 0x0342}, {1, {0x1fe7}}},
+ {{0x03c5, 0x0313, 0x0300}, {1, {0x1f52}}},
+ {{0x03c5, 0x0313, 0x0301}, {1, {0x1f54}}},
+ {{0x03c5, 0x0313, 0x0342}, {1, {0x1f56}}},
+ {{0x03c9, 0x0342, 0x03b9}, {1, {0x1ff7}}},
};
-#define FOLD_TABLE_SIZE 1357
-#define UNFOLD1_TABLE_SIZE 1207
-#define UNFOLD2_TABLE_SIZE 88
-#define UNFOLD3_TABLE_SIZE 23
+/* C code produced by gperf version 3.0.3 */
+/* Command-line: gperf -7 -k1,2,3,4,5,6,7,8,9 -F,-1 -c -j1 -i1 -t -T -E -C -H onigenc_unicode_CaseUnfold_13_hash -N onigenc_unicode_CaseUnfold_13_lookup -n */
+
+/* maximum key range = 20, duplicates = 0 */
+
+#ifdef __GNUC__
+__inline
+#else
+#ifdef __cplusplus
+inline
+#endif
+#endif
+/*ARGSUSED*/
+static unsigned int
+onigenc_unicode_CaseUnfold_13_hash(const OnigCodePoint *codes)
+{
+ static const unsigned char asso_values[] =
+ {
+ 7, 4, 47, 47, 47, 47, 1, 1, 2, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 1,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 11,
+ 47, 47, 47, 47, 47, 10, 47, 2, 47, 47,
+ 47, 47, 47, 47, 47, 47, 1, 47, 47, 1,
+ 47, 47, 47, 9, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 1, 47, 47, 2, 47, 47, 1, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
+ 47, 47, 47, 47, 47, 47, 47, 47
+ };
+ return asso_values[bits_at(codes, 8)] + asso_values[bits_at(codes, 7)] + asso_values[bits_at(codes, 6)] + asso_values[bits_at(codes, 5)] + asso_values[bits_at(codes, 4)] + asso_values[bits_at(codes, 3)] + asso_values[bits_at(codes, 2)] + asso_values[bits_at(codes, 1)] + asso_values[bits_at(codes, 0)];
+}
+
+#ifdef __GNUC__
+__inline
+#ifdef __GNUC_STDC_INLINE__
+__attribute__ ((__gnu_inline__))
+#endif
+#endif
+static const CodePointList2 *
+onigenc_unicode_CaseUnfold_13_lookup(const OnigCodePoint *codes)
+{
+ enum
+ {
+ MIN_CODE_VALUE = 0x66,
+ MAX_CODE_VALUE = 0x3c9,
+ TOTAL_KEYWORDS = 14,
+ MIN_WORD_LENGTH = 9,
+ MAX_WORD_LENGTH = 9,
+ MIN_HASH_VALUE = 27,
+ MAX_HASH_VALUE = 46
+ };
+
+ static const short wordlist[] =
+ {
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1, -1, -1, -1,
+ -1, -1, -1,
+ /*0x03c5,0x0313,0x0342*/ 12,
+ /*0x03c5,0x0308,0x0342*/ 9,
+ /*0x03b9,0x0308,0x0342*/ 6,
+ /*0x03c5,0x0313,0x0301*/ 11,
+ /*0x03c5,0x0308,0x0301*/ 8,
+ /*0x03b9,0x0308,0x0301*/ 5,
+ /*0x03c5,0x0313,0x0300*/ 10,
+ /*0x03c5,0x0308,0x0300*/ 7,
+ /*0x03b9,0x0308,0x0300*/ 4,
+ /*0x03c9,0x0342,0x03b9*/ 13,
+ /*0x03b7,0x0342,0x03b9*/ 3,
+ /*0x03b1,0x0342,0x03b9*/ 2,
+ -1, -1, -1, -1, -1, -1,
+ /*0x0066,0x0066,0x006c*/ 1,
+ /*0x0066,0x0066,0x0069*/ 0
+ };
+
+ if (codes[0] <= MAX_CODE_VALUE && codes[0] >= MIN_CODE_VALUE &&
+ codes[1] <= MAX_CODE_VALUE && codes[1] >= MIN_CODE_VALUE &&
+ codes[2] <= MAX_CODE_VALUE && codes[2] >= MIN_CODE_VALUE)
+ {
+ register int key = onigenc_unicode_CaseUnfold_13_hash(codes);
+
+ if (key <= MAX_HASH_VALUE && key >= 0)
+ {
+ register short s = wordlist[key];
+
+ if (s >= 0 && code3_equal(codes, CaseUnfold_13_Table[s].from))
+ return &CaseUnfold_13_Table[s].to;
+ }
+ }
+ return 0;
+}
+
diff --git a/enc/unicode/name2ctype.h b/enc/unicode/name2ctype.h
index 2e80edf525..80b79abc3e 100644
--- a/enc/unicode/name2ctype.h
+++ b/enc/unicode/name2ctype.h
@@ -44,7 +44,7 @@ static const OnigCodePoint CR_NEWLINE[] = {
/* 'Alpha': [[:Alpha:]] */
static const OnigCodePoint CR_Alpha[] = {
- 540,
+ 600,
0x0041, 0x005a,
0x0061, 0x007a,
0x00aa, 0x00aa,
@@ -61,13 +61,14 @@ static const OnigCodePoint CR_Alpha[] = {
0x0370, 0x0374,
0x0376, 0x0377,
0x037a, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03f5,
0x03f7, 0x0481,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0559, 0x0559,
0x0561, 0x0587,
@@ -95,17 +96,13 @@ static const OnigCodePoint CR_Alpha[] = {
0x0800, 0x0817,
0x081a, 0x082c,
0x0840, 0x0858,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
+ 0x08a0, 0x08b2,
0x08e4, 0x08e9,
- 0x08f0, 0x08fe,
- 0x0900, 0x093b,
+ 0x08f0, 0x093b,
0x093d, 0x094c,
0x094e, 0x0950,
0x0955, 0x0963,
- 0x0971, 0x0977,
- 0x0979, 0x097f,
- 0x0981, 0x0983,
+ 0x0971, 0x0983,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -176,19 +173,18 @@ static const OnigCodePoint CR_Alpha[] = {
0x0bca, 0x0bcc,
0x0bd0, 0x0bd0,
0x0bd7, 0x0bd7,
- 0x0c01, 0x0c03,
+ 0x0c00, 0x0c03,
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4c,
0x0c55, 0x0c56,
0x0c58, 0x0c59,
0x0c60, 0x0c63,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0c85, 0x0c8c,
0x0c8e, 0x0c90,
0x0c92, 0x0ca8,
@@ -201,7 +197,7 @@ static const OnigCodePoint CR_Alpha[] = {
0x0cde, 0x0cde,
0x0ce0, 0x0ce3,
0x0cf1, 0x0cf2,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d05, 0x0d0c,
0x0d0e, 0x0d10,
0x0d12, 0x0d3a,
@@ -283,7 +279,7 @@ static const OnigCodePoint CR_Alpha[] = {
0x166f, 0x167f,
0x1681, 0x169a,
0x16a0, 0x16ea,
- 0x16ee, 0x16f0,
+ 0x16ee, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1713,
0x1720, 0x1733,
@@ -298,7 +294,7 @@ static const OnigCodePoint CR_Alpha[] = {
0x1820, 0x1877,
0x1880, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1920, 0x192b,
0x1930, 0x1938,
0x1950, 0x196d,
@@ -323,6 +319,7 @@ static const OnigCodePoint CR_Alpha[] = {
0x1cee, 0x1cf3,
0x1cf5, 0x1cf6,
0x1d00, 0x1dbf,
+ 0x1de7, 0x1df4,
0x1e00, 0x1f15,
0x1f18, 0x1f1d,
0x1f20, 0x1f45,
@@ -402,14 +399,14 @@ static const OnigCodePoint CR_Alpha[] = {
0xa62a, 0xa62b,
0xa640, 0xa66e,
0xa674, 0xa67b,
- 0xa67f, 0xa697,
+ 0xa67f, 0xa69d,
0xa69f, 0xa6ef,
0xa717, 0xa71f,
0xa722, 0xa788,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa801,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa801,
0xa803, 0xa805,
0xa807, 0xa80a,
0xa80c, 0xa827,
@@ -423,11 +420,14 @@ static const OnigCodePoint CR_Alpha[] = {
0xa980, 0xa9b2,
0xa9b4, 0xa9bf,
0xa9cf, 0xa9cf,
+ 0xa9e0, 0xa9e4,
+ 0xa9e6, 0xa9ef,
+ 0xa9fa, 0xa9fe,
0xaa00, 0xaa36,
0xaa40, 0xaa4d,
0xaa60, 0xaa76,
0xaa7a, 0xaa7a,
- 0xaa80, 0xaabe,
+ 0xaa7e, 0xaabe,
0xaac0, 0xaac0,
0xaac2, 0xaac2,
0xaadb, 0xaadd,
@@ -438,6 +438,9 @@ static const OnigCodePoint CR_Alpha[] = {
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabea,
0xac00, 0xd7a3,
0xd7b0, 0xd7c6,
@@ -476,19 +479,27 @@ static const OnigCodePoint CR_Alpha[] = {
0x10140, 0x10174,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
+ 0x10300, 0x1031f,
0x10330, 0x1034a,
+ 0x10350, 0x1037a,
0x10380, 0x1039d,
0x103a0, 0x103c3,
0x103c8, 0x103cf,
0x103d1, 0x103d5,
0x10400, 0x1049d,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
+ 0x10860, 0x10876,
+ 0x10880, 0x1089e,
0x10900, 0x10915,
0x10920, 0x10939,
0x10980, 0x109b7,
@@ -499,25 +510,70 @@ static const OnigCodePoint CR_Alpha[] = {
0x10a15, 0x10a17,
0x10a19, 0x10a33,
0x10a60, 0x10a7c,
+ 0x10a80, 0x10a9c,
+ 0x10ac0, 0x10ac7,
+ 0x10ac9, 0x10ae4,
0x10b00, 0x10b35,
0x10b40, 0x10b55,
0x10b60, 0x10b72,
+ 0x10b80, 0x10b91,
0x10c00, 0x10c48,
0x11000, 0x11045,
0x11082, 0x110b8,
0x110d0, 0x110e8,
0x11100, 0x11132,
+ 0x11150, 0x11172,
+ 0x11176, 0x11176,
0x11180, 0x111bf,
0x111c1, 0x111c4,
+ 0x111da, 0x111da,
+ 0x11200, 0x11211,
+ 0x11213, 0x11234,
+ 0x11237, 0x11237,
+ 0x112b0, 0x112e8,
+ 0x11301, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133d, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134c,
+ 0x11357, 0x11357,
+ 0x1135d, 0x11363,
+ 0x11480, 0x114c1,
+ 0x114c4, 0x114c5,
+ 0x114c7, 0x114c7,
+ 0x11580, 0x115b5,
+ 0x115b8, 0x115be,
+ 0x11600, 0x1163e,
+ 0x11640, 0x11640,
+ 0x11644, 0x11644,
0x11680, 0x116b5,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
+ 0x118a0, 0x118df,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16ad0, 0x16aed,
+ 0x16b00, 0x16b36,
+ 0x16b40, 0x16b43,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f7e,
0x16f93, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9e, 0x1bc9e,
0x1d400, 0x1d454,
0x1d456, 0x1d49c,
0x1d49e, 0x1d49f,
@@ -548,6 +604,7 @@ static const OnigCodePoint CR_Alpha[] = {
0x1d78a, 0x1d7a8,
0x1d7aa, 0x1d7c2,
0x1d7c4, 0x1d7cb,
+ 0x1e800, 0x1e8c4,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -581,6 +638,9 @@ static const OnigCodePoint CR_Alpha[] = {
0x1eea1, 0x1eea3,
0x1eea5, 0x1eea9,
0x1eeab, 0x1eebb,
+ 0x1f130, 0x1f149,
+ 0x1f150, 0x1f169,
+ 0x1f170, 0x1f189,
0x20000, 0x2a6d6,
0x2a700, 0x2b734,
0x2b740, 0x2b81d,
@@ -589,12 +649,11 @@ static const OnigCodePoint CR_Alpha[] = {
/* 'Blank': [[:Blank:]] */
static const OnigCodePoint CR_Blank[] = {
- 9,
+ 8,
0x0009, 0x0009,
0x0020, 0x0020,
0x00a0, 0x00a0,
0x1680, 0x1680,
- 0x180e, 0x180e,
0x2000, 0x200a,
0x202f, 0x202f,
0x205f, 0x205f,
@@ -610,7 +669,7 @@ static const OnigCodePoint CR_Cntrl[] = {
/* 'Digit': [[:Digit:]] */
static const OnigCodePoint CR_Digit[] = {
- 42,
+ 50,
0x0030, 0x0039,
0x0660, 0x0669,
0x06f0, 0x06f9,
@@ -624,6 +683,7 @@ static const OnigCodePoint CR_Digit[] = {
0x0c66, 0x0c6f,
0x0ce6, 0x0cef,
0x0d66, 0x0d6f,
+ 0x0de6, 0x0def,
0x0e50, 0x0e59,
0x0ed0, 0x0ed9,
0x0f20, 0x0f29,
@@ -643,6 +703,7 @@ static const OnigCodePoint CR_Digit[] = {
0xa8d0, 0xa8d9,
0xa900, 0xa909,
0xa9d0, 0xa9d9,
+ 0xa9f0, 0xa9f9,
0xaa50, 0xaa59,
0xabf0, 0xabf9,
0xff10, 0xff19,
@@ -651,30 +712,35 @@ static const OnigCodePoint CR_Digit[] = {
0x110f0, 0x110f9,
0x11136, 0x1113f,
0x111d0, 0x111d9,
+ 0x112f0, 0x112f9,
+ 0x114d0, 0x114d9,
+ 0x11650, 0x11659,
0x116c0, 0x116c9,
+ 0x118e0, 0x118e9,
+ 0x16a60, 0x16a69,
+ 0x16b50, 0x16b59,
0x1d7ce, 0x1d7ff,
}; /* CR_Digit */
/* 'Graph': [[:Graph:]] */
static const OnigCodePoint CR_Graph[] = {
- 544,
+ 605,
0x0021, 0x007e,
0x00a1, 0x0377,
- 0x037a, 0x037e,
+ 0x037a, 0x037f,
0x0384, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
- 0x03a3, 0x0527,
+ 0x03a3, 0x052f,
0x0531, 0x0556,
0x0559, 0x055f,
0x0561, 0x0587,
0x0589, 0x058a,
- 0x058f, 0x058f,
+ 0x058d, 0x058f,
0x0591, 0x05c7,
0x05d0, 0x05ea,
0x05f0, 0x05f4,
- 0x0600, 0x0604,
- 0x0606, 0x061b,
+ 0x0600, 0x061c,
0x061e, 0x070d,
0x070f, 0x074a,
0x074d, 0x07b1,
@@ -683,12 +749,8 @@ static const OnigCodePoint CR_Graph[] = {
0x0830, 0x083e,
0x0840, 0x085b,
0x085e, 0x085e,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
- 0x08e4, 0x08fe,
- 0x0900, 0x0977,
- 0x0979, 0x097f,
- 0x0981, 0x0983,
+ 0x08a0, 0x08b2,
+ 0x08e4, 0x0983,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -761,12 +823,11 @@ static const OnigCodePoint CR_Graph[] = {
0x0bd0, 0x0bd0,
0x0bd7, 0x0bd7,
0x0be6, 0x0bfa,
- 0x0c01, 0x0c03,
+ 0x0c00, 0x0c03,
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
@@ -775,7 +836,7 @@ static const OnigCodePoint CR_Graph[] = {
0x0c60, 0x0c63,
0x0c66, 0x0c6f,
0x0c78, 0x0c7f,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0c85, 0x0c8c,
0x0c8e, 0x0c90,
0x0c92, 0x0ca8,
@@ -789,7 +850,7 @@ static const OnigCodePoint CR_Graph[] = {
0x0ce0, 0x0ce3,
0x0ce6, 0x0cef,
0x0cf1, 0x0cf2,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d05, 0x0d0c,
0x0d0e, 0x0d10,
0x0d12, 0x0d3a,
@@ -810,6 +871,7 @@ static const OnigCodePoint CR_Graph[] = {
0x0dcf, 0x0dd4,
0x0dd6, 0x0dd6,
0x0dd8, 0x0ddf,
+ 0x0de6, 0x0def,
0x0df2, 0x0df4,
0x0e01, 0x0e3a,
0x0e3f, 0x0e5b,
@@ -861,7 +923,7 @@ static const OnigCodePoint CR_Graph[] = {
0x13a0, 0x13f4,
0x1400, 0x167f,
0x1681, 0x169c,
- 0x16a0, 0x16f0,
+ 0x16a0, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1714,
0x1720, 0x1736,
@@ -872,12 +934,12 @@ static const OnigCodePoint CR_Graph[] = {
0x1780, 0x17dd,
0x17e0, 0x17e9,
0x17f0, 0x17f9,
- 0x1800, 0x180d,
+ 0x1800, 0x180e,
0x1810, 0x1819,
0x1820, 0x1877,
0x1880, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1920, 0x192b,
0x1930, 0x193b,
0x1940, 0x1940,
@@ -892,6 +954,7 @@ static const OnigCodePoint CR_Graph[] = {
0x1a7f, 0x1a89,
0x1a90, 0x1a99,
0x1aa0, 0x1aad,
+ 0x1ab0, 0x1abe,
0x1b00, 0x1b4b,
0x1b50, 0x1b7c,
0x1b80, 0x1bf3,
@@ -900,7 +963,8 @@ static const OnigCodePoint CR_Graph[] = {
0x1c4d, 0x1c7f,
0x1cc0, 0x1cc7,
0x1cd0, 0x1cf6,
- 0x1d00, 0x1de6,
+ 0x1cf8, 0x1cf9,
+ 0x1d00, 0x1df5,
0x1dfc, 0x1f15,
0x1f18, 0x1f1d,
0x1f20, 0x1f45,
@@ -921,18 +985,20 @@ static const OnigCodePoint CR_Graph[] = {
0x202a, 0x202e,
0x2030, 0x205e,
0x2060, 0x2064,
- 0x206a, 0x2071,
+ 0x2066, 0x2071,
0x2074, 0x208e,
0x2090, 0x209c,
- 0x20a0, 0x20b9,
+ 0x20a0, 0x20bd,
0x20d0, 0x20f0,
0x2100, 0x2189,
- 0x2190, 0x23f3,
+ 0x2190, 0x23fa,
0x2400, 0x2426,
0x2440, 0x244a,
- 0x2460, 0x26ff,
- 0x2701, 0x2b4c,
- 0x2b50, 0x2b59,
+ 0x2460, 0x2b73,
+ 0x2b76, 0x2b95,
+ 0x2b98, 0x2bb9,
+ 0x2bbd, 0x2bc8,
+ 0x2bca, 0x2bd1,
0x2c00, 0x2c2e,
0x2c30, 0x2c5e,
0x2c60, 0x2cf3,
@@ -950,7 +1016,7 @@ static const OnigCodePoint CR_Graph[] = {
0x2dc8, 0x2dce,
0x2dd0, 0x2dd6,
0x2dd8, 0x2dde,
- 0x2de0, 0x2e3b,
+ 0x2de0, 0x2e42,
0x2e80, 0x2e99,
0x2e9b, 0x2ef3,
0x2f00, 0x2fd5,
@@ -969,12 +1035,12 @@ static const OnigCodePoint CR_Graph[] = {
0xa000, 0xa48c,
0xa490, 0xa4c6,
0xa4d0, 0xa62b,
- 0xa640, 0xa697,
+ 0xa640, 0xa69d,
0xa69f, 0xa6f7,
0xa700, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa82b,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa82b,
0xa830, 0xa839,
0xa840, 0xa877,
0xa880, 0xa8c4,
@@ -984,18 +1050,19 @@ static const OnigCodePoint CR_Graph[] = {
0xa95f, 0xa97c,
0xa980, 0xa9cd,
0xa9cf, 0xa9d9,
- 0xa9de, 0xa9df,
+ 0xa9de, 0xa9fe,
0xaa00, 0xaa36,
0xaa40, 0xaa4d,
0xaa50, 0xaa59,
- 0xaa5c, 0xaa7b,
- 0xaa80, 0xaac2,
+ 0xaa5c, 0xaac2,
0xaadb, 0xaaf6,
0xab01, 0xab06,
0xab09, 0xab0e,
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabed,
0xabf0, 0xabf9,
0xac00, 0xd7a3,
@@ -1016,7 +1083,7 @@ static const OnigCodePoint CR_Graph[] = {
0xfd92, 0xfdc7,
0xfdf0, 0xfdfd,
0xfe00, 0xfe19,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0xfe30, 0xfe52,
0xfe54, 0xfe66,
0xfe68, 0xfe6b,
@@ -1040,26 +1107,35 @@ static const OnigCodePoint CR_Graph[] = {
0x10080, 0x100fa,
0x10100, 0x10102,
0x10107, 0x10133,
- 0x10137, 0x1018a,
+ 0x10137, 0x1018c,
0x10190, 0x1019b,
+ 0x101a0, 0x101a0,
0x101d0, 0x101fd,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
- 0x10320, 0x10323,
+ 0x102e0, 0x102fb,
+ 0x10300, 0x10323,
0x10330, 0x1034a,
+ 0x10350, 0x1037a,
0x10380, 0x1039d,
0x1039f, 0x103c3,
0x103c8, 0x103d5,
0x10400, 0x1049d,
0x104a0, 0x104a9,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x1056f, 0x1056f,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
- 0x10857, 0x1085f,
+ 0x10857, 0x1089e,
+ 0x108a7, 0x108af,
0x10900, 0x1091b,
0x1091f, 0x10939,
0x1093f, 0x1093f,
@@ -1073,33 +1149,82 @@ static const OnigCodePoint CR_Graph[] = {
0x10a38, 0x10a3a,
0x10a3f, 0x10a47,
0x10a50, 0x10a58,
- 0x10a60, 0x10a7f,
+ 0x10a60, 0x10a9f,
+ 0x10ac0, 0x10ae6,
+ 0x10aeb, 0x10af6,
0x10b00, 0x10b35,
0x10b39, 0x10b55,
0x10b58, 0x10b72,
- 0x10b78, 0x10b7f,
+ 0x10b78, 0x10b91,
+ 0x10b99, 0x10b9c,
+ 0x10ba9, 0x10baf,
0x10c00, 0x10c48,
0x10e60, 0x10e7e,
0x11000, 0x1104d,
0x11052, 0x1106f,
- 0x11080, 0x110c1,
+ 0x1107f, 0x110c1,
0x110d0, 0x110e8,
0x110f0, 0x110f9,
0x11100, 0x11134,
0x11136, 0x11143,
+ 0x11150, 0x11176,
0x11180, 0x111c8,
- 0x111d0, 0x111d9,
+ 0x111cd, 0x111cd,
+ 0x111d0, 0x111da,
+ 0x111e1, 0x111f4,
+ 0x11200, 0x11211,
+ 0x11213, 0x1123d,
+ 0x112b0, 0x112ea,
+ 0x112f0, 0x112f9,
+ 0x11301, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133c, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x11357, 0x11357,
+ 0x1135d, 0x11363,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x11480, 0x114c7,
+ 0x114d0, 0x114d9,
+ 0x11580, 0x115b5,
+ 0x115b8, 0x115c9,
+ 0x11600, 0x11644,
+ 0x11650, 0x11659,
0x11680, 0x116b7,
0x116c0, 0x116c9,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
- 0x12470, 0x12473,
+ 0x118a0, 0x118f2,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
+ 0x12470, 0x12474,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16a60, 0x16a69,
+ 0x16a6e, 0x16a6f,
+ 0x16ad0, 0x16aed,
+ 0x16af0, 0x16af5,
+ 0x16b00, 0x16b45,
+ 0x16b50, 0x16b59,
+ 0x16b5b, 0x16b61,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f7e,
0x16f8f, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9c, 0x1bca3,
0x1d000, 0x1d0f5,
0x1d100, 0x1d126,
0x1d129, 0x1d1dd,
@@ -1127,6 +1252,8 @@ static const OnigCodePoint CR_Graph[] = {
0x1d552, 0x1d6a5,
0x1d6a8, 0x1d7cb,
0x1d7ce, 0x1d7ff,
+ 0x1e800, 0x1e8c4,
+ 0x1e8c7, 0x1e8d6,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -1164,10 +1291,10 @@ static const OnigCodePoint CR_Graph[] = {
0x1f000, 0x1f02b,
0x1f030, 0x1f093,
0x1f0a0, 0x1f0ae,
- 0x1f0b1, 0x1f0be,
+ 0x1f0b1, 0x1f0bf,
0x1f0c1, 0x1f0cf,
- 0x1f0d1, 0x1f0df,
- 0x1f100, 0x1f10a,
+ 0x1f0d1, 0x1f0f5,
+ 0x1f100, 0x1f10c,
0x1f110, 0x1f12e,
0x1f130, 0x1f16b,
0x1f170, 0x1f19a,
@@ -1175,24 +1302,25 @@ static const OnigCodePoint CR_Graph[] = {
0x1f210, 0x1f23a,
0x1f240, 0x1f248,
0x1f250, 0x1f251,
- 0x1f300, 0x1f320,
- 0x1f330, 0x1f335,
- 0x1f337, 0x1f37c,
- 0x1f380, 0x1f393,
- 0x1f3a0, 0x1f3c4,
- 0x1f3c6, 0x1f3ca,
- 0x1f3e0, 0x1f3f0,
- 0x1f400, 0x1f43e,
- 0x1f440, 0x1f440,
- 0x1f442, 0x1f4f7,
- 0x1f4f9, 0x1f4fc,
- 0x1f500, 0x1f53d,
- 0x1f540, 0x1f543,
- 0x1f550, 0x1f567,
- 0x1f5fb, 0x1f640,
- 0x1f645, 0x1f64f,
- 0x1f680, 0x1f6c5,
+ 0x1f300, 0x1f32c,
+ 0x1f330, 0x1f37d,
+ 0x1f380, 0x1f3ce,
+ 0x1f3d4, 0x1f3f7,
+ 0x1f400, 0x1f4fe,
+ 0x1f500, 0x1f54a,
+ 0x1f550, 0x1f579,
+ 0x1f57b, 0x1f5a3,
+ 0x1f5a5, 0x1f642,
+ 0x1f645, 0x1f6cf,
+ 0x1f6e0, 0x1f6ec,
+ 0x1f6f0, 0x1f6f3,
0x1f700, 0x1f773,
+ 0x1f780, 0x1f7d4,
+ 0x1f800, 0x1f80b,
+ 0x1f810, 0x1f847,
+ 0x1f850, 0x1f859,
+ 0x1f860, 0x1f887,
+ 0x1f890, 0x1f8ad,
0x20000, 0x2a6d6,
0x2a700, 0x2b734,
0x2b740, 0x2b81d,
@@ -1206,7 +1334,7 @@ static const OnigCodePoint CR_Graph[] = {
/* 'Lower': [[:Lower:]] */
static const OnigCodePoint CR_Lower[] = {
- 618,
+ 633,
0x0061, 0x007a,
0x00aa, 0x00aa,
0x00b5, 0x00b5,
@@ -1477,6 +1605,10 @@ static const OnigCodePoint CR_Lower[] = {
0x0523, 0x0523,
0x0525, 0x0525,
0x0527, 0x0527,
+ 0x0529, 0x0529,
+ 0x052b, 0x052b,
+ 0x052d, 0x052d,
+ 0x052f, 0x052f,
0x0561, 0x0587,
0x1d00, 0x1dbf,
0x1e01, 0x1e01,
@@ -1738,6 +1870,8 @@ static const OnigCodePoint CR_Lower[] = {
0xa693, 0xa693,
0xa695, 0xa695,
0xa697, 0xa697,
+ 0xa699, 0xa699,
+ 0xa69b, 0xa69d,
0xa723, 0xa723,
0xa725, 0xa725,
0xa727, 0xa727,
@@ -1786,17 +1920,26 @@ static const OnigCodePoint CR_Lower[] = {
0xa78c, 0xa78c,
0xa78e, 0xa78e,
0xa791, 0xa791,
- 0xa793, 0xa793,
+ 0xa793, 0xa795,
+ 0xa797, 0xa797,
+ 0xa799, 0xa799,
+ 0xa79b, 0xa79b,
+ 0xa79d, 0xa79d,
+ 0xa79f, 0xa79f,
0xa7a1, 0xa7a1,
0xa7a3, 0xa7a3,
0xa7a5, 0xa7a5,
0xa7a7, 0xa7a7,
0xa7a9, 0xa7a9,
0xa7f8, 0xa7fa,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab65,
0xfb00, 0xfb06,
0xfb13, 0xfb17,
0xff41, 0xff5a,
0x10428, 0x1044f,
+ 0x118c0, 0x118df,
0x1d41a, 0x1d433,
0x1d44e, 0x1d454,
0x1d456, 0x1d467,
@@ -1829,24 +1972,23 @@ static const OnigCodePoint CR_Lower[] = {
/* 'Print': [[:Print:]] */
static const OnigCodePoint CR_Print[] = {
- 541,
+ 602,
0x0020, 0x007e,
0x00a0, 0x0377,
- 0x037a, 0x037e,
+ 0x037a, 0x037f,
0x0384, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
- 0x03a3, 0x0527,
+ 0x03a3, 0x052f,
0x0531, 0x0556,
0x0559, 0x055f,
0x0561, 0x0587,
0x0589, 0x058a,
- 0x058f, 0x058f,
+ 0x058d, 0x058f,
0x0591, 0x05c7,
0x05d0, 0x05ea,
0x05f0, 0x05f4,
- 0x0600, 0x0604,
- 0x0606, 0x061b,
+ 0x0600, 0x061c,
0x061e, 0x070d,
0x070f, 0x074a,
0x074d, 0x07b1,
@@ -1855,12 +1997,8 @@ static const OnigCodePoint CR_Print[] = {
0x0830, 0x083e,
0x0840, 0x085b,
0x085e, 0x085e,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
- 0x08e4, 0x08fe,
- 0x0900, 0x0977,
- 0x0979, 0x097f,
- 0x0981, 0x0983,
+ 0x08a0, 0x08b2,
+ 0x08e4, 0x0983,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -1933,12 +2071,11 @@ static const OnigCodePoint CR_Print[] = {
0x0bd0, 0x0bd0,
0x0bd7, 0x0bd7,
0x0be6, 0x0bfa,
- 0x0c01, 0x0c03,
+ 0x0c00, 0x0c03,
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
@@ -1947,7 +2084,7 @@ static const OnigCodePoint CR_Print[] = {
0x0c60, 0x0c63,
0x0c66, 0x0c6f,
0x0c78, 0x0c7f,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0c85, 0x0c8c,
0x0c8e, 0x0c90,
0x0c92, 0x0ca8,
@@ -1961,7 +2098,7 @@ static const OnigCodePoint CR_Print[] = {
0x0ce0, 0x0ce3,
0x0ce6, 0x0cef,
0x0cf1, 0x0cf2,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d05, 0x0d0c,
0x0d0e, 0x0d10,
0x0d12, 0x0d3a,
@@ -1982,6 +2119,7 @@ static const OnigCodePoint CR_Print[] = {
0x0dcf, 0x0dd4,
0x0dd6, 0x0dd6,
0x0dd8, 0x0ddf,
+ 0x0de6, 0x0def,
0x0df2, 0x0df4,
0x0e01, 0x0e3a,
0x0e3f, 0x0e5b,
@@ -2032,7 +2170,7 @@ static const OnigCodePoint CR_Print[] = {
0x1380, 0x1399,
0x13a0, 0x13f4,
0x1400, 0x169c,
- 0x16a0, 0x16f0,
+ 0x16a0, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1714,
0x1720, 0x1736,
@@ -2048,7 +2186,7 @@ static const OnigCodePoint CR_Print[] = {
0x1820, 0x1877,
0x1880, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1920, 0x192b,
0x1930, 0x193b,
0x1940, 0x1940,
@@ -2063,6 +2201,7 @@ static const OnigCodePoint CR_Print[] = {
0x1a7f, 0x1a89,
0x1a90, 0x1a99,
0x1aa0, 0x1aad,
+ 0x1ab0, 0x1abe,
0x1b00, 0x1b4b,
0x1b50, 0x1b7c,
0x1b80, 0x1bf3,
@@ -2071,7 +2210,8 @@ static const OnigCodePoint CR_Print[] = {
0x1c4d, 0x1c7f,
0x1cc0, 0x1cc7,
0x1cd0, 0x1cf6,
- 0x1d00, 0x1de6,
+ 0x1cf8, 0x1cf9,
+ 0x1d00, 0x1df5,
0x1dfc, 0x1f15,
0x1f18, 0x1f1d,
0x1f20, 0x1f45,
@@ -2090,18 +2230,20 @@ static const OnigCodePoint CR_Print[] = {
0x1ff6, 0x1ffe,
0x2000, 0x2027,
0x202a, 0x2064,
- 0x206a, 0x2071,
+ 0x2066, 0x2071,
0x2074, 0x208e,
0x2090, 0x209c,
- 0x20a0, 0x20b9,
+ 0x20a0, 0x20bd,
0x20d0, 0x20f0,
0x2100, 0x2189,
- 0x2190, 0x23f3,
+ 0x2190, 0x23fa,
0x2400, 0x2426,
0x2440, 0x244a,
- 0x2460, 0x26ff,
- 0x2701, 0x2b4c,
- 0x2b50, 0x2b59,
+ 0x2460, 0x2b73,
+ 0x2b76, 0x2b95,
+ 0x2b98, 0x2bb9,
+ 0x2bbd, 0x2bc8,
+ 0x2bca, 0x2bd1,
0x2c00, 0x2c2e,
0x2c30, 0x2c5e,
0x2c60, 0x2cf3,
@@ -2119,7 +2261,7 @@ static const OnigCodePoint CR_Print[] = {
0x2dc8, 0x2dce,
0x2dd0, 0x2dd6,
0x2dd8, 0x2dde,
- 0x2de0, 0x2e3b,
+ 0x2de0, 0x2e42,
0x2e80, 0x2e99,
0x2e9b, 0x2ef3,
0x2f00, 0x2fd5,
@@ -2138,12 +2280,12 @@ static const OnigCodePoint CR_Print[] = {
0xa000, 0xa48c,
0xa490, 0xa4c6,
0xa4d0, 0xa62b,
- 0xa640, 0xa697,
+ 0xa640, 0xa69d,
0xa69f, 0xa6f7,
0xa700, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa82b,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa82b,
0xa830, 0xa839,
0xa840, 0xa877,
0xa880, 0xa8c4,
@@ -2153,18 +2295,19 @@ static const OnigCodePoint CR_Print[] = {
0xa95f, 0xa97c,
0xa980, 0xa9cd,
0xa9cf, 0xa9d9,
- 0xa9de, 0xa9df,
+ 0xa9de, 0xa9fe,
0xaa00, 0xaa36,
0xaa40, 0xaa4d,
0xaa50, 0xaa59,
- 0xaa5c, 0xaa7b,
- 0xaa80, 0xaac2,
+ 0xaa5c, 0xaac2,
0xaadb, 0xaaf6,
0xab01, 0xab06,
0xab09, 0xab0e,
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabed,
0xabf0, 0xabf9,
0xac00, 0xd7a3,
@@ -2185,7 +2328,7 @@ static const OnigCodePoint CR_Print[] = {
0xfd92, 0xfdc7,
0xfdf0, 0xfdfd,
0xfe00, 0xfe19,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0xfe30, 0xfe52,
0xfe54, 0xfe66,
0xfe68, 0xfe6b,
@@ -2209,26 +2352,35 @@ static const OnigCodePoint CR_Print[] = {
0x10080, 0x100fa,
0x10100, 0x10102,
0x10107, 0x10133,
- 0x10137, 0x1018a,
+ 0x10137, 0x1018c,
0x10190, 0x1019b,
+ 0x101a0, 0x101a0,
0x101d0, 0x101fd,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
- 0x10320, 0x10323,
+ 0x102e0, 0x102fb,
+ 0x10300, 0x10323,
0x10330, 0x1034a,
+ 0x10350, 0x1037a,
0x10380, 0x1039d,
0x1039f, 0x103c3,
0x103c8, 0x103d5,
0x10400, 0x1049d,
0x104a0, 0x104a9,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x1056f, 0x1056f,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
- 0x10857, 0x1085f,
+ 0x10857, 0x1089e,
+ 0x108a7, 0x108af,
0x10900, 0x1091b,
0x1091f, 0x10939,
0x1093f, 0x1093f,
@@ -2242,33 +2394,82 @@ static const OnigCodePoint CR_Print[] = {
0x10a38, 0x10a3a,
0x10a3f, 0x10a47,
0x10a50, 0x10a58,
- 0x10a60, 0x10a7f,
+ 0x10a60, 0x10a9f,
+ 0x10ac0, 0x10ae6,
+ 0x10aeb, 0x10af6,
0x10b00, 0x10b35,
0x10b39, 0x10b55,
0x10b58, 0x10b72,
- 0x10b78, 0x10b7f,
+ 0x10b78, 0x10b91,
+ 0x10b99, 0x10b9c,
+ 0x10ba9, 0x10baf,
0x10c00, 0x10c48,
0x10e60, 0x10e7e,
0x11000, 0x1104d,
0x11052, 0x1106f,
- 0x11080, 0x110c1,
+ 0x1107f, 0x110c1,
0x110d0, 0x110e8,
0x110f0, 0x110f9,
0x11100, 0x11134,
0x11136, 0x11143,
+ 0x11150, 0x11176,
0x11180, 0x111c8,
- 0x111d0, 0x111d9,
+ 0x111cd, 0x111cd,
+ 0x111d0, 0x111da,
+ 0x111e1, 0x111f4,
+ 0x11200, 0x11211,
+ 0x11213, 0x1123d,
+ 0x112b0, 0x112ea,
+ 0x112f0, 0x112f9,
+ 0x11301, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133c, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x11357, 0x11357,
+ 0x1135d, 0x11363,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x11480, 0x114c7,
+ 0x114d0, 0x114d9,
+ 0x11580, 0x115b5,
+ 0x115b8, 0x115c9,
+ 0x11600, 0x11644,
+ 0x11650, 0x11659,
0x11680, 0x116b7,
0x116c0, 0x116c9,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
- 0x12470, 0x12473,
+ 0x118a0, 0x118f2,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
+ 0x12470, 0x12474,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16a60, 0x16a69,
+ 0x16a6e, 0x16a6f,
+ 0x16ad0, 0x16aed,
+ 0x16af0, 0x16af5,
+ 0x16b00, 0x16b45,
+ 0x16b50, 0x16b59,
+ 0x16b5b, 0x16b61,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f7e,
0x16f8f, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9c, 0x1bca3,
0x1d000, 0x1d0f5,
0x1d100, 0x1d126,
0x1d129, 0x1d1dd,
@@ -2296,6 +2497,8 @@ static const OnigCodePoint CR_Print[] = {
0x1d552, 0x1d6a5,
0x1d6a8, 0x1d7cb,
0x1d7ce, 0x1d7ff,
+ 0x1e800, 0x1e8c4,
+ 0x1e8c7, 0x1e8d6,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -2333,10 +2536,10 @@ static const OnigCodePoint CR_Print[] = {
0x1f000, 0x1f02b,
0x1f030, 0x1f093,
0x1f0a0, 0x1f0ae,
- 0x1f0b1, 0x1f0be,
+ 0x1f0b1, 0x1f0bf,
0x1f0c1, 0x1f0cf,
- 0x1f0d1, 0x1f0df,
- 0x1f100, 0x1f10a,
+ 0x1f0d1, 0x1f0f5,
+ 0x1f100, 0x1f10c,
0x1f110, 0x1f12e,
0x1f130, 0x1f16b,
0x1f170, 0x1f19a,
@@ -2344,24 +2547,25 @@ static const OnigCodePoint CR_Print[] = {
0x1f210, 0x1f23a,
0x1f240, 0x1f248,
0x1f250, 0x1f251,
- 0x1f300, 0x1f320,
- 0x1f330, 0x1f335,
- 0x1f337, 0x1f37c,
- 0x1f380, 0x1f393,
- 0x1f3a0, 0x1f3c4,
- 0x1f3c6, 0x1f3ca,
- 0x1f3e0, 0x1f3f0,
- 0x1f400, 0x1f43e,
- 0x1f440, 0x1f440,
- 0x1f442, 0x1f4f7,
- 0x1f4f9, 0x1f4fc,
- 0x1f500, 0x1f53d,
- 0x1f540, 0x1f543,
- 0x1f550, 0x1f567,
- 0x1f5fb, 0x1f640,
- 0x1f645, 0x1f64f,
- 0x1f680, 0x1f6c5,
+ 0x1f300, 0x1f32c,
+ 0x1f330, 0x1f37d,
+ 0x1f380, 0x1f3ce,
+ 0x1f3d4, 0x1f3f7,
+ 0x1f400, 0x1f4fe,
+ 0x1f500, 0x1f54a,
+ 0x1f550, 0x1f579,
+ 0x1f57b, 0x1f5a3,
+ 0x1f5a5, 0x1f642,
+ 0x1f645, 0x1f6cf,
+ 0x1f6e0, 0x1f6ec,
+ 0x1f6f0, 0x1f6f3,
0x1f700, 0x1f773,
+ 0x1f780, 0x1f7d4,
+ 0x1f800, 0x1f80b,
+ 0x1f810, 0x1f847,
+ 0x1f850, 0x1f859,
+ 0x1f860, 0x1f887,
+ 0x1f890, 0x1f8ad,
0x20000, 0x2a6d6,
0x2a700, 0x2b734,
0x2b740, 0x2b81d,
@@ -2375,7 +2579,7 @@ static const OnigCodePoint CR_Print[] = {
/* 'Punct': [[:Punct:]] */
static const OnigCodePoint CR_Punct[] = {
- 140,
+ 155,
0x0021, 0x0023,
0x0025, 0x002a,
0x002c, 0x002f,
@@ -2449,6 +2653,7 @@ static const OnigCodePoint CR_Punct[] = {
0x2053, 0x205e,
0x207d, 0x207e,
0x208d, 0x208e,
+ 0x2308, 0x230b,
0x2329, 0x232a,
0x2768, 0x2775,
0x27c5, 0x27c6,
@@ -2460,7 +2665,7 @@ static const OnigCodePoint CR_Punct[] = {
0x2cfe, 0x2cff,
0x2d70, 0x2d70,
0x2e00, 0x2e2e,
- 0x2e30, 0x2e3b,
+ 0x2e30, 0x2e42,
0x3001, 0x3003,
0x3008, 0x3011,
0x3014, 0x301f,
@@ -2504,29 +2709,42 @@ static const OnigCodePoint CR_Punct[] = {
0x10100, 0x10102,
0x1039f, 0x1039f,
0x103d0, 0x103d0,
+ 0x1056f, 0x1056f,
0x10857, 0x10857,
0x1091f, 0x1091f,
0x1093f, 0x1093f,
0x10a50, 0x10a58,
0x10a7f, 0x10a7f,
+ 0x10af0, 0x10af6,
0x10b39, 0x10b3f,
+ 0x10b99, 0x10b9c,
0x11047, 0x1104d,
0x110bb, 0x110bc,
0x110be, 0x110c1,
0x11140, 0x11143,
+ 0x11174, 0x11175,
0x111c5, 0x111c8,
- 0x12470, 0x12473,
+ 0x111cd, 0x111cd,
+ 0x11238, 0x1123d,
+ 0x114c6, 0x114c6,
+ 0x115c1, 0x115c9,
+ 0x11641, 0x11643,
+ 0x12470, 0x12474,
+ 0x16a6e, 0x16a6f,
+ 0x16af5, 0x16af5,
+ 0x16b37, 0x16b3b,
+ 0x16b44, 0x16b44,
+ 0x1bc9f, 0x1bc9f,
}; /* CR_Punct */
/* 'Space': [[:Space:]] */
static const OnigCodePoint CR_Space[] = {
- 11,
+ 10,
0x0009, 0x000d,
0x0020, 0x0020,
0x0085, 0x0085,
0x00a0, 0x00a0,
0x1680, 0x1680,
- 0x180e, 0x180e,
0x2000, 0x200a,
0x2028, 0x2029,
0x202f, 0x202f,
@@ -2536,7 +2754,7 @@ static const OnigCodePoint CR_Space[] = {
/* 'Upper': [[:Upper:]] */
static const OnigCodePoint CR_Upper[] = {
- 610,
+ 627,
0x0041, 0x005a,
0x00c0, 0x00d6,
0x00d8, 0x00de,
@@ -2684,6 +2902,7 @@ static const OnigCodePoint CR_Upper[] = {
0x0370, 0x0370,
0x0372, 0x0372,
0x0376, 0x0376,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
@@ -2803,6 +3022,10 @@ static const OnigCodePoint CR_Upper[] = {
0x0522, 0x0522,
0x0524, 0x0524,
0x0526, 0x0526,
+ 0x0528, 0x0528,
+ 0x052a, 0x052a,
+ 0x052c, 0x052c,
+ 0x052e, 0x052e,
0x0531, 0x0556,
0x10a0, 0x10c5,
0x10c7, 0x10c7,
@@ -3059,6 +3282,8 @@ static const OnigCodePoint CR_Upper[] = {
0xa692, 0xa692,
0xa694, 0xa694,
0xa696, 0xa696,
+ 0xa698, 0xa698,
+ 0xa69a, 0xa69a,
0xa722, 0xa722,
0xa724, 0xa724,
0xa726, 0xa726,
@@ -3108,14 +3333,21 @@ static const OnigCodePoint CR_Upper[] = {
0xa78d, 0xa78d,
0xa790, 0xa790,
0xa792, 0xa792,
+ 0xa796, 0xa796,
+ 0xa798, 0xa798,
+ 0xa79a, 0xa79a,
+ 0xa79c, 0xa79c,
+ 0xa79e, 0xa79e,
0xa7a0, 0xa7a0,
0xa7a2, 0xa7a2,
0xa7a4, 0xa7a4,
0xa7a6, 0xa7a6,
0xa7a8, 0xa7a8,
- 0xa7aa, 0xa7aa,
+ 0xa7aa, 0xa7ad,
+ 0xa7b0, 0xa7b1,
0xff21, 0xff3a,
0x10400, 0x10427,
+ 0x118a0, 0x118bf,
0x1d400, 0x1d419,
0x1d434, 0x1d44d,
0x1d468, 0x1d481,
@@ -3147,6 +3379,9 @@ static const OnigCodePoint CR_Upper[] = {
0x1d756, 0x1d76e,
0x1d790, 0x1d7a8,
0x1d7ca, 0x1d7ca,
+ 0x1f130, 0x1f149,
+ 0x1f150, 0x1f169,
+ 0x1f170, 0x1f189,
}; /* CR_Upper */
/* 'XDigit': [[:XDigit:]] */
@@ -3159,7 +3394,7 @@ static const OnigCodePoint CR_XDigit[] = {
/* 'Word': [[:Word:]] */
static const OnigCodePoint CR_Word[] = {
- 564,
+ 629,
0x0030, 0x0039,
0x0041, 0x005a,
0x005f, 0x005f,
@@ -3177,13 +3412,14 @@ static const OnigCodePoint CR_Word[] = {
0x0300, 0x0374,
0x0376, 0x0377,
0x037a, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03f5,
0x03f7, 0x0481,
- 0x0483, 0x0527,
+ 0x0483, 0x052f,
0x0531, 0x0556,
0x0559, 0x0559,
0x0561, 0x0587,
@@ -3207,14 +3443,10 @@ static const OnigCodePoint CR_Word[] = {
0x07fa, 0x07fa,
0x0800, 0x082d,
0x0840, 0x085b,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
- 0x08e4, 0x08fe,
- 0x0900, 0x0963,
+ 0x08a0, 0x08b2,
+ 0x08e4, 0x0963,
0x0966, 0x096f,
- 0x0971, 0x0977,
- 0x0979, 0x097f,
- 0x0981, 0x0983,
+ 0x0971, 0x0983,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -3288,12 +3520,11 @@ static const OnigCodePoint CR_Word[] = {
0x0bd0, 0x0bd0,
0x0bd7, 0x0bd7,
0x0be6, 0x0bef,
- 0x0c01, 0x0c03,
+ 0x0c00, 0x0c03,
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
@@ -3301,7 +3532,7 @@ static const OnigCodePoint CR_Word[] = {
0x0c58, 0x0c59,
0x0c60, 0x0c63,
0x0c66, 0x0c6f,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0c85, 0x0c8c,
0x0c8e, 0x0c90,
0x0c92, 0x0ca8,
@@ -3315,7 +3546,7 @@ static const OnigCodePoint CR_Word[] = {
0x0ce0, 0x0ce3,
0x0ce6, 0x0cef,
0x0cf1, 0x0cf2,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d05, 0x0d0c,
0x0d0e, 0x0d10,
0x0d12, 0x0d3a,
@@ -3336,6 +3567,7 @@ static const OnigCodePoint CR_Word[] = {
0x0dcf, 0x0dd4,
0x0dd6, 0x0dd6,
0x0dd8, 0x0ddf,
+ 0x0de6, 0x0def,
0x0df2, 0x0df3,
0x0e01, 0x0e3a,
0x0e40, 0x0e4e,
@@ -3399,7 +3631,7 @@ static const OnigCodePoint CR_Word[] = {
0x166f, 0x167f,
0x1681, 0x169a,
0x16a0, 0x16ea,
- 0x16ee, 0x16f0,
+ 0x16ee, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1714,
0x1720, 0x1734,
@@ -3416,7 +3648,7 @@ static const OnigCodePoint CR_Word[] = {
0x1820, 0x1877,
0x1880, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1920, 0x192b,
0x1930, 0x193b,
0x1946, 0x196d,
@@ -3430,6 +3662,7 @@ static const OnigCodePoint CR_Word[] = {
0x1a7f, 0x1a89,
0x1a90, 0x1a99,
0x1aa7, 0x1aa7,
+ 0x1ab0, 0x1abe,
0x1b00, 0x1b4b,
0x1b50, 0x1b59,
0x1b6b, 0x1b73,
@@ -3439,7 +3672,8 @@ static const OnigCodePoint CR_Word[] = {
0x1c4d, 0x1c7d,
0x1cd0, 0x1cd2,
0x1cd4, 0x1cf6,
- 0x1d00, 0x1de6,
+ 0x1cf8, 0x1cf9,
+ 0x1d00, 0x1df5,
0x1dfc, 0x1f15,
0x1f18, 0x1f1d,
0x1f20, 0x1f45,
@@ -3521,14 +3755,14 @@ static const OnigCodePoint CR_Word[] = {
0xa610, 0xa62b,
0xa640, 0xa672,
0xa674, 0xa67d,
- 0xa67f, 0xa697,
+ 0xa67f, 0xa69d,
0xa69f, 0xa6f1,
0xa717, 0xa71f,
0xa722, 0xa788,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa827,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa827,
0xa840, 0xa873,
0xa880, 0xa8c4,
0xa8d0, 0xa8d9,
@@ -3539,12 +3773,12 @@ static const OnigCodePoint CR_Word[] = {
0xa960, 0xa97c,
0xa980, 0xa9c0,
0xa9cf, 0xa9d9,
+ 0xa9e0, 0xa9fe,
0xaa00, 0xaa36,
0xaa40, 0xaa4d,
0xaa50, 0xaa59,
0xaa60, 0xaa76,
- 0xaa7a, 0xaa7b,
- 0xaa80, 0xaac2,
+ 0xaa7a, 0xaac2,
0xaadb, 0xaadd,
0xaae0, 0xaaef,
0xaaf2, 0xaaf6,
@@ -3553,6 +3787,9 @@ static const OnigCodePoint CR_Word[] = {
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabea,
0xabec, 0xabed,
0xabf0, 0xabf9,
@@ -3575,7 +3812,7 @@ static const OnigCodePoint CR_Word[] = {
0xfd92, 0xfdc7,
0xfdf0, 0xfdfb,
0xfe00, 0xfe0f,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0xfe33, 0xfe34,
0xfe4d, 0xfe4f,
0xfe70, 0xfe74,
@@ -3600,20 +3837,29 @@ static const OnigCodePoint CR_Word[] = {
0x101fd, 0x101fd,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
+ 0x102e0, 0x102e0,
+ 0x10300, 0x1031f,
0x10330, 0x1034a,
+ 0x10350, 0x1037a,
0x10380, 0x1039d,
0x103a0, 0x103c3,
0x103c8, 0x103cf,
0x103d1, 0x103d5,
0x10400, 0x1049d,
0x104a0, 0x104a9,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
+ 0x10860, 0x10876,
+ 0x10880, 0x1089e,
0x10900, 0x10915,
0x10920, 0x10939,
0x10980, 0x109b7,
@@ -3626,29 +3872,78 @@ static const OnigCodePoint CR_Word[] = {
0x10a38, 0x10a3a,
0x10a3f, 0x10a3f,
0x10a60, 0x10a7c,
+ 0x10a80, 0x10a9c,
+ 0x10ac0, 0x10ac7,
+ 0x10ac9, 0x10ae6,
0x10b00, 0x10b35,
0x10b40, 0x10b55,
0x10b60, 0x10b72,
+ 0x10b80, 0x10b91,
0x10c00, 0x10c48,
0x11000, 0x11046,
0x11066, 0x1106f,
- 0x11080, 0x110ba,
+ 0x1107f, 0x110ba,
0x110d0, 0x110e8,
0x110f0, 0x110f9,
0x11100, 0x11134,
0x11136, 0x1113f,
+ 0x11150, 0x11173,
+ 0x11176, 0x11176,
0x11180, 0x111c4,
- 0x111d0, 0x111d9,
+ 0x111d0, 0x111da,
+ 0x11200, 0x11211,
+ 0x11213, 0x11237,
+ 0x112b0, 0x112ea,
+ 0x112f0, 0x112f9,
+ 0x11301, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133c, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x11357, 0x11357,
+ 0x1135d, 0x11363,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x11480, 0x114c5,
+ 0x114c7, 0x114c7,
+ 0x114d0, 0x114d9,
+ 0x11580, 0x115b5,
+ 0x115b8, 0x115c0,
+ 0x11600, 0x11640,
+ 0x11644, 0x11644,
+ 0x11650, 0x11659,
0x11680, 0x116b7,
0x116c0, 0x116c9,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
+ 0x118a0, 0x118e9,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16a60, 0x16a69,
+ 0x16ad0, 0x16aed,
+ 0x16af0, 0x16af4,
+ 0x16b00, 0x16b36,
+ 0x16b40, 0x16b43,
+ 0x16b50, 0x16b59,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f7e,
0x16f8f, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9d, 0x1bc9e,
0x1d165, 0x1d169,
0x1d16d, 0x1d172,
0x1d17b, 0x1d182,
@@ -3686,6 +3981,8 @@ static const OnigCodePoint CR_Word[] = {
0x1d7aa, 0x1d7c2,
0x1d7c4, 0x1d7cb,
0x1d7ce, 0x1d7ff,
+ 0x1e800, 0x1e8c4,
+ 0x1e8d0, 0x1e8d6,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -3719,6 +4016,9 @@ static const OnigCodePoint CR_Word[] = {
0x1eea1, 0x1eea3,
0x1eea5, 0x1eea9,
0x1eeab, 0x1eebb,
+ 0x1f130, 0x1f149,
+ 0x1f150, 0x1f169,
+ 0x1f170, 0x1f189,
0x20000, 0x2a6d6,
0x2a700, 0x2b734,
0x2b740, 0x2b81d,
@@ -3728,7 +4028,7 @@ static const OnigCodePoint CR_Word[] = {
/* 'Alnum': [[:Alnum:]] */
static const OnigCodePoint CR_Alnum[] = {
- 566,
+ 630,
0x0030, 0x0039,
0x0041, 0x005a,
0x0061, 0x007a,
@@ -3746,13 +4046,14 @@ static const OnigCodePoint CR_Alnum[] = {
0x0370, 0x0374,
0x0376, 0x0377,
0x037a, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03f5,
0x03f7, 0x0481,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0559, 0x0559,
0x0561, 0x0587,
@@ -3779,18 +4080,14 @@ static const OnigCodePoint CR_Alnum[] = {
0x0800, 0x0817,
0x081a, 0x082c,
0x0840, 0x0858,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
+ 0x08a0, 0x08b2,
0x08e4, 0x08e9,
- 0x08f0, 0x08fe,
- 0x0900, 0x093b,
+ 0x08f0, 0x093b,
0x093d, 0x094c,
0x094e, 0x0950,
0x0955, 0x0963,
0x0966, 0x096f,
- 0x0971, 0x0977,
- 0x0979, 0x097f,
- 0x0981, 0x0983,
+ 0x0971, 0x0983,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -3864,12 +4161,11 @@ static const OnigCodePoint CR_Alnum[] = {
0x0bd0, 0x0bd0,
0x0bd7, 0x0bd7,
0x0be6, 0x0bef,
- 0x0c01, 0x0c03,
+ 0x0c00, 0x0c03,
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4c,
@@ -3877,7 +4173,7 @@ static const OnigCodePoint CR_Alnum[] = {
0x0c58, 0x0c59,
0x0c60, 0x0c63,
0x0c66, 0x0c6f,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0c85, 0x0c8c,
0x0c8e, 0x0c90,
0x0c92, 0x0ca8,
@@ -3891,7 +4187,7 @@ static const OnigCodePoint CR_Alnum[] = {
0x0ce0, 0x0ce3,
0x0ce6, 0x0cef,
0x0cf1, 0x0cf2,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d05, 0x0d0c,
0x0d0e, 0x0d10,
0x0d12, 0x0d3a,
@@ -3912,6 +4208,7 @@ static const OnigCodePoint CR_Alnum[] = {
0x0dcf, 0x0dd4,
0x0dd6, 0x0dd6,
0x0dd8, 0x0ddf,
+ 0x0de6, 0x0def,
0x0df2, 0x0df3,
0x0e01, 0x0e3a,
0x0e40, 0x0e46,
@@ -3978,7 +4275,7 @@ static const OnigCodePoint CR_Alnum[] = {
0x166f, 0x167f,
0x1681, 0x169a,
0x16a0, 0x16ea,
- 0x16ee, 0x16f0,
+ 0x16ee, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1713,
0x1720, 0x1733,
@@ -3995,7 +4292,7 @@ static const OnigCodePoint CR_Alnum[] = {
0x1820, 0x1877,
0x1880, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1920, 0x192b,
0x1930, 0x1938,
0x1946, 0x196d,
@@ -4023,6 +4320,7 @@ static const OnigCodePoint CR_Alnum[] = {
0x1cee, 0x1cf3,
0x1cf5, 0x1cf6,
0x1d00, 0x1dbf,
+ 0x1de7, 0x1df4,
0x1e00, 0x1f15,
0x1f18, 0x1f1d,
0x1f20, 0x1f45,
@@ -4101,14 +4399,14 @@ static const OnigCodePoint CR_Alnum[] = {
0xa610, 0xa62b,
0xa640, 0xa66e,
0xa674, 0xa67b,
- 0xa67f, 0xa697,
+ 0xa67f, 0xa69d,
0xa69f, 0xa6ef,
0xa717, 0xa71f,
0xa722, 0xa788,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa801,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa801,
0xa803, 0xa805,
0xa807, 0xa80a,
0xa80c, 0xa827,
@@ -4123,12 +4421,14 @@ static const OnigCodePoint CR_Alnum[] = {
0xa980, 0xa9b2,
0xa9b4, 0xa9bf,
0xa9cf, 0xa9d9,
+ 0xa9e0, 0xa9e4,
+ 0xa9e6, 0xa9fe,
0xaa00, 0xaa36,
0xaa40, 0xaa4d,
0xaa50, 0xaa59,
0xaa60, 0xaa76,
0xaa7a, 0xaa7a,
- 0xaa80, 0xaabe,
+ 0xaa7e, 0xaabe,
0xaac0, 0xaac0,
0xaac2, 0xaac2,
0xaadb, 0xaadd,
@@ -4139,6 +4439,9 @@ static const OnigCodePoint CR_Alnum[] = {
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabea,
0xabf0, 0xabf9,
0xac00, 0xd7a3,
@@ -4179,20 +4482,28 @@ static const OnigCodePoint CR_Alnum[] = {
0x10140, 0x10174,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
+ 0x10300, 0x1031f,
0x10330, 0x1034a,
+ 0x10350, 0x1037a,
0x10380, 0x1039d,
0x103a0, 0x103c3,
0x103c8, 0x103cf,
0x103d1, 0x103d5,
0x10400, 0x1049d,
0x104a0, 0x104a9,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
+ 0x10860, 0x10876,
+ 0x10880, 0x1089e,
0x10900, 0x10915,
0x10920, 0x10939,
0x10980, 0x109b7,
@@ -4203,9 +4514,13 @@ static const OnigCodePoint CR_Alnum[] = {
0x10a15, 0x10a17,
0x10a19, 0x10a33,
0x10a60, 0x10a7c,
+ 0x10a80, 0x10a9c,
+ 0x10ac0, 0x10ac7,
+ 0x10ac9, 0x10ae4,
0x10b00, 0x10b35,
0x10b40, 0x10b55,
0x10b60, 0x10b72,
+ 0x10b80, 0x10b91,
0x10c00, 0x10c48,
0x11000, 0x11045,
0x11066, 0x1106f,
@@ -4214,19 +4529,64 @@ static const OnigCodePoint CR_Alnum[] = {
0x110f0, 0x110f9,
0x11100, 0x11132,
0x11136, 0x1113f,
+ 0x11150, 0x11172,
+ 0x11176, 0x11176,
0x11180, 0x111bf,
0x111c1, 0x111c4,
- 0x111d0, 0x111d9,
+ 0x111d0, 0x111da,
+ 0x11200, 0x11211,
+ 0x11213, 0x11234,
+ 0x11237, 0x11237,
+ 0x112b0, 0x112e8,
+ 0x112f0, 0x112f9,
+ 0x11301, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133d, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134c,
+ 0x11357, 0x11357,
+ 0x1135d, 0x11363,
+ 0x11480, 0x114c1,
+ 0x114c4, 0x114c5,
+ 0x114c7, 0x114c7,
+ 0x114d0, 0x114d9,
+ 0x11580, 0x115b5,
+ 0x115b8, 0x115be,
+ 0x11600, 0x1163e,
+ 0x11640, 0x11640,
+ 0x11644, 0x11644,
+ 0x11650, 0x11659,
0x11680, 0x116b5,
0x116c0, 0x116c9,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
+ 0x118a0, 0x118e9,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16a60, 0x16a69,
+ 0x16ad0, 0x16aed,
+ 0x16b00, 0x16b36,
+ 0x16b40, 0x16b43,
+ 0x16b50, 0x16b59,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f7e,
0x16f93, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9e, 0x1bc9e,
0x1d400, 0x1d454,
0x1d456, 0x1d49c,
0x1d49e, 0x1d49f,
@@ -4258,6 +4618,7 @@ static const OnigCodePoint CR_Alnum[] = {
0x1d7aa, 0x1d7c2,
0x1d7c4, 0x1d7cb,
0x1d7ce, 0x1d7ff,
+ 0x1e800, 0x1e8c4,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -4291,6 +4652,9 @@ static const OnigCodePoint CR_Alnum[] = {
0x1eea1, 0x1eea3,
0x1eea5, 0x1eea9,
0x1eeab, 0x1eebb,
+ 0x1f130, 0x1f149,
+ 0x1f150, 0x1f169,
+ 0x1f170, 0x1f189,
0x20000, 0x2a6d6,
0x2a700, 0x2b734,
0x2b740, 0x2b81d,
@@ -4312,23 +4676,22 @@ static const OnigCodePoint CR_Any[] = {
/* 'Assigned': - */
static const OnigCodePoint CR_Assigned[] = {
- 539,
+ 600,
0x0000, 0x0377,
- 0x037a, 0x037e,
+ 0x037a, 0x037f,
0x0384, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
- 0x03a3, 0x0527,
+ 0x03a3, 0x052f,
0x0531, 0x0556,
0x0559, 0x055f,
0x0561, 0x0587,
0x0589, 0x058a,
- 0x058f, 0x058f,
+ 0x058d, 0x058f,
0x0591, 0x05c7,
0x05d0, 0x05ea,
0x05f0, 0x05f4,
- 0x0600, 0x0604,
- 0x0606, 0x061b,
+ 0x0600, 0x061c,
0x061e, 0x070d,
0x070f, 0x074a,
0x074d, 0x07b1,
@@ -4337,12 +4700,8 @@ static const OnigCodePoint CR_Assigned[] = {
0x0830, 0x083e,
0x0840, 0x085b,
0x085e, 0x085e,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
- 0x08e4, 0x08fe,
- 0x0900, 0x0977,
- 0x0979, 0x097f,
- 0x0981, 0x0983,
+ 0x08a0, 0x08b2,
+ 0x08e4, 0x0983,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -4415,12 +4774,11 @@ static const OnigCodePoint CR_Assigned[] = {
0x0bd0, 0x0bd0,
0x0bd7, 0x0bd7,
0x0be6, 0x0bfa,
- 0x0c01, 0x0c03,
+ 0x0c00, 0x0c03,
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
@@ -4429,7 +4787,7 @@ static const OnigCodePoint CR_Assigned[] = {
0x0c60, 0x0c63,
0x0c66, 0x0c6f,
0x0c78, 0x0c7f,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0c85, 0x0c8c,
0x0c8e, 0x0c90,
0x0c92, 0x0ca8,
@@ -4443,7 +4801,7 @@ static const OnigCodePoint CR_Assigned[] = {
0x0ce0, 0x0ce3,
0x0ce6, 0x0cef,
0x0cf1, 0x0cf2,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d05, 0x0d0c,
0x0d0e, 0x0d10,
0x0d12, 0x0d3a,
@@ -4464,6 +4822,7 @@ static const OnigCodePoint CR_Assigned[] = {
0x0dcf, 0x0dd4,
0x0dd6, 0x0dd6,
0x0dd8, 0x0ddf,
+ 0x0de6, 0x0def,
0x0df2, 0x0df4,
0x0e01, 0x0e3a,
0x0e3f, 0x0e5b,
@@ -4514,7 +4873,7 @@ static const OnigCodePoint CR_Assigned[] = {
0x1380, 0x1399,
0x13a0, 0x13f4,
0x1400, 0x169c,
- 0x16a0, 0x16f0,
+ 0x16a0, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1714,
0x1720, 0x1736,
@@ -4530,7 +4889,7 @@ static const OnigCodePoint CR_Assigned[] = {
0x1820, 0x1877,
0x1880, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1920, 0x192b,
0x1930, 0x193b,
0x1940, 0x1940,
@@ -4545,6 +4904,7 @@ static const OnigCodePoint CR_Assigned[] = {
0x1a7f, 0x1a89,
0x1a90, 0x1a99,
0x1aa0, 0x1aad,
+ 0x1ab0, 0x1abe,
0x1b00, 0x1b4b,
0x1b50, 0x1b7c,
0x1b80, 0x1bf3,
@@ -4553,7 +4913,8 @@ static const OnigCodePoint CR_Assigned[] = {
0x1c4d, 0x1c7f,
0x1cc0, 0x1cc7,
0x1cd0, 0x1cf6,
- 0x1d00, 0x1de6,
+ 0x1cf8, 0x1cf9,
+ 0x1d00, 0x1df5,
0x1dfc, 0x1f15,
0x1f18, 0x1f1d,
0x1f20, 0x1f45,
@@ -4571,18 +4932,20 @@ static const OnigCodePoint CR_Assigned[] = {
0x1ff2, 0x1ff4,
0x1ff6, 0x1ffe,
0x2000, 0x2064,
- 0x206a, 0x2071,
+ 0x2066, 0x2071,
0x2074, 0x208e,
0x2090, 0x209c,
- 0x20a0, 0x20b9,
+ 0x20a0, 0x20bd,
0x20d0, 0x20f0,
0x2100, 0x2189,
- 0x2190, 0x23f3,
+ 0x2190, 0x23fa,
0x2400, 0x2426,
0x2440, 0x244a,
- 0x2460, 0x26ff,
- 0x2701, 0x2b4c,
- 0x2b50, 0x2b59,
+ 0x2460, 0x2b73,
+ 0x2b76, 0x2b95,
+ 0x2b98, 0x2bb9,
+ 0x2bbd, 0x2bc8,
+ 0x2bca, 0x2bd1,
0x2c00, 0x2c2e,
0x2c30, 0x2c5e,
0x2c60, 0x2cf3,
@@ -4600,7 +4963,7 @@ static const OnigCodePoint CR_Assigned[] = {
0x2dc8, 0x2dce,
0x2dd0, 0x2dd6,
0x2dd8, 0x2dde,
- 0x2de0, 0x2e3b,
+ 0x2de0, 0x2e42,
0x2e80, 0x2e99,
0x2e9b, 0x2ef3,
0x2f00, 0x2fd5,
@@ -4619,12 +4982,12 @@ static const OnigCodePoint CR_Assigned[] = {
0xa000, 0xa48c,
0xa490, 0xa4c6,
0xa4d0, 0xa62b,
- 0xa640, 0xa697,
+ 0xa640, 0xa69d,
0xa69f, 0xa6f7,
0xa700, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa82b,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa82b,
0xa830, 0xa839,
0xa840, 0xa877,
0xa880, 0xa8c4,
@@ -4634,18 +4997,19 @@ static const OnigCodePoint CR_Assigned[] = {
0xa95f, 0xa97c,
0xa980, 0xa9cd,
0xa9cf, 0xa9d9,
- 0xa9de, 0xa9df,
+ 0xa9de, 0xa9fe,
0xaa00, 0xaa36,
0xaa40, 0xaa4d,
0xaa50, 0xaa59,
- 0xaa5c, 0xaa7b,
- 0xaa80, 0xaac2,
+ 0xaa5c, 0xaac2,
0xaadb, 0xaaf6,
0xab01, 0xab06,
0xab09, 0xab0e,
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabed,
0xabf0, 0xabf9,
0xac00, 0xd7a3,
@@ -4666,7 +5030,7 @@ static const OnigCodePoint CR_Assigned[] = {
0xfd92, 0xfdc7,
0xfdf0, 0xfdfd,
0xfe00, 0xfe19,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0xfe30, 0xfe52,
0xfe54, 0xfe66,
0xfe68, 0xfe6b,
@@ -4690,26 +5054,35 @@ static const OnigCodePoint CR_Assigned[] = {
0x10080, 0x100fa,
0x10100, 0x10102,
0x10107, 0x10133,
- 0x10137, 0x1018a,
+ 0x10137, 0x1018c,
0x10190, 0x1019b,
+ 0x101a0, 0x101a0,
0x101d0, 0x101fd,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
- 0x10320, 0x10323,
+ 0x102e0, 0x102fb,
+ 0x10300, 0x10323,
0x10330, 0x1034a,
+ 0x10350, 0x1037a,
0x10380, 0x1039d,
0x1039f, 0x103c3,
0x103c8, 0x103d5,
0x10400, 0x1049d,
0x104a0, 0x104a9,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x1056f, 0x1056f,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
- 0x10857, 0x1085f,
+ 0x10857, 0x1089e,
+ 0x108a7, 0x108af,
0x10900, 0x1091b,
0x1091f, 0x10939,
0x1093f, 0x1093f,
@@ -4723,33 +5096,82 @@ static const OnigCodePoint CR_Assigned[] = {
0x10a38, 0x10a3a,
0x10a3f, 0x10a47,
0x10a50, 0x10a58,
- 0x10a60, 0x10a7f,
+ 0x10a60, 0x10a9f,
+ 0x10ac0, 0x10ae6,
+ 0x10aeb, 0x10af6,
0x10b00, 0x10b35,
0x10b39, 0x10b55,
0x10b58, 0x10b72,
- 0x10b78, 0x10b7f,
+ 0x10b78, 0x10b91,
+ 0x10b99, 0x10b9c,
+ 0x10ba9, 0x10baf,
0x10c00, 0x10c48,
0x10e60, 0x10e7e,
0x11000, 0x1104d,
0x11052, 0x1106f,
- 0x11080, 0x110c1,
+ 0x1107f, 0x110c1,
0x110d0, 0x110e8,
0x110f0, 0x110f9,
0x11100, 0x11134,
0x11136, 0x11143,
+ 0x11150, 0x11176,
0x11180, 0x111c8,
- 0x111d0, 0x111d9,
+ 0x111cd, 0x111cd,
+ 0x111d0, 0x111da,
+ 0x111e1, 0x111f4,
+ 0x11200, 0x11211,
+ 0x11213, 0x1123d,
+ 0x112b0, 0x112ea,
+ 0x112f0, 0x112f9,
+ 0x11301, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133c, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x11357, 0x11357,
+ 0x1135d, 0x11363,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x11480, 0x114c7,
+ 0x114d0, 0x114d9,
+ 0x11580, 0x115b5,
+ 0x115b8, 0x115c9,
+ 0x11600, 0x11644,
+ 0x11650, 0x11659,
0x11680, 0x116b7,
0x116c0, 0x116c9,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
- 0x12470, 0x12473,
+ 0x118a0, 0x118f2,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
+ 0x12470, 0x12474,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16a60, 0x16a69,
+ 0x16a6e, 0x16a6f,
+ 0x16ad0, 0x16aed,
+ 0x16af0, 0x16af5,
+ 0x16b00, 0x16b45,
+ 0x16b50, 0x16b59,
+ 0x16b5b, 0x16b61,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f7e,
0x16f8f, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9c, 0x1bca3,
0x1d000, 0x1d0f5,
0x1d100, 0x1d126,
0x1d129, 0x1d1dd,
@@ -4777,6 +5199,8 @@ static const OnigCodePoint CR_Assigned[] = {
0x1d552, 0x1d6a5,
0x1d6a8, 0x1d7cb,
0x1d7ce, 0x1d7ff,
+ 0x1e800, 0x1e8c4,
+ 0x1e8c7, 0x1e8d6,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -4814,10 +5238,10 @@ static const OnigCodePoint CR_Assigned[] = {
0x1f000, 0x1f02b,
0x1f030, 0x1f093,
0x1f0a0, 0x1f0ae,
- 0x1f0b1, 0x1f0be,
+ 0x1f0b1, 0x1f0bf,
0x1f0c1, 0x1f0cf,
- 0x1f0d1, 0x1f0df,
- 0x1f100, 0x1f10a,
+ 0x1f0d1, 0x1f0f5,
+ 0x1f100, 0x1f10c,
0x1f110, 0x1f12e,
0x1f130, 0x1f16b,
0x1f170, 0x1f19a,
@@ -4825,24 +5249,25 @@ static const OnigCodePoint CR_Assigned[] = {
0x1f210, 0x1f23a,
0x1f240, 0x1f248,
0x1f250, 0x1f251,
- 0x1f300, 0x1f320,
- 0x1f330, 0x1f335,
- 0x1f337, 0x1f37c,
- 0x1f380, 0x1f393,
- 0x1f3a0, 0x1f3c4,
- 0x1f3c6, 0x1f3ca,
- 0x1f3e0, 0x1f3f0,
- 0x1f400, 0x1f43e,
- 0x1f440, 0x1f440,
- 0x1f442, 0x1f4f7,
- 0x1f4f9, 0x1f4fc,
- 0x1f500, 0x1f53d,
- 0x1f540, 0x1f543,
- 0x1f550, 0x1f567,
- 0x1f5fb, 0x1f640,
- 0x1f645, 0x1f64f,
- 0x1f680, 0x1f6c5,
+ 0x1f300, 0x1f32c,
+ 0x1f330, 0x1f37d,
+ 0x1f380, 0x1f3ce,
+ 0x1f3d4, 0x1f3f7,
+ 0x1f400, 0x1f4fe,
+ 0x1f500, 0x1f54a,
+ 0x1f550, 0x1f579,
+ 0x1f57b, 0x1f5a3,
+ 0x1f5a5, 0x1f642,
+ 0x1f645, 0x1f6cf,
+ 0x1f6e0, 0x1f6ec,
+ 0x1f6f0, 0x1f6f3,
0x1f700, 0x1f773,
+ 0x1f780, 0x1f7d4,
+ 0x1f800, 0x1f80b,
+ 0x1f810, 0x1f847,
+ 0x1f850, 0x1f859,
+ 0x1f860, 0x1f887,
+ 0x1f890, 0x1f8ad,
0x20000, 0x2a6d6,
0x2a700, 0x2b734,
0x2b740, 0x2b81d,
@@ -4856,20 +5281,20 @@ static const OnigCodePoint CR_Assigned[] = {
/* 'C': Major Category */
static const OnigCodePoint CR_C[] = {
- 541,
+ 603,
0x0000, 0x001f,
0x007f, 0x009f,
0x00ad, 0x00ad,
0x0378, 0x0379,
- 0x037f, 0x0383,
+ 0x0380, 0x0383,
0x038b, 0x038b,
0x038d, 0x038d,
0x03a2, 0x03a2,
- 0x0528, 0x0530,
+ 0x0530, 0x0530,
0x0557, 0x0558,
0x0560, 0x0560,
0x0588, 0x0588,
- 0x058b, 0x058e,
+ 0x058b, 0x058c,
0x0590, 0x0590,
0x05c8, 0x05cf,
0x05eb, 0x05ef,
@@ -4884,11 +5309,7 @@ static const OnigCodePoint CR_C[] = {
0x083f, 0x083f,
0x085c, 0x085d,
0x085f, 0x089f,
- 0x08a1, 0x08a1,
- 0x08ad, 0x08e3,
- 0x08ff, 0x08ff,
- 0x0978, 0x0978,
- 0x0980, 0x0980,
+ 0x08b3, 0x08e3,
0x0984, 0x0984,
0x098d, 0x098e,
0x0991, 0x0992,
@@ -4961,12 +5382,11 @@ static const OnigCodePoint CR_C[] = {
0x0bce, 0x0bcf,
0x0bd1, 0x0bd6,
0x0bd8, 0x0be5,
- 0x0bfb, 0x0c00,
+ 0x0bfb, 0x0bff,
0x0c04, 0x0c04,
0x0c0d, 0x0c0d,
0x0c11, 0x0c11,
0x0c29, 0x0c29,
- 0x0c34, 0x0c34,
0x0c3a, 0x0c3c,
0x0c45, 0x0c45,
0x0c49, 0x0c49,
@@ -4975,7 +5395,7 @@ static const OnigCodePoint CR_C[] = {
0x0c5a, 0x0c5f,
0x0c64, 0x0c65,
0x0c70, 0x0c77,
- 0x0c80, 0x0c81,
+ 0x0c80, 0x0c80,
0x0c84, 0x0c84,
0x0c8d, 0x0c8d,
0x0c91, 0x0c91,
@@ -4989,7 +5409,7 @@ static const OnigCodePoint CR_C[] = {
0x0cdf, 0x0cdf,
0x0ce4, 0x0ce5,
0x0cf0, 0x0cf0,
- 0x0cf3, 0x0d01,
+ 0x0cf3, 0x0d00,
0x0d04, 0x0d04,
0x0d0d, 0x0d0d,
0x0d11, 0x0d11,
@@ -5010,7 +5430,8 @@ static const OnigCodePoint CR_C[] = {
0x0dcb, 0x0dce,
0x0dd5, 0x0dd5,
0x0dd7, 0x0dd7,
- 0x0de0, 0x0df1,
+ 0x0de0, 0x0de5,
+ 0x0df0, 0x0df1,
0x0df5, 0x0e00,
0x0e3b, 0x0e3e,
0x0e5c, 0x0e80,
@@ -5061,7 +5482,7 @@ static const OnigCodePoint CR_C[] = {
0x139a, 0x139f,
0x13f5, 0x13ff,
0x169d, 0x169f,
- 0x16f1, 0x16ff,
+ 0x16f9, 0x16ff,
0x170d, 0x170d,
0x1715, 0x171f,
0x1737, 0x173f,
@@ -5072,12 +5493,12 @@ static const OnigCodePoint CR_C[] = {
0x17de, 0x17df,
0x17ea, 0x17ef,
0x17fa, 0x17ff,
- 0x180f, 0x180f,
+ 0x180e, 0x180f,
0x181a, 0x181f,
0x1878, 0x187f,
0x18ab, 0x18af,
0x18f6, 0x18ff,
- 0x191d, 0x191f,
+ 0x191f, 0x191f,
0x192c, 0x192f,
0x193c, 0x193f,
0x1941, 0x1943,
@@ -5091,7 +5512,8 @@ static const OnigCodePoint CR_C[] = {
0x1a7d, 0x1a7e,
0x1a8a, 0x1a8f,
0x1a9a, 0x1a9f,
- 0x1aae, 0x1aff,
+ 0x1aae, 0x1aaf,
+ 0x1abf, 0x1aff,
0x1b4c, 0x1b4f,
0x1b7d, 0x1b7f,
0x1bf4, 0x1bfb,
@@ -5099,8 +5521,9 @@ static const OnigCodePoint CR_C[] = {
0x1c4a, 0x1c4c,
0x1c80, 0x1cbf,
0x1cc8, 0x1ccf,
- 0x1cf7, 0x1cff,
- 0x1de7, 0x1dfb,
+ 0x1cf7, 0x1cf7,
+ 0x1cfa, 0x1cff,
+ 0x1df6, 0x1dfb,
0x1f16, 0x1f17,
0x1f1e, 0x1f1f,
0x1f46, 0x1f47,
@@ -5123,15 +5546,17 @@ static const OnigCodePoint CR_C[] = {
0x2072, 0x2073,
0x208f, 0x208f,
0x209d, 0x209f,
- 0x20ba, 0x20cf,
+ 0x20be, 0x20cf,
0x20f1, 0x20ff,
0x218a, 0x218f,
- 0x23f4, 0x23ff,
+ 0x23fb, 0x23ff,
0x2427, 0x243f,
0x244b, 0x245f,
- 0x2700, 0x2700,
- 0x2b4d, 0x2b4f,
- 0x2b5a, 0x2bff,
+ 0x2b74, 0x2b75,
+ 0x2b96, 0x2b97,
+ 0x2bba, 0x2bbc,
+ 0x2bc9, 0x2bc9,
+ 0x2bd2, 0x2bff,
0x2c2f, 0x2c2f,
0x2c5f, 0x2c5f,
0x2cf4, 0x2cf8,
@@ -5149,7 +5574,7 @@ static const OnigCodePoint CR_C[] = {
0x2dcf, 0x2dcf,
0x2dd7, 0x2dd7,
0x2ddf, 0x2ddf,
- 0x2e3c, 0x2e7f,
+ 0x2e43, 0x2e7f,
0x2e9a, 0x2e9a,
0x2ef4, 0x2eff,
0x2fd6, 0x2fef,
@@ -5168,11 +5593,11 @@ static const OnigCodePoint CR_C[] = {
0xa48d, 0xa48f,
0xa4c7, 0xa4cf,
0xa62c, 0xa63f,
- 0xa698, 0xa69e,
+ 0xa69e, 0xa69e,
0xa6f8, 0xa6ff,
0xa78f, 0xa78f,
- 0xa794, 0xa79f,
- 0xa7ab, 0xa7f7,
+ 0xa7ae, 0xa7af,
+ 0xa7b2, 0xa7f6,
0xa82c, 0xa82f,
0xa83a, 0xa83f,
0xa878, 0xa87f,
@@ -5183,18 +5608,19 @@ static const OnigCodePoint CR_C[] = {
0xa97d, 0xa97f,
0xa9ce, 0xa9ce,
0xa9da, 0xa9dd,
- 0xa9e0, 0xa9ff,
+ 0xa9ff, 0xa9ff,
0xaa37, 0xaa3f,
0xaa4e, 0xaa4f,
0xaa5a, 0xaa5b,
- 0xaa7c, 0xaa7f,
0xaac3, 0xaada,
0xaaf7, 0xab00,
0xab07, 0xab08,
0xab0f, 0xab10,
0xab17, 0xab1f,
0xab27, 0xab27,
- 0xab2f, 0xabbf,
+ 0xab2f, 0xab2f,
+ 0xab60, 0xab63,
+ 0xab66, 0xabbf,
0xabee, 0xabef,
0xabfa, 0xabff,
0xd7a4, 0xd7af,
@@ -5215,7 +5641,7 @@ static const OnigCodePoint CR_C[] = {
0xfdc8, 0xfdef,
0xfdfe, 0xfdff,
0xfe1a, 0xfe1f,
- 0xfe27, 0xfe2f,
+ 0xfe2e, 0xfe2f,
0xfe53, 0xfe53,
0xfe67, 0xfe67,
0xfe6c, 0xfe6f,
@@ -5238,26 +5664,35 @@ static const OnigCodePoint CR_C[] = {
0x100fb, 0x100ff,
0x10103, 0x10106,
0x10134, 0x10136,
- 0x1018b, 0x1018f,
- 0x1019c, 0x101cf,
+ 0x1018d, 0x1018f,
+ 0x1019c, 0x1019f,
+ 0x101a1, 0x101cf,
0x101fe, 0x1027f,
0x1029d, 0x1029f,
- 0x102d1, 0x102ff,
- 0x1031f, 0x1031f,
+ 0x102d1, 0x102df,
+ 0x102fc, 0x102ff,
0x10324, 0x1032f,
- 0x1034b, 0x1037f,
+ 0x1034b, 0x1034f,
+ 0x1037b, 0x1037f,
0x1039e, 0x1039e,
0x103c4, 0x103c7,
0x103d6, 0x103ff,
0x1049e, 0x1049f,
- 0x104aa, 0x107ff,
+ 0x104aa, 0x104ff,
+ 0x10528, 0x1052f,
+ 0x10564, 0x1056e,
+ 0x10570, 0x105ff,
+ 0x10737, 0x1073f,
+ 0x10756, 0x1075f,
+ 0x10768, 0x107ff,
0x10806, 0x10807,
0x10809, 0x10809,
0x10836, 0x10836,
0x10839, 0x1083b,
0x1083d, 0x1083e,
0x10856, 0x10856,
- 0x10860, 0x108ff,
+ 0x1089f, 0x108a6,
+ 0x108b0, 0x108ff,
0x1091c, 0x1091e,
0x1093a, 0x1093e,
0x10940, 0x1097f,
@@ -5271,34 +5706,83 @@ static const OnigCodePoint CR_C[] = {
0x10a3b, 0x10a3e,
0x10a48, 0x10a4f,
0x10a59, 0x10a5f,
- 0x10a80, 0x10aff,
+ 0x10aa0, 0x10abf,
+ 0x10ae7, 0x10aea,
+ 0x10af7, 0x10aff,
0x10b36, 0x10b38,
0x10b56, 0x10b57,
0x10b73, 0x10b77,
- 0x10b80, 0x10bff,
+ 0x10b92, 0x10b98,
+ 0x10b9d, 0x10ba8,
+ 0x10bb0, 0x10bff,
0x10c49, 0x10e5f,
0x10e7f, 0x10fff,
0x1104e, 0x11051,
- 0x11070, 0x1107f,
+ 0x11070, 0x1107e,
0x110bd, 0x110bd,
0x110c2, 0x110cf,
0x110e9, 0x110ef,
0x110fa, 0x110ff,
0x11135, 0x11135,
- 0x11144, 0x1117f,
- 0x111c9, 0x111cf,
- 0x111da, 0x1167f,
+ 0x11144, 0x1114f,
+ 0x11177, 0x1117f,
+ 0x111c9, 0x111cc,
+ 0x111ce, 0x111cf,
+ 0x111db, 0x111e0,
+ 0x111f5, 0x111ff,
+ 0x11212, 0x11212,
+ 0x1123e, 0x112af,
+ 0x112eb, 0x112ef,
+ 0x112fa, 0x11300,
+ 0x11304, 0x11304,
+ 0x1130d, 0x1130e,
+ 0x11311, 0x11312,
+ 0x11329, 0x11329,
+ 0x11331, 0x11331,
+ 0x11334, 0x11334,
+ 0x1133a, 0x1133b,
+ 0x11345, 0x11346,
+ 0x11349, 0x1134a,
+ 0x1134e, 0x11356,
+ 0x11358, 0x1135c,
+ 0x11364, 0x11365,
+ 0x1136d, 0x1136f,
+ 0x11375, 0x1147f,
+ 0x114c8, 0x114cf,
+ 0x114da, 0x1157f,
+ 0x115b6, 0x115b7,
+ 0x115ca, 0x115ff,
+ 0x11645, 0x1164f,
+ 0x1165a, 0x1167f,
0x116b8, 0x116bf,
- 0x116ca, 0x11fff,
- 0x1236f, 0x123ff,
- 0x12463, 0x1246f,
- 0x12474, 0x12fff,
+ 0x116ca, 0x1189f,
+ 0x118f3, 0x118fe,
+ 0x11900, 0x11abf,
+ 0x11af9, 0x11fff,
+ 0x12399, 0x123ff,
+ 0x1246f, 0x1246f,
+ 0x12475, 0x12fff,
0x1342f, 0x167ff,
- 0x16a39, 0x16eff,
+ 0x16a39, 0x16a3f,
+ 0x16a5f, 0x16a5f,
+ 0x16a6a, 0x16a6d,
+ 0x16a70, 0x16acf,
+ 0x16aee, 0x16aef,
+ 0x16af6, 0x16aff,
+ 0x16b46, 0x16b4f,
+ 0x16b5a, 0x16b5a,
+ 0x16b62, 0x16b62,
+ 0x16b78, 0x16b7c,
+ 0x16b90, 0x16eff,
0x16f45, 0x16f4f,
0x16f7f, 0x16f8e,
0x16fa0, 0x1afff,
- 0x1b002, 0x1cfff,
+ 0x1b002, 0x1bbff,
+ 0x1bc6b, 0x1bc6f,
+ 0x1bc7d, 0x1bc7f,
+ 0x1bc89, 0x1bc8f,
+ 0x1bc9a, 0x1bc9b,
+ 0x1bca0, 0x1cfff,
0x1d0f6, 0x1d0ff,
0x1d127, 0x1d128,
0x1d173, 0x1d17a,
@@ -5326,7 +5810,9 @@ static const OnigCodePoint CR_C[] = {
0x1d551, 0x1d551,
0x1d6a6, 0x1d6a7,
0x1d7cc, 0x1d7cd,
- 0x1d800, 0x1edff,
+ 0x1d800, 0x1e7ff,
+ 0x1e8c5, 0x1e8c6,
+ 0x1e8d7, 0x1edff,
0x1ee04, 0x1ee04,
0x1ee20, 0x1ee20,
0x1ee23, 0x1ee23,
@@ -5364,10 +5850,10 @@ static const OnigCodePoint CR_C[] = {
0x1f02c, 0x1f02f,
0x1f094, 0x1f09f,
0x1f0af, 0x1f0b0,
- 0x1f0bf, 0x1f0c0,
+ 0x1f0c0, 0x1f0c0,
0x1f0d0, 0x1f0d0,
- 0x1f0e0, 0x1f0ff,
- 0x1f10b, 0x1f10f,
+ 0x1f0f6, 0x1f0ff,
+ 0x1f10d, 0x1f10f,
0x1f12f, 0x1f12f,
0x1f16c, 0x1f16f,
0x1f19b, 0x1f1e5,
@@ -5375,24 +5861,25 @@ static const OnigCodePoint CR_C[] = {
0x1f23b, 0x1f23f,
0x1f249, 0x1f24f,
0x1f252, 0x1f2ff,
- 0x1f321, 0x1f32f,
- 0x1f336, 0x1f336,
- 0x1f37d, 0x1f37f,
- 0x1f394, 0x1f39f,
- 0x1f3c5, 0x1f3c5,
- 0x1f3cb, 0x1f3df,
- 0x1f3f1, 0x1f3ff,
- 0x1f43f, 0x1f43f,
- 0x1f441, 0x1f441,
- 0x1f4f8, 0x1f4f8,
- 0x1f4fd, 0x1f4ff,
- 0x1f53e, 0x1f53f,
- 0x1f544, 0x1f54f,
- 0x1f568, 0x1f5fa,
- 0x1f641, 0x1f644,
- 0x1f650, 0x1f67f,
- 0x1f6c6, 0x1f6ff,
- 0x1f774, 0x1ffff,
+ 0x1f32d, 0x1f32f,
+ 0x1f37e, 0x1f37f,
+ 0x1f3cf, 0x1f3d3,
+ 0x1f3f8, 0x1f3ff,
+ 0x1f4ff, 0x1f4ff,
+ 0x1f54b, 0x1f54f,
+ 0x1f57a, 0x1f57a,
+ 0x1f5a4, 0x1f5a4,
+ 0x1f643, 0x1f644,
+ 0x1f6d0, 0x1f6df,
+ 0x1f6ed, 0x1f6ef,
+ 0x1f6f4, 0x1f6ff,
+ 0x1f774, 0x1f77f,
+ 0x1f7d5, 0x1f7ff,
+ 0x1f80c, 0x1f80f,
+ 0x1f848, 0x1f84f,
+ 0x1f85a, 0x1f85f,
+ 0x1f888, 0x1f88f,
+ 0x1f8ae, 0x1ffff,
0x2a6d7, 0x2a6ff,
0x2b735, 0x2b73f,
0x2b81e, 0x2f7ff,
@@ -5405,18 +5892,21 @@ static const OnigCodePoint CR_C[] = {
/* 'Cf': General Category */
static const OnigCodePoint CR_Cf[] = {
- 14,
+ 17,
0x00ad, 0x00ad,
- 0x0600, 0x0604,
+ 0x0600, 0x0605,
+ 0x061c, 0x061c,
0x06dd, 0x06dd,
0x070f, 0x070f,
+ 0x180e, 0x180e,
0x200b, 0x200f,
0x202a, 0x202e,
0x2060, 0x2064,
- 0x206a, 0x206f,
+ 0x2066, 0x206f,
0xfeff, 0xfeff,
0xfff9, 0xfffb,
0x110bd, 0x110bd,
+ 0x1bca0, 0x1bca3,
0x1d173, 0x1d17a,
0xe0001, 0xe0001,
0xe0020, 0xe007f,
@@ -5424,23 +5914,22 @@ static const OnigCodePoint CR_Cf[] = {
/* 'Cn': General Category */
static const OnigCodePoint CR_Cn[] = {
- 539,
+ 600,
0x0378, 0x0379,
- 0x037f, 0x0383,
+ 0x0380, 0x0383,
0x038b, 0x038b,
0x038d, 0x038d,
0x03a2, 0x03a2,
- 0x0528, 0x0530,
+ 0x0530, 0x0530,
0x0557, 0x0558,
0x0560, 0x0560,
0x0588, 0x0588,
- 0x058b, 0x058e,
+ 0x058b, 0x058c,
0x0590, 0x0590,
0x05c8, 0x05cf,
0x05eb, 0x05ef,
0x05f5, 0x05ff,
- 0x0605, 0x0605,
- 0x061c, 0x061d,
+ 0x061d, 0x061d,
0x070e, 0x070e,
0x074b, 0x074c,
0x07b2, 0x07bf,
@@ -5449,11 +5938,7 @@ static const OnigCodePoint CR_Cn[] = {
0x083f, 0x083f,
0x085c, 0x085d,
0x085f, 0x089f,
- 0x08a1, 0x08a1,
- 0x08ad, 0x08e3,
- 0x08ff, 0x08ff,
- 0x0978, 0x0978,
- 0x0980, 0x0980,
+ 0x08b3, 0x08e3,
0x0984, 0x0984,
0x098d, 0x098e,
0x0991, 0x0992,
@@ -5526,12 +6011,11 @@ static const OnigCodePoint CR_Cn[] = {
0x0bce, 0x0bcf,
0x0bd1, 0x0bd6,
0x0bd8, 0x0be5,
- 0x0bfb, 0x0c00,
+ 0x0bfb, 0x0bff,
0x0c04, 0x0c04,
0x0c0d, 0x0c0d,
0x0c11, 0x0c11,
0x0c29, 0x0c29,
- 0x0c34, 0x0c34,
0x0c3a, 0x0c3c,
0x0c45, 0x0c45,
0x0c49, 0x0c49,
@@ -5540,7 +6024,7 @@ static const OnigCodePoint CR_Cn[] = {
0x0c5a, 0x0c5f,
0x0c64, 0x0c65,
0x0c70, 0x0c77,
- 0x0c80, 0x0c81,
+ 0x0c80, 0x0c80,
0x0c84, 0x0c84,
0x0c8d, 0x0c8d,
0x0c91, 0x0c91,
@@ -5554,7 +6038,7 @@ static const OnigCodePoint CR_Cn[] = {
0x0cdf, 0x0cdf,
0x0ce4, 0x0ce5,
0x0cf0, 0x0cf0,
- 0x0cf3, 0x0d01,
+ 0x0cf3, 0x0d00,
0x0d04, 0x0d04,
0x0d0d, 0x0d0d,
0x0d11, 0x0d11,
@@ -5575,7 +6059,8 @@ static const OnigCodePoint CR_Cn[] = {
0x0dcb, 0x0dce,
0x0dd5, 0x0dd5,
0x0dd7, 0x0dd7,
- 0x0de0, 0x0df1,
+ 0x0de0, 0x0de5,
+ 0x0df0, 0x0df1,
0x0df5, 0x0e00,
0x0e3b, 0x0e3e,
0x0e5c, 0x0e80,
@@ -5626,7 +6111,7 @@ static const OnigCodePoint CR_Cn[] = {
0x139a, 0x139f,
0x13f5, 0x13ff,
0x169d, 0x169f,
- 0x16f1, 0x16ff,
+ 0x16f9, 0x16ff,
0x170d, 0x170d,
0x1715, 0x171f,
0x1737, 0x173f,
@@ -5642,7 +6127,7 @@ static const OnigCodePoint CR_Cn[] = {
0x1878, 0x187f,
0x18ab, 0x18af,
0x18f6, 0x18ff,
- 0x191d, 0x191f,
+ 0x191f, 0x191f,
0x192c, 0x192f,
0x193c, 0x193f,
0x1941, 0x1943,
@@ -5656,7 +6141,8 @@ static const OnigCodePoint CR_Cn[] = {
0x1a7d, 0x1a7e,
0x1a8a, 0x1a8f,
0x1a9a, 0x1a9f,
- 0x1aae, 0x1aff,
+ 0x1aae, 0x1aaf,
+ 0x1abf, 0x1aff,
0x1b4c, 0x1b4f,
0x1b7d, 0x1b7f,
0x1bf4, 0x1bfb,
@@ -5664,8 +6150,9 @@ static const OnigCodePoint CR_Cn[] = {
0x1c4a, 0x1c4c,
0x1c80, 0x1cbf,
0x1cc8, 0x1ccf,
- 0x1cf7, 0x1cff,
- 0x1de7, 0x1dfb,
+ 0x1cf7, 0x1cf7,
+ 0x1cfa, 0x1cff,
+ 0x1df6, 0x1dfb,
0x1f16, 0x1f17,
0x1f1e, 0x1f1f,
0x1f46, 0x1f47,
@@ -5682,19 +6169,21 @@ static const OnigCodePoint CR_Cn[] = {
0x1ff0, 0x1ff1,
0x1ff5, 0x1ff5,
0x1fff, 0x1fff,
- 0x2065, 0x2069,
+ 0x2065, 0x2065,
0x2072, 0x2073,
0x208f, 0x208f,
0x209d, 0x209f,
- 0x20ba, 0x20cf,
+ 0x20be, 0x20cf,
0x20f1, 0x20ff,
0x218a, 0x218f,
- 0x23f4, 0x23ff,
+ 0x23fb, 0x23ff,
0x2427, 0x243f,
0x244b, 0x245f,
- 0x2700, 0x2700,
- 0x2b4d, 0x2b4f,
- 0x2b5a, 0x2bff,
+ 0x2b74, 0x2b75,
+ 0x2b96, 0x2b97,
+ 0x2bba, 0x2bbc,
+ 0x2bc9, 0x2bc9,
+ 0x2bd2, 0x2bff,
0x2c2f, 0x2c2f,
0x2c5f, 0x2c5f,
0x2cf4, 0x2cf8,
@@ -5712,7 +6201,7 @@ static const OnigCodePoint CR_Cn[] = {
0x2dcf, 0x2dcf,
0x2dd7, 0x2dd7,
0x2ddf, 0x2ddf,
- 0x2e3c, 0x2e7f,
+ 0x2e43, 0x2e7f,
0x2e9a, 0x2e9a,
0x2ef4, 0x2eff,
0x2fd6, 0x2fef,
@@ -5731,11 +6220,11 @@ static const OnigCodePoint CR_Cn[] = {
0xa48d, 0xa48f,
0xa4c7, 0xa4cf,
0xa62c, 0xa63f,
- 0xa698, 0xa69e,
+ 0xa69e, 0xa69e,
0xa6f8, 0xa6ff,
0xa78f, 0xa78f,
- 0xa794, 0xa79f,
- 0xa7ab, 0xa7f7,
+ 0xa7ae, 0xa7af,
+ 0xa7b2, 0xa7f6,
0xa82c, 0xa82f,
0xa83a, 0xa83f,
0xa878, 0xa87f,
@@ -5746,18 +6235,19 @@ static const OnigCodePoint CR_Cn[] = {
0xa97d, 0xa97f,
0xa9ce, 0xa9ce,
0xa9da, 0xa9dd,
- 0xa9e0, 0xa9ff,
+ 0xa9ff, 0xa9ff,
0xaa37, 0xaa3f,
0xaa4e, 0xaa4f,
0xaa5a, 0xaa5b,
- 0xaa7c, 0xaa7f,
0xaac3, 0xaada,
0xaaf7, 0xab00,
0xab07, 0xab08,
0xab0f, 0xab10,
0xab17, 0xab1f,
0xab27, 0xab27,
- 0xab2f, 0xabbf,
+ 0xab2f, 0xab2f,
+ 0xab60, 0xab63,
+ 0xab66, 0xabbf,
0xabee, 0xabef,
0xabfa, 0xabff,
0xd7a4, 0xd7af,
@@ -5778,7 +6268,7 @@ static const OnigCodePoint CR_Cn[] = {
0xfdc8, 0xfdef,
0xfdfe, 0xfdff,
0xfe1a, 0xfe1f,
- 0xfe27, 0xfe2f,
+ 0xfe2e, 0xfe2f,
0xfe53, 0xfe53,
0xfe67, 0xfe67,
0xfe6c, 0xfe6f,
@@ -5802,26 +6292,35 @@ static const OnigCodePoint CR_Cn[] = {
0x100fb, 0x100ff,
0x10103, 0x10106,
0x10134, 0x10136,
- 0x1018b, 0x1018f,
- 0x1019c, 0x101cf,
+ 0x1018d, 0x1018f,
+ 0x1019c, 0x1019f,
+ 0x101a1, 0x101cf,
0x101fe, 0x1027f,
0x1029d, 0x1029f,
- 0x102d1, 0x102ff,
- 0x1031f, 0x1031f,
+ 0x102d1, 0x102df,
+ 0x102fc, 0x102ff,
0x10324, 0x1032f,
- 0x1034b, 0x1037f,
+ 0x1034b, 0x1034f,
+ 0x1037b, 0x1037f,
0x1039e, 0x1039e,
0x103c4, 0x103c7,
0x103d6, 0x103ff,
0x1049e, 0x1049f,
- 0x104aa, 0x107ff,
+ 0x104aa, 0x104ff,
+ 0x10528, 0x1052f,
+ 0x10564, 0x1056e,
+ 0x10570, 0x105ff,
+ 0x10737, 0x1073f,
+ 0x10756, 0x1075f,
+ 0x10768, 0x107ff,
0x10806, 0x10807,
0x10809, 0x10809,
0x10836, 0x10836,
0x10839, 0x1083b,
0x1083d, 0x1083e,
0x10856, 0x10856,
- 0x10860, 0x108ff,
+ 0x1089f, 0x108a6,
+ 0x108b0, 0x108ff,
0x1091c, 0x1091e,
0x1093a, 0x1093e,
0x10940, 0x1097f,
@@ -5835,33 +6334,82 @@ static const OnigCodePoint CR_Cn[] = {
0x10a3b, 0x10a3e,
0x10a48, 0x10a4f,
0x10a59, 0x10a5f,
- 0x10a80, 0x10aff,
+ 0x10aa0, 0x10abf,
+ 0x10ae7, 0x10aea,
+ 0x10af7, 0x10aff,
0x10b36, 0x10b38,
0x10b56, 0x10b57,
0x10b73, 0x10b77,
- 0x10b80, 0x10bff,
+ 0x10b92, 0x10b98,
+ 0x10b9d, 0x10ba8,
+ 0x10bb0, 0x10bff,
0x10c49, 0x10e5f,
0x10e7f, 0x10fff,
0x1104e, 0x11051,
- 0x11070, 0x1107f,
+ 0x11070, 0x1107e,
0x110c2, 0x110cf,
0x110e9, 0x110ef,
0x110fa, 0x110ff,
0x11135, 0x11135,
- 0x11144, 0x1117f,
- 0x111c9, 0x111cf,
- 0x111da, 0x1167f,
+ 0x11144, 0x1114f,
+ 0x11177, 0x1117f,
+ 0x111c9, 0x111cc,
+ 0x111ce, 0x111cf,
+ 0x111db, 0x111e0,
+ 0x111f5, 0x111ff,
+ 0x11212, 0x11212,
+ 0x1123e, 0x112af,
+ 0x112eb, 0x112ef,
+ 0x112fa, 0x11300,
+ 0x11304, 0x11304,
+ 0x1130d, 0x1130e,
+ 0x11311, 0x11312,
+ 0x11329, 0x11329,
+ 0x11331, 0x11331,
+ 0x11334, 0x11334,
+ 0x1133a, 0x1133b,
+ 0x11345, 0x11346,
+ 0x11349, 0x1134a,
+ 0x1134e, 0x11356,
+ 0x11358, 0x1135c,
+ 0x11364, 0x11365,
+ 0x1136d, 0x1136f,
+ 0x11375, 0x1147f,
+ 0x114c8, 0x114cf,
+ 0x114da, 0x1157f,
+ 0x115b6, 0x115b7,
+ 0x115ca, 0x115ff,
+ 0x11645, 0x1164f,
+ 0x1165a, 0x1167f,
0x116b8, 0x116bf,
- 0x116ca, 0x11fff,
- 0x1236f, 0x123ff,
- 0x12463, 0x1246f,
- 0x12474, 0x12fff,
+ 0x116ca, 0x1189f,
+ 0x118f3, 0x118fe,
+ 0x11900, 0x11abf,
+ 0x11af9, 0x11fff,
+ 0x12399, 0x123ff,
+ 0x1246f, 0x1246f,
+ 0x12475, 0x12fff,
0x1342f, 0x167ff,
- 0x16a39, 0x16eff,
+ 0x16a39, 0x16a3f,
+ 0x16a5f, 0x16a5f,
+ 0x16a6a, 0x16a6d,
+ 0x16a70, 0x16acf,
+ 0x16aee, 0x16aef,
+ 0x16af6, 0x16aff,
+ 0x16b46, 0x16b4f,
+ 0x16b5a, 0x16b5a,
+ 0x16b62, 0x16b62,
+ 0x16b78, 0x16b7c,
+ 0x16b90, 0x16eff,
0x16f45, 0x16f4f,
0x16f7f, 0x16f8e,
0x16fa0, 0x1afff,
- 0x1b002, 0x1cfff,
+ 0x1b002, 0x1bbff,
+ 0x1bc6b, 0x1bc6f,
+ 0x1bc7d, 0x1bc7f,
+ 0x1bc89, 0x1bc8f,
+ 0x1bc9a, 0x1bc9b,
+ 0x1bca4, 0x1cfff,
0x1d0f6, 0x1d0ff,
0x1d127, 0x1d128,
0x1d1de, 0x1d1ff,
@@ -5888,7 +6436,9 @@ static const OnigCodePoint CR_Cn[] = {
0x1d551, 0x1d551,
0x1d6a6, 0x1d6a7,
0x1d7cc, 0x1d7cd,
- 0x1d800, 0x1edff,
+ 0x1d800, 0x1e7ff,
+ 0x1e8c5, 0x1e8c6,
+ 0x1e8d7, 0x1edff,
0x1ee04, 0x1ee04,
0x1ee20, 0x1ee20,
0x1ee23, 0x1ee23,
@@ -5926,10 +6476,10 @@ static const OnigCodePoint CR_Cn[] = {
0x1f02c, 0x1f02f,
0x1f094, 0x1f09f,
0x1f0af, 0x1f0b0,
- 0x1f0bf, 0x1f0c0,
+ 0x1f0c0, 0x1f0c0,
0x1f0d0, 0x1f0d0,
- 0x1f0e0, 0x1f0ff,
- 0x1f10b, 0x1f10f,
+ 0x1f0f6, 0x1f0ff,
+ 0x1f10d, 0x1f10f,
0x1f12f, 0x1f12f,
0x1f16c, 0x1f16f,
0x1f19b, 0x1f1e5,
@@ -5937,24 +6487,25 @@ static const OnigCodePoint CR_Cn[] = {
0x1f23b, 0x1f23f,
0x1f249, 0x1f24f,
0x1f252, 0x1f2ff,
- 0x1f321, 0x1f32f,
- 0x1f336, 0x1f336,
- 0x1f37d, 0x1f37f,
- 0x1f394, 0x1f39f,
- 0x1f3c5, 0x1f3c5,
- 0x1f3cb, 0x1f3df,
- 0x1f3f1, 0x1f3ff,
- 0x1f43f, 0x1f43f,
- 0x1f441, 0x1f441,
- 0x1f4f8, 0x1f4f8,
- 0x1f4fd, 0x1f4ff,
- 0x1f53e, 0x1f53f,
- 0x1f544, 0x1f54f,
- 0x1f568, 0x1f5fa,
- 0x1f641, 0x1f644,
- 0x1f650, 0x1f67f,
- 0x1f6c6, 0x1f6ff,
- 0x1f774, 0x1ffff,
+ 0x1f32d, 0x1f32f,
+ 0x1f37e, 0x1f37f,
+ 0x1f3cf, 0x1f3d3,
+ 0x1f3f8, 0x1f3ff,
+ 0x1f4ff, 0x1f4ff,
+ 0x1f54b, 0x1f54f,
+ 0x1f57a, 0x1f57a,
+ 0x1f5a4, 0x1f5a4,
+ 0x1f643, 0x1f644,
+ 0x1f6d0, 0x1f6df,
+ 0x1f6ed, 0x1f6ef,
+ 0x1f6f4, 0x1f6ff,
+ 0x1f774, 0x1f77f,
+ 0x1f7d5, 0x1f7ff,
+ 0x1f80c, 0x1f80f,
+ 0x1f848, 0x1f84f,
+ 0x1f85a, 0x1f85f,
+ 0x1f888, 0x1f88f,
+ 0x1f8ae, 0x1ffff,
0x2a6d7, 0x2a6ff,
0x2b735, 0x2b73f,
0x2b81e, 0x2f7ff,
@@ -5982,7 +6533,7 @@ static const OnigCodePoint CR_Cs[] = {
/* 'L': Major Category */
static const OnigCodePoint CR_L[] = {
- 486,
+ 537,
0x0041, 0x005a,
0x0061, 0x007a,
0x00aa, 0x00aa,
@@ -5998,13 +6549,14 @@ static const OnigCodePoint CR_L[] = {
0x0370, 0x0374,
0x0376, 0x0377,
0x037a, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03f5,
0x03f7, 0x0481,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0559, 0x0559,
0x0561, 0x0587,
@@ -6030,14 +6582,12 @@ static const OnigCodePoint CR_L[] = {
0x0824, 0x0824,
0x0828, 0x0828,
0x0840, 0x0858,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
+ 0x08a0, 0x08b2,
0x0904, 0x0939,
0x093d, 0x093d,
0x0950, 0x0950,
0x0958, 0x0961,
- 0x0971, 0x0977,
- 0x0979, 0x097f,
+ 0x0971, 0x0980,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -6092,8 +6642,7 @@ static const OnigCodePoint CR_L[] = {
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c3d,
0x0c58, 0x0c59,
0x0c60, 0x0c61,
@@ -6177,6 +6726,7 @@ static const OnigCodePoint CR_L[] = {
0x166f, 0x167f,
0x1681, 0x169a,
0x16a0, 0x16ea,
+ 0x16f1, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1711,
0x1720, 0x1731,
@@ -6190,7 +6740,7 @@ static const OnigCodePoint CR_L[] = {
0x1880, 0x18a8,
0x18aa, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1950, 0x196d,
0x1970, 0x1974,
0x1980, 0x19ab,
@@ -6285,14 +6835,14 @@ static const OnigCodePoint CR_L[] = {
0xa610, 0xa61f,
0xa62a, 0xa62b,
0xa640, 0xa66e,
- 0xa67f, 0xa697,
+ 0xa67f, 0xa69d,
0xa6a0, 0xa6e5,
0xa717, 0xa71f,
0xa722, 0xa788,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa801,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa801,
0xa803, 0xa805,
0xa807, 0xa80a,
0xa80c, 0xa822,
@@ -6305,12 +6855,15 @@ static const OnigCodePoint CR_L[] = {
0xa960, 0xa97c,
0xa984, 0xa9b2,
0xa9cf, 0xa9cf,
+ 0xa9e0, 0xa9e4,
+ 0xa9e6, 0xa9ef,
+ 0xa9fa, 0xa9fe,
0xaa00, 0xaa28,
0xaa40, 0xaa42,
0xaa44, 0xaa4b,
0xaa60, 0xaa76,
0xaa7a, 0xaa7a,
- 0xaa80, 0xaaaf,
+ 0xaa7e, 0xaaaf,
0xaab1, 0xaab1,
0xaab5, 0xaab6,
0xaab9, 0xaabd,
@@ -6324,6 +6877,9 @@ static const OnigCodePoint CR_L[] = {
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabe2,
0xac00, 0xd7a3,
0xd7b0, 0xd7c6,
@@ -6362,19 +6918,27 @@ static const OnigCodePoint CR_L[] = {
0x10080, 0x100fa,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
+ 0x10300, 0x1031f,
0x10330, 0x10340,
0x10342, 0x10349,
+ 0x10350, 0x10375,
0x10380, 0x1039d,
0x103a0, 0x103c3,
0x103c8, 0x103cf,
0x10400, 0x1049d,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
+ 0x10860, 0x10876,
+ 0x10880, 0x1089e,
0x10900, 0x10915,
0x10920, 0x10939,
0x10980, 0x109b7,
@@ -6384,24 +6948,61 @@ static const OnigCodePoint CR_L[] = {
0x10a15, 0x10a17,
0x10a19, 0x10a33,
0x10a60, 0x10a7c,
+ 0x10a80, 0x10a9c,
+ 0x10ac0, 0x10ac7,
+ 0x10ac9, 0x10ae4,
0x10b00, 0x10b35,
0x10b40, 0x10b55,
0x10b60, 0x10b72,
+ 0x10b80, 0x10b91,
0x10c00, 0x10c48,
0x11003, 0x11037,
0x11083, 0x110af,
0x110d0, 0x110e8,
0x11103, 0x11126,
+ 0x11150, 0x11172,
+ 0x11176, 0x11176,
0x11183, 0x111b2,
0x111c1, 0x111c4,
+ 0x111da, 0x111da,
+ 0x11200, 0x11211,
+ 0x11213, 0x1122b,
+ 0x112b0, 0x112de,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133d, 0x1133d,
+ 0x1135d, 0x11361,
+ 0x11480, 0x114af,
+ 0x114c4, 0x114c5,
+ 0x114c7, 0x114c7,
+ 0x11580, 0x115ae,
+ 0x11600, 0x1162f,
+ 0x11644, 0x11644,
0x11680, 0x116aa,
- 0x12000, 0x1236e,
+ 0x118a0, 0x118df,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16ad0, 0x16aed,
+ 0x16b00, 0x16b2f,
+ 0x16b40, 0x16b43,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f50,
0x16f93, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
0x1d400, 0x1d454,
0x1d456, 0x1d49c,
0x1d49e, 0x1d49f,
@@ -6432,6 +7033,7 @@ static const OnigCodePoint CR_L[] = {
0x1d78a, 0x1d7a8,
0x1d7aa, 0x1d7c2,
0x1d7c4, 0x1d7cb,
+ 0x1e800, 0x1e8c4,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -6473,7 +7075,7 @@ static const OnigCodePoint CR_L[] = {
/* 'LC': General Category */
static const OnigCodePoint CR_LC[] = {
- 113,
+ 117,
0x0041, 0x005a,
0x0061, 0x007a,
0x00b5, 0x00b5,
@@ -6486,13 +7088,14 @@ static const OnigCodePoint CR_LC[] = {
0x0370, 0x0373,
0x0376, 0x0377,
0x037b, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03f5,
0x03f7, 0x0481,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0561, 0x0587,
0x10a0, 0x10c5,
@@ -6545,18 +7148,21 @@ static const OnigCodePoint CR_LC[] = {
0x2d27, 0x2d27,
0x2d2d, 0x2d2d,
0xa640, 0xa66d,
- 0xa680, 0xa697,
+ 0xa680, 0xa69b,
0xa722, 0xa76f,
0xa771, 0xa787,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
0xa7fa, 0xa7fa,
+ 0xab30, 0xab5a,
+ 0xab64, 0xab65,
0xfb00, 0xfb06,
0xfb13, 0xfb17,
0xff21, 0xff3a,
0xff41, 0xff5a,
0x10400, 0x1044f,
+ 0x118a0, 0x118df,
0x1d400, 0x1d454,
0x1d456, 0x1d49c,
0x1d49e, 0x1d49f,
@@ -6591,7 +7197,7 @@ static const OnigCodePoint CR_LC[] = {
/* 'Ll': General Category */
static const OnigCodePoint CR_Ll[] = {
- 611,
+ 625,
0x0061, 0x007a,
0x00b5, 0x00b5,
0x00df, 0x00f6,
@@ -6857,6 +7463,10 @@ static const OnigCodePoint CR_Ll[] = {
0x0523, 0x0523,
0x0525, 0x0525,
0x0527, 0x0527,
+ 0x0529, 0x0529,
+ 0x052b, 0x052b,
+ 0x052d, 0x052d,
+ 0x052f, 0x052f,
0x0561, 0x0587,
0x1d00, 0x1d2b,
0x1d6b, 0x1d77,
@@ -7115,6 +7725,8 @@ static const OnigCodePoint CR_Ll[] = {
0xa693, 0xa693,
0xa695, 0xa695,
0xa697, 0xa697,
+ 0xa699, 0xa699,
+ 0xa69b, 0xa69b,
0xa723, 0xa723,
0xa725, 0xa725,
0xa727, 0xa727,
@@ -7164,17 +7776,25 @@ static const OnigCodePoint CR_Ll[] = {
0xa78c, 0xa78c,
0xa78e, 0xa78e,
0xa791, 0xa791,
- 0xa793, 0xa793,
+ 0xa793, 0xa795,
+ 0xa797, 0xa797,
+ 0xa799, 0xa799,
+ 0xa79b, 0xa79b,
+ 0xa79d, 0xa79d,
+ 0xa79f, 0xa79f,
0xa7a1, 0xa7a1,
0xa7a3, 0xa7a3,
0xa7a5, 0xa7a5,
0xa7a7, 0xa7a7,
0xa7a9, 0xa7a9,
0xa7fa, 0xa7fa,
+ 0xab30, 0xab5a,
+ 0xab64, 0xab65,
0xfb00, 0xfb06,
0xfb13, 0xfb17,
0xff41, 0xff5a,
0x10428, 0x1044f,
+ 0x118c0, 0x118df,
0x1d41a, 0x1d433,
0x1d44e, 0x1d454,
0x1d456, 0x1d467,
@@ -7207,7 +7827,7 @@ static const OnigCodePoint CR_Ll[] = {
/* 'Lm': General Category */
static const OnigCodePoint CR_Lm[] = {
- 52,
+ 56,
0x02b0, 0x02c1,
0x02c6, 0x02d1,
0x02e0, 0x02e4,
@@ -7249,22 +7869,26 @@ static const OnigCodePoint CR_Lm[] = {
0xa4f8, 0xa4fd,
0xa60c, 0xa60c,
0xa67f, 0xa67f,
+ 0xa69c, 0xa69d,
0xa717, 0xa71f,
0xa770, 0xa770,
0xa788, 0xa788,
0xa7f8, 0xa7f9,
0xa9cf, 0xa9cf,
+ 0xa9e6, 0xa9e6,
0xaa70, 0xaa70,
0xaadd, 0xaadd,
0xaaf3, 0xaaf4,
+ 0xab5c, 0xab5f,
0xff70, 0xff70,
0xff9e, 0xff9f,
+ 0x16b40, 0x16b43,
0x16f93, 0x16f9f,
}; /* CR_Lm */
/* 'Lo': General Category */
static const OnigCodePoint CR_Lo[] = {
- 371,
+ 417,
0x00aa, 0x00aa,
0x00ba, 0x00ba,
0x01bb, 0x01bb,
@@ -7287,14 +7911,12 @@ static const OnigCodePoint CR_Lo[] = {
0x07ca, 0x07ea,
0x0800, 0x0815,
0x0840, 0x0858,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
+ 0x08a0, 0x08b2,
0x0904, 0x0939,
0x093d, 0x093d,
0x0950, 0x0950,
0x0958, 0x0961,
- 0x0972, 0x0977,
- 0x0979, 0x097f,
+ 0x0972, 0x0980,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -7349,8 +7971,7 @@ static const OnigCodePoint CR_Lo[] = {
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c3d,
0x0c58, 0x0c59,
0x0c60, 0x0c61,
@@ -7430,6 +8051,7 @@ static const OnigCodePoint CR_Lo[] = {
0x166f, 0x167f,
0x1681, 0x169a,
0x16a0, 0x16ea,
+ 0x16f1, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1711,
0x1720, 0x1731,
@@ -7443,7 +8065,7 @@ static const OnigCodePoint CR_Lo[] = {
0x1880, 0x18a8,
0x18aa, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1950, 0x196d,
0x1970, 0x1974,
0x1980, 0x19ab,
@@ -7492,6 +8114,7 @@ static const OnigCodePoint CR_Lo[] = {
0xa62a, 0xa62b,
0xa66e, 0xa66e,
0xa6a0, 0xa6e5,
+ 0xa7f7, 0xa7f7,
0xa7fb, 0xa801,
0xa803, 0xa805,
0xa807, 0xa80a,
@@ -7504,13 +8127,16 @@ static const OnigCodePoint CR_Lo[] = {
0xa930, 0xa946,
0xa960, 0xa97c,
0xa984, 0xa9b2,
+ 0xa9e0, 0xa9e4,
+ 0xa9e7, 0xa9ef,
+ 0xa9fa, 0xa9fe,
0xaa00, 0xaa28,
0xaa40, 0xaa42,
0xaa44, 0xaa4b,
0xaa60, 0xaa6f,
0xaa71, 0xaa76,
0xaa7a, 0xaa7a,
- 0xaa80, 0xaaaf,
+ 0xaa7e, 0xaaaf,
0xaab1, 0xaab1,
0xaab5, 0xaab6,
0xaab9, 0xaabd,
@@ -7560,19 +8186,27 @@ static const OnigCodePoint CR_Lo[] = {
0x10080, 0x100fa,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
+ 0x10300, 0x1031f,
0x10330, 0x10340,
0x10342, 0x10349,
+ 0x10350, 0x10375,
0x10380, 0x1039d,
0x103a0, 0x103c3,
0x103c8, 0x103cf,
0x10450, 0x1049d,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
+ 0x10860, 0x10876,
+ 0x10880, 0x1089e,
0x10900, 0x10915,
0x10920, 0x10939,
0x10980, 0x109b7,
@@ -7582,23 +8216,59 @@ static const OnigCodePoint CR_Lo[] = {
0x10a15, 0x10a17,
0x10a19, 0x10a33,
0x10a60, 0x10a7c,
+ 0x10a80, 0x10a9c,
+ 0x10ac0, 0x10ac7,
+ 0x10ac9, 0x10ae4,
0x10b00, 0x10b35,
0x10b40, 0x10b55,
0x10b60, 0x10b72,
+ 0x10b80, 0x10b91,
0x10c00, 0x10c48,
0x11003, 0x11037,
0x11083, 0x110af,
0x110d0, 0x110e8,
0x11103, 0x11126,
+ 0x11150, 0x11172,
+ 0x11176, 0x11176,
0x11183, 0x111b2,
0x111c1, 0x111c4,
+ 0x111da, 0x111da,
+ 0x11200, 0x11211,
+ 0x11213, 0x1122b,
+ 0x112b0, 0x112de,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133d, 0x1133d,
+ 0x1135d, 0x11361,
+ 0x11480, 0x114af,
+ 0x114c4, 0x114c5,
+ 0x114c7, 0x114c7,
+ 0x11580, 0x115ae,
+ 0x11600, 0x1162f,
+ 0x11644, 0x11644,
0x11680, 0x116aa,
- 0x12000, 0x1236e,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16ad0, 0x16aed,
+ 0x16b00, 0x16b2f,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f50,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1e800, 0x1e8c4,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -7655,7 +8325,7 @@ static const OnigCodePoint CR_Lt[] = {
/* 'Lu': General Category */
static const OnigCodePoint CR_Lu[] = {
- 608,
+ 622,
0x0041, 0x005a,
0x00c0, 0x00d6,
0x00d8, 0x00de,
@@ -7803,6 +8473,7 @@ static const OnigCodePoint CR_Lu[] = {
0x0370, 0x0370,
0x0372, 0x0372,
0x0376, 0x0376,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
@@ -7922,6 +8593,10 @@ static const OnigCodePoint CR_Lu[] = {
0x0522, 0x0522,
0x0524, 0x0524,
0x0526, 0x0526,
+ 0x0528, 0x0528,
+ 0x052a, 0x052a,
+ 0x052c, 0x052c,
+ 0x052e, 0x052e,
0x0531, 0x0556,
0x10a0, 0x10c5,
0x10c7, 0x10c7,
@@ -8176,6 +8851,8 @@ static const OnigCodePoint CR_Lu[] = {
0xa692, 0xa692,
0xa694, 0xa694,
0xa696, 0xa696,
+ 0xa698, 0xa698,
+ 0xa69a, 0xa69a,
0xa722, 0xa722,
0xa724, 0xa724,
0xa726, 0xa726,
@@ -8225,14 +8902,21 @@ static const OnigCodePoint CR_Lu[] = {
0xa78d, 0xa78d,
0xa790, 0xa790,
0xa792, 0xa792,
+ 0xa796, 0xa796,
+ 0xa798, 0xa798,
+ 0xa79a, 0xa79a,
+ 0xa79c, 0xa79c,
+ 0xa79e, 0xa79e,
0xa7a0, 0xa7a0,
0xa7a2, 0xa7a2,
0xa7a4, 0xa7a4,
0xa7a6, 0xa7a6,
0xa7a8, 0xa7a8,
- 0xa7aa, 0xa7aa,
+ 0xa7aa, 0xa7ad,
+ 0xa7b0, 0xa7b1,
0xff21, 0xff3a,
0x10400, 0x10427,
+ 0x118a0, 0x118bf,
0x1d400, 0x1d419,
0x1d434, 0x1d44d,
0x1d468, 0x1d481,
@@ -8268,7 +8952,7 @@ static const OnigCodePoint CR_Lu[] = {
/* 'M': Major Category */
static const OnigCodePoint CR_M[] = {
- 204,
+ 229,
0x0300, 0x036f,
0x0483, 0x0489,
0x0591, 0x05bd,
@@ -8292,8 +8976,7 @@ static const OnigCodePoint CR_M[] = {
0x0825, 0x0827,
0x0829, 0x082d,
0x0859, 0x085b,
- 0x08e4, 0x08fe,
- 0x0900, 0x0903,
+ 0x08e4, 0x0903,
0x093a, 0x093c,
0x093e, 0x094f,
0x0951, 0x0957,
@@ -8331,20 +9014,20 @@ static const OnigCodePoint CR_M[] = {
0x0bc6, 0x0bc8,
0x0bca, 0x0bcd,
0x0bd7, 0x0bd7,
- 0x0c01, 0x0c03,
+ 0x0c00, 0x0c03,
0x0c3e, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
0x0c55, 0x0c56,
0x0c62, 0x0c63,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0cbc, 0x0cbc,
0x0cbe, 0x0cc4,
0x0cc6, 0x0cc8,
0x0cca, 0x0ccd,
0x0cd5, 0x0cd6,
0x0ce2, 0x0ce3,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d3e, 0x0d44,
0x0d46, 0x0d48,
0x0d4a, 0x0d4d,
@@ -8399,6 +9082,7 @@ static const OnigCodePoint CR_M[] = {
0x1a55, 0x1a5e,
0x1a60, 0x1a7c,
0x1a7f, 0x1a7f,
+ 0x1ab0, 0x1abe,
0x1b00, 0x1b04,
0x1b34, 0x1b44,
0x1b6b, 0x1b73,
@@ -8410,7 +9094,8 @@ static const OnigCodePoint CR_M[] = {
0x1cd4, 0x1ce8,
0x1ced, 0x1ced,
0x1cf2, 0x1cf4,
- 0x1dc0, 0x1de6,
+ 0x1cf8, 0x1cf9,
+ 0x1dc0, 0x1df5,
0x1dfc, 0x1dff,
0x20d0, 0x20f0,
0x2cef, 0x2cf1,
@@ -8433,10 +9118,11 @@ static const OnigCodePoint CR_M[] = {
0xa947, 0xa953,
0xa980, 0xa983,
0xa9b3, 0xa9c0,
+ 0xa9e5, 0xa9e5,
0xaa29, 0xaa36,
0xaa43, 0xaa43,
0xaa4c, 0xaa4d,
- 0xaa7b, 0xaa7b,
+ 0xaa7b, 0xaa7d,
0xaab0, 0xaab0,
0xaab2, 0xaab4,
0xaab7, 0xaab8,
@@ -8448,36 +9134,59 @@ static const OnigCodePoint CR_M[] = {
0xabec, 0xabed,
0xfb1e, 0xfb1e,
0xfe00, 0xfe0f,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0x101fd, 0x101fd,
+ 0x102e0, 0x102e0,
+ 0x10376, 0x1037a,
0x10a01, 0x10a03,
0x10a05, 0x10a06,
0x10a0c, 0x10a0f,
0x10a38, 0x10a3a,
0x10a3f, 0x10a3f,
+ 0x10ae5, 0x10ae6,
0x11000, 0x11002,
0x11038, 0x11046,
- 0x11080, 0x11082,
+ 0x1107f, 0x11082,
0x110b0, 0x110ba,
0x11100, 0x11102,
0x11127, 0x11134,
+ 0x11173, 0x11173,
0x11180, 0x11182,
0x111b3, 0x111c0,
+ 0x1122c, 0x11237,
+ 0x112df, 0x112ea,
+ 0x11301, 0x11303,
+ 0x1133c, 0x1133c,
+ 0x1133e, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x11357, 0x11357,
+ 0x11362, 0x11363,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x114b0, 0x114c3,
+ 0x115af, 0x115b5,
+ 0x115b8, 0x115c0,
+ 0x11630, 0x11640,
0x116ab, 0x116b7,
+ 0x16af0, 0x16af4,
+ 0x16b30, 0x16b36,
0x16f51, 0x16f7e,
0x16f8f, 0x16f92,
+ 0x1bc9d, 0x1bc9e,
0x1d165, 0x1d169,
0x1d16d, 0x1d172,
0x1d17b, 0x1d182,
0x1d185, 0x1d18b,
0x1d1aa, 0x1d1ad,
0x1d242, 0x1d244,
+ 0x1e8d0, 0x1e8d6,
0xe0100, 0xe01ef,
}; /* CR_M */
/* 'Mc': General Category */
static const OnigCodePoint CR_Mc[] = {
- 126,
+ 147,
0x0903, 0x0903,
0x093b, 0x093b,
0x093e, 0x0940,
@@ -8544,7 +9253,7 @@ static const OnigCodePoint CR_Mc[] = {
0x1933, 0x1938,
0x19b0, 0x19c0,
0x19c8, 0x19c9,
- 0x1a19, 0x1a1b,
+ 0x1a19, 0x1a1a,
0x1a55, 0x1a55,
0x1a57, 0x1a57,
0x1a61, 0x1a61,
@@ -8559,7 +9268,6 @@ static const OnigCodePoint CR_Mc[] = {
0x1ba1, 0x1ba1,
0x1ba6, 0x1ba7,
0x1baa, 0x1baa,
- 0x1bac, 0x1bad,
0x1be7, 0x1be7,
0x1bea, 0x1bec,
0x1bee, 0x1bee,
@@ -8582,6 +9290,7 @@ static const OnigCodePoint CR_Mc[] = {
0xaa33, 0xaa34,
0xaa4d, 0xaa4d,
0xaa7b, 0xaa7b,
+ 0xaa7d, 0xaa7d,
0xaaeb, 0xaaeb,
0xaaee, 0xaaef,
0xaaf5, 0xaaf5,
@@ -8598,6 +9307,27 @@ static const OnigCodePoint CR_Mc[] = {
0x11182, 0x11182,
0x111b3, 0x111b5,
0x111bf, 0x111c0,
+ 0x1122c, 0x1122e,
+ 0x11232, 0x11233,
+ 0x11235, 0x11235,
+ 0x112e0, 0x112e2,
+ 0x11302, 0x11303,
+ 0x1133e, 0x1133f,
+ 0x11341, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x11357, 0x11357,
+ 0x11362, 0x11363,
+ 0x114b0, 0x114b2,
+ 0x114b9, 0x114b9,
+ 0x114bb, 0x114be,
+ 0x114c1, 0x114c1,
+ 0x115af, 0x115b1,
+ 0x115b8, 0x115bb,
+ 0x115be, 0x115be,
+ 0x11630, 0x11632,
+ 0x1163b, 0x1163c,
+ 0x1163e, 0x1163e,
0x116ac, 0x116ac,
0x116ae, 0x116af,
0x116b6, 0x116b6,
@@ -8608,8 +9338,9 @@ static const OnigCodePoint CR_Mc[] = {
/* 'Me': General Category */
static const OnigCodePoint CR_Me[] = {
- 4,
+ 5,
0x0488, 0x0489,
+ 0x1abe, 0x1abe,
0x20dd, 0x20e0,
0x20e2, 0x20e4,
0xa670, 0xa672,
@@ -8617,7 +9348,7 @@ static const OnigCodePoint CR_Me[] = {
/* 'Mn': General Category */
static const OnigCodePoint CR_Mn[] = {
- 220,
+ 255,
0x0300, 0x036f,
0x0483, 0x0487,
0x0591, 0x05bd,
@@ -8641,8 +9372,7 @@ static const OnigCodePoint CR_Mn[] = {
0x0825, 0x0827,
0x0829, 0x082d,
0x0859, 0x085b,
- 0x08e4, 0x08fe,
- 0x0900, 0x0902,
+ 0x08e4, 0x0902,
0x093a, 0x093a,
0x093c, 0x093c,
0x0941, 0x0948,
@@ -8678,16 +9408,19 @@ static const OnigCodePoint CR_Mn[] = {
0x0b82, 0x0b82,
0x0bc0, 0x0bc0,
0x0bcd, 0x0bcd,
+ 0x0c00, 0x0c00,
0x0c3e, 0x0c40,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
0x0c55, 0x0c56,
0x0c62, 0x0c63,
+ 0x0c81, 0x0c81,
0x0cbc, 0x0cbc,
0x0cbf, 0x0cbf,
0x0cc6, 0x0cc6,
0x0ccc, 0x0ccd,
0x0ce2, 0x0ce3,
+ 0x0d01, 0x0d01,
0x0d41, 0x0d44,
0x0d4d, 0x0d4d,
0x0d62, 0x0d63,
@@ -8739,6 +9472,7 @@ static const OnigCodePoint CR_Mn[] = {
0x1932, 0x1932,
0x1939, 0x193b,
0x1a17, 0x1a18,
+ 0x1a1b, 0x1a1b,
0x1a56, 0x1a56,
0x1a58, 0x1a5e,
0x1a60, 0x1a60,
@@ -8746,6 +9480,7 @@ static const OnigCodePoint CR_Mn[] = {
0x1a65, 0x1a6c,
0x1a73, 0x1a7c,
0x1a7f, 0x1a7f,
+ 0x1ab0, 0x1abd,
0x1b00, 0x1b03,
0x1b34, 0x1b34,
0x1b36, 0x1b3a,
@@ -8755,7 +9490,7 @@ static const OnigCodePoint CR_Mn[] = {
0x1b80, 0x1b81,
0x1ba2, 0x1ba5,
0x1ba8, 0x1ba9,
- 0x1bab, 0x1bab,
+ 0x1bab, 0x1bad,
0x1be6, 0x1be6,
0x1be8, 0x1be9,
0x1bed, 0x1bed,
@@ -8767,7 +9502,8 @@ static const OnigCodePoint CR_Mn[] = {
0x1ce2, 0x1ce8,
0x1ced, 0x1ced,
0x1cf4, 0x1cf4,
- 0x1dc0, 0x1de6,
+ 0x1cf8, 0x1cf9,
+ 0x1dc0, 0x1df5,
0x1dfc, 0x1dff,
0x20d0, 0x20dc,
0x20e1, 0x20e1,
@@ -8793,11 +9529,13 @@ static const OnigCodePoint CR_Mn[] = {
0xa9b3, 0xa9b3,
0xa9b6, 0xa9b9,
0xa9bc, 0xa9bc,
+ 0xa9e5, 0xa9e5,
0xaa29, 0xaa2e,
0xaa31, 0xaa32,
0xaa35, 0xaa36,
0xaa43, 0xaa43,
0xaa4c, 0xaa4c,
+ 0xaa7c, 0xaa7c,
0xaab0, 0xaab0,
0xaab2, 0xaab4,
0xaab7, 0xaab8,
@@ -8810,39 +9548,67 @@ static const OnigCodePoint CR_Mn[] = {
0xabed, 0xabed,
0xfb1e, 0xfb1e,
0xfe00, 0xfe0f,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0x101fd, 0x101fd,
+ 0x102e0, 0x102e0,
+ 0x10376, 0x1037a,
0x10a01, 0x10a03,
0x10a05, 0x10a06,
0x10a0c, 0x10a0f,
0x10a38, 0x10a3a,
0x10a3f, 0x10a3f,
+ 0x10ae5, 0x10ae6,
0x11001, 0x11001,
0x11038, 0x11046,
- 0x11080, 0x11081,
+ 0x1107f, 0x11081,
0x110b3, 0x110b6,
0x110b9, 0x110ba,
0x11100, 0x11102,
0x11127, 0x1112b,
0x1112d, 0x11134,
+ 0x11173, 0x11173,
0x11180, 0x11181,
0x111b6, 0x111be,
+ 0x1122f, 0x11231,
+ 0x11234, 0x11234,
+ 0x11236, 0x11237,
+ 0x112df, 0x112df,
+ 0x112e3, 0x112ea,
+ 0x11301, 0x11301,
+ 0x1133c, 0x1133c,
+ 0x11340, 0x11340,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x114b3, 0x114b8,
+ 0x114ba, 0x114ba,
+ 0x114bf, 0x114c0,
+ 0x114c2, 0x114c3,
+ 0x115b2, 0x115b5,
+ 0x115bc, 0x115bd,
+ 0x115bf, 0x115c0,
+ 0x11633, 0x1163a,
+ 0x1163d, 0x1163d,
+ 0x1163f, 0x11640,
0x116ab, 0x116ab,
0x116ad, 0x116ad,
0x116b0, 0x116b5,
0x116b7, 0x116b7,
+ 0x16af0, 0x16af4,
+ 0x16b30, 0x16b36,
0x16f8f, 0x16f92,
+ 0x1bc9d, 0x1bc9e,
0x1d167, 0x1d169,
0x1d17b, 0x1d182,
0x1d185, 0x1d18b,
0x1d1aa, 0x1d1ad,
0x1d242, 0x1d244,
+ 0x1e8d0, 0x1e8d6,
0xe0100, 0xe01ef,
}; /* CR_Mn */
/* 'N': Major Category */
static const OnigCodePoint CR_N[] = {
- 88,
+ 105,
0x0030, 0x0039,
0x00b2, 0x00b3,
0x00b9, 0x00b9,
@@ -8862,6 +9628,7 @@ static const OnigCodePoint CR_N[] = {
0x0c78, 0x0c7e,
0x0ce6, 0x0cef,
0x0d66, 0x0d75,
+ 0x0de6, 0x0def,
0x0e50, 0x0e59,
0x0ed0, 0x0ed9,
0x0f20, 0x0f33,
@@ -8904,33 +9671,49 @@ static const OnigCodePoint CR_N[] = {
0xa8d0, 0xa8d9,
0xa900, 0xa909,
0xa9d0, 0xa9d9,
+ 0xa9f0, 0xa9f9,
0xaa50, 0xaa59,
0xabf0, 0xabf9,
0xff10, 0xff19,
0x10107, 0x10133,
0x10140, 0x10178,
- 0x1018a, 0x1018a,
+ 0x1018a, 0x1018b,
+ 0x102e1, 0x102fb,
0x10320, 0x10323,
0x10341, 0x10341,
0x1034a, 0x1034a,
0x103d1, 0x103d5,
0x104a0, 0x104a9,
0x10858, 0x1085f,
+ 0x10879, 0x1087f,
+ 0x108a7, 0x108af,
0x10916, 0x1091b,
0x10a40, 0x10a47,
0x10a7d, 0x10a7e,
+ 0x10a9d, 0x10a9f,
+ 0x10aeb, 0x10aef,
0x10b58, 0x10b5f,
0x10b78, 0x10b7f,
+ 0x10ba9, 0x10baf,
0x10e60, 0x10e7e,
0x11052, 0x1106f,
0x110f0, 0x110f9,
0x11136, 0x1113f,
0x111d0, 0x111d9,
+ 0x111e1, 0x111f4,
+ 0x112f0, 0x112f9,
+ 0x114d0, 0x114d9,
+ 0x11650, 0x11659,
0x116c0, 0x116c9,
- 0x12400, 0x12462,
+ 0x118e0, 0x118f2,
+ 0x12400, 0x1246e,
+ 0x16a60, 0x16a69,
+ 0x16b50, 0x16b59,
+ 0x16b5b, 0x16b61,
0x1d360, 0x1d371,
0x1d7ce, 0x1d7ff,
- 0x1f100, 0x1f10a,
+ 0x1e8c7, 0x1e8cf,
+ 0x1f100, 0x1f10c,
}; /* CR_N */
/* 'Nd': General Category */
@@ -8950,12 +9733,12 @@ static const OnigCodePoint CR_Nl[] = {
0x10341, 0x10341,
0x1034a, 0x1034a,
0x103d1, 0x103d5,
- 0x12400, 0x12462,
+ 0x12400, 0x1246e,
}; /* CR_Nl */
/* 'No': General Category */
static const OnigCodePoint CR_No[] = {
- 42,
+ 52,
0x00b2, 0x00b3,
0x00b9, 0x00b9,
0x00bc, 0x00be,
@@ -8986,18 +9769,28 @@ static const OnigCodePoint CR_No[] = {
0xa830, 0xa835,
0x10107, 0x10133,
0x10175, 0x10178,
- 0x1018a, 0x1018a,
+ 0x1018a, 0x1018b,
+ 0x102e1, 0x102fb,
0x10320, 0x10323,
0x10858, 0x1085f,
+ 0x10879, 0x1087f,
+ 0x108a7, 0x108af,
0x10916, 0x1091b,
0x10a40, 0x10a47,
0x10a7d, 0x10a7e,
+ 0x10a9d, 0x10a9f,
+ 0x10aeb, 0x10aef,
0x10b58, 0x10b5f,
0x10b78, 0x10b7f,
+ 0x10ba9, 0x10baf,
0x10e60, 0x10e7e,
0x11052, 0x11065,
+ 0x111e1, 0x111f4,
+ 0x118ea, 0x118f2,
+ 0x16b5b, 0x16b61,
0x1d360, 0x1d371,
- 0x1f100, 0x1f10a,
+ 0x1e8c7, 0x1e8cf,
+ 0x1f100, 0x1f10c,
}; /* CR_No */
/* 'P': Major Category */
@@ -9016,7 +9809,7 @@ static const OnigCodePoint CR_Pc[] = {
/* 'Pd': General Category */
static const OnigCodePoint CR_Pd[] = {
- 16,
+ 17,
0x002d, 0x002d,
0x058a, 0x058a,
0x05be, 0x05be,
@@ -9026,6 +9819,7 @@ static const OnigCodePoint CR_Pd[] = {
0x2e17, 0x2e17,
0x2e1a, 0x2e1a,
0x2e3a, 0x2e3b,
+ 0x2e40, 0x2e40,
0x301c, 0x301c,
0x3030, 0x3030,
0x30a0, 0x30a0,
@@ -9037,7 +9831,7 @@ static const OnigCodePoint CR_Pd[] = {
/* 'Pe': General Category */
static const OnigCodePoint CR_Pe[] = {
- 70,
+ 72,
0x0029, 0x0029,
0x005d, 0x005d,
0x007d, 0x007d,
@@ -9047,6 +9841,8 @@ static const OnigCodePoint CR_Pe[] = {
0x2046, 0x2046,
0x207e, 0x207e,
0x208e, 0x208e,
+ 0x2309, 0x2309,
+ 0x230b, 0x230b,
0x232a, 0x232a,
0x2769, 0x2769,
0x276b, 0x276b,
@@ -9089,7 +9885,7 @@ static const OnigCodePoint CR_Pe[] = {
0x3019, 0x3019,
0x301b, 0x301b,
0x301e, 0x301f,
- 0xfd3f, 0xfd3f,
+ 0xfd3e, 0xfd3e,
0xfe18, 0xfe18,
0xfe36, 0xfe36,
0xfe38, 0xfe38,
@@ -9143,7 +9939,7 @@ static const OnigCodePoint CR_Pi[] = {
/* 'Po': General Category */
static const OnigCodePoint CR_Po[] = {
- 135,
+ 151,
0x0021, 0x0023,
0x0025, 0x0027,
0x002a, 0x002a,
@@ -9225,6 +10021,8 @@ static const OnigCodePoint CR_Po[] = {
0x2e1e, 0x2e1f,
0x2e2a, 0x2e2e,
0x2e30, 0x2e39,
+ 0x2e3c, 0x2e3f,
+ 0x2e41, 0x2e41,
0x3001, 0x3003,
0x303d, 0x303d,
0x30fb, 0x30fb,
@@ -9267,23 +10065,37 @@ static const OnigCodePoint CR_Po[] = {
0x10100, 0x10102,
0x1039f, 0x1039f,
0x103d0, 0x103d0,
+ 0x1056f, 0x1056f,
0x10857, 0x10857,
0x1091f, 0x1091f,
0x1093f, 0x1093f,
0x10a50, 0x10a58,
0x10a7f, 0x10a7f,
+ 0x10af0, 0x10af6,
0x10b39, 0x10b3f,
+ 0x10b99, 0x10b9c,
0x11047, 0x1104d,
0x110bb, 0x110bc,
0x110be, 0x110c1,
0x11140, 0x11143,
+ 0x11174, 0x11175,
0x111c5, 0x111c8,
- 0x12470, 0x12473,
+ 0x111cd, 0x111cd,
+ 0x11238, 0x1123d,
+ 0x114c6, 0x114c6,
+ 0x115c1, 0x115c9,
+ 0x11641, 0x11643,
+ 0x12470, 0x12474,
+ 0x16a6e, 0x16a6f,
+ 0x16af5, 0x16af5,
+ 0x16b37, 0x16b3b,
+ 0x16b44, 0x16b44,
+ 0x1bc9f, 0x1bc9f,
}; /* CR_Po */
/* 'Ps': General Category */
static const OnigCodePoint CR_Ps[] = {
- 72,
+ 75,
0x0028, 0x0028,
0x005b, 0x005b,
0x007b, 0x007b,
@@ -9295,6 +10107,8 @@ static const OnigCodePoint CR_Ps[] = {
0x2045, 0x2045,
0x207d, 0x207d,
0x208d, 0x208d,
+ 0x2308, 0x2308,
+ 0x230a, 0x230a,
0x2329, 0x2329,
0x2768, 0x2768,
0x276a, 0x276a,
@@ -9327,6 +10141,7 @@ static const OnigCodePoint CR_Ps[] = {
0x2e24, 0x2e24,
0x2e26, 0x2e26,
0x2e28, 0x2e28,
+ 0x2e42, 0x2e42,
0x3008, 0x3008,
0x300a, 0x300a,
0x300c, 0x300c,
@@ -9337,7 +10152,7 @@ static const OnigCodePoint CR_Ps[] = {
0x3018, 0x3018,
0x301a, 0x301a,
0x301d, 0x301d,
- 0xfd3e, 0xfd3e,
+ 0xfd3f, 0xfd3f,
0xfe17, 0xfe17,
0xfe35, 0xfe35,
0xfe37, 0xfe37,
@@ -9360,7 +10175,7 @@ static const OnigCodePoint CR_Ps[] = {
/* 'S': Major Category */
static const OnigCodePoint CR_S[] = {
- 198,
+ 210,
0x0024, 0x0024,
0x002b, 0x002b,
0x003c, 0x003e,
@@ -9385,7 +10200,7 @@ static const OnigCodePoint CR_S[] = {
0x0384, 0x0385,
0x03f6, 0x03f6,
0x0482, 0x0482,
- 0x058f, 0x058f,
+ 0x058d, 0x058f,
0x0606, 0x0608,
0x060b, 0x060b,
0x060e, 0x060f,
@@ -9429,7 +10244,7 @@ static const OnigCodePoint CR_S[] = {
0x2052, 0x2052,
0x207a, 0x207c,
0x208a, 0x208c,
- 0x20a0, 0x20b9,
+ 0x20a0, 0x20bd,
0x2100, 0x2101,
0x2103, 0x2106,
0x2108, 0x2109,
@@ -9444,20 +10259,23 @@ static const OnigCodePoint CR_S[] = {
0x2140, 0x2144,
0x214a, 0x214d,
0x214f, 0x214f,
- 0x2190, 0x2328,
- 0x232b, 0x23f3,
+ 0x2190, 0x2307,
+ 0x230c, 0x2328,
+ 0x232b, 0x23fa,
0x2400, 0x2426,
0x2440, 0x244a,
0x249c, 0x24e9,
- 0x2500, 0x26ff,
- 0x2701, 0x2767,
+ 0x2500, 0x2767,
0x2794, 0x27c4,
0x27c7, 0x27e5,
0x27f0, 0x2982,
0x2999, 0x29d7,
0x29dc, 0x29fb,
- 0x29fe, 0x2b4c,
- 0x2b50, 0x2b59,
+ 0x29fe, 0x2b73,
+ 0x2b76, 0x2b95,
+ 0x2b98, 0x2bb9,
+ 0x2bbd, 0x2bc8,
+ 0x2bca, 0x2bd1,
0x2ce5, 0x2cea,
0x2e80, 0x2e99,
0x2e9b, 0x2ef3,
@@ -9487,6 +10305,7 @@ static const OnigCodePoint CR_S[] = {
0xa828, 0xa82b,
0xa836, 0xa839,
0xaa77, 0xaa79,
+ 0xab5b, 0xab5b,
0xfb29, 0xfb29,
0xfbb2, 0xfbc1,
0xfdfc, 0xfdfd,
@@ -9505,8 +10324,15 @@ static const OnigCodePoint CR_S[] = {
0xfffc, 0xfffd,
0x10137, 0x1013f,
0x10179, 0x10189,
+ 0x1018c, 0x1018c,
0x10190, 0x1019b,
+ 0x101a0, 0x101a0,
0x101d0, 0x101fc,
+ 0x10877, 0x10878,
+ 0x10ac8, 0x10ac8,
+ 0x16b3c, 0x16b3f,
+ 0x16b45, 0x16b45,
+ 0x1bc9c, 0x1bc9c,
0x1d000, 0x1d0f5,
0x1d100, 0x1d126,
0x1d129, 0x1d164,
@@ -9531,9 +10357,9 @@ static const OnigCodePoint CR_S[] = {
0x1f000, 0x1f02b,
0x1f030, 0x1f093,
0x1f0a0, 0x1f0ae,
- 0x1f0b1, 0x1f0be,
+ 0x1f0b1, 0x1f0bf,
0x1f0c1, 0x1f0cf,
- 0x1f0d1, 0x1f0df,
+ 0x1f0d1, 0x1f0f5,
0x1f110, 0x1f12e,
0x1f130, 0x1f16b,
0x1f170, 0x1f19a,
@@ -9541,24 +10367,25 @@ static const OnigCodePoint CR_S[] = {
0x1f210, 0x1f23a,
0x1f240, 0x1f248,
0x1f250, 0x1f251,
- 0x1f300, 0x1f320,
- 0x1f330, 0x1f335,
- 0x1f337, 0x1f37c,
- 0x1f380, 0x1f393,
- 0x1f3a0, 0x1f3c4,
- 0x1f3c6, 0x1f3ca,
- 0x1f3e0, 0x1f3f0,
- 0x1f400, 0x1f43e,
- 0x1f440, 0x1f440,
- 0x1f442, 0x1f4f7,
- 0x1f4f9, 0x1f4fc,
- 0x1f500, 0x1f53d,
- 0x1f540, 0x1f543,
- 0x1f550, 0x1f567,
- 0x1f5fb, 0x1f640,
- 0x1f645, 0x1f64f,
- 0x1f680, 0x1f6c5,
+ 0x1f300, 0x1f32c,
+ 0x1f330, 0x1f37d,
+ 0x1f380, 0x1f3ce,
+ 0x1f3d4, 0x1f3f7,
+ 0x1f400, 0x1f4fe,
+ 0x1f500, 0x1f54a,
+ 0x1f550, 0x1f579,
+ 0x1f57b, 0x1f5a3,
+ 0x1f5a5, 0x1f642,
+ 0x1f645, 0x1f6cf,
+ 0x1f6e0, 0x1f6ec,
+ 0x1f6f0, 0x1f6f3,
0x1f700, 0x1f773,
+ 0x1f780, 0x1f7d4,
+ 0x1f800, 0x1f80b,
+ 0x1f810, 0x1f847,
+ 0x1f850, 0x1f859,
+ 0x1f860, 0x1f887,
+ 0x1f890, 0x1f8ad,
}; /* CR_S */
/* 'Sc': General Category */
@@ -9574,7 +10401,7 @@ static const OnigCodePoint CR_Sc[] = {
0x0bf9, 0x0bf9,
0x0e3f, 0x0e3f,
0x17db, 0x17db,
- 0x20a0, 0x20b9,
+ 0x20a0, 0x20bd,
0xa838, 0xa838,
0xfdfc, 0xfdfc,
0xfe69, 0xfe69,
@@ -9585,7 +10412,7 @@ static const OnigCodePoint CR_Sc[] = {
/* 'Sk': General Category */
static const OnigCodePoint CR_Sk[] = {
- 27,
+ 28,
0x005e, 0x005e,
0x0060, 0x0060,
0x00a8, 0x00a8,
@@ -9609,6 +10436,7 @@ static const OnigCodePoint CR_Sk[] = {
0xa700, 0xa716,
0xa720, 0xa721,
0xa789, 0xa78a,
+ 0xab5b, 0xab5b,
0xfbb2, 0xfbc1,
0xff3e, 0xff3e,
0xff40, 0xff40,
@@ -9617,7 +10445,7 @@ static const OnigCodePoint CR_Sk[] = {
/* 'Sm': General Category */
static const OnigCodePoint CR_Sm[] = {
- 65,
+ 64,
0x002b, 0x002b,
0x003c, 0x003e,
0x007c, 0x007c,
@@ -9645,7 +10473,6 @@ static const OnigCodePoint CR_Sm[] = {
0x21d2, 0x21d2,
0x21d4, 0x21d4,
0x21f4, 0x22ff,
- 0x2308, 0x230b,
0x2320, 0x2321,
0x237c, 0x237c,
0x239b, 0x23b3,
@@ -9687,12 +10514,13 @@ static const OnigCodePoint CR_Sm[] = {
/* 'So': General Category */
static const OnigCodePoint CR_So[] = {
- 153,
+ 165,
0x00a6, 0x00a6,
0x00a9, 0x00a9,
0x00ae, 0x00ae,
0x00b0, 0x00b0,
0x0482, 0x0482,
+ 0x058d, 0x058e,
0x060e, 0x060f,
0x06de, 0x06de,
0x06e9, 0x06e9,
@@ -9750,7 +10578,7 @@ static const OnigCodePoint CR_So[] = {
0x232b, 0x237b,
0x237d, 0x239a,
0x23b4, 0x23db,
- 0x23e2, 0x23f3,
+ 0x23e2, 0x23fa,
0x2400, 0x2426,
0x2440, 0x244a,
0x249c, 0x24e9,
@@ -9758,13 +10586,16 @@ static const OnigCodePoint CR_So[] = {
0x25b8, 0x25c0,
0x25c2, 0x25f7,
0x2600, 0x266e,
- 0x2670, 0x26ff,
- 0x2701, 0x2767,
+ 0x2670, 0x2767,
0x2794, 0x27bf,
0x2800, 0x28ff,
0x2b00, 0x2b2f,
0x2b45, 0x2b46,
- 0x2b50, 0x2b59,
+ 0x2b4d, 0x2b73,
+ 0x2b76, 0x2b95,
+ 0x2b98, 0x2bb9,
+ 0x2bbd, 0x2bc8,
+ 0x2bca, 0x2bd1,
0x2ce5, 0x2cea,
0x2e80, 0x2e99,
0x2e9b, 0x2ef3,
@@ -9798,8 +10629,15 @@ static const OnigCodePoint CR_So[] = {
0xfffc, 0xfffd,
0x10137, 0x1013f,
0x10179, 0x10189,
+ 0x1018c, 0x1018c,
0x10190, 0x1019b,
+ 0x101a0, 0x101a0,
0x101d0, 0x101fc,
+ 0x10877, 0x10878,
+ 0x10ac8, 0x10ac8,
+ 0x16b3c, 0x16b3f,
+ 0x16b45, 0x16b45,
+ 0x1bc9c, 0x1bc9c,
0x1d000, 0x1d0f5,
0x1d100, 0x1d126,
0x1d129, 0x1d164,
@@ -9813,9 +10651,9 @@ static const OnigCodePoint CR_So[] = {
0x1f000, 0x1f02b,
0x1f030, 0x1f093,
0x1f0a0, 0x1f0ae,
- 0x1f0b1, 0x1f0be,
+ 0x1f0b1, 0x1f0bf,
0x1f0c1, 0x1f0cf,
- 0x1f0d1, 0x1f0df,
+ 0x1f0d1, 0x1f0f5,
0x1f110, 0x1f12e,
0x1f130, 0x1f16b,
0x1f170, 0x1f19a,
@@ -9823,33 +10661,33 @@ static const OnigCodePoint CR_So[] = {
0x1f210, 0x1f23a,
0x1f240, 0x1f248,
0x1f250, 0x1f251,
- 0x1f300, 0x1f320,
- 0x1f330, 0x1f335,
- 0x1f337, 0x1f37c,
- 0x1f380, 0x1f393,
- 0x1f3a0, 0x1f3c4,
- 0x1f3c6, 0x1f3ca,
- 0x1f3e0, 0x1f3f0,
- 0x1f400, 0x1f43e,
- 0x1f440, 0x1f440,
- 0x1f442, 0x1f4f7,
- 0x1f4f9, 0x1f4fc,
- 0x1f500, 0x1f53d,
- 0x1f540, 0x1f543,
- 0x1f550, 0x1f567,
- 0x1f5fb, 0x1f640,
- 0x1f645, 0x1f64f,
- 0x1f680, 0x1f6c5,
+ 0x1f300, 0x1f32c,
+ 0x1f330, 0x1f37d,
+ 0x1f380, 0x1f3ce,
+ 0x1f3d4, 0x1f3f7,
+ 0x1f400, 0x1f4fe,
+ 0x1f500, 0x1f54a,
+ 0x1f550, 0x1f579,
+ 0x1f57b, 0x1f5a3,
+ 0x1f5a5, 0x1f642,
+ 0x1f645, 0x1f6cf,
+ 0x1f6e0, 0x1f6ec,
+ 0x1f6f0, 0x1f6f3,
0x1f700, 0x1f773,
+ 0x1f780, 0x1f7d4,
+ 0x1f800, 0x1f80b,
+ 0x1f810, 0x1f847,
+ 0x1f850, 0x1f859,
+ 0x1f860, 0x1f887,
+ 0x1f890, 0x1f8ad,
}; /* CR_So */
/* 'Z': Major Category */
static const OnigCodePoint CR_Z[] = {
- 9,
+ 8,
0x0020, 0x0020,
0x00a0, 0x00a0,
0x1680, 0x1680,
- 0x180e, 0x180e,
0x2000, 0x200a,
0x2028, 0x2029,
0x202f, 0x202f,
@@ -9871,11 +10709,10 @@ static const OnigCodePoint CR_Zp[] = {
/* 'Zs': General Category */
static const OnigCodePoint CR_Zs[] = {
- 8,
+ 7,
0x0020, 0x0020,
0x00a0, 0x00a0,
0x1680, 0x1680,
- 0x180e, 0x180e,
0x2000, 0x200a,
0x202f, 0x202f,
0x205f, 0x205f,
@@ -10036,7 +10873,7 @@ static const OnigCodePoint CR_Math[] = {
/* 'Cased': Derived Property */
static const OnigCodePoint CR_Cased[] = {
- 119,
+ 127,
0x0041, 0x005a,
0x0061, 0x007a,
0x00aa, 0x00aa,
@@ -10054,13 +10891,14 @@ static const OnigCodePoint CR_Cased[] = {
0x0370, 0x0373,
0x0376, 0x0377,
0x037a, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03f5,
0x03f7, 0x0481,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0561, 0x0587,
0x10a0, 0x10c5,
@@ -10115,17 +10953,21 @@ static const OnigCodePoint CR_Cased[] = {
0x2d27, 0x2d27,
0x2d2d, 0x2d2d,
0xa640, 0xa66d,
- 0xa680, 0xa697,
+ 0xa680, 0xa69d,
0xa722, 0xa787,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
0xa7f8, 0xa7fa,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab65,
0xfb00, 0xfb06,
0xfb13, 0xfb17,
0xff21, 0xff3a,
0xff41, 0xff5a,
0x10400, 0x1044f,
+ 0x118a0, 0x118df,
0x1d400, 0x1d454,
0x1d456, 0x1d49c,
0x1d49e, 0x1d49f,
@@ -10156,11 +10998,14 @@ static const OnigCodePoint CR_Cased[] = {
0x1d78a, 0x1d7a8,
0x1d7aa, 0x1d7c2,
0x1d7c4, 0x1d7cb,
+ 0x1f130, 0x1f149,
+ 0x1f150, 0x1f169,
+ 0x1f170, 0x1f189,
}; /* CR_Cased */
/* 'Case_Ignorable': Derived Property */
static const OnigCodePoint CR_Case_Ignorable[] = {
- 295,
+ 335,
0x0027, 0x0027,
0x002e, 0x002e,
0x003a, 0x003a,
@@ -10184,8 +11029,9 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0x05c4, 0x05c5,
0x05c7, 0x05c7,
0x05f4, 0x05f4,
- 0x0600, 0x0604,
+ 0x0600, 0x0605,
0x0610, 0x061a,
+ 0x061c, 0x061c,
0x0640, 0x0640,
0x064b, 0x065f,
0x0670, 0x0670,
@@ -10200,8 +11046,7 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0x07fa, 0x07fa,
0x0816, 0x082d,
0x0859, 0x085b,
- 0x08e4, 0x08fe,
- 0x0900, 0x0902,
+ 0x08e4, 0x0902,
0x093a, 0x093a,
0x093c, 0x093c,
0x0941, 0x0948,
@@ -10238,16 +11083,19 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0x0b82, 0x0b82,
0x0bc0, 0x0bc0,
0x0bcd, 0x0bcd,
+ 0x0c00, 0x0c00,
0x0c3e, 0x0c40,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
0x0c55, 0x0c56,
0x0c62, 0x0c63,
+ 0x0c81, 0x0c81,
0x0cbc, 0x0cbc,
0x0cbf, 0x0cbf,
0x0cc6, 0x0cc6,
0x0ccc, 0x0ccd,
0x0ce2, 0x0ce3,
+ 0x0d01, 0x0d01,
0x0d41, 0x0d44,
0x0d4d, 0x0d4d,
0x0d62, 0x0d63,
@@ -10295,7 +11143,7 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0x17c9, 0x17d3,
0x17d7, 0x17d7,
0x17dd, 0x17dd,
- 0x180b, 0x180d,
+ 0x180b, 0x180e,
0x1843, 0x1843,
0x18a9, 0x18a9,
0x1920, 0x1922,
@@ -10303,6 +11151,7 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0x1932, 0x1932,
0x1939, 0x193b,
0x1a17, 0x1a18,
+ 0x1a1b, 0x1a1b,
0x1a56, 0x1a56,
0x1a58, 0x1a5e,
0x1a60, 0x1a60,
@@ -10311,6 +11160,7 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0x1a73, 0x1a7c,
0x1a7f, 0x1a7f,
0x1aa7, 0x1aa7,
+ 0x1ab0, 0x1abe,
0x1b00, 0x1b03,
0x1b34, 0x1b34,
0x1b36, 0x1b3a,
@@ -10320,7 +11170,7 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0x1b80, 0x1b81,
0x1ba2, 0x1ba5,
0x1ba8, 0x1ba9,
- 0x1bab, 0x1bab,
+ 0x1bab, 0x1bad,
0x1be6, 0x1be6,
0x1be8, 0x1be9,
0x1bed, 0x1bed,
@@ -10333,9 +11183,10 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0x1ce2, 0x1ce8,
0x1ced, 0x1ced,
0x1cf4, 0x1cf4,
+ 0x1cf8, 0x1cf9,
0x1d2c, 0x1d6a,
0x1d78, 0x1d78,
- 0x1d9b, 0x1de6,
+ 0x1d9b, 0x1df5,
0x1dfc, 0x1dff,
0x1fbd, 0x1fbd,
0x1fbf, 0x1fc1,
@@ -10349,7 +11200,7 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0x2027, 0x2027,
0x202a, 0x202e,
0x2060, 0x2064,
- 0x206a, 0x206f,
+ 0x2066, 0x206f,
0x2071, 0x2071,
0x207f, 0x207f,
0x2090, 0x209c,
@@ -10372,6 +11223,7 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0xa66f, 0xa672,
0xa674, 0xa67d,
0xa67f, 0xa67f,
+ 0xa69c, 0xa69d,
0xa69f, 0xa69f,
0xa6f0, 0xa6f1,
0xa700, 0xa721,
@@ -10391,12 +11243,14 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0xa9b6, 0xa9b9,
0xa9bc, 0xa9bc,
0xa9cf, 0xa9cf,
+ 0xa9e5, 0xa9e6,
0xaa29, 0xaa2e,
0xaa31, 0xaa32,
0xaa35, 0xaa36,
0xaa43, 0xaa43,
0xaa4c, 0xaa4c,
0xaa70, 0xaa70,
+ 0xaa7c, 0xaa7c,
0xaab0, 0xaab0,
0xaab2, 0xaab4,
0xaab7, 0xaab8,
@@ -10406,6 +11260,7 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0xaaec, 0xaaed,
0xaaf3, 0xaaf4,
0xaaf6, 0xaaf6,
+ 0xab5b, 0xab5f,
0xabe5, 0xabe5,
0xabe8, 0xabe8,
0xabed, 0xabed,
@@ -10413,7 +11268,7 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0xfbb2, 0xfbc1,
0xfe00, 0xfe0f,
0xfe13, 0xfe13,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0xfe52, 0xfe52,
0xfe55, 0xfe55,
0xfeff, 0xfeff,
@@ -10427,32 +11282,62 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
0xffe3, 0xffe3,
0xfff9, 0xfffb,
0x101fd, 0x101fd,
+ 0x102e0, 0x102e0,
+ 0x10376, 0x1037a,
0x10a01, 0x10a03,
0x10a05, 0x10a06,
0x10a0c, 0x10a0f,
0x10a38, 0x10a3a,
0x10a3f, 0x10a3f,
+ 0x10ae5, 0x10ae6,
0x11001, 0x11001,
0x11038, 0x11046,
- 0x11080, 0x11081,
+ 0x1107f, 0x11081,
0x110b3, 0x110b6,
0x110b9, 0x110ba,
0x110bd, 0x110bd,
0x11100, 0x11102,
0x11127, 0x1112b,
0x1112d, 0x11134,
+ 0x11173, 0x11173,
0x11180, 0x11181,
0x111b6, 0x111be,
+ 0x1122f, 0x11231,
+ 0x11234, 0x11234,
+ 0x11236, 0x11237,
+ 0x112df, 0x112df,
+ 0x112e3, 0x112ea,
+ 0x11301, 0x11301,
+ 0x1133c, 0x1133c,
+ 0x11340, 0x11340,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x114b3, 0x114b8,
+ 0x114ba, 0x114ba,
+ 0x114bf, 0x114c0,
+ 0x114c2, 0x114c3,
+ 0x115b2, 0x115b5,
+ 0x115bc, 0x115bd,
+ 0x115bf, 0x115c0,
+ 0x11633, 0x1163a,
+ 0x1163d, 0x1163d,
+ 0x1163f, 0x11640,
0x116ab, 0x116ab,
0x116ad, 0x116ad,
0x116b0, 0x116b5,
0x116b7, 0x116b7,
+ 0x16af0, 0x16af4,
+ 0x16b30, 0x16b36,
+ 0x16b40, 0x16b43,
0x16f8f, 0x16f9f,
+ 0x1bc9d, 0x1bc9e,
+ 0x1bca0, 0x1bca3,
0x1d167, 0x1d169,
0x1d173, 0x1d182,
0x1d185, 0x1d18b,
0x1d1aa, 0x1d1ad,
0x1d242, 0x1d244,
+ 0x1e8d0, 0x1e8d6,
0xe0001, 0xe0001,
0xe0020, 0xe007f,
0xe0100, 0xe01ef,
@@ -10460,7 +11345,7 @@ static const OnigCodePoint CR_Case_Ignorable[] = {
/* 'Changes_When_Lowercased': Derived Property */
static const OnigCodePoint CR_Changes_When_Lowercased[] = {
- 571,
+ 585,
0x0041, 0x005a,
0x00c0, 0x00d6,
0x00d8, 0x00de,
@@ -10608,6 +11493,7 @@ static const OnigCodePoint CR_Changes_When_Lowercased[] = {
0x0370, 0x0370,
0x0372, 0x0372,
0x0376, 0x0376,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
@@ -10726,6 +11612,10 @@ static const OnigCodePoint CR_Changes_When_Lowercased[] = {
0x0522, 0x0522,
0x0524, 0x0524,
0x0526, 0x0526,
+ 0x0528, 0x0528,
+ 0x052a, 0x052a,
+ 0x052c, 0x052c,
+ 0x052e, 0x052e,
0x0531, 0x0556,
0x10a0, 0x10c5,
0x10c7, 0x10c7,
@@ -10975,6 +11865,8 @@ static const OnigCodePoint CR_Changes_When_Lowercased[] = {
0xa692, 0xa692,
0xa694, 0xa694,
0xa696, 0xa696,
+ 0xa698, 0xa698,
+ 0xa69a, 0xa69a,
0xa722, 0xa722,
0xa724, 0xa724,
0xa726, 0xa726,
@@ -11024,19 +11916,26 @@ static const OnigCodePoint CR_Changes_When_Lowercased[] = {
0xa78d, 0xa78d,
0xa790, 0xa790,
0xa792, 0xa792,
+ 0xa796, 0xa796,
+ 0xa798, 0xa798,
+ 0xa79a, 0xa79a,
+ 0xa79c, 0xa79c,
+ 0xa79e, 0xa79e,
0xa7a0, 0xa7a0,
0xa7a2, 0xa7a2,
0xa7a4, 0xa7a4,
0xa7a6, 0xa7a6,
0xa7a8, 0xa7a8,
- 0xa7aa, 0xa7aa,
+ 0xa7aa, 0xa7ad,
+ 0xa7b0, 0xa7b1,
0xff21, 0xff3a,
0x10400, 0x10427,
+ 0x118a0, 0x118bf,
}; /* CR_Changes_When_Lowercased */
/* 'Changes_When_Uppercased': Derived Property */
static const OnigCodePoint CR_Changes_When_Uppercased[] = {
- 586,
+ 599,
0x0061, 0x007a,
0x00b5, 0x00b5,
0x00df, 0x00f6,
@@ -11183,20 +12082,21 @@ static const OnigCodePoint CR_Changes_When_Uppercased[] = {
0x024f, 0x0254,
0x0256, 0x0257,
0x0259, 0x0259,
- 0x025b, 0x025b,
- 0x0260, 0x0260,
+ 0x025b, 0x025c,
+ 0x0260, 0x0261,
0x0263, 0x0263,
0x0265, 0x0266,
0x0268, 0x0269,
- 0x026b, 0x026b,
+ 0x026b, 0x026c,
0x026f, 0x026f,
0x0271, 0x0272,
0x0275, 0x0275,
0x027d, 0x027d,
0x0280, 0x0280,
0x0283, 0x0283,
- 0x0288, 0x028c,
+ 0x0287, 0x028c,
0x0292, 0x0292,
+ 0x029e, 0x029e,
0x0345, 0x0345,
0x0371, 0x0371,
0x0373, 0x0373,
@@ -11217,7 +12117,7 @@ static const OnigCodePoint CR_Changes_When_Uppercased[] = {
0x03e9, 0x03e9,
0x03eb, 0x03eb,
0x03ed, 0x03ed,
- 0x03ef, 0x03f2,
+ 0x03ef, 0x03f3,
0x03f5, 0x03f5,
0x03f8, 0x03f8,
0x03fb, 0x03fb,
@@ -11317,6 +12217,10 @@ static const OnigCodePoint CR_Changes_When_Uppercased[] = {
0x0523, 0x0523,
0x0525, 0x0525,
0x0527, 0x0527,
+ 0x0529, 0x0529,
+ 0x052b, 0x052b,
+ 0x052d, 0x052d,
+ 0x052f, 0x052f,
0x0561, 0x0587,
0x1d79, 0x1d79,
0x1d7d, 0x1d7d,
@@ -11566,6 +12470,8 @@ static const OnigCodePoint CR_Changes_When_Uppercased[] = {
0xa693, 0xa693,
0xa695, 0xa695,
0xa697, 0xa697,
+ 0xa699, 0xa699,
+ 0xa69b, 0xa69b,
0xa723, 0xa723,
0xa725, 0xa725,
0xa727, 0xa727,
@@ -11614,6 +12520,11 @@ static const OnigCodePoint CR_Changes_When_Uppercased[] = {
0xa78c, 0xa78c,
0xa791, 0xa791,
0xa793, 0xa793,
+ 0xa797, 0xa797,
+ 0xa799, 0xa799,
+ 0xa79b, 0xa79b,
+ 0xa79d, 0xa79d,
+ 0xa79f, 0xa79f,
0xa7a1, 0xa7a1,
0xa7a3, 0xa7a3,
0xa7a5, 0xa7a5,
@@ -11623,11 +12534,12 @@ static const OnigCodePoint CR_Changes_When_Uppercased[] = {
0xfb13, 0xfb17,
0xff41, 0xff5a,
0x10428, 0x1044f,
+ 0x118c0, 0x118df,
}; /* CR_Changes_When_Uppercased */
/* 'Changes_When_Titlecased': Derived Property */
static const OnigCodePoint CR_Changes_When_Titlecased[] = {
- 587,
+ 600,
0x0061, 0x007a,
0x00b5, 0x00b5,
0x00df, 0x00f6,
@@ -11775,20 +12687,21 @@ static const OnigCodePoint CR_Changes_When_Titlecased[] = {
0x024f, 0x0254,
0x0256, 0x0257,
0x0259, 0x0259,
- 0x025b, 0x025b,
- 0x0260, 0x0260,
+ 0x025b, 0x025c,
+ 0x0260, 0x0261,
0x0263, 0x0263,
0x0265, 0x0266,
0x0268, 0x0269,
- 0x026b, 0x026b,
+ 0x026b, 0x026c,
0x026f, 0x026f,
0x0271, 0x0272,
0x0275, 0x0275,
0x027d, 0x027d,
0x0280, 0x0280,
0x0283, 0x0283,
- 0x0288, 0x028c,
+ 0x0287, 0x028c,
0x0292, 0x0292,
+ 0x029e, 0x029e,
0x0345, 0x0345,
0x0371, 0x0371,
0x0373, 0x0373,
@@ -11809,7 +12722,7 @@ static const OnigCodePoint CR_Changes_When_Titlecased[] = {
0x03e9, 0x03e9,
0x03eb, 0x03eb,
0x03ed, 0x03ed,
- 0x03ef, 0x03f2,
+ 0x03ef, 0x03f3,
0x03f5, 0x03f5,
0x03f8, 0x03f8,
0x03fb, 0x03fb,
@@ -11909,6 +12822,10 @@ static const OnigCodePoint CR_Changes_When_Titlecased[] = {
0x0523, 0x0523,
0x0525, 0x0525,
0x0527, 0x0527,
+ 0x0529, 0x0529,
+ 0x052b, 0x052b,
+ 0x052d, 0x052d,
+ 0x052f, 0x052f,
0x0561, 0x0587,
0x1d79, 0x1d79,
0x1d7d, 0x1d7d,
@@ -12158,6 +13075,8 @@ static const OnigCodePoint CR_Changes_When_Titlecased[] = {
0xa693, 0xa693,
0xa695, 0xa695,
0xa697, 0xa697,
+ 0xa699, 0xa699,
+ 0xa69b, 0xa69b,
0xa723, 0xa723,
0xa725, 0xa725,
0xa727, 0xa727,
@@ -12206,6 +13125,11 @@ static const OnigCodePoint CR_Changes_When_Titlecased[] = {
0xa78c, 0xa78c,
0xa791, 0xa791,
0xa793, 0xa793,
+ 0xa797, 0xa797,
+ 0xa799, 0xa799,
+ 0xa79b, 0xa79b,
+ 0xa79d, 0xa79d,
+ 0xa79f, 0xa79f,
0xa7a1, 0xa7a1,
0xa7a3, 0xa7a3,
0xa7a5, 0xa7a5,
@@ -12215,11 +13139,12 @@ static const OnigCodePoint CR_Changes_When_Titlecased[] = {
0xfb13, 0xfb17,
0xff41, 0xff5a,
0x10428, 0x1044f,
+ 0x118c0, 0x118df,
}; /* CR_Changes_When_Titlecased */
/* 'Changes_When_Casefolded': Derived Property */
static const OnigCodePoint CR_Changes_When_Casefolded[] = {
- 582,
+ 596,
0x0041, 0x005a,
0x00b5, 0x00b5,
0x00c0, 0x00d6,
@@ -12370,6 +13295,7 @@ static const OnigCodePoint CR_Changes_When_Casefolded[] = {
0x0370, 0x0370,
0x0372, 0x0372,
0x0376, 0x0376,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
@@ -12491,6 +13417,10 @@ static const OnigCodePoint CR_Changes_When_Casefolded[] = {
0x0522, 0x0522,
0x0524, 0x0524,
0x0526, 0x0526,
+ 0x0528, 0x0528,
+ 0x052a, 0x052a,
+ 0x052c, 0x052c,
+ 0x052e, 0x052e,
0x0531, 0x0556,
0x0587, 0x0587,
0x10a0, 0x10c5,
@@ -12743,6 +13673,8 @@ static const OnigCodePoint CR_Changes_When_Casefolded[] = {
0xa692, 0xa692,
0xa694, 0xa694,
0xa696, 0xa696,
+ 0xa698, 0xa698,
+ 0xa69a, 0xa69a,
0xa722, 0xa722,
0xa724, 0xa724,
0xa726, 0xa726,
@@ -12792,21 +13724,28 @@ static const OnigCodePoint CR_Changes_When_Casefolded[] = {
0xa78d, 0xa78d,
0xa790, 0xa790,
0xa792, 0xa792,
+ 0xa796, 0xa796,
+ 0xa798, 0xa798,
+ 0xa79a, 0xa79a,
+ 0xa79c, 0xa79c,
+ 0xa79e, 0xa79e,
0xa7a0, 0xa7a0,
0xa7a2, 0xa7a2,
0xa7a4, 0xa7a4,
0xa7a6, 0xa7a6,
0xa7a8, 0xa7a8,
- 0xa7aa, 0xa7aa,
+ 0xa7aa, 0xa7ad,
+ 0xa7b0, 0xa7b1,
0xfb00, 0xfb06,
0xfb13, 0xfb17,
0xff21, 0xff3a,
0x10400, 0x10427,
+ 0x118a0, 0x118bf,
}; /* CR_Changes_When_Casefolded */
/* 'Changes_When_Casemapped': Derived Property */
static const OnigCodePoint CR_Changes_When_Casemapped[] = {
- 104,
+ 107,
0x0041, 0x005a,
0x0061, 0x007a,
0x00b5, 0x00b5,
@@ -12824,34 +13763,35 @@ static const OnigCodePoint CR_Changes_When_Casemapped[] = {
0x023a, 0x0254,
0x0256, 0x0257,
0x0259, 0x0259,
- 0x025b, 0x025b,
- 0x0260, 0x0260,
+ 0x025b, 0x025c,
+ 0x0260, 0x0261,
0x0263, 0x0263,
0x0265, 0x0266,
0x0268, 0x0269,
- 0x026b, 0x026b,
+ 0x026b, 0x026c,
0x026f, 0x026f,
0x0271, 0x0272,
0x0275, 0x0275,
0x027d, 0x027d,
0x0280, 0x0280,
0x0283, 0x0283,
- 0x0288, 0x028c,
+ 0x0287, 0x028c,
0x0292, 0x0292,
+ 0x029e, 0x029e,
0x0345, 0x0345,
0x0370, 0x0373,
0x0376, 0x0377,
0x037b, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03d1,
- 0x03d5, 0x03f2,
- 0x03f4, 0x03f5,
+ 0x03d5, 0x03f5,
0x03f7, 0x03fb,
0x03fd, 0x0481,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0561, 0x0587,
0x10a0, 0x10c5,
@@ -12899,23 +13839,25 @@ static const OnigCodePoint CR_Changes_When_Casemapped[] = {
0x2d27, 0x2d27,
0x2d2d, 0x2d2d,
0xa640, 0xa66d,
- 0xa680, 0xa697,
+ 0xa680, 0xa69b,
0xa722, 0xa72f,
0xa732, 0xa76f,
0xa779, 0xa787,
0xa78b, 0xa78d,
0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
+ 0xa796, 0xa7ad,
+ 0xa7b0, 0xa7b1,
0xfb00, 0xfb06,
0xfb13, 0xfb17,
0xff21, 0xff3a,
0xff41, 0xff5a,
0x10400, 0x1044f,
+ 0x118a0, 0x118df,
}; /* CR_Changes_When_Casemapped */
/* 'ID_Start': Derived Property */
static const OnigCodePoint CR_ID_Start[] = {
- 488,
+ 538,
0x0041, 0x005a,
0x0061, 0x007a,
0x00aa, 0x00aa,
@@ -12931,13 +13873,14 @@ static const OnigCodePoint CR_ID_Start[] = {
0x0370, 0x0374,
0x0376, 0x0377,
0x037a, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03f5,
0x03f7, 0x0481,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0559, 0x0559,
0x0561, 0x0587,
@@ -12963,14 +13906,12 @@ static const OnigCodePoint CR_ID_Start[] = {
0x0824, 0x0824,
0x0828, 0x0828,
0x0840, 0x0858,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
+ 0x08a0, 0x08b2,
0x0904, 0x0939,
0x093d, 0x093d,
0x0950, 0x0950,
0x0958, 0x0961,
- 0x0971, 0x0977,
- 0x0979, 0x097f,
+ 0x0971, 0x0980,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -13025,8 +13966,7 @@ static const OnigCodePoint CR_ID_Start[] = {
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c3d,
0x0c58, 0x0c59,
0x0c60, 0x0c61,
@@ -13110,7 +14050,7 @@ static const OnigCodePoint CR_ID_Start[] = {
0x166f, 0x167f,
0x1681, 0x169a,
0x16a0, 0x16ea,
- 0x16ee, 0x16f0,
+ 0x16ee, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1711,
0x1720, 0x1731,
@@ -13124,7 +14064,7 @@ static const OnigCodePoint CR_ID_Start[] = {
0x1880, 0x18a8,
0x18aa, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1950, 0x196d,
0x1970, 0x1974,
0x1980, 0x19ab,
@@ -13218,14 +14158,14 @@ static const OnigCodePoint CR_ID_Start[] = {
0xa610, 0xa61f,
0xa62a, 0xa62b,
0xa640, 0xa66e,
- 0xa67f, 0xa697,
+ 0xa67f, 0xa69d,
0xa6a0, 0xa6ef,
0xa717, 0xa71f,
0xa722, 0xa788,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa801,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa801,
0xa803, 0xa805,
0xa807, 0xa80a,
0xa80c, 0xa822,
@@ -13238,12 +14178,15 @@ static const OnigCodePoint CR_ID_Start[] = {
0xa960, 0xa97c,
0xa984, 0xa9b2,
0xa9cf, 0xa9cf,
+ 0xa9e0, 0xa9e4,
+ 0xa9e6, 0xa9ef,
+ 0xa9fa, 0xa9fe,
0xaa00, 0xaa28,
0xaa40, 0xaa42,
0xaa44, 0xaa4b,
0xaa60, 0xaa76,
0xaa7a, 0xaa7a,
- 0xaa80, 0xaaaf,
+ 0xaa7e, 0xaaaf,
0xaab1, 0xaab1,
0xaab5, 0xaab6,
0xaab9, 0xaabd,
@@ -13257,6 +14200,9 @@ static const OnigCodePoint CR_ID_Start[] = {
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabe2,
0xac00, 0xd7a3,
0xd7b0, 0xd7c6,
@@ -13296,19 +14242,27 @@ static const OnigCodePoint CR_ID_Start[] = {
0x10140, 0x10174,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
+ 0x10300, 0x1031f,
0x10330, 0x1034a,
+ 0x10350, 0x10375,
0x10380, 0x1039d,
0x103a0, 0x103c3,
0x103c8, 0x103cf,
0x103d1, 0x103d5,
0x10400, 0x1049d,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
+ 0x10860, 0x10876,
+ 0x10880, 0x1089e,
0x10900, 0x10915,
0x10920, 0x10939,
0x10980, 0x109b7,
@@ -13318,25 +14272,62 @@ static const OnigCodePoint CR_ID_Start[] = {
0x10a15, 0x10a17,
0x10a19, 0x10a33,
0x10a60, 0x10a7c,
+ 0x10a80, 0x10a9c,
+ 0x10ac0, 0x10ac7,
+ 0x10ac9, 0x10ae4,
0x10b00, 0x10b35,
0x10b40, 0x10b55,
0x10b60, 0x10b72,
+ 0x10b80, 0x10b91,
0x10c00, 0x10c48,
0x11003, 0x11037,
0x11083, 0x110af,
0x110d0, 0x110e8,
0x11103, 0x11126,
+ 0x11150, 0x11172,
+ 0x11176, 0x11176,
0x11183, 0x111b2,
0x111c1, 0x111c4,
+ 0x111da, 0x111da,
+ 0x11200, 0x11211,
+ 0x11213, 0x1122b,
+ 0x112b0, 0x112de,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133d, 0x1133d,
+ 0x1135d, 0x11361,
+ 0x11480, 0x114af,
+ 0x114c4, 0x114c5,
+ 0x114c7, 0x114c7,
+ 0x11580, 0x115ae,
+ 0x11600, 0x1162f,
+ 0x11644, 0x11644,
0x11680, 0x116aa,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
+ 0x118a0, 0x118df,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16ad0, 0x16aed,
+ 0x16b00, 0x16b2f,
+ 0x16b40, 0x16b43,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f50,
0x16f93, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
0x1d400, 0x1d454,
0x1d456, 0x1d49c,
0x1d49e, 0x1d49f,
@@ -13367,6 +14358,7 @@ static const OnigCodePoint CR_ID_Start[] = {
0x1d78a, 0x1d7a8,
0x1d7aa, 0x1d7c2,
0x1d7c4, 0x1d7cb,
+ 0x1e800, 0x1e8c4,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -13408,7 +14400,7 @@ static const OnigCodePoint CR_ID_Start[] = {
/* 'ID_Continue': Derived Property */
static const OnigCodePoint CR_ID_Continue[] = {
- 564,
+ 626,
0x0030, 0x0039,
0x0041, 0x005a,
0x005f, 0x005f,
@@ -13427,13 +14419,14 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x0300, 0x0374,
0x0376, 0x0377,
0x037a, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03f5,
0x03f7, 0x0481,
0x0483, 0x0487,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0559, 0x0559,
0x0561, 0x0587,
@@ -13457,14 +14450,10 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x07fa, 0x07fa,
0x0800, 0x082d,
0x0840, 0x085b,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
- 0x08e4, 0x08fe,
- 0x0900, 0x0963,
+ 0x08a0, 0x08b2,
+ 0x08e4, 0x0963,
0x0966, 0x096f,
- 0x0971, 0x0977,
- 0x0979, 0x097f,
- 0x0981, 0x0983,
+ 0x0971, 0x0983,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -13538,12 +14527,11 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x0bd0, 0x0bd0,
0x0bd7, 0x0bd7,
0x0be6, 0x0bef,
- 0x0c01, 0x0c03,
+ 0x0c00, 0x0c03,
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
@@ -13551,7 +14539,7 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x0c58, 0x0c59,
0x0c60, 0x0c63,
0x0c66, 0x0c6f,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0c85, 0x0c8c,
0x0c8e, 0x0c90,
0x0c92, 0x0ca8,
@@ -13565,7 +14553,7 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x0ce0, 0x0ce3,
0x0ce6, 0x0cef,
0x0cf1, 0x0cf2,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d05, 0x0d0c,
0x0d0e, 0x0d10,
0x0d12, 0x0d3a,
@@ -13586,6 +14574,7 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x0dcf, 0x0dd4,
0x0dd6, 0x0dd6,
0x0dd8, 0x0ddf,
+ 0x0de6, 0x0def,
0x0df2, 0x0df3,
0x0e01, 0x0e3a,
0x0e40, 0x0e4e,
@@ -13650,7 +14639,7 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x166f, 0x167f,
0x1681, 0x169a,
0x16a0, 0x16ea,
- 0x16ee, 0x16f0,
+ 0x16ee, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1714,
0x1720, 0x1734,
@@ -13667,7 +14656,7 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x1820, 0x1877,
0x1880, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1920, 0x192b,
0x1930, 0x193b,
0x1946, 0x196d,
@@ -13681,6 +14670,7 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x1a7f, 0x1a89,
0x1a90, 0x1a99,
0x1aa7, 0x1aa7,
+ 0x1ab0, 0x1abd,
0x1b00, 0x1b4b,
0x1b50, 0x1b59,
0x1b6b, 0x1b73,
@@ -13690,7 +14680,8 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x1c4d, 0x1c7d,
0x1cd0, 0x1cd2,
0x1cd4, 0x1cf6,
- 0x1d00, 0x1de6,
+ 0x1cf8, 0x1cf9,
+ 0x1d00, 0x1df5,
0x1dfc, 0x1f15,
0x1f18, 0x1f1d,
0x1f20, 0x1f45,
@@ -13770,14 +14761,14 @@ static const OnigCodePoint CR_ID_Continue[] = {
0xa610, 0xa62b,
0xa640, 0xa66f,
0xa674, 0xa67d,
- 0xa67f, 0xa697,
+ 0xa67f, 0xa69d,
0xa69f, 0xa6f1,
0xa717, 0xa71f,
0xa722, 0xa788,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa827,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa827,
0xa840, 0xa873,
0xa880, 0xa8c4,
0xa8d0, 0xa8d9,
@@ -13788,12 +14779,12 @@ static const OnigCodePoint CR_ID_Continue[] = {
0xa960, 0xa97c,
0xa980, 0xa9c0,
0xa9cf, 0xa9d9,
+ 0xa9e0, 0xa9fe,
0xaa00, 0xaa36,
0xaa40, 0xaa4d,
0xaa50, 0xaa59,
0xaa60, 0xaa76,
- 0xaa7a, 0xaa7b,
- 0xaa80, 0xaac2,
+ 0xaa7a, 0xaac2,
0xaadb, 0xaadd,
0xaae0, 0xaaef,
0xaaf2, 0xaaf6,
@@ -13802,6 +14793,9 @@ static const OnigCodePoint CR_ID_Continue[] = {
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabea,
0xabec, 0xabed,
0xabf0, 0xabf9,
@@ -13824,7 +14818,7 @@ static const OnigCodePoint CR_ID_Continue[] = {
0xfd92, 0xfdc7,
0xfdf0, 0xfdfb,
0xfe00, 0xfe0f,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0xfe33, 0xfe34,
0xfe4d, 0xfe4f,
0xfe70, 0xfe74,
@@ -13849,20 +14843,29 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x101fd, 0x101fd,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
+ 0x102e0, 0x102e0,
+ 0x10300, 0x1031f,
0x10330, 0x1034a,
+ 0x10350, 0x1037a,
0x10380, 0x1039d,
0x103a0, 0x103c3,
0x103c8, 0x103cf,
0x103d1, 0x103d5,
0x10400, 0x1049d,
0x104a0, 0x104a9,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
+ 0x10860, 0x10876,
+ 0x10880, 0x1089e,
0x10900, 0x10915,
0x10920, 0x10939,
0x10980, 0x109b7,
@@ -13875,29 +14878,78 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x10a38, 0x10a3a,
0x10a3f, 0x10a3f,
0x10a60, 0x10a7c,
+ 0x10a80, 0x10a9c,
+ 0x10ac0, 0x10ac7,
+ 0x10ac9, 0x10ae6,
0x10b00, 0x10b35,
0x10b40, 0x10b55,
0x10b60, 0x10b72,
+ 0x10b80, 0x10b91,
0x10c00, 0x10c48,
0x11000, 0x11046,
0x11066, 0x1106f,
- 0x11080, 0x110ba,
+ 0x1107f, 0x110ba,
0x110d0, 0x110e8,
0x110f0, 0x110f9,
0x11100, 0x11134,
0x11136, 0x1113f,
+ 0x11150, 0x11173,
+ 0x11176, 0x11176,
0x11180, 0x111c4,
- 0x111d0, 0x111d9,
+ 0x111d0, 0x111da,
+ 0x11200, 0x11211,
+ 0x11213, 0x11237,
+ 0x112b0, 0x112ea,
+ 0x112f0, 0x112f9,
+ 0x11301, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133c, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x11357, 0x11357,
+ 0x1135d, 0x11363,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x11480, 0x114c5,
+ 0x114c7, 0x114c7,
+ 0x114d0, 0x114d9,
+ 0x11580, 0x115b5,
+ 0x115b8, 0x115c0,
+ 0x11600, 0x11640,
+ 0x11644, 0x11644,
+ 0x11650, 0x11659,
0x11680, 0x116b7,
0x116c0, 0x116c9,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
+ 0x118a0, 0x118e9,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16a60, 0x16a69,
+ 0x16ad0, 0x16aed,
+ 0x16af0, 0x16af4,
+ 0x16b00, 0x16b36,
+ 0x16b40, 0x16b43,
+ 0x16b50, 0x16b59,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f7e,
0x16f8f, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9d, 0x1bc9e,
0x1d165, 0x1d169,
0x1d16d, 0x1d172,
0x1d17b, 0x1d182,
@@ -13935,6 +14987,8 @@ static const OnigCodePoint CR_ID_Continue[] = {
0x1d7aa, 0x1d7c2,
0x1d7c4, 0x1d7cb,
0x1d7ce, 0x1d7ff,
+ 0x1e800, 0x1e8c4,
+ 0x1e8d0, 0x1e8d6,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -13977,7 +15031,7 @@ static const OnigCodePoint CR_ID_Continue[] = {
/* 'XID_Start': Derived Property */
static const OnigCodePoint CR_XID_Start[] = {
- 495,
+ 545,
0x0041, 0x005a,
0x0061, 0x007a,
0x00aa, 0x00aa,
@@ -13993,13 +15047,14 @@ static const OnigCodePoint CR_XID_Start[] = {
0x0370, 0x0374,
0x0376, 0x0377,
0x037b, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x0386,
0x0388, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03f5,
0x03f7, 0x0481,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0559, 0x0559,
0x0561, 0x0587,
@@ -14025,14 +15080,12 @@ static const OnigCodePoint CR_XID_Start[] = {
0x0824, 0x0824,
0x0828, 0x0828,
0x0840, 0x0858,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
+ 0x08a0, 0x08b2,
0x0904, 0x0939,
0x093d, 0x093d,
0x0950, 0x0950,
0x0958, 0x0961,
- 0x0971, 0x0977,
- 0x0979, 0x097f,
+ 0x0971, 0x0980,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -14087,8 +15140,7 @@ static const OnigCodePoint CR_XID_Start[] = {
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c3d,
0x0c58, 0x0c59,
0x0c60, 0x0c61,
@@ -14172,7 +15224,7 @@ static const OnigCodePoint CR_XID_Start[] = {
0x166f, 0x167f,
0x1681, 0x169a,
0x16a0, 0x16ea,
- 0x16ee, 0x16f0,
+ 0x16ee, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1711,
0x1720, 0x1731,
@@ -14186,7 +15238,7 @@ static const OnigCodePoint CR_XID_Start[] = {
0x1880, 0x18a8,
0x18aa, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1950, 0x196d,
0x1970, 0x1974,
0x1980, 0x19ab,
@@ -14280,14 +15332,14 @@ static const OnigCodePoint CR_XID_Start[] = {
0xa610, 0xa61f,
0xa62a, 0xa62b,
0xa640, 0xa66e,
- 0xa67f, 0xa697,
+ 0xa67f, 0xa69d,
0xa6a0, 0xa6ef,
0xa717, 0xa71f,
0xa722, 0xa788,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa801,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa801,
0xa803, 0xa805,
0xa807, 0xa80a,
0xa80c, 0xa822,
@@ -14300,12 +15352,15 @@ static const OnigCodePoint CR_XID_Start[] = {
0xa960, 0xa97c,
0xa984, 0xa9b2,
0xa9cf, 0xa9cf,
+ 0xa9e0, 0xa9e4,
+ 0xa9e6, 0xa9ef,
+ 0xa9fa, 0xa9fe,
0xaa00, 0xaa28,
0xaa40, 0xaa42,
0xaa44, 0xaa4b,
0xaa60, 0xaa76,
0xaa7a, 0xaa7a,
- 0xaa80, 0xaaaf,
+ 0xaa7e, 0xaaaf,
0xaab1, 0xaab1,
0xaab5, 0xaab6,
0xaab9, 0xaabd,
@@ -14319,6 +15374,9 @@ static const OnigCodePoint CR_XID_Start[] = {
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabe2,
0xac00, 0xd7a3,
0xd7b0, 0xd7c6,
@@ -14365,19 +15423,27 @@ static const OnigCodePoint CR_XID_Start[] = {
0x10140, 0x10174,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
+ 0x10300, 0x1031f,
0x10330, 0x1034a,
+ 0x10350, 0x10375,
0x10380, 0x1039d,
0x103a0, 0x103c3,
0x103c8, 0x103cf,
0x103d1, 0x103d5,
0x10400, 0x1049d,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
+ 0x10860, 0x10876,
+ 0x10880, 0x1089e,
0x10900, 0x10915,
0x10920, 0x10939,
0x10980, 0x109b7,
@@ -14387,25 +15453,62 @@ static const OnigCodePoint CR_XID_Start[] = {
0x10a15, 0x10a17,
0x10a19, 0x10a33,
0x10a60, 0x10a7c,
+ 0x10a80, 0x10a9c,
+ 0x10ac0, 0x10ac7,
+ 0x10ac9, 0x10ae4,
0x10b00, 0x10b35,
0x10b40, 0x10b55,
0x10b60, 0x10b72,
+ 0x10b80, 0x10b91,
0x10c00, 0x10c48,
0x11003, 0x11037,
0x11083, 0x110af,
0x110d0, 0x110e8,
0x11103, 0x11126,
+ 0x11150, 0x11172,
+ 0x11176, 0x11176,
0x11183, 0x111b2,
0x111c1, 0x111c4,
+ 0x111da, 0x111da,
+ 0x11200, 0x11211,
+ 0x11213, 0x1122b,
+ 0x112b0, 0x112de,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133d, 0x1133d,
+ 0x1135d, 0x11361,
+ 0x11480, 0x114af,
+ 0x114c4, 0x114c5,
+ 0x114c7, 0x114c7,
+ 0x11580, 0x115ae,
+ 0x11600, 0x1162f,
+ 0x11644, 0x11644,
0x11680, 0x116aa,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
+ 0x118a0, 0x118df,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16ad0, 0x16aed,
+ 0x16b00, 0x16b2f,
+ 0x16b40, 0x16b43,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f50,
0x16f93, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
0x1d400, 0x1d454,
0x1d456, 0x1d49c,
0x1d49e, 0x1d49f,
@@ -14436,6 +15539,7 @@ static const OnigCodePoint CR_XID_Start[] = {
0x1d78a, 0x1d7a8,
0x1d7aa, 0x1d7c2,
0x1d7c4, 0x1d7cb,
+ 0x1e800, 0x1e8c4,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -14477,7 +15581,7 @@ static const OnigCodePoint CR_XID_Start[] = {
/* 'XID_Continue': Derived Property */
static const OnigCodePoint CR_XID_Continue[] = {
- 571,
+ 633,
0x0030, 0x0039,
0x0041, 0x005a,
0x005f, 0x005f,
@@ -14496,13 +15600,14 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x0300, 0x0374,
0x0376, 0x0377,
0x037b, 0x037d,
+ 0x037f, 0x037f,
0x0386, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x03f5,
0x03f7, 0x0481,
0x0483, 0x0487,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0559, 0x0559,
0x0561, 0x0587,
@@ -14526,14 +15631,10 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x07fa, 0x07fa,
0x0800, 0x082d,
0x0840, 0x085b,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
- 0x08e4, 0x08fe,
- 0x0900, 0x0963,
+ 0x08a0, 0x08b2,
+ 0x08e4, 0x0963,
0x0966, 0x096f,
- 0x0971, 0x0977,
- 0x0979, 0x097f,
- 0x0981, 0x0983,
+ 0x0971, 0x0983,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -14607,12 +15708,11 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x0bd0, 0x0bd0,
0x0bd7, 0x0bd7,
0x0be6, 0x0bef,
- 0x0c01, 0x0c03,
+ 0x0c00, 0x0c03,
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
@@ -14620,7 +15720,7 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x0c58, 0x0c59,
0x0c60, 0x0c63,
0x0c66, 0x0c6f,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0c85, 0x0c8c,
0x0c8e, 0x0c90,
0x0c92, 0x0ca8,
@@ -14634,7 +15734,7 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x0ce0, 0x0ce3,
0x0ce6, 0x0cef,
0x0cf1, 0x0cf2,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d05, 0x0d0c,
0x0d0e, 0x0d10,
0x0d12, 0x0d3a,
@@ -14655,6 +15755,7 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x0dcf, 0x0dd4,
0x0dd6, 0x0dd6,
0x0dd8, 0x0ddf,
+ 0x0de6, 0x0def,
0x0df2, 0x0df3,
0x0e01, 0x0e3a,
0x0e40, 0x0e4e,
@@ -14719,7 +15820,7 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x166f, 0x167f,
0x1681, 0x169a,
0x16a0, 0x16ea,
- 0x16ee, 0x16f0,
+ 0x16ee, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1714,
0x1720, 0x1734,
@@ -14736,7 +15837,7 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x1820, 0x1877,
0x1880, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1920, 0x192b,
0x1930, 0x193b,
0x1946, 0x196d,
@@ -14750,6 +15851,7 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x1a7f, 0x1a89,
0x1a90, 0x1a99,
0x1aa7, 0x1aa7,
+ 0x1ab0, 0x1abd,
0x1b00, 0x1b4b,
0x1b50, 0x1b59,
0x1b6b, 0x1b73,
@@ -14759,7 +15861,8 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x1c4d, 0x1c7d,
0x1cd0, 0x1cd2,
0x1cd4, 0x1cf6,
- 0x1d00, 0x1de6,
+ 0x1cf8, 0x1cf9,
+ 0x1d00, 0x1df5,
0x1dfc, 0x1f15,
0x1f18, 0x1f1d,
0x1f20, 0x1f45,
@@ -14840,14 +15943,14 @@ static const OnigCodePoint CR_XID_Continue[] = {
0xa610, 0xa62b,
0xa640, 0xa66f,
0xa674, 0xa67d,
- 0xa67f, 0xa697,
+ 0xa67f, 0xa69d,
0xa69f, 0xa6f1,
0xa717, 0xa71f,
0xa722, 0xa788,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa827,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa827,
0xa840, 0xa873,
0xa880, 0xa8c4,
0xa8d0, 0xa8d9,
@@ -14858,12 +15961,12 @@ static const OnigCodePoint CR_XID_Continue[] = {
0xa960, 0xa97c,
0xa980, 0xa9c0,
0xa9cf, 0xa9d9,
+ 0xa9e0, 0xa9fe,
0xaa00, 0xaa36,
0xaa40, 0xaa4d,
0xaa50, 0xaa59,
0xaa60, 0xaa76,
- 0xaa7a, 0xaa7b,
- 0xaa80, 0xaac2,
+ 0xaa7a, 0xaac2,
0xaadb, 0xaadd,
0xaae0, 0xaaef,
0xaaf2, 0xaaf6,
@@ -14872,6 +15975,9 @@ static const OnigCodePoint CR_XID_Continue[] = {
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabea,
0xabec, 0xabed,
0xabf0, 0xabf9,
@@ -14895,7 +16001,7 @@ static const OnigCodePoint CR_XID_Continue[] = {
0xfd92, 0xfdc7,
0xfdf0, 0xfdf9,
0xfe00, 0xfe0f,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0xfe33, 0xfe34,
0xfe4d, 0xfe4f,
0xfe71, 0xfe71,
@@ -14925,20 +16031,29 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x101fd, 0x101fd,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
+ 0x102e0, 0x102e0,
+ 0x10300, 0x1031f,
0x10330, 0x1034a,
+ 0x10350, 0x1037a,
0x10380, 0x1039d,
0x103a0, 0x103c3,
0x103c8, 0x103cf,
0x103d1, 0x103d5,
0x10400, 0x1049d,
0x104a0, 0x104a9,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
+ 0x10860, 0x10876,
+ 0x10880, 0x1089e,
0x10900, 0x10915,
0x10920, 0x10939,
0x10980, 0x109b7,
@@ -14951,29 +16066,78 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x10a38, 0x10a3a,
0x10a3f, 0x10a3f,
0x10a60, 0x10a7c,
+ 0x10a80, 0x10a9c,
+ 0x10ac0, 0x10ac7,
+ 0x10ac9, 0x10ae6,
0x10b00, 0x10b35,
0x10b40, 0x10b55,
0x10b60, 0x10b72,
+ 0x10b80, 0x10b91,
0x10c00, 0x10c48,
0x11000, 0x11046,
0x11066, 0x1106f,
- 0x11080, 0x110ba,
+ 0x1107f, 0x110ba,
0x110d0, 0x110e8,
0x110f0, 0x110f9,
0x11100, 0x11134,
0x11136, 0x1113f,
+ 0x11150, 0x11173,
+ 0x11176, 0x11176,
0x11180, 0x111c4,
- 0x111d0, 0x111d9,
+ 0x111d0, 0x111da,
+ 0x11200, 0x11211,
+ 0x11213, 0x11237,
+ 0x112b0, 0x112ea,
+ 0x112f0, 0x112f9,
+ 0x11301, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133c, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x11357, 0x11357,
+ 0x1135d, 0x11363,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x11480, 0x114c5,
+ 0x114c7, 0x114c7,
+ 0x114d0, 0x114d9,
+ 0x11580, 0x115b5,
+ 0x115b8, 0x115c0,
+ 0x11600, 0x11640,
+ 0x11644, 0x11644,
+ 0x11650, 0x11659,
0x11680, 0x116b7,
0x116c0, 0x116c9,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
+ 0x118a0, 0x118e9,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16a60, 0x16a69,
+ 0x16ad0, 0x16aed,
+ 0x16af0, 0x16af4,
+ 0x16b00, 0x16b36,
+ 0x16b40, 0x16b43,
+ 0x16b50, 0x16b59,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f7e,
0x16f8f, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9d, 0x1bc9e,
0x1d165, 0x1d169,
0x1d16d, 0x1d172,
0x1d17b, 0x1d182,
@@ -15011,6 +16175,8 @@ static const OnigCodePoint CR_XID_Continue[] = {
0x1d7aa, 0x1d7c2,
0x1d7c4, 0x1d7cb,
0x1d7ce, 0x1d7ff,
+ 0x1e800, 0x1e8c4,
+ 0x1e8d0, 0x1e8d6,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -15053,12 +16219,13 @@ static const OnigCodePoint CR_XID_Continue[] = {
/* 'Default_Ignorable_Code_Point': Derived Property */
static const OnigCodePoint CR_Default_Ignorable_Code_Point[] = {
- 15,
+ 17,
0x00ad, 0x00ad,
0x034f, 0x034f,
+ 0x061c, 0x061c,
0x115f, 0x1160,
0x17b4, 0x17b5,
- 0x180b, 0x180d,
+ 0x180b, 0x180e,
0x200b, 0x200f,
0x202a, 0x202e,
0x2060, 0x206f,
@@ -15067,13 +16234,14 @@ static const OnigCodePoint CR_Default_Ignorable_Code_Point[] = {
0xfeff, 0xfeff,
0xffa0, 0xffa0,
0xfff0, 0xfff8,
+ 0x1bca0, 0x1bca3,
0x1d173, 0x1d17a,
0xe0000, 0xe0fff,
}; /* CR_Default_Ignorable_Code_Point */
/* 'Grapheme_Extend': Derived Property */
static const OnigCodePoint CR_Grapheme_Extend[] = {
- 232,
+ 272,
0x0300, 0x036f,
0x0483, 0x0489,
0x0591, 0x05bd,
@@ -15097,8 +16265,7 @@ static const OnigCodePoint CR_Grapheme_Extend[] = {
0x0825, 0x0827,
0x0829, 0x082d,
0x0859, 0x085b,
- 0x08e4, 0x08fe,
- 0x0900, 0x0902,
+ 0x08e4, 0x0902,
0x093a, 0x093a,
0x093c, 0x093c,
0x0941, 0x0948,
@@ -15138,11 +16305,13 @@ static const OnigCodePoint CR_Grapheme_Extend[] = {
0x0bc0, 0x0bc0,
0x0bcd, 0x0bcd,
0x0bd7, 0x0bd7,
+ 0x0c00, 0x0c00,
0x0c3e, 0x0c40,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
0x0c55, 0x0c56,
0x0c62, 0x0c63,
+ 0x0c81, 0x0c81,
0x0cbc, 0x0cbc,
0x0cbf, 0x0cbf,
0x0cc2, 0x0cc2,
@@ -15150,6 +16319,7 @@ static const OnigCodePoint CR_Grapheme_Extend[] = {
0x0ccc, 0x0ccd,
0x0cd5, 0x0cd6,
0x0ce2, 0x0ce3,
+ 0x0d01, 0x0d01,
0x0d3e, 0x0d3e,
0x0d41, 0x0d44,
0x0d4d, 0x0d4d,
@@ -15205,6 +16375,7 @@ static const OnigCodePoint CR_Grapheme_Extend[] = {
0x1932, 0x1932,
0x1939, 0x193b,
0x1a17, 0x1a18,
+ 0x1a1b, 0x1a1b,
0x1a56, 0x1a56,
0x1a58, 0x1a5e,
0x1a60, 0x1a60,
@@ -15212,6 +16383,7 @@ static const OnigCodePoint CR_Grapheme_Extend[] = {
0x1a65, 0x1a6c,
0x1a73, 0x1a7c,
0x1a7f, 0x1a7f,
+ 0x1ab0, 0x1abe,
0x1b00, 0x1b03,
0x1b34, 0x1b34,
0x1b36, 0x1b3a,
@@ -15221,7 +16393,7 @@ static const OnigCodePoint CR_Grapheme_Extend[] = {
0x1b80, 0x1b81,
0x1ba2, 0x1ba5,
0x1ba8, 0x1ba9,
- 0x1bab, 0x1bab,
+ 0x1bab, 0x1bad,
0x1be6, 0x1be6,
0x1be8, 0x1be9,
0x1bed, 0x1bed,
@@ -15233,7 +16405,8 @@ static const OnigCodePoint CR_Grapheme_Extend[] = {
0x1ce2, 0x1ce8,
0x1ced, 0x1ced,
0x1cf4, 0x1cf4,
- 0x1dc0, 0x1de6,
+ 0x1cf8, 0x1cf9,
+ 0x1dc0, 0x1df5,
0x1dfc, 0x1dff,
0x200c, 0x200d,
0x20d0, 0x20f0,
@@ -15258,11 +16431,13 @@ static const OnigCodePoint CR_Grapheme_Extend[] = {
0xa9b3, 0xa9b3,
0xa9b6, 0xa9b9,
0xa9bc, 0xa9bc,
+ 0xa9e5, 0xa9e5,
0xaa29, 0xaa2e,
0xaa31, 0xaa32,
0xaa35, 0xaa36,
0xaa43, 0xaa43,
0xaa4c, 0xaa4c,
+ 0xaa7c, 0xaa7c,
0xaab0, 0xaab0,
0xaab2, 0xaab4,
0xaab7, 0xaab8,
@@ -15275,29 +16450,61 @@ static const OnigCodePoint CR_Grapheme_Extend[] = {
0xabed, 0xabed,
0xfb1e, 0xfb1e,
0xfe00, 0xfe0f,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0xff9e, 0xff9f,
0x101fd, 0x101fd,
+ 0x102e0, 0x102e0,
+ 0x10376, 0x1037a,
0x10a01, 0x10a03,
0x10a05, 0x10a06,
0x10a0c, 0x10a0f,
0x10a38, 0x10a3a,
0x10a3f, 0x10a3f,
+ 0x10ae5, 0x10ae6,
0x11001, 0x11001,
0x11038, 0x11046,
- 0x11080, 0x11081,
+ 0x1107f, 0x11081,
0x110b3, 0x110b6,
0x110b9, 0x110ba,
0x11100, 0x11102,
0x11127, 0x1112b,
0x1112d, 0x11134,
+ 0x11173, 0x11173,
0x11180, 0x11181,
0x111b6, 0x111be,
+ 0x1122f, 0x11231,
+ 0x11234, 0x11234,
+ 0x11236, 0x11237,
+ 0x112df, 0x112df,
+ 0x112e3, 0x112ea,
+ 0x11301, 0x11301,
+ 0x1133c, 0x1133c,
+ 0x1133e, 0x1133e,
+ 0x11340, 0x11340,
+ 0x11357, 0x11357,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x114b0, 0x114b0,
+ 0x114b3, 0x114b8,
+ 0x114ba, 0x114ba,
+ 0x114bd, 0x114bd,
+ 0x114bf, 0x114c0,
+ 0x114c2, 0x114c3,
+ 0x115af, 0x115af,
+ 0x115b2, 0x115b5,
+ 0x115bc, 0x115bd,
+ 0x115bf, 0x115c0,
+ 0x11633, 0x1163a,
+ 0x1163d, 0x1163d,
+ 0x1163f, 0x11640,
0x116ab, 0x116ab,
0x116ad, 0x116ad,
0x116b0, 0x116b5,
0x116b7, 0x116b7,
+ 0x16af0, 0x16af4,
+ 0x16b30, 0x16b36,
0x16f8f, 0x16f92,
+ 0x1bc9d, 0x1bc9e,
0x1d165, 0x1d165,
0x1d167, 0x1d169,
0x1d16e, 0x1d172,
@@ -15305,27 +16512,28 @@ static const OnigCodePoint CR_Grapheme_Extend[] = {
0x1d185, 0x1d18b,
0x1d1aa, 0x1d1ad,
0x1d242, 0x1d244,
+ 0x1e8d0, 0x1e8d6,
0xe0100, 0xe01ef,
}; /* CR_Grapheme_Extend */
/* 'Grapheme_Base': Derived Property */
static const OnigCodePoint CR_Grapheme_Base[] = {
- 643,
+ 724,
0x0020, 0x007e,
0x00a0, 0x00ac,
0x00ae, 0x02ff,
0x0370, 0x0377,
- 0x037a, 0x037e,
+ 0x037a, 0x037f,
0x0384, 0x038a,
0x038c, 0x038c,
0x038e, 0x03a1,
0x03a3, 0x0482,
- 0x048a, 0x0527,
+ 0x048a, 0x052f,
0x0531, 0x0556,
0x0559, 0x055f,
0x0561, 0x0587,
0x0589, 0x058a,
- 0x058f, 0x058f,
+ 0x058d, 0x058f,
0x05be, 0x05be,
0x05c0, 0x05c0,
0x05c3, 0x05c3,
@@ -15354,16 +16562,14 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x0830, 0x083e,
0x0840, 0x0858,
0x085e, 0x085e,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
+ 0x08a0, 0x08b2,
0x0903, 0x0939,
0x093b, 0x093b,
0x093d, 0x0940,
0x0949, 0x094c,
0x094e, 0x0950,
0x0958, 0x0961,
- 0x0964, 0x0977,
- 0x0979, 0x097f,
+ 0x0964, 0x0980,
0x0982, 0x0983,
0x0985, 0x098c,
0x098f, 0x0990,
@@ -15439,8 +16645,7 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c3d,
0x0c41, 0x0c44,
0x0c58, 0x0c59,
@@ -15482,6 +16687,7 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x0dc0, 0x0dc6,
0x0dd0, 0x0dd1,
0x0dd8, 0x0dde,
+ 0x0de6, 0x0def,
0x0df2, 0x0df4,
0x0e01, 0x0e30,
0x0e32, 0x0e33,
@@ -15551,7 +16757,7 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x1380, 0x1399,
0x13a0, 0x13f4,
0x1400, 0x169c,
- 0x16a0, 0x16f0,
+ 0x16a0, 0x16f8,
0x1700, 0x170c,
0x170e, 0x1711,
0x1720, 0x1731,
@@ -15567,13 +16773,12 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x17e0, 0x17e9,
0x17f0, 0x17f9,
0x1800, 0x180a,
- 0x180e, 0x180e,
0x1810, 0x1819,
0x1820, 0x1877,
0x1880, 0x18a8,
0x18aa, 0x18aa,
0x18b0, 0x18f5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1923, 0x1926,
0x1929, 0x192b,
0x1930, 0x1931,
@@ -15585,7 +16790,7 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x19b0, 0x19c9,
0x19d0, 0x19da,
0x19de, 0x1a16,
- 0x1a19, 0x1a1b,
+ 0x1a19, 0x1a1a,
0x1a1e, 0x1a55,
0x1a57, 0x1a57,
0x1a61, 0x1a61,
@@ -15604,7 +16809,7 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x1b82, 0x1ba1,
0x1ba6, 0x1ba7,
0x1baa, 0x1baa,
- 0x1bac, 0x1be5,
+ 0x1bae, 0x1be5,
0x1be7, 0x1be7,
0x1bea, 0x1bec,
0x1bee, 0x1bee,
@@ -15642,14 +16847,16 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x2070, 0x2071,
0x2074, 0x208e,
0x2090, 0x209c,
- 0x20a0, 0x20b9,
+ 0x20a0, 0x20bd,
0x2100, 0x2189,
- 0x2190, 0x23f3,
+ 0x2190, 0x23fa,
0x2400, 0x2426,
0x2440, 0x244a,
- 0x2460, 0x26ff,
- 0x2701, 0x2b4c,
- 0x2b50, 0x2b59,
+ 0x2460, 0x2b73,
+ 0x2b76, 0x2b95,
+ 0x2b98, 0x2bb9,
+ 0x2bbd, 0x2bc8,
+ 0x2bca, 0x2bd1,
0x2c00, 0x2c2e,
0x2c30, 0x2c5e,
0x2c60, 0x2cee,
@@ -15668,7 +16875,7 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x2dc8, 0x2dce,
0x2dd0, 0x2dd6,
0x2dd8, 0x2dde,
- 0x2e00, 0x2e3b,
+ 0x2e00, 0x2e42,
0x2e80, 0x2e99,
0x2e9b, 0x2ef3,
0x2f00, 0x2fd5,
@@ -15690,13 +16897,13 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0xa4d0, 0xa62b,
0xa640, 0xa66e,
0xa673, 0xa673,
- 0xa67e, 0xa697,
+ 0xa67e, 0xa69d,
0xa6a0, 0xa6ef,
0xa6f2, 0xa6f7,
0xa700, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa801,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa801,
0xa803, 0xa805,
0xa807, 0xa80a,
0xa80c, 0xa824,
@@ -15715,7 +16922,8 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0xa9ba, 0xa9bb,
0xa9bd, 0xa9cd,
0xa9cf, 0xa9d9,
- 0xa9de, 0xa9df,
+ 0xa9de, 0xa9e4,
+ 0xa9e6, 0xa9fe,
0xaa00, 0xaa28,
0xaa2f, 0xaa30,
0xaa33, 0xaa34,
@@ -15724,7 +16932,7 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0xaa4d, 0xaa4d,
0xaa50, 0xaa59,
0xaa5c, 0xaa7b,
- 0xaa80, 0xaaaf,
+ 0xaa7d, 0xaaaf,
0xaab1, 0xaab1,
0xaab5, 0xaab6,
0xaab9, 0xaabd,
@@ -15737,6 +16945,8 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0xab11, 0xab16,
0xab20, 0xab26,
0xab28, 0xab2e,
+ 0xab30, 0xab5f,
+ 0xab64, 0xab65,
0xabc0, 0xabe4,
0xabe6, 0xabe7,
0xabe9, 0xabec,
@@ -15783,26 +16993,35 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x10080, 0x100fa,
0x10100, 0x10102,
0x10107, 0x10133,
- 0x10137, 0x1018a,
+ 0x10137, 0x1018c,
0x10190, 0x1019b,
+ 0x101a0, 0x101a0,
0x101d0, 0x101fc,
0x10280, 0x1029c,
0x102a0, 0x102d0,
- 0x10300, 0x1031e,
- 0x10320, 0x10323,
+ 0x102e1, 0x102fb,
+ 0x10300, 0x10323,
0x10330, 0x1034a,
+ 0x10350, 0x10375,
0x10380, 0x1039d,
0x1039f, 0x103c3,
0x103c8, 0x103d5,
0x10400, 0x1049d,
0x104a0, 0x104a9,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x1056f, 0x1056f,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
0x10800, 0x10805,
0x10808, 0x10808,
0x1080a, 0x10835,
0x10837, 0x10838,
0x1083c, 0x1083c,
0x1083f, 0x10855,
- 0x10857, 0x1085f,
+ 0x10857, 0x1089e,
+ 0x108a7, 0x108af,
0x10900, 0x1091b,
0x1091f, 0x10939,
0x1093f, 0x1093f,
@@ -15814,11 +17033,15 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x10a19, 0x10a33,
0x10a40, 0x10a47,
0x10a50, 0x10a58,
- 0x10a60, 0x10a7f,
+ 0x10a60, 0x10a9f,
+ 0x10ac0, 0x10ae4,
+ 0x10aeb, 0x10af6,
0x10b00, 0x10b35,
0x10b39, 0x10b55,
0x10b58, 0x10b72,
- 0x10b78, 0x10b7f,
+ 0x10b78, 0x10b91,
+ 0x10b99, 0x10b9c,
+ 0x10ba9, 0x10baf,
0x10c00, 0x10c48,
0x10e60, 0x10e7e,
0x11000, 0x11000,
@@ -15834,23 +17057,86 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x11103, 0x11126,
0x1112c, 0x1112c,
0x11136, 0x11143,
+ 0x11150, 0x11172,
+ 0x11174, 0x11176,
0x11182, 0x111b5,
0x111bf, 0x111c8,
- 0x111d0, 0x111d9,
+ 0x111cd, 0x111cd,
+ 0x111d0, 0x111da,
+ 0x111e1, 0x111f4,
+ 0x11200, 0x11211,
+ 0x11213, 0x1122e,
+ 0x11232, 0x11233,
+ 0x11235, 0x11235,
+ 0x11238, 0x1123d,
+ 0x112b0, 0x112de,
+ 0x112e0, 0x112e2,
+ 0x112f0, 0x112f9,
+ 0x11302, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133d, 0x1133d,
+ 0x1133f, 0x1133f,
+ 0x11341, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x1135d, 0x11363,
+ 0x11480, 0x114af,
+ 0x114b1, 0x114b2,
+ 0x114b9, 0x114b9,
+ 0x114bb, 0x114bc,
+ 0x114be, 0x114be,
+ 0x114c1, 0x114c1,
+ 0x114c4, 0x114c7,
+ 0x114d0, 0x114d9,
+ 0x11580, 0x115ae,
+ 0x115b0, 0x115b1,
+ 0x115b8, 0x115bb,
+ 0x115be, 0x115be,
+ 0x115c1, 0x115c9,
+ 0x11600, 0x11632,
+ 0x1163b, 0x1163c,
+ 0x1163e, 0x1163e,
+ 0x11641, 0x11644,
+ 0x11650, 0x11659,
0x11680, 0x116aa,
0x116ac, 0x116ac,
0x116ae, 0x116af,
0x116b6, 0x116b6,
0x116c0, 0x116c9,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
- 0x12470, 0x12473,
+ 0x118a0, 0x118f2,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
+ 0x12470, 0x12474,
0x13000, 0x1342e,
0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16a60, 0x16a69,
+ 0x16a6e, 0x16a6f,
+ 0x16ad0, 0x16aed,
+ 0x16af5, 0x16af5,
+ 0x16b00, 0x16b2f,
+ 0x16b37, 0x16b45,
+ 0x16b50, 0x16b59,
+ 0x16b5b, 0x16b61,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
0x16f00, 0x16f44,
0x16f50, 0x16f7e,
0x16f93, 0x16f9f,
0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9c, 0x1bc9c,
+ 0x1bc9f, 0x1bc9f,
0x1d000, 0x1d0f5,
0x1d100, 0x1d126,
0x1d129, 0x1d164,
@@ -15884,6 +17170,8 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x1d552, 0x1d6a5,
0x1d6a8, 0x1d7cb,
0x1d7ce, 0x1d7ff,
+ 0x1e800, 0x1e8c4,
+ 0x1e8c7, 0x1e8cf,
0x1ee00, 0x1ee03,
0x1ee05, 0x1ee1f,
0x1ee21, 0x1ee22,
@@ -15921,10 +17209,10 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x1f000, 0x1f02b,
0x1f030, 0x1f093,
0x1f0a0, 0x1f0ae,
- 0x1f0b1, 0x1f0be,
+ 0x1f0b1, 0x1f0bf,
0x1f0c1, 0x1f0cf,
- 0x1f0d1, 0x1f0df,
- 0x1f100, 0x1f10a,
+ 0x1f0d1, 0x1f0f5,
+ 0x1f100, 0x1f10c,
0x1f110, 0x1f12e,
0x1f130, 0x1f16b,
0x1f170, 0x1f19a,
@@ -15932,24 +17220,25 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
0x1f210, 0x1f23a,
0x1f240, 0x1f248,
0x1f250, 0x1f251,
- 0x1f300, 0x1f320,
- 0x1f330, 0x1f335,
- 0x1f337, 0x1f37c,
- 0x1f380, 0x1f393,
- 0x1f3a0, 0x1f3c4,
- 0x1f3c6, 0x1f3ca,
- 0x1f3e0, 0x1f3f0,
- 0x1f400, 0x1f43e,
- 0x1f440, 0x1f440,
- 0x1f442, 0x1f4f7,
- 0x1f4f9, 0x1f4fc,
- 0x1f500, 0x1f53d,
- 0x1f540, 0x1f543,
- 0x1f550, 0x1f567,
- 0x1f5fb, 0x1f640,
- 0x1f645, 0x1f64f,
- 0x1f680, 0x1f6c5,
+ 0x1f300, 0x1f32c,
+ 0x1f330, 0x1f37d,
+ 0x1f380, 0x1f3ce,
+ 0x1f3d4, 0x1f3f7,
+ 0x1f400, 0x1f4fe,
+ 0x1f500, 0x1f54a,
+ 0x1f550, 0x1f579,
+ 0x1f57b, 0x1f5a3,
+ 0x1f5a5, 0x1f642,
+ 0x1f645, 0x1f6cf,
+ 0x1f6e0, 0x1f6ec,
+ 0x1f6f0, 0x1f6f3,
0x1f700, 0x1f773,
+ 0x1f780, 0x1f7d4,
+ 0x1f800, 0x1f80b,
+ 0x1f810, 0x1f847,
+ 0x1f850, 0x1f859,
+ 0x1f860, 0x1f887,
+ 0x1f890, 0x1f8ad,
0x20000, 0x2a6d6,
0x2a700, 0x2b734,
0x2b740, 0x2b81d,
@@ -15958,7 +17247,7 @@ static const OnigCodePoint CR_Grapheme_Base[] = {
/* 'Grapheme_Link': Derived Property */
static const OnigCodePoint CR_Grapheme_Link[] = {
- 33,
+ 40,
0x094d, 0x094d,
0x09cd, 0x09cd,
0x0a4d, 0x0a4d,
@@ -15988,15 +17277,22 @@ static const OnigCodePoint CR_Grapheme_Link[] = {
0xabed, 0xabed,
0x10a3f, 0x10a3f,
0x11046, 0x11046,
+ 0x1107f, 0x1107f,
0x110b9, 0x110b9,
0x11133, 0x11134,
0x111c0, 0x111c0,
+ 0x11235, 0x11235,
+ 0x112ea, 0x112ea,
+ 0x1134d, 0x1134d,
+ 0x114c2, 0x114c2,
+ 0x115bf, 0x115bf,
+ 0x1163f, 0x1163f,
0x116b6, 0x116b6,
}; /* CR_Grapheme_Link */
/* 'Common': Script */
static const OnigCodePoint CR_Common[] = {
- 157,
+ 165,
0x0000, 0x0040,
0x005b, 0x0060,
0x007b, 0x00a9,
@@ -16012,8 +17308,9 @@ static const OnigCodePoint CR_Common[] = {
0x0385, 0x0385,
0x0387, 0x0387,
0x0589, 0x0589,
+ 0x0605, 0x0605,
0x060c, 0x060c,
- 0x061b, 0x061b,
+ 0x061b, 0x061c,
0x061f, 0x061f,
0x0640, 0x0640,
0x0660, 0x0669,
@@ -16033,24 +17330,26 @@ static const OnigCodePoint CR_Common[] = {
0x1cf5, 0x1cf6,
0x2000, 0x200b,
0x200e, 0x2064,
- 0x206a, 0x2070,
+ 0x2066, 0x2070,
0x2074, 0x207e,
0x2080, 0x208e,
- 0x20a0, 0x20b9,
+ 0x20a0, 0x20bd,
0x2100, 0x2125,
0x2127, 0x2129,
0x212c, 0x2131,
0x2133, 0x214d,
0x214f, 0x215f,
0x2189, 0x2189,
- 0x2190, 0x23f3,
+ 0x2190, 0x23fa,
0x2400, 0x2426,
0x2440, 0x244a,
- 0x2460, 0x26ff,
- 0x2701, 0x27ff,
- 0x2900, 0x2b4c,
- 0x2b50, 0x2b59,
- 0x2e00, 0x2e3b,
+ 0x2460, 0x27ff,
+ 0x2900, 0x2b73,
+ 0x2b76, 0x2b95,
+ 0x2b98, 0x2bb9,
+ 0x2bbd, 0x2bc8,
+ 0x2bca, 0x2bd1,
+ 0x2e00, 0x2e42,
0x2ff0, 0x2ffb,
0x3000, 0x3004,
0x3006, 0x3006,
@@ -16069,8 +17368,10 @@ static const OnigCodePoint CR_Common[] = {
0xa700, 0xa721,
0xa788, 0xa78a,
0xa830, 0xa839,
+ 0xa92e, 0xa92e,
+ 0xa9cf, 0xa9cf,
+ 0xab5b, 0xab5b,
0xfd3e, 0xfd3f,
- 0xfdfd, 0xfdfd,
0xfe10, 0xfe19,
0xfe30, 0xfe52,
0xfe54, 0xfe66,
@@ -16089,6 +17390,8 @@ static const OnigCodePoint CR_Common[] = {
0x10137, 0x1013f,
0x10190, 0x1019b,
0x101d0, 0x101fc,
+ 0x102e1, 0x102fb,
+ 0x1bca0, 0x1bca3,
0x1d000, 0x1d0f5,
0x1d100, 0x1d126,
0x1d129, 0x1d166,
@@ -16122,10 +17425,10 @@ static const OnigCodePoint CR_Common[] = {
0x1f000, 0x1f02b,
0x1f030, 0x1f093,
0x1f0a0, 0x1f0ae,
- 0x1f0b1, 0x1f0be,
+ 0x1f0b1, 0x1f0bf,
0x1f0c1, 0x1f0cf,
- 0x1f0d1, 0x1f0df,
- 0x1f100, 0x1f10a,
+ 0x1f0d1, 0x1f0f5,
+ 0x1f100, 0x1f10c,
0x1f110, 0x1f12e,
0x1f130, 0x1f16b,
0x1f170, 0x1f19a,
@@ -16134,31 +17437,32 @@ static const OnigCodePoint CR_Common[] = {
0x1f210, 0x1f23a,
0x1f240, 0x1f248,
0x1f250, 0x1f251,
- 0x1f300, 0x1f320,
- 0x1f330, 0x1f335,
- 0x1f337, 0x1f37c,
- 0x1f380, 0x1f393,
- 0x1f3a0, 0x1f3c4,
- 0x1f3c6, 0x1f3ca,
- 0x1f3e0, 0x1f3f0,
- 0x1f400, 0x1f43e,
- 0x1f440, 0x1f440,
- 0x1f442, 0x1f4f7,
- 0x1f4f9, 0x1f4fc,
- 0x1f500, 0x1f53d,
- 0x1f540, 0x1f543,
- 0x1f550, 0x1f567,
- 0x1f5fb, 0x1f640,
- 0x1f645, 0x1f64f,
- 0x1f680, 0x1f6c5,
+ 0x1f300, 0x1f32c,
+ 0x1f330, 0x1f37d,
+ 0x1f380, 0x1f3ce,
+ 0x1f3d4, 0x1f3f7,
+ 0x1f400, 0x1f4fe,
+ 0x1f500, 0x1f54a,
+ 0x1f550, 0x1f579,
+ 0x1f57b, 0x1f5a3,
+ 0x1f5a5, 0x1f642,
+ 0x1f645, 0x1f6cf,
+ 0x1f6e0, 0x1f6ec,
+ 0x1f6f0, 0x1f6f3,
0x1f700, 0x1f773,
+ 0x1f780, 0x1f7d4,
+ 0x1f800, 0x1f80b,
+ 0x1f810, 0x1f847,
+ 0x1f850, 0x1f859,
+ 0x1f860, 0x1f887,
+ 0x1f890, 0x1f8ad,
0xe0001, 0xe0001,
0xe0020, 0xe007f,
}; /* CR_Common */
/* 'Latin': Script */
static const OnigCodePoint CR_Latin[] = {
- 30,
+ 33,
0x0041, 0x005a,
0x0061, 0x007a,
0x00aa, 0x00aa,
@@ -16183,9 +17487,12 @@ static const OnigCodePoint CR_Latin[] = {
0x2c60, 0x2c7f,
0xa722, 0xa787,
0xa78b, 0xa78e,
- 0xa790, 0xa793,
- 0xa7a0, 0xa7aa,
- 0xa7f8, 0xa7ff,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa7ff,
+ 0xab30, 0xab5a,
+ 0xab5c, 0xab5f,
+ 0xab64, 0xab64,
0xfb00, 0xfb06,
0xff21, 0xff3a,
0xff41, 0xff5a,
@@ -16193,10 +17500,11 @@ static const OnigCodePoint CR_Latin[] = {
/* 'Greek': Script */
static const OnigCodePoint CR_Greek[] = {
- 33,
+ 36,
0x0370, 0x0373,
0x0375, 0x0377,
0x037a, 0x037d,
+ 0x037f, 0x037f,
0x0384, 0x0384,
0x0386, 0x0386,
0x0388, 0x038a,
@@ -16225,7 +17533,9 @@ static const OnigCodePoint CR_Greek[] = {
0x1ff2, 0x1ff4,
0x1ff6, 0x1ffe,
0x2126, 0x2126,
- 0x10140, 0x1018a,
+ 0xab65, 0xab65,
+ 0x10140, 0x1018c,
+ 0x101a0, 0x101a0,
0x1d200, 0x1d245,
}; /* CR_Greek */
@@ -16233,11 +17543,11 @@ static const OnigCodePoint CR_Greek[] = {
static const OnigCodePoint CR_Cyrillic[] = {
7,
0x0400, 0x0484,
- 0x0487, 0x0527,
+ 0x0487, 0x052f,
0x1d2b, 0x1d2b,
0x1d78, 0x1d78,
0x2de0, 0x2dff,
- 0xa640, 0xa697,
+ 0xa640, 0xa69d,
0xa69f, 0xa69f,
}; /* CR_Cyrillic */
@@ -16248,7 +17558,7 @@ static const OnigCodePoint CR_Armenian[] = {
0x0559, 0x055f,
0x0561, 0x0587,
0x058a, 0x058a,
- 0x058f, 0x058f,
+ 0x058d, 0x058f,
0xfb13, 0xfb17,
}; /* CR_Armenian */
@@ -16268,26 +17578,25 @@ static const OnigCodePoint CR_Hebrew[] = {
/* 'Arabic': Script */
static const OnigCodePoint CR_Arabic[] = {
- 56,
+ 55,
0x0600, 0x0604,
0x0606, 0x060b,
0x060d, 0x061a,
0x061e, 0x061e,
0x0620, 0x063f,
0x0641, 0x064a,
- 0x0656, 0x065e,
+ 0x0656, 0x065f,
0x066a, 0x066f,
0x0671, 0x06dc,
0x06de, 0x06ff,
0x0750, 0x077f,
- 0x08a0, 0x08a0,
- 0x08a2, 0x08ac,
- 0x08e4, 0x08fe,
+ 0x08a0, 0x08b2,
+ 0x08e4, 0x08ff,
0xfb50, 0xfbc1,
0xfbd3, 0xfd3d,
0xfd50, 0xfd8f,
0xfd92, 0xfdc7,
- 0xfdf0, 0xfdfc,
+ 0xfdf0, 0xfdfd,
0xfe70, 0xfe74,
0xfe76, 0xfefc,
0x10e60, 0x10e7e,
@@ -16343,18 +17652,17 @@ static const OnigCodePoint CR_Thaana[] = {
/* 'Devanagari': Script */
static const OnigCodePoint CR_Devanagari[] = {
- 5,
+ 4,
0x0900, 0x0950,
0x0953, 0x0963,
- 0x0966, 0x0977,
- 0x0979, 0x097f,
+ 0x0966, 0x097f,
0xa8e0, 0xa8fb,
}; /* CR_Devanagari */
/* 'Bengali': Script */
static const OnigCodePoint CR_Bengali[] = {
14,
- 0x0981, 0x0983,
+ 0x0980, 0x0983,
0x0985, 0x098c,
0x098f, 0x0990,
0x0993, 0x09a8,
@@ -16451,13 +17759,12 @@ static const OnigCodePoint CR_Tamil[] = {
/* 'Telugu': Script */
static const OnigCodePoint CR_Telugu[] = {
- 14,
- 0x0c01, 0x0c03,
+ 13,
+ 0x0c00, 0x0c03,
0x0c05, 0x0c0c,
0x0c0e, 0x0c10,
0x0c12, 0x0c28,
- 0x0c2a, 0x0c33,
- 0x0c35, 0x0c39,
+ 0x0c2a, 0x0c39,
0x0c3d, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4d,
@@ -16471,7 +17778,7 @@ static const OnigCodePoint CR_Telugu[] = {
/* 'Kannada': Script */
static const OnigCodePoint CR_Kannada[] = {
14,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0c85, 0x0c8c,
0x0c8e, 0x0c90,
0x0c92, 0x0ca8,
@@ -16490,7 +17797,7 @@ static const OnigCodePoint CR_Kannada[] = {
/* 'Malayalam': Script */
static const OnigCodePoint CR_Malayalam[] = {
11,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d05, 0x0d0c,
0x0d0e, 0x0d10,
0x0d12, 0x0d3a,
@@ -16505,7 +17812,7 @@ static const OnigCodePoint CR_Malayalam[] = {
/* 'Sinhala': Script */
static const OnigCodePoint CR_Sinhala[] = {
- 11,
+ 13,
0x0d82, 0x0d83,
0x0d85, 0x0d96,
0x0d9a, 0x0db1,
@@ -16516,7 +17823,9 @@ static const OnigCodePoint CR_Sinhala[] = {
0x0dcf, 0x0dd4,
0x0dd6, 0x0dd6,
0x0dd8, 0x0ddf,
+ 0x0de6, 0x0def,
0x0df2, 0x0df4,
+ 0x111e1, 0x111f4,
}; /* CR_Sinhala */
/* 'Thai': Script */
@@ -16563,9 +17872,10 @@ static const OnigCodePoint CR_Tibetan[] = {
/* 'Myanmar': Script */
static const OnigCodePoint CR_Myanmar[] = {
- 2,
+ 3,
0x1000, 0x109f,
- 0xaa60, 0xaa7b,
+ 0xa9e0, 0xa9fe,
+ 0xaa60, 0xaa7f,
}; /* CR_Myanmar */
/* 'Georgian': Script */
@@ -16660,7 +17970,7 @@ static const OnigCodePoint CR_Ogham[] = {
static const OnigCodePoint CR_Runic[] = {
2,
0x16a0, 0x16ea,
- 0x16ee, 0x16f0,
+ 0x16ee, 0x16f8,
}; /* CR_Runic */
/* 'Khmer': Script */
@@ -16742,9 +18052,8 @@ static const OnigCodePoint CR_Yi[] = {
/* 'Old_Italic': Script */
static const OnigCodePoint CR_Old_Italic[] = {
- 2,
- 0x10300, 0x1031e,
- 0x10320, 0x10323,
+ 1,
+ 0x10300, 0x10323,
}; /* CR_Old_Italic */
/* 'Gothic': Script */
@@ -16761,27 +18070,29 @@ static const OnigCodePoint CR_Deseret[] = {
/* 'Inherited': Script */
static const OnigCodePoint CR_Inherited[] = {
- 25,
+ 27,
0x0300, 0x036f,
0x0485, 0x0486,
0x064b, 0x0655,
- 0x065f, 0x065f,
0x0670, 0x0670,
0x0951, 0x0952,
+ 0x1ab0, 0x1abe,
0x1cd0, 0x1cd2,
0x1cd4, 0x1ce0,
0x1ce2, 0x1ce8,
0x1ced, 0x1ced,
0x1cf4, 0x1cf4,
- 0x1dc0, 0x1de6,
+ 0x1cf8, 0x1cf9,
+ 0x1dc0, 0x1df5,
0x1dfc, 0x1dff,
0x200c, 0x200d,
0x20d0, 0x20f0,
0x302a, 0x302d,
0x3099, 0x309a,
0xfe00, 0xfe0f,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0x101fd, 0x101fd,
+ 0x102e0, 0x102e0,
0x1d167, 0x1d169,
0x1d17b, 0x1d182,
0x1d185, 0x1d18b,
@@ -16819,7 +18130,7 @@ static const OnigCodePoint CR_Tagbanwa[] = {
/* 'Limbu': Script */
static const OnigCodePoint CR_Limbu[] = {
5,
- 0x1900, 0x191c,
+ 0x1900, 0x191e,
0x1920, 0x192b,
0x1930, 0x193b,
0x1940, 0x1940,
@@ -16957,9 +18268,9 @@ static const OnigCodePoint CR_Balinese[] = {
/* 'Cuneiform': Script */
static const OnigCodePoint CR_Cuneiform[] = {
3,
- 0x12000, 0x1236e,
- 0x12400, 0x12462,
- 0x12470, 0x12473,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
+ 0x12470, 0x12474,
}; /* CR_Cuneiform */
/* 'Phoenician': Script */
@@ -17017,8 +18328,9 @@ static const OnigCodePoint CR_Saurashtra[] = {
/* 'Kayah_Li': Script */
static const OnigCodePoint CR_Kayah_Li[] = {
- 1,
- 0xa900, 0xa92f,
+ 2,
+ 0xa900, 0xa92d,
+ 0xa92f, 0xa92f,
}; /* CR_Kayah_Li */
/* 'Rejang': Script */
@@ -17110,7 +18422,7 @@ static const OnigCodePoint CR_Bamum[] = {
static const OnigCodePoint CR_Javanese[] = {
3,
0xa980, 0xa9cd,
- 0xa9cf, 0xa9d9,
+ 0xa9d0, 0xa9d9,
0xa9de, 0xa9df,
}; /* CR_Javanese */
@@ -17170,9 +18482,10 @@ static const OnigCodePoint CR_Batak[] = {
/* 'Brahmi': Script */
static const OnigCodePoint CR_Brahmi[] = {
- 2,
+ 3,
0x11000, 0x1104d,
0x11052, 0x1106f,
+ 0x1107f, 0x1107f,
}; /* CR_Brahmi */
/* 'Mandaic': Script */
@@ -17212,9 +18525,10 @@ static const OnigCodePoint CR_Miao[] = {
/* 'Sharada': Script */
static const OnigCodePoint CR_Sharada[] = {
- 2,
+ 3,
0x11180, 0x111c8,
- 0x111d0, 0x111d9,
+ 0x111cd, 0x111cd,
+ 0x111d0, 0x111da,
}; /* CR_Sharada */
/* 'Sora_Sompeng': Script */
@@ -17231,14 +18545,192 @@ static const OnigCodePoint CR_Takri[] = {
0x116c0, 0x116c9,
}; /* CR_Takri */
+/* 'Caucasian_Albanian': Script */
+static const OnigCodePoint CR_Caucasian_Albanian[] = {
+ 2,
+ 0x10530, 0x10563,
+ 0x1056f, 0x1056f,
+}; /* CR_Caucasian_Albanian */
+
+/* 'Bassa_Vah': Script */
+static const OnigCodePoint CR_Bassa_Vah[] = {
+ 2,
+ 0x16ad0, 0x16aed,
+ 0x16af0, 0x16af5,
+}; /* CR_Bassa_Vah */
+
+/* 'Duployan': Script */
+static const OnigCodePoint CR_Duployan[] = {
+ 5,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9c, 0x1bc9f,
+}; /* CR_Duployan */
+
+/* 'Elbasan': Script */
+static const OnigCodePoint CR_Elbasan[] = {
+ 1,
+ 0x10500, 0x10527,
+}; /* CR_Elbasan */
+
+/* 'Grantha': Script */
+static const OnigCodePoint CR_Grantha[] = {
+ 14,
+ 0x11301, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133c, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x11357, 0x11357,
+ 0x1135d, 0x11363,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+}; /* CR_Grantha */
+
+/* 'Pahawh_Hmong': Script */
+static const OnigCodePoint CR_Pahawh_Hmong[] = {
+ 5,
+ 0x16b00, 0x16b45,
+ 0x16b50, 0x16b59,
+ 0x16b5b, 0x16b61,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
+}; /* CR_Pahawh_Hmong */
+
+/* 'Khojki': Script */
+static const OnigCodePoint CR_Khojki[] = {
+ 2,
+ 0x11200, 0x11211,
+ 0x11213, 0x1123d,
+}; /* CR_Khojki */
+
+/* 'Linear_A': Script */
+static const OnigCodePoint CR_Linear_A[] = {
+ 3,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
+}; /* CR_Linear_A */
+
+/* 'Mahajani': Script */
+static const OnigCodePoint CR_Mahajani[] = {
+ 1,
+ 0x11150, 0x11176,
+}; /* CR_Mahajani */
+
+/* 'Manichaean': Script */
+static const OnigCodePoint CR_Manichaean[] = {
+ 2,
+ 0x10ac0, 0x10ae6,
+ 0x10aeb, 0x10af6,
+}; /* CR_Manichaean */
+
+/* 'Mende_Kikakui': Script */
+static const OnigCodePoint CR_Mende_Kikakui[] = {
+ 2,
+ 0x1e800, 0x1e8c4,
+ 0x1e8c7, 0x1e8d6,
+}; /* CR_Mende_Kikakui */
+
+/* 'Modi': Script */
+static const OnigCodePoint CR_Modi[] = {
+ 2,
+ 0x11600, 0x11644,
+ 0x11650, 0x11659,
+}; /* CR_Modi */
+
+/* 'Mro': Script */
+static const OnigCodePoint CR_Mro[] = {
+ 3,
+ 0x16a40, 0x16a5e,
+ 0x16a60, 0x16a69,
+ 0x16a6e, 0x16a6f,
+}; /* CR_Mro */
+
+/* 'Old_North_Arabian': Script */
+static const OnigCodePoint CR_Old_North_Arabian[] = {
+ 1,
+ 0x10a80, 0x10a9f,
+}; /* CR_Old_North_Arabian */
+
+/* 'Nabataean': Script */
+static const OnigCodePoint CR_Nabataean[] = {
+ 2,
+ 0x10880, 0x1089e,
+ 0x108a7, 0x108af,
+}; /* CR_Nabataean */
+
+/* 'Palmyrene': Script */
+static const OnigCodePoint CR_Palmyrene[] = {
+ 1,
+ 0x10860, 0x1087f,
+}; /* CR_Palmyrene */
+
+/* 'Pau_Cin_Hau': Script */
+static const OnigCodePoint CR_Pau_Cin_Hau[] = {
+ 1,
+ 0x11ac0, 0x11af8,
+}; /* CR_Pau_Cin_Hau */
+
+/* 'Old_Permic': Script */
+static const OnigCodePoint CR_Old_Permic[] = {
+ 1,
+ 0x10350, 0x1037a,
+}; /* CR_Old_Permic */
+
+/* 'Psalter_Pahlavi': Script */
+static const OnigCodePoint CR_Psalter_Pahlavi[] = {
+ 3,
+ 0x10b80, 0x10b91,
+ 0x10b99, 0x10b9c,
+ 0x10ba9, 0x10baf,
+}; /* CR_Psalter_Pahlavi */
+
+/* 'Siddham': Script */
+static const OnigCodePoint CR_Siddham[] = {
+ 2,
+ 0x11580, 0x115b5,
+ 0x115b8, 0x115c9,
+}; /* CR_Siddham */
+
+/* 'Khudawadi': Script */
+static const OnigCodePoint CR_Khudawadi[] = {
+ 2,
+ 0x112b0, 0x112ea,
+ 0x112f0, 0x112f9,
+}; /* CR_Khudawadi */
+
+/* 'Tirhuta': Script */
+static const OnigCodePoint CR_Tirhuta[] = {
+ 2,
+ 0x11480, 0x114c7,
+ 0x114d0, 0x114d9,
+}; /* CR_Tirhuta */
+
+/* 'Warang_Citi': Script */
+static const OnigCodePoint CR_Warang_Citi[] = {
+ 2,
+ 0x118a0, 0x118f2,
+ 0x118ff, 0x118ff,
+}; /* CR_Warang_Citi */
+
/* 'White_Space': Binary Property */
#define CR_White_Space CR_Space
/* 'Bidi_Control': Binary Property */
static const OnigCodePoint CR_Bidi_Control[] = {
- 2,
+ 4,
+ 0x061c, 0x061c,
0x200e, 0x200f,
0x202a, 0x202e,
+ 0x2066, 0x2069,
}; /* CR_Bidi_Control */
/* 'Join_Control': Binary Property */
@@ -17249,7 +18741,7 @@ static const OnigCodePoint CR_Join_Control[] = {
/* 'Dash': Binary Property */
static const OnigCodePoint CR_Dash[] = {
- 20,
+ 21,
0x002d, 0x002d,
0x058a, 0x058a,
0x05be, 0x05be,
@@ -17263,6 +18755,7 @@ static const OnigCodePoint CR_Dash[] = {
0x2e17, 0x2e17,
0x2e1a, 0x2e1a,
0x2e3a, 0x2e3b,
+ 0x2e40, 0x2e40,
0x301c, 0x301c,
0x3030, 0x3030,
0x30a0, 0x30a0,
@@ -17289,13 +18782,14 @@ static const OnigCodePoint CR_Hyphen[] = {
/* 'Quotation_Mark': Binary Property */
static const OnigCodePoint CR_Quotation_Mark[] = {
- 12,
+ 13,
0x0022, 0x0022,
0x0027, 0x0027,
0x00ab, 0x00ab,
0x00bb, 0x00bb,
0x2018, 0x201f,
0x2039, 0x203a,
+ 0x2e42, 0x2e42,
0x300c, 0x300f,
0x301d, 0x301f,
0xfe41, 0xfe44,
@@ -17306,7 +18800,7 @@ static const OnigCodePoint CR_Quotation_Mark[] = {
/* 'Terminal_Punctuation': Binary Property */
static const OnigCodePoint CR_Terminal_Punctuation[] = {
- 70,
+ 86,
0x0021, 0x0021,
0x002c, 0x002c,
0x002e, 0x002e,
@@ -17333,6 +18827,7 @@ static const OnigCodePoint CR_Terminal_Punctuation[] = {
0x1361, 0x1368,
0x166d, 0x166e,
0x16eb, 0x16ed,
+ 0x1735, 0x1736,
0x17d4, 0x17d6,
0x17da, 0x17da,
0x1802, 0x1805,
@@ -17346,6 +18841,8 @@ static const OnigCodePoint CR_Terminal_Punctuation[] = {
0x203c, 0x203d,
0x2047, 0x2049,
0x2e2e, 0x2e2e,
+ 0x2e3c, 0x2e3c,
+ 0x2e41, 0x2e41,
0x3001, 0x3002,
0xa4fe, 0xa4ff,
0xa60d, 0xa60f,
@@ -17371,17 +18868,30 @@ static const OnigCodePoint CR_Terminal_Punctuation[] = {
0x103d0, 0x103d0,
0x10857, 0x10857,
0x1091f, 0x1091f,
+ 0x10a56, 0x10a57,
+ 0x10af0, 0x10af5,
0x10b3a, 0x10b3f,
+ 0x10b99, 0x10b9c,
0x11047, 0x1104d,
0x110be, 0x110c1,
0x11141, 0x11143,
0x111c5, 0x111c6,
- 0x12470, 0x12473,
+ 0x111cd, 0x111cd,
+ 0x11238, 0x1123c,
+ 0x115c2, 0x115c5,
+ 0x115c9, 0x115c9,
+ 0x11641, 0x11642,
+ 0x12470, 0x12474,
+ 0x16a6e, 0x16a6f,
+ 0x16af5, 0x16af5,
+ 0x16b37, 0x16b39,
+ 0x16b44, 0x16b44,
+ 0x1bc9f, 0x1bc9f,
}; /* CR_Terminal_Punctuation */
/* 'Other_Math': Binary Property */
static const OnigCodePoint CR_Other_Math[] = {
- 133,
+ 134,
0x005e, 0x005e,
0x03d0, 0x03d2,
0x03d5, 0x03d5,
@@ -17423,6 +18933,7 @@ static const OnigCodePoint CR_Other_Math[] = {
0x21d5, 0x21db,
0x21dd, 0x21dd,
0x21e4, 0x21e5,
+ 0x2308, 0x230b,
0x23b4, 0x23b5,
0x23b7, 0x23b7,
0x23d0, 0x23d0,
@@ -17533,7 +19044,7 @@ static const OnigCodePoint CR_Hex_Digit[] = {
/* 'Other_Alphabetic': Binary Property */
static const OnigCodePoint CR_Other_Alphabetic[] = {
- 158,
+ 178,
0x0345, 0x0345,
0x05b0, 0x05bd,
0x05bf, 0x05bf,
@@ -17556,8 +19067,7 @@ static const OnigCodePoint CR_Other_Alphabetic[] = {
0x0825, 0x0827,
0x0829, 0x082c,
0x08e4, 0x08e9,
- 0x08f0, 0x08fe,
- 0x0900, 0x0903,
+ 0x08f0, 0x0903,
0x093a, 0x093b,
0x093e, 0x094c,
0x094e, 0x094f,
@@ -17592,19 +19102,19 @@ static const OnigCodePoint CR_Other_Alphabetic[] = {
0x0bc6, 0x0bc8,
0x0bca, 0x0bcc,
0x0bd7, 0x0bd7,
- 0x0c01, 0x0c03,
+ 0x0c00, 0x0c03,
0x0c3e, 0x0c44,
0x0c46, 0x0c48,
0x0c4a, 0x0c4c,
0x0c55, 0x0c56,
0x0c62, 0x0c63,
- 0x0c82, 0x0c83,
+ 0x0c81, 0x0c83,
0x0cbe, 0x0cc4,
0x0cc6, 0x0cc8,
0x0cca, 0x0ccc,
0x0cd5, 0x0cd6,
0x0ce2, 0x0ce3,
- 0x0d02, 0x0d03,
+ 0x0d01, 0x0d03,
0x0d3e, 0x0d44,
0x0d46, 0x0d48,
0x0d4a, 0x0d4c,
@@ -17657,6 +19167,7 @@ static const OnigCodePoint CR_Other_Alphabetic[] = {
0x1be7, 0x1bf1,
0x1c24, 0x1c35,
0x1cf2, 0x1cf3,
+ 0x1de7, 0x1df4,
0x24b6, 0x24e9,
0x2de0, 0x2dff,
0xa674, 0xa67b,
@@ -17679,6 +19190,7 @@ static const OnigCodePoint CR_Other_Alphabetic[] = {
0xaaf5, 0xaaf5,
0xabe3, 0xabea,
0xfb1e, 0xfb1e,
+ 0x10376, 0x1037a,
0x10a01, 0x10a03,
0x10a05, 0x10a06,
0x10a0c, 0x10a0f,
@@ -17690,8 +19202,27 @@ static const OnigCodePoint CR_Other_Alphabetic[] = {
0x11127, 0x11132,
0x11180, 0x11182,
0x111b3, 0x111bf,
+ 0x1122c, 0x11234,
+ 0x11237, 0x11237,
+ 0x112df, 0x112e8,
+ 0x11301, 0x11303,
+ 0x1133e, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134c,
+ 0x11357, 0x11357,
+ 0x11362, 0x11363,
+ 0x114b0, 0x114c1,
+ 0x115af, 0x115b5,
+ 0x115b8, 0x115be,
+ 0x11630, 0x1163e,
+ 0x11640, 0x11640,
0x116ab, 0x116b5,
+ 0x16b30, 0x16b36,
0x16f51, 0x16f7e,
+ 0x1bc9e, 0x1bc9e,
+ 0x1f130, 0x1f149,
+ 0x1f150, 0x1f169,
+ 0x1f170, 0x1f189,
}; /* CR_Other_Alphabetic */
/* 'Ideographic': Binary Property */
@@ -17712,7 +19243,7 @@ static const OnigCodePoint CR_Ideographic[] = {
/* 'Diacritic': Binary Property */
static const OnigCodePoint CR_Diacritic[] = {
- 125,
+ 145,
0x005e, 0x005e,
0x0060, 0x0060,
0x00a8, 0x00a8,
@@ -17781,6 +19312,7 @@ static const OnigCodePoint CR_Diacritic[] = {
0x1939, 0x193b,
0x1a75, 0x1a7c,
0x1a7f, 0x1a7f,
+ 0x1ab0, 0x1abd,
0x1b34, 0x1b34,
0x1b44, 0x1b44,
0x1b6b, 0x1b73,
@@ -17790,8 +19322,10 @@ static const OnigCodePoint CR_Diacritic[] = {
0x1cd0, 0x1ce8,
0x1ced, 0x1ced,
0x1cf4, 0x1cf4,
+ 0x1cf8, 0x1cf9,
0x1d2c, 0x1d6a,
0x1dc4, 0x1dcf,
+ 0x1df5, 0x1df5,
0x1dfd, 0x1dff,
0x1fbd, 0x1fbd,
0x1fbf, 0x1fc1,
@@ -17807,6 +19341,7 @@ static const OnigCodePoint CR_Diacritic[] = {
0xa66f, 0xa66f,
0xa67c, 0xa67d,
0xa67f, 0xa67f,
+ 0xa69c, 0xa69d,
0xa6f0, 0xa6f1,
0xa717, 0xa721,
0xa788, 0xa788,
@@ -17817,32 +19352,48 @@ static const OnigCodePoint CR_Diacritic[] = {
0xa953, 0xa953,
0xa9b3, 0xa9b3,
0xa9c0, 0xa9c0,
- 0xaa7b, 0xaa7b,
+ 0xa9e5, 0xa9e5,
+ 0xaa7b, 0xaa7d,
0xaabf, 0xaac2,
0xaaf6, 0xaaf6,
+ 0xab5b, 0xab5f,
0xabec, 0xabed,
0xfb1e, 0xfb1e,
- 0xfe20, 0xfe26,
+ 0xfe20, 0xfe2d,
0xff3e, 0xff3e,
0xff40, 0xff40,
0xff70, 0xff70,
0xff9e, 0xff9f,
0xffe3, 0xffe3,
+ 0x102e0, 0x102e0,
+ 0x10ae5, 0x10ae6,
0x110b9, 0x110ba,
0x11133, 0x11134,
+ 0x11173, 0x11173,
0x111c0, 0x111c0,
+ 0x11235, 0x11236,
+ 0x112e9, 0x112ea,
+ 0x1133c, 0x1133c,
+ 0x1134d, 0x1134d,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x114c2, 0x114c3,
+ 0x115bf, 0x115c0,
+ 0x1163f, 0x1163f,
0x116b6, 0x116b7,
+ 0x16af0, 0x16af4,
0x16f8f, 0x16f9f,
0x1d167, 0x1d169,
0x1d16d, 0x1d172,
0x1d17b, 0x1d182,
0x1d185, 0x1d18b,
0x1d1aa, 0x1d1ad,
+ 0x1e8d0, 0x1e8d6,
}; /* CR_Diacritic */
/* 'Extender': Binary Property */
static const OnigCodePoint CR_Extender[] = {
- 22,
+ 26,
0x00b7, 0x00b7,
0x02d0, 0x02d1,
0x0640, 0x0640,
@@ -17861,15 +19412,19 @@ static const OnigCodePoint CR_Extender[] = {
0xa015, 0xa015,
0xa60c, 0xa60c,
0xa9cf, 0xa9cf,
+ 0xa9e6, 0xa9e6,
0xaa70, 0xaa70,
0xaadd, 0xaadd,
0xaaf3, 0xaaf4,
0xff70, 0xff70,
+ 0x1135d, 0x1135d,
+ 0x115c6, 0x115c8,
+ 0x16b42, 0x16b43,
}; /* CR_Extender */
/* 'Other_Lowercase': Binary Property */
static const OnigCodePoint CR_Other_Lowercase[] = {
- 18,
+ 20,
0x00aa, 0x00aa,
0x00ba, 0x00ba,
0x02b0, 0x02b8,
@@ -17886,15 +19441,20 @@ static const OnigCodePoint CR_Other_Lowercase[] = {
0x2170, 0x217f,
0x24d0, 0x24e9,
0x2c7c, 0x2c7d,
+ 0xa69c, 0xa69d,
0xa770, 0xa770,
0xa7f8, 0xa7f9,
+ 0xab5c, 0xab5f,
}; /* CR_Other_Lowercase */
/* 'Other_Uppercase': Binary Property */
static const OnigCodePoint CR_Other_Uppercase[] = {
- 2,
+ 5,
0x2160, 0x216f,
0x24b6, 0x24cf,
+ 0x1f130, 0x1f149,
+ 0x1f150, 0x1f169,
+ 0x1f170, 0x1f189,
}; /* CR_Other_Uppercase */
/* 'Noncharacter_Code_Point': Binary Property */
@@ -17922,7 +19482,7 @@ static const OnigCodePoint CR_Noncharacter_Code_Point[] = {
/* 'Other_Grapheme_Extend': Binary Property */
static const OnigCodePoint CR_Other_Grapheme_Extend[] = {
- 17,
+ 22,
0x09be, 0x09be,
0x09d7, 0x09d7,
0x0b3e, 0x0b3e,
@@ -17938,6 +19498,11 @@ static const OnigCodePoint CR_Other_Grapheme_Extend[] = {
0x200c, 0x200d,
0x302e, 0x302f,
0xff9e, 0xff9f,
+ 0x1133e, 0x1133e,
+ 0x11357, 0x11357,
+ 0x114b0, 0x114b0,
+ 0x114bd, 0x114bd,
+ 0x115af, 0x115af,
0x1d165, 0x1d165,
0x1d16e, 0x1d172,
}; /* CR_Other_Grapheme_Extend */
@@ -17986,7 +19551,7 @@ static const OnigCodePoint CR_Other_Default_Ignorable_Code_Point[] = {
0x034f, 0x034f,
0x115f, 0x1160,
0x17b4, 0x17b5,
- 0x2065, 0x2069,
+ 0x2065, 0x2065,
0x3164, 0x3164,
0xffa0, 0xffa0,
0xfff0, 0xfff8,
@@ -18075,12 +19640,10 @@ static const OnigCodePoint CR_Other_ID_Continue[] = {
/* 'STerm': Binary Property */
static const OnigCodePoint CR_STerm[] = {
- 50,
+ 60,
0x0021, 0x0021,
0x002e, 0x002e,
0x003f, 0x003f,
- 0x055c, 0x055c,
- 0x055e, 0x055e,
0x0589, 0x0589,
0x061f, 0x061f,
0x06d4, 0x06d4,
@@ -18103,6 +19666,7 @@ static const OnigCodePoint CR_STerm[] = {
0x203c, 0x203d,
0x2047, 0x2049,
0x2e2e, 0x2e2e,
+ 0x2e3c, 0x2e3c,
0x3002, 0x3002,
0xa4ff, 0xa4ff,
0xa60e, 0xa60f,
@@ -18126,6 +19690,17 @@ static const OnigCodePoint CR_STerm[] = {
0x110be, 0x110c1,
0x11141, 0x11143,
0x111c5, 0x111c6,
+ 0x111cd, 0x111cd,
+ 0x11238, 0x11239,
+ 0x1123b, 0x1123c,
+ 0x115c2, 0x115c3,
+ 0x115c9, 0x115c9,
+ 0x11641, 0x11642,
+ 0x16a6e, 0x16a6f,
+ 0x16af5, 0x16af5,
+ 0x16b37, 0x16b38,
+ 0x16b44, 0x16b44,
+ 0x1bc9f, 0x1bc9f,
}; /* CR_STerm */
/* 'Variation_Selector': Binary Property */
@@ -18181,23 +19756,22 @@ static const OnigCodePoint CR_Pattern_Syntax[] = {
/* 'Unknown': Script */
static const OnigCodePoint CR_Unknown[] = {
- 537,
+ 598,
0x0378, 0x0379,
- 0x037f, 0x0383,
+ 0x0380, 0x0383,
0x038b, 0x038b,
0x038d, 0x038d,
0x03a2, 0x03a2,
- 0x0528, 0x0530,
+ 0x0530, 0x0530,
0x0557, 0x0558,
0x0560, 0x0560,
0x0588, 0x0588,
- 0x058b, 0x058e,
+ 0x058b, 0x058c,
0x0590, 0x0590,
0x05c8, 0x05cf,
0x05eb, 0x05ef,
0x05f5, 0x05ff,
- 0x0605, 0x0605,
- 0x061c, 0x061d,
+ 0x061d, 0x061d,
0x070e, 0x070e,
0x074b, 0x074c,
0x07b2, 0x07bf,
@@ -18206,11 +19780,7 @@ static const OnigCodePoint CR_Unknown[] = {
0x083f, 0x083f,
0x085c, 0x085d,
0x085f, 0x089f,
- 0x08a1, 0x08a1,
- 0x08ad, 0x08e3,
- 0x08ff, 0x08ff,
- 0x0978, 0x0978,
- 0x0980, 0x0980,
+ 0x08b3, 0x08e3,
0x0984, 0x0984,
0x098d, 0x098e,
0x0991, 0x0992,
@@ -18283,12 +19853,11 @@ static const OnigCodePoint CR_Unknown[] = {
0x0bce, 0x0bcf,
0x0bd1, 0x0bd6,
0x0bd8, 0x0be5,
- 0x0bfb, 0x0c00,
+ 0x0bfb, 0x0bff,
0x0c04, 0x0c04,
0x0c0d, 0x0c0d,
0x0c11, 0x0c11,
0x0c29, 0x0c29,
- 0x0c34, 0x0c34,
0x0c3a, 0x0c3c,
0x0c45, 0x0c45,
0x0c49, 0x0c49,
@@ -18297,7 +19866,7 @@ static const OnigCodePoint CR_Unknown[] = {
0x0c5a, 0x0c5f,
0x0c64, 0x0c65,
0x0c70, 0x0c77,
- 0x0c80, 0x0c81,
+ 0x0c80, 0x0c80,
0x0c84, 0x0c84,
0x0c8d, 0x0c8d,
0x0c91, 0x0c91,
@@ -18311,7 +19880,7 @@ static const OnigCodePoint CR_Unknown[] = {
0x0cdf, 0x0cdf,
0x0ce4, 0x0ce5,
0x0cf0, 0x0cf0,
- 0x0cf3, 0x0d01,
+ 0x0cf3, 0x0d00,
0x0d04, 0x0d04,
0x0d0d, 0x0d0d,
0x0d11, 0x0d11,
@@ -18332,7 +19901,8 @@ static const OnigCodePoint CR_Unknown[] = {
0x0dcb, 0x0dce,
0x0dd5, 0x0dd5,
0x0dd7, 0x0dd7,
- 0x0de0, 0x0df1,
+ 0x0de0, 0x0de5,
+ 0x0df0, 0x0df1,
0x0df5, 0x0e00,
0x0e3b, 0x0e3e,
0x0e5c, 0x0e80,
@@ -18383,7 +19953,7 @@ static const OnigCodePoint CR_Unknown[] = {
0x139a, 0x139f,
0x13f5, 0x13ff,
0x169d, 0x169f,
- 0x16f1, 0x16ff,
+ 0x16f9, 0x16ff,
0x170d, 0x170d,
0x1715, 0x171f,
0x1737, 0x173f,
@@ -18399,7 +19969,7 @@ static const OnigCodePoint CR_Unknown[] = {
0x1878, 0x187f,
0x18ab, 0x18af,
0x18f6, 0x18ff,
- 0x191d, 0x191f,
+ 0x191f, 0x191f,
0x192c, 0x192f,
0x193c, 0x193f,
0x1941, 0x1943,
@@ -18413,7 +19983,8 @@ static const OnigCodePoint CR_Unknown[] = {
0x1a7d, 0x1a7e,
0x1a8a, 0x1a8f,
0x1a9a, 0x1a9f,
- 0x1aae, 0x1aff,
+ 0x1aae, 0x1aaf,
+ 0x1abf, 0x1aff,
0x1b4c, 0x1b4f,
0x1b7d, 0x1b7f,
0x1bf4, 0x1bfb,
@@ -18421,8 +19992,9 @@ static const OnigCodePoint CR_Unknown[] = {
0x1c4a, 0x1c4c,
0x1c80, 0x1cbf,
0x1cc8, 0x1ccf,
- 0x1cf7, 0x1cff,
- 0x1de7, 0x1dfb,
+ 0x1cf7, 0x1cf7,
+ 0x1cfa, 0x1cff,
+ 0x1df6, 0x1dfb,
0x1f16, 0x1f17,
0x1f1e, 0x1f1f,
0x1f46, 0x1f47,
@@ -18439,19 +20011,21 @@ static const OnigCodePoint CR_Unknown[] = {
0x1ff0, 0x1ff1,
0x1ff5, 0x1ff5,
0x1fff, 0x1fff,
- 0x2065, 0x2069,
+ 0x2065, 0x2065,
0x2072, 0x2073,
0x208f, 0x208f,
0x209d, 0x209f,
- 0x20ba, 0x20cf,
+ 0x20be, 0x20cf,
0x20f1, 0x20ff,
0x218a, 0x218f,
- 0x23f4, 0x23ff,
+ 0x23fb, 0x23ff,
0x2427, 0x243f,
0x244b, 0x245f,
- 0x2700, 0x2700,
- 0x2b4d, 0x2b4f,
- 0x2b5a, 0x2bff,
+ 0x2b74, 0x2b75,
+ 0x2b96, 0x2b97,
+ 0x2bba, 0x2bbc,
+ 0x2bc9, 0x2bc9,
+ 0x2bd2, 0x2bff,
0x2c2f, 0x2c2f,
0x2c5f, 0x2c5f,
0x2cf4, 0x2cf8,
@@ -18469,7 +20043,7 @@ static const OnigCodePoint CR_Unknown[] = {
0x2dcf, 0x2dcf,
0x2dd7, 0x2dd7,
0x2ddf, 0x2ddf,
- 0x2e3c, 0x2e7f,
+ 0x2e43, 0x2e7f,
0x2e9a, 0x2e9a,
0x2ef4, 0x2eff,
0x2fd6, 0x2fef,
@@ -18488,11 +20062,11 @@ static const OnigCodePoint CR_Unknown[] = {
0xa48d, 0xa48f,
0xa4c7, 0xa4cf,
0xa62c, 0xa63f,
- 0xa698, 0xa69e,
+ 0xa69e, 0xa69e,
0xa6f8, 0xa6ff,
0xa78f, 0xa78f,
- 0xa794, 0xa79f,
- 0xa7ab, 0xa7f7,
+ 0xa7ae, 0xa7af,
+ 0xa7b2, 0xa7f6,
0xa82c, 0xa82f,
0xa83a, 0xa83f,
0xa878, 0xa87f,
@@ -18503,18 +20077,19 @@ static const OnigCodePoint CR_Unknown[] = {
0xa97d, 0xa97f,
0xa9ce, 0xa9ce,
0xa9da, 0xa9dd,
- 0xa9e0, 0xa9ff,
+ 0xa9ff, 0xa9ff,
0xaa37, 0xaa3f,
0xaa4e, 0xaa4f,
0xaa5a, 0xaa5b,
- 0xaa7c, 0xaa7f,
0xaac3, 0xaada,
0xaaf7, 0xab00,
0xab07, 0xab08,
0xab0f, 0xab10,
0xab17, 0xab1f,
0xab27, 0xab27,
- 0xab2f, 0xabbf,
+ 0xab2f, 0xab2f,
+ 0xab60, 0xab63,
+ 0xab66, 0xabbf,
0xabee, 0xabef,
0xabfa, 0xabff,
0xd7a4, 0xd7af,
@@ -18535,7 +20110,7 @@ static const OnigCodePoint CR_Unknown[] = {
0xfdc8, 0xfdef,
0xfdfe, 0xfdff,
0xfe1a, 0xfe1f,
- 0xfe27, 0xfe2f,
+ 0xfe2e, 0xfe2f,
0xfe53, 0xfe53,
0xfe67, 0xfe67,
0xfe6c, 0xfe6f,
@@ -18559,26 +20134,35 @@ static const OnigCodePoint CR_Unknown[] = {
0x100fb, 0x100ff,
0x10103, 0x10106,
0x10134, 0x10136,
- 0x1018b, 0x1018f,
- 0x1019c, 0x101cf,
+ 0x1018d, 0x1018f,
+ 0x1019c, 0x1019f,
+ 0x101a1, 0x101cf,
0x101fe, 0x1027f,
0x1029d, 0x1029f,
- 0x102d1, 0x102ff,
- 0x1031f, 0x1031f,
+ 0x102d1, 0x102df,
+ 0x102fc, 0x102ff,
0x10324, 0x1032f,
- 0x1034b, 0x1037f,
+ 0x1034b, 0x1034f,
+ 0x1037b, 0x1037f,
0x1039e, 0x1039e,
0x103c4, 0x103c7,
0x103d6, 0x103ff,
0x1049e, 0x1049f,
- 0x104aa, 0x107ff,
+ 0x104aa, 0x104ff,
+ 0x10528, 0x1052f,
+ 0x10564, 0x1056e,
+ 0x10570, 0x105ff,
+ 0x10737, 0x1073f,
+ 0x10756, 0x1075f,
+ 0x10768, 0x107ff,
0x10806, 0x10807,
0x10809, 0x10809,
0x10836, 0x10836,
0x10839, 0x1083b,
0x1083d, 0x1083e,
0x10856, 0x10856,
- 0x10860, 0x108ff,
+ 0x1089f, 0x108a6,
+ 0x108b0, 0x108ff,
0x1091c, 0x1091e,
0x1093a, 0x1093e,
0x10940, 0x1097f,
@@ -18592,33 +20176,82 @@ static const OnigCodePoint CR_Unknown[] = {
0x10a3b, 0x10a3e,
0x10a48, 0x10a4f,
0x10a59, 0x10a5f,
- 0x10a80, 0x10aff,
+ 0x10aa0, 0x10abf,
+ 0x10ae7, 0x10aea,
+ 0x10af7, 0x10aff,
0x10b36, 0x10b38,
0x10b56, 0x10b57,
0x10b73, 0x10b77,
- 0x10b80, 0x10bff,
+ 0x10b92, 0x10b98,
+ 0x10b9d, 0x10ba8,
+ 0x10bb0, 0x10bff,
0x10c49, 0x10e5f,
0x10e7f, 0x10fff,
0x1104e, 0x11051,
- 0x11070, 0x1107f,
+ 0x11070, 0x1107e,
0x110c2, 0x110cf,
0x110e9, 0x110ef,
0x110fa, 0x110ff,
0x11135, 0x11135,
- 0x11144, 0x1117f,
- 0x111c9, 0x111cf,
- 0x111da, 0x1167f,
+ 0x11144, 0x1114f,
+ 0x11177, 0x1117f,
+ 0x111c9, 0x111cc,
+ 0x111ce, 0x111cf,
+ 0x111db, 0x111e0,
+ 0x111f5, 0x111ff,
+ 0x11212, 0x11212,
+ 0x1123e, 0x112af,
+ 0x112eb, 0x112ef,
+ 0x112fa, 0x11300,
+ 0x11304, 0x11304,
+ 0x1130d, 0x1130e,
+ 0x11311, 0x11312,
+ 0x11329, 0x11329,
+ 0x11331, 0x11331,
+ 0x11334, 0x11334,
+ 0x1133a, 0x1133b,
+ 0x11345, 0x11346,
+ 0x11349, 0x1134a,
+ 0x1134e, 0x11356,
+ 0x11358, 0x1135c,
+ 0x11364, 0x11365,
+ 0x1136d, 0x1136f,
+ 0x11375, 0x1147f,
+ 0x114c8, 0x114cf,
+ 0x114da, 0x1157f,
+ 0x115b6, 0x115b7,
+ 0x115ca, 0x115ff,
+ 0x11645, 0x1164f,
+ 0x1165a, 0x1167f,
0x116b8, 0x116bf,
- 0x116ca, 0x11fff,
- 0x1236f, 0x123ff,
- 0x12463, 0x1246f,
- 0x12474, 0x12fff,
+ 0x116ca, 0x1189f,
+ 0x118f3, 0x118fe,
+ 0x11900, 0x11abf,
+ 0x11af9, 0x11fff,
+ 0x12399, 0x123ff,
+ 0x1246f, 0x1246f,
+ 0x12475, 0x12fff,
0x1342f, 0x167ff,
- 0x16a39, 0x16eff,
+ 0x16a39, 0x16a3f,
+ 0x16a5f, 0x16a5f,
+ 0x16a6a, 0x16a6d,
+ 0x16a70, 0x16acf,
+ 0x16aee, 0x16aef,
+ 0x16af6, 0x16aff,
+ 0x16b46, 0x16b4f,
+ 0x16b5a, 0x16b5a,
+ 0x16b62, 0x16b62,
+ 0x16b78, 0x16b7c,
+ 0x16b90, 0x16eff,
0x16f45, 0x16f4f,
0x16f7f, 0x16f8e,
0x16fa0, 0x1afff,
- 0x1b002, 0x1cfff,
+ 0x1b002, 0x1bbff,
+ 0x1bc6b, 0x1bc6f,
+ 0x1bc7d, 0x1bc7f,
+ 0x1bc89, 0x1bc8f,
+ 0x1bc9a, 0x1bc9b,
+ 0x1bca4, 0x1cfff,
0x1d0f6, 0x1d0ff,
0x1d127, 0x1d128,
0x1d1de, 0x1d1ff,
@@ -18645,7 +20278,9 @@ static const OnigCodePoint CR_Unknown[] = {
0x1d551, 0x1d551,
0x1d6a6, 0x1d6a7,
0x1d7cc, 0x1d7cd,
- 0x1d800, 0x1edff,
+ 0x1d800, 0x1e7ff,
+ 0x1e8c5, 0x1e8c6,
+ 0x1e8d7, 0x1edff,
0x1ee04, 0x1ee04,
0x1ee20, 0x1ee20,
0x1ee23, 0x1ee23,
@@ -18683,10 +20318,10 @@ static const OnigCodePoint CR_Unknown[] = {
0x1f02c, 0x1f02f,
0x1f094, 0x1f09f,
0x1f0af, 0x1f0b0,
- 0x1f0bf, 0x1f0c0,
+ 0x1f0c0, 0x1f0c0,
0x1f0d0, 0x1f0d0,
- 0x1f0e0, 0x1f0ff,
- 0x1f10b, 0x1f10f,
+ 0x1f0f6, 0x1f0ff,
+ 0x1f10d, 0x1f10f,
0x1f12f, 0x1f12f,
0x1f16c, 0x1f16f,
0x1f19b, 0x1f1e5,
@@ -18694,24 +20329,25 @@ static const OnigCodePoint CR_Unknown[] = {
0x1f23b, 0x1f23f,
0x1f249, 0x1f24f,
0x1f252, 0x1f2ff,
- 0x1f321, 0x1f32f,
- 0x1f336, 0x1f336,
- 0x1f37d, 0x1f37f,
- 0x1f394, 0x1f39f,
- 0x1f3c5, 0x1f3c5,
- 0x1f3cb, 0x1f3df,
- 0x1f3f1, 0x1f3ff,
- 0x1f43f, 0x1f43f,
- 0x1f441, 0x1f441,
- 0x1f4f8, 0x1f4f8,
- 0x1f4fd, 0x1f4ff,
- 0x1f53e, 0x1f53f,
- 0x1f544, 0x1f54f,
- 0x1f568, 0x1f5fa,
- 0x1f641, 0x1f644,
- 0x1f650, 0x1f67f,
- 0x1f6c6, 0x1f6ff,
- 0x1f774, 0x1ffff,
+ 0x1f32d, 0x1f32f,
+ 0x1f37e, 0x1f37f,
+ 0x1f3cf, 0x1f3d3,
+ 0x1f3f8, 0x1f3ff,
+ 0x1f4ff, 0x1f4ff,
+ 0x1f54b, 0x1f54f,
+ 0x1f57a, 0x1f57a,
+ 0x1f5a4, 0x1f5a4,
+ 0x1f643, 0x1f644,
+ 0x1f6d0, 0x1f6df,
+ 0x1f6ed, 0x1f6ef,
+ 0x1f6f4, 0x1f6ff,
+ 0x1f774, 0x1f77f,
+ 0x1f7d5, 0x1f7ff,
+ 0x1f80c, 0x1f80f,
+ 0x1f848, 0x1f84f,
+ 0x1f85a, 0x1f85f,
+ 0x1f888, 0x1f88f,
+ 0x1f8ae, 0x1ffff,
0x2a6d7, 0x2a6ff,
0x2b735, 0x2b73f,
0x2b81e, 0x2f7ff,
@@ -18721,6 +20357,7 @@ static const OnigCodePoint CR_Unknown[] = {
0xe01f0, 0x10ffff,
}; /* CR_Unknown */
+#ifdef USE_UNICODE_AGE_PROPERTIES
/* 'Age_1_1': Derived Age 1.1 */
static const OnigCodePoint CR_Age_1_1[] = {
288,
@@ -24158,6 +25795,1730 @@ static const OnigCodePoint CR_Age_6_1[] = {
0xefffe, 0x10ffff,
}; /* CR_Age_6_1 */
+/* 'Age_6_2': Derived Age 6.2 */
+static const OnigCodePoint CR_Age_6_2[] = {
+ 549,
+ 0x0000, 0x0377,
+ 0x037a, 0x037e,
+ 0x0384, 0x038a,
+ 0x038c, 0x038c,
+ 0x038e, 0x03a1,
+ 0x03a3, 0x0527,
+ 0x0531, 0x0556,
+ 0x0559, 0x055f,
+ 0x0561, 0x0587,
+ 0x0589, 0x058a,
+ 0x058f, 0x058f,
+ 0x0591, 0x05c7,
+ 0x05d0, 0x05ea,
+ 0x05f0, 0x05f4,
+ 0x0600, 0x0604,
+ 0x0606, 0x061b,
+ 0x061e, 0x070d,
+ 0x070f, 0x074a,
+ 0x074d, 0x07b1,
+ 0x07c0, 0x07fa,
+ 0x0800, 0x082d,
+ 0x0830, 0x083e,
+ 0x0840, 0x085b,
+ 0x085e, 0x085e,
+ 0x08a0, 0x08a0,
+ 0x08a2, 0x08ac,
+ 0x08e4, 0x08fe,
+ 0x0900, 0x0977,
+ 0x0979, 0x097f,
+ 0x0981, 0x0983,
+ 0x0985, 0x098c,
+ 0x098f, 0x0990,
+ 0x0993, 0x09a8,
+ 0x09aa, 0x09b0,
+ 0x09b2, 0x09b2,
+ 0x09b6, 0x09b9,
+ 0x09bc, 0x09c4,
+ 0x09c7, 0x09c8,
+ 0x09cb, 0x09ce,
+ 0x09d7, 0x09d7,
+ 0x09dc, 0x09dd,
+ 0x09df, 0x09e3,
+ 0x09e6, 0x09fb,
+ 0x0a01, 0x0a03,
+ 0x0a05, 0x0a0a,
+ 0x0a0f, 0x0a10,
+ 0x0a13, 0x0a28,
+ 0x0a2a, 0x0a30,
+ 0x0a32, 0x0a33,
+ 0x0a35, 0x0a36,
+ 0x0a38, 0x0a39,
+ 0x0a3c, 0x0a3c,
+ 0x0a3e, 0x0a42,
+ 0x0a47, 0x0a48,
+ 0x0a4b, 0x0a4d,
+ 0x0a51, 0x0a51,
+ 0x0a59, 0x0a5c,
+ 0x0a5e, 0x0a5e,
+ 0x0a66, 0x0a75,
+ 0x0a81, 0x0a83,
+ 0x0a85, 0x0a8d,
+ 0x0a8f, 0x0a91,
+ 0x0a93, 0x0aa8,
+ 0x0aaa, 0x0ab0,
+ 0x0ab2, 0x0ab3,
+ 0x0ab5, 0x0ab9,
+ 0x0abc, 0x0ac5,
+ 0x0ac7, 0x0ac9,
+ 0x0acb, 0x0acd,
+ 0x0ad0, 0x0ad0,
+ 0x0ae0, 0x0ae3,
+ 0x0ae6, 0x0af1,
+ 0x0b01, 0x0b03,
+ 0x0b05, 0x0b0c,
+ 0x0b0f, 0x0b10,
+ 0x0b13, 0x0b28,
+ 0x0b2a, 0x0b30,
+ 0x0b32, 0x0b33,
+ 0x0b35, 0x0b39,
+ 0x0b3c, 0x0b44,
+ 0x0b47, 0x0b48,
+ 0x0b4b, 0x0b4d,
+ 0x0b56, 0x0b57,
+ 0x0b5c, 0x0b5d,
+ 0x0b5f, 0x0b63,
+ 0x0b66, 0x0b77,
+ 0x0b82, 0x0b83,
+ 0x0b85, 0x0b8a,
+ 0x0b8e, 0x0b90,
+ 0x0b92, 0x0b95,
+ 0x0b99, 0x0b9a,
+ 0x0b9c, 0x0b9c,
+ 0x0b9e, 0x0b9f,
+ 0x0ba3, 0x0ba4,
+ 0x0ba8, 0x0baa,
+ 0x0bae, 0x0bb9,
+ 0x0bbe, 0x0bc2,
+ 0x0bc6, 0x0bc8,
+ 0x0bca, 0x0bcd,
+ 0x0bd0, 0x0bd0,
+ 0x0bd7, 0x0bd7,
+ 0x0be6, 0x0bfa,
+ 0x0c01, 0x0c03,
+ 0x0c05, 0x0c0c,
+ 0x0c0e, 0x0c10,
+ 0x0c12, 0x0c28,
+ 0x0c2a, 0x0c33,
+ 0x0c35, 0x0c39,
+ 0x0c3d, 0x0c44,
+ 0x0c46, 0x0c48,
+ 0x0c4a, 0x0c4d,
+ 0x0c55, 0x0c56,
+ 0x0c58, 0x0c59,
+ 0x0c60, 0x0c63,
+ 0x0c66, 0x0c6f,
+ 0x0c78, 0x0c7f,
+ 0x0c82, 0x0c83,
+ 0x0c85, 0x0c8c,
+ 0x0c8e, 0x0c90,
+ 0x0c92, 0x0ca8,
+ 0x0caa, 0x0cb3,
+ 0x0cb5, 0x0cb9,
+ 0x0cbc, 0x0cc4,
+ 0x0cc6, 0x0cc8,
+ 0x0cca, 0x0ccd,
+ 0x0cd5, 0x0cd6,
+ 0x0cde, 0x0cde,
+ 0x0ce0, 0x0ce3,
+ 0x0ce6, 0x0cef,
+ 0x0cf1, 0x0cf2,
+ 0x0d02, 0x0d03,
+ 0x0d05, 0x0d0c,
+ 0x0d0e, 0x0d10,
+ 0x0d12, 0x0d3a,
+ 0x0d3d, 0x0d44,
+ 0x0d46, 0x0d48,
+ 0x0d4a, 0x0d4e,
+ 0x0d57, 0x0d57,
+ 0x0d60, 0x0d63,
+ 0x0d66, 0x0d75,
+ 0x0d79, 0x0d7f,
+ 0x0d82, 0x0d83,
+ 0x0d85, 0x0d96,
+ 0x0d9a, 0x0db1,
+ 0x0db3, 0x0dbb,
+ 0x0dbd, 0x0dbd,
+ 0x0dc0, 0x0dc6,
+ 0x0dca, 0x0dca,
+ 0x0dcf, 0x0dd4,
+ 0x0dd6, 0x0dd6,
+ 0x0dd8, 0x0ddf,
+ 0x0df2, 0x0df4,
+ 0x0e01, 0x0e3a,
+ 0x0e3f, 0x0e5b,
+ 0x0e81, 0x0e82,
+ 0x0e84, 0x0e84,
+ 0x0e87, 0x0e88,
+ 0x0e8a, 0x0e8a,
+ 0x0e8d, 0x0e8d,
+ 0x0e94, 0x0e97,
+ 0x0e99, 0x0e9f,
+ 0x0ea1, 0x0ea3,
+ 0x0ea5, 0x0ea5,
+ 0x0ea7, 0x0ea7,
+ 0x0eaa, 0x0eab,
+ 0x0ead, 0x0eb9,
+ 0x0ebb, 0x0ebd,
+ 0x0ec0, 0x0ec4,
+ 0x0ec6, 0x0ec6,
+ 0x0ec8, 0x0ecd,
+ 0x0ed0, 0x0ed9,
+ 0x0edc, 0x0edf,
+ 0x0f00, 0x0f47,
+ 0x0f49, 0x0f6c,
+ 0x0f71, 0x0f97,
+ 0x0f99, 0x0fbc,
+ 0x0fbe, 0x0fcc,
+ 0x0fce, 0x0fda,
+ 0x1000, 0x10c5,
+ 0x10c7, 0x10c7,
+ 0x10cd, 0x10cd,
+ 0x10d0, 0x1248,
+ 0x124a, 0x124d,
+ 0x1250, 0x1256,
+ 0x1258, 0x1258,
+ 0x125a, 0x125d,
+ 0x1260, 0x1288,
+ 0x128a, 0x128d,
+ 0x1290, 0x12b0,
+ 0x12b2, 0x12b5,
+ 0x12b8, 0x12be,
+ 0x12c0, 0x12c0,
+ 0x12c2, 0x12c5,
+ 0x12c8, 0x12d6,
+ 0x12d8, 0x1310,
+ 0x1312, 0x1315,
+ 0x1318, 0x135a,
+ 0x135d, 0x137c,
+ 0x1380, 0x1399,
+ 0x13a0, 0x13f4,
+ 0x1400, 0x169c,
+ 0x16a0, 0x16f0,
+ 0x1700, 0x170c,
+ 0x170e, 0x1714,
+ 0x1720, 0x1736,
+ 0x1740, 0x1753,
+ 0x1760, 0x176c,
+ 0x176e, 0x1770,
+ 0x1772, 0x1773,
+ 0x1780, 0x17dd,
+ 0x17e0, 0x17e9,
+ 0x17f0, 0x17f9,
+ 0x1800, 0x180e,
+ 0x1810, 0x1819,
+ 0x1820, 0x1877,
+ 0x1880, 0x18aa,
+ 0x18b0, 0x18f5,
+ 0x1900, 0x191c,
+ 0x1920, 0x192b,
+ 0x1930, 0x193b,
+ 0x1940, 0x1940,
+ 0x1944, 0x196d,
+ 0x1970, 0x1974,
+ 0x1980, 0x19ab,
+ 0x19b0, 0x19c9,
+ 0x19d0, 0x19da,
+ 0x19de, 0x1a1b,
+ 0x1a1e, 0x1a5e,
+ 0x1a60, 0x1a7c,
+ 0x1a7f, 0x1a89,
+ 0x1a90, 0x1a99,
+ 0x1aa0, 0x1aad,
+ 0x1b00, 0x1b4b,
+ 0x1b50, 0x1b7c,
+ 0x1b80, 0x1bf3,
+ 0x1bfc, 0x1c37,
+ 0x1c3b, 0x1c49,
+ 0x1c4d, 0x1c7f,
+ 0x1cc0, 0x1cc7,
+ 0x1cd0, 0x1cf6,
+ 0x1d00, 0x1de6,
+ 0x1dfc, 0x1f15,
+ 0x1f18, 0x1f1d,
+ 0x1f20, 0x1f45,
+ 0x1f48, 0x1f4d,
+ 0x1f50, 0x1f57,
+ 0x1f59, 0x1f59,
+ 0x1f5b, 0x1f5b,
+ 0x1f5d, 0x1f5d,
+ 0x1f5f, 0x1f7d,
+ 0x1f80, 0x1fb4,
+ 0x1fb6, 0x1fc4,
+ 0x1fc6, 0x1fd3,
+ 0x1fd6, 0x1fdb,
+ 0x1fdd, 0x1fef,
+ 0x1ff2, 0x1ff4,
+ 0x1ff6, 0x1ffe,
+ 0x2000, 0x2064,
+ 0x206a, 0x2071,
+ 0x2074, 0x208e,
+ 0x2090, 0x209c,
+ 0x20a0, 0x20ba,
+ 0x20d0, 0x20f0,
+ 0x2100, 0x2189,
+ 0x2190, 0x23f3,
+ 0x2400, 0x2426,
+ 0x2440, 0x244a,
+ 0x2460, 0x26ff,
+ 0x2701, 0x2b4c,
+ 0x2b50, 0x2b59,
+ 0x2c00, 0x2c2e,
+ 0x2c30, 0x2c5e,
+ 0x2c60, 0x2cf3,
+ 0x2cf9, 0x2d25,
+ 0x2d27, 0x2d27,
+ 0x2d2d, 0x2d2d,
+ 0x2d30, 0x2d67,
+ 0x2d6f, 0x2d70,
+ 0x2d7f, 0x2d96,
+ 0x2da0, 0x2da6,
+ 0x2da8, 0x2dae,
+ 0x2db0, 0x2db6,
+ 0x2db8, 0x2dbe,
+ 0x2dc0, 0x2dc6,
+ 0x2dc8, 0x2dce,
+ 0x2dd0, 0x2dd6,
+ 0x2dd8, 0x2dde,
+ 0x2de0, 0x2e3b,
+ 0x2e80, 0x2e99,
+ 0x2e9b, 0x2ef3,
+ 0x2f00, 0x2fd5,
+ 0x2ff0, 0x2ffb,
+ 0x3000, 0x303f,
+ 0x3041, 0x3096,
+ 0x3099, 0x30ff,
+ 0x3105, 0x312d,
+ 0x3131, 0x318e,
+ 0x3190, 0x31ba,
+ 0x31c0, 0x31e3,
+ 0x31f0, 0x321e,
+ 0x3220, 0x32fe,
+ 0x3300, 0x4db5,
+ 0x4dc0, 0x9fcc,
+ 0xa000, 0xa48c,
+ 0xa490, 0xa4c6,
+ 0xa4d0, 0xa62b,
+ 0xa640, 0xa697,
+ 0xa69f, 0xa6f7,
+ 0xa700, 0xa78e,
+ 0xa790, 0xa793,
+ 0xa7a0, 0xa7aa,
+ 0xa7f8, 0xa82b,
+ 0xa830, 0xa839,
+ 0xa840, 0xa877,
+ 0xa880, 0xa8c4,
+ 0xa8ce, 0xa8d9,
+ 0xa8e0, 0xa8fb,
+ 0xa900, 0xa953,
+ 0xa95f, 0xa97c,
+ 0xa980, 0xa9cd,
+ 0xa9cf, 0xa9d9,
+ 0xa9de, 0xa9df,
+ 0xaa00, 0xaa36,
+ 0xaa40, 0xaa4d,
+ 0xaa50, 0xaa59,
+ 0xaa5c, 0xaa7b,
+ 0xaa80, 0xaac2,
+ 0xaadb, 0xaaf6,
+ 0xab01, 0xab06,
+ 0xab09, 0xab0e,
+ 0xab11, 0xab16,
+ 0xab20, 0xab26,
+ 0xab28, 0xab2e,
+ 0xabc0, 0xabed,
+ 0xabf0, 0xabf9,
+ 0xac00, 0xd7a3,
+ 0xd7b0, 0xd7c6,
+ 0xd7cb, 0xd7fb,
+ 0xd800, 0xfa6d,
+ 0xfa70, 0xfad9,
+ 0xfb00, 0xfb06,
+ 0xfb13, 0xfb17,
+ 0xfb1d, 0xfb36,
+ 0xfb38, 0xfb3c,
+ 0xfb3e, 0xfb3e,
+ 0xfb40, 0xfb41,
+ 0xfb43, 0xfb44,
+ 0xfb46, 0xfbc1,
+ 0xfbd3, 0xfd3f,
+ 0xfd50, 0xfd8f,
+ 0xfd92, 0xfdc7,
+ 0xfdd0, 0xfdfd,
+ 0xfe00, 0xfe19,
+ 0xfe20, 0xfe26,
+ 0xfe30, 0xfe52,
+ 0xfe54, 0xfe66,
+ 0xfe68, 0xfe6b,
+ 0xfe70, 0xfe74,
+ 0xfe76, 0xfefc,
+ 0xfeff, 0xfeff,
+ 0xff01, 0xffbe,
+ 0xffc2, 0xffc7,
+ 0xffca, 0xffcf,
+ 0xffd2, 0xffd7,
+ 0xffda, 0xffdc,
+ 0xffe0, 0xffe6,
+ 0xffe8, 0xffee,
+ 0xfff9, 0x1000b,
+ 0x1000d, 0x10026,
+ 0x10028, 0x1003a,
+ 0x1003c, 0x1003d,
+ 0x1003f, 0x1004d,
+ 0x10050, 0x1005d,
+ 0x10080, 0x100fa,
+ 0x10100, 0x10102,
+ 0x10107, 0x10133,
+ 0x10137, 0x1018a,
+ 0x10190, 0x1019b,
+ 0x101d0, 0x101fd,
+ 0x10280, 0x1029c,
+ 0x102a0, 0x102d0,
+ 0x10300, 0x1031e,
+ 0x10320, 0x10323,
+ 0x10330, 0x1034a,
+ 0x10380, 0x1039d,
+ 0x1039f, 0x103c3,
+ 0x103c8, 0x103d5,
+ 0x10400, 0x1049d,
+ 0x104a0, 0x104a9,
+ 0x10800, 0x10805,
+ 0x10808, 0x10808,
+ 0x1080a, 0x10835,
+ 0x10837, 0x10838,
+ 0x1083c, 0x1083c,
+ 0x1083f, 0x10855,
+ 0x10857, 0x1085f,
+ 0x10900, 0x1091b,
+ 0x1091f, 0x10939,
+ 0x1093f, 0x1093f,
+ 0x10980, 0x109b7,
+ 0x109be, 0x109bf,
+ 0x10a00, 0x10a03,
+ 0x10a05, 0x10a06,
+ 0x10a0c, 0x10a13,
+ 0x10a15, 0x10a17,
+ 0x10a19, 0x10a33,
+ 0x10a38, 0x10a3a,
+ 0x10a3f, 0x10a47,
+ 0x10a50, 0x10a58,
+ 0x10a60, 0x10a7f,
+ 0x10b00, 0x10b35,
+ 0x10b39, 0x10b55,
+ 0x10b58, 0x10b72,
+ 0x10b78, 0x10b7f,
+ 0x10c00, 0x10c48,
+ 0x10e60, 0x10e7e,
+ 0x11000, 0x1104d,
+ 0x11052, 0x1106f,
+ 0x11080, 0x110c1,
+ 0x110d0, 0x110e8,
+ 0x110f0, 0x110f9,
+ 0x11100, 0x11134,
+ 0x11136, 0x11143,
+ 0x11180, 0x111c8,
+ 0x111d0, 0x111d9,
+ 0x11680, 0x116b7,
+ 0x116c0, 0x116c9,
+ 0x12000, 0x1236e,
+ 0x12400, 0x12462,
+ 0x12470, 0x12473,
+ 0x13000, 0x1342e,
+ 0x16800, 0x16a38,
+ 0x16f00, 0x16f44,
+ 0x16f50, 0x16f7e,
+ 0x16f8f, 0x16f9f,
+ 0x1b000, 0x1b001,
+ 0x1d000, 0x1d0f5,
+ 0x1d100, 0x1d126,
+ 0x1d129, 0x1d1dd,
+ 0x1d200, 0x1d245,
+ 0x1d300, 0x1d356,
+ 0x1d360, 0x1d371,
+ 0x1d400, 0x1d454,
+ 0x1d456, 0x1d49c,
+ 0x1d49e, 0x1d49f,
+ 0x1d4a2, 0x1d4a2,
+ 0x1d4a5, 0x1d4a6,
+ 0x1d4a9, 0x1d4ac,
+ 0x1d4ae, 0x1d4b9,
+ 0x1d4bb, 0x1d4bb,
+ 0x1d4bd, 0x1d4c3,
+ 0x1d4c5, 0x1d505,
+ 0x1d507, 0x1d50a,
+ 0x1d50d, 0x1d514,
+ 0x1d516, 0x1d51c,
+ 0x1d51e, 0x1d539,
+ 0x1d53b, 0x1d53e,
+ 0x1d540, 0x1d544,
+ 0x1d546, 0x1d546,
+ 0x1d54a, 0x1d550,
+ 0x1d552, 0x1d6a5,
+ 0x1d6a8, 0x1d7cb,
+ 0x1d7ce, 0x1d7ff,
+ 0x1ee00, 0x1ee03,
+ 0x1ee05, 0x1ee1f,
+ 0x1ee21, 0x1ee22,
+ 0x1ee24, 0x1ee24,
+ 0x1ee27, 0x1ee27,
+ 0x1ee29, 0x1ee32,
+ 0x1ee34, 0x1ee37,
+ 0x1ee39, 0x1ee39,
+ 0x1ee3b, 0x1ee3b,
+ 0x1ee42, 0x1ee42,
+ 0x1ee47, 0x1ee47,
+ 0x1ee49, 0x1ee49,
+ 0x1ee4b, 0x1ee4b,
+ 0x1ee4d, 0x1ee4f,
+ 0x1ee51, 0x1ee52,
+ 0x1ee54, 0x1ee54,
+ 0x1ee57, 0x1ee57,
+ 0x1ee59, 0x1ee59,
+ 0x1ee5b, 0x1ee5b,
+ 0x1ee5d, 0x1ee5d,
+ 0x1ee5f, 0x1ee5f,
+ 0x1ee61, 0x1ee62,
+ 0x1ee64, 0x1ee64,
+ 0x1ee67, 0x1ee6a,
+ 0x1ee6c, 0x1ee72,
+ 0x1ee74, 0x1ee77,
+ 0x1ee79, 0x1ee7c,
+ 0x1ee7e, 0x1ee7e,
+ 0x1ee80, 0x1ee89,
+ 0x1ee8b, 0x1ee9b,
+ 0x1eea1, 0x1eea3,
+ 0x1eea5, 0x1eea9,
+ 0x1eeab, 0x1eebb,
+ 0x1eef0, 0x1eef1,
+ 0x1f000, 0x1f02b,
+ 0x1f030, 0x1f093,
+ 0x1f0a0, 0x1f0ae,
+ 0x1f0b1, 0x1f0be,
+ 0x1f0c1, 0x1f0cf,
+ 0x1f0d1, 0x1f0df,
+ 0x1f100, 0x1f10a,
+ 0x1f110, 0x1f12e,
+ 0x1f130, 0x1f16b,
+ 0x1f170, 0x1f19a,
+ 0x1f1e6, 0x1f202,
+ 0x1f210, 0x1f23a,
+ 0x1f240, 0x1f248,
+ 0x1f250, 0x1f251,
+ 0x1f300, 0x1f320,
+ 0x1f330, 0x1f335,
+ 0x1f337, 0x1f37c,
+ 0x1f380, 0x1f393,
+ 0x1f3a0, 0x1f3c4,
+ 0x1f3c6, 0x1f3ca,
+ 0x1f3e0, 0x1f3f0,
+ 0x1f400, 0x1f43e,
+ 0x1f440, 0x1f440,
+ 0x1f442, 0x1f4f7,
+ 0x1f4f9, 0x1f4fc,
+ 0x1f500, 0x1f53d,
+ 0x1f540, 0x1f543,
+ 0x1f550, 0x1f567,
+ 0x1f5fb, 0x1f640,
+ 0x1f645, 0x1f64f,
+ 0x1f680, 0x1f6c5,
+ 0x1f700, 0x1f773,
+ 0x1fffe, 0x2a6d6,
+ 0x2a700, 0x2b734,
+ 0x2b740, 0x2b81d,
+ 0x2f800, 0x2fa1d,
+ 0x2fffe, 0x2ffff,
+ 0x3fffe, 0x3ffff,
+ 0x4fffe, 0x4ffff,
+ 0x5fffe, 0x5ffff,
+ 0x6fffe, 0x6ffff,
+ 0x7fffe, 0x7ffff,
+ 0x8fffe, 0x8ffff,
+ 0x9fffe, 0x9ffff,
+ 0xafffe, 0xaffff,
+ 0xbfffe, 0xbffff,
+ 0xcfffe, 0xcffff,
+ 0xdfffe, 0xdffff,
+ 0xe0001, 0xe0001,
+ 0xe0020, 0xe007f,
+ 0xe0100, 0xe01ef,
+ 0xefffe, 0x10ffff,
+}; /* CR_Age_6_2 */
+
+/* 'Age_6_3': Derived Age 6.3 */
+static const OnigCodePoint CR_Age_6_3[] = {
+ 549,
+ 0x0000, 0x0377,
+ 0x037a, 0x037e,
+ 0x0384, 0x038a,
+ 0x038c, 0x038c,
+ 0x038e, 0x03a1,
+ 0x03a3, 0x0527,
+ 0x0531, 0x0556,
+ 0x0559, 0x055f,
+ 0x0561, 0x0587,
+ 0x0589, 0x058a,
+ 0x058f, 0x058f,
+ 0x0591, 0x05c7,
+ 0x05d0, 0x05ea,
+ 0x05f0, 0x05f4,
+ 0x0600, 0x0604,
+ 0x0606, 0x061c,
+ 0x061e, 0x070d,
+ 0x070f, 0x074a,
+ 0x074d, 0x07b1,
+ 0x07c0, 0x07fa,
+ 0x0800, 0x082d,
+ 0x0830, 0x083e,
+ 0x0840, 0x085b,
+ 0x085e, 0x085e,
+ 0x08a0, 0x08a0,
+ 0x08a2, 0x08ac,
+ 0x08e4, 0x08fe,
+ 0x0900, 0x0977,
+ 0x0979, 0x097f,
+ 0x0981, 0x0983,
+ 0x0985, 0x098c,
+ 0x098f, 0x0990,
+ 0x0993, 0x09a8,
+ 0x09aa, 0x09b0,
+ 0x09b2, 0x09b2,
+ 0x09b6, 0x09b9,
+ 0x09bc, 0x09c4,
+ 0x09c7, 0x09c8,
+ 0x09cb, 0x09ce,
+ 0x09d7, 0x09d7,
+ 0x09dc, 0x09dd,
+ 0x09df, 0x09e3,
+ 0x09e6, 0x09fb,
+ 0x0a01, 0x0a03,
+ 0x0a05, 0x0a0a,
+ 0x0a0f, 0x0a10,
+ 0x0a13, 0x0a28,
+ 0x0a2a, 0x0a30,
+ 0x0a32, 0x0a33,
+ 0x0a35, 0x0a36,
+ 0x0a38, 0x0a39,
+ 0x0a3c, 0x0a3c,
+ 0x0a3e, 0x0a42,
+ 0x0a47, 0x0a48,
+ 0x0a4b, 0x0a4d,
+ 0x0a51, 0x0a51,
+ 0x0a59, 0x0a5c,
+ 0x0a5e, 0x0a5e,
+ 0x0a66, 0x0a75,
+ 0x0a81, 0x0a83,
+ 0x0a85, 0x0a8d,
+ 0x0a8f, 0x0a91,
+ 0x0a93, 0x0aa8,
+ 0x0aaa, 0x0ab0,
+ 0x0ab2, 0x0ab3,
+ 0x0ab5, 0x0ab9,
+ 0x0abc, 0x0ac5,
+ 0x0ac7, 0x0ac9,
+ 0x0acb, 0x0acd,
+ 0x0ad0, 0x0ad0,
+ 0x0ae0, 0x0ae3,
+ 0x0ae6, 0x0af1,
+ 0x0b01, 0x0b03,
+ 0x0b05, 0x0b0c,
+ 0x0b0f, 0x0b10,
+ 0x0b13, 0x0b28,
+ 0x0b2a, 0x0b30,
+ 0x0b32, 0x0b33,
+ 0x0b35, 0x0b39,
+ 0x0b3c, 0x0b44,
+ 0x0b47, 0x0b48,
+ 0x0b4b, 0x0b4d,
+ 0x0b56, 0x0b57,
+ 0x0b5c, 0x0b5d,
+ 0x0b5f, 0x0b63,
+ 0x0b66, 0x0b77,
+ 0x0b82, 0x0b83,
+ 0x0b85, 0x0b8a,
+ 0x0b8e, 0x0b90,
+ 0x0b92, 0x0b95,
+ 0x0b99, 0x0b9a,
+ 0x0b9c, 0x0b9c,
+ 0x0b9e, 0x0b9f,
+ 0x0ba3, 0x0ba4,
+ 0x0ba8, 0x0baa,
+ 0x0bae, 0x0bb9,
+ 0x0bbe, 0x0bc2,
+ 0x0bc6, 0x0bc8,
+ 0x0bca, 0x0bcd,
+ 0x0bd0, 0x0bd0,
+ 0x0bd7, 0x0bd7,
+ 0x0be6, 0x0bfa,
+ 0x0c01, 0x0c03,
+ 0x0c05, 0x0c0c,
+ 0x0c0e, 0x0c10,
+ 0x0c12, 0x0c28,
+ 0x0c2a, 0x0c33,
+ 0x0c35, 0x0c39,
+ 0x0c3d, 0x0c44,
+ 0x0c46, 0x0c48,
+ 0x0c4a, 0x0c4d,
+ 0x0c55, 0x0c56,
+ 0x0c58, 0x0c59,
+ 0x0c60, 0x0c63,
+ 0x0c66, 0x0c6f,
+ 0x0c78, 0x0c7f,
+ 0x0c82, 0x0c83,
+ 0x0c85, 0x0c8c,
+ 0x0c8e, 0x0c90,
+ 0x0c92, 0x0ca8,
+ 0x0caa, 0x0cb3,
+ 0x0cb5, 0x0cb9,
+ 0x0cbc, 0x0cc4,
+ 0x0cc6, 0x0cc8,
+ 0x0cca, 0x0ccd,
+ 0x0cd5, 0x0cd6,
+ 0x0cde, 0x0cde,
+ 0x0ce0, 0x0ce3,
+ 0x0ce6, 0x0cef,
+ 0x0cf1, 0x0cf2,
+ 0x0d02, 0x0d03,
+ 0x0d05, 0x0d0c,
+ 0x0d0e, 0x0d10,
+ 0x0d12, 0x0d3a,
+ 0x0d3d, 0x0d44,
+ 0x0d46, 0x0d48,
+ 0x0d4a, 0x0d4e,
+ 0x0d57, 0x0d57,
+ 0x0d60, 0x0d63,
+ 0x0d66, 0x0d75,
+ 0x0d79, 0x0d7f,
+ 0x0d82, 0x0d83,
+ 0x0d85, 0x0d96,
+ 0x0d9a, 0x0db1,
+ 0x0db3, 0x0dbb,
+ 0x0dbd, 0x0dbd,
+ 0x0dc0, 0x0dc6,
+ 0x0dca, 0x0dca,
+ 0x0dcf, 0x0dd4,
+ 0x0dd6, 0x0dd6,
+ 0x0dd8, 0x0ddf,
+ 0x0df2, 0x0df4,
+ 0x0e01, 0x0e3a,
+ 0x0e3f, 0x0e5b,
+ 0x0e81, 0x0e82,
+ 0x0e84, 0x0e84,
+ 0x0e87, 0x0e88,
+ 0x0e8a, 0x0e8a,
+ 0x0e8d, 0x0e8d,
+ 0x0e94, 0x0e97,
+ 0x0e99, 0x0e9f,
+ 0x0ea1, 0x0ea3,
+ 0x0ea5, 0x0ea5,
+ 0x0ea7, 0x0ea7,
+ 0x0eaa, 0x0eab,
+ 0x0ead, 0x0eb9,
+ 0x0ebb, 0x0ebd,
+ 0x0ec0, 0x0ec4,
+ 0x0ec6, 0x0ec6,
+ 0x0ec8, 0x0ecd,
+ 0x0ed0, 0x0ed9,
+ 0x0edc, 0x0edf,
+ 0x0f00, 0x0f47,
+ 0x0f49, 0x0f6c,
+ 0x0f71, 0x0f97,
+ 0x0f99, 0x0fbc,
+ 0x0fbe, 0x0fcc,
+ 0x0fce, 0x0fda,
+ 0x1000, 0x10c5,
+ 0x10c7, 0x10c7,
+ 0x10cd, 0x10cd,
+ 0x10d0, 0x1248,
+ 0x124a, 0x124d,
+ 0x1250, 0x1256,
+ 0x1258, 0x1258,
+ 0x125a, 0x125d,
+ 0x1260, 0x1288,
+ 0x128a, 0x128d,
+ 0x1290, 0x12b0,
+ 0x12b2, 0x12b5,
+ 0x12b8, 0x12be,
+ 0x12c0, 0x12c0,
+ 0x12c2, 0x12c5,
+ 0x12c8, 0x12d6,
+ 0x12d8, 0x1310,
+ 0x1312, 0x1315,
+ 0x1318, 0x135a,
+ 0x135d, 0x137c,
+ 0x1380, 0x1399,
+ 0x13a0, 0x13f4,
+ 0x1400, 0x169c,
+ 0x16a0, 0x16f0,
+ 0x1700, 0x170c,
+ 0x170e, 0x1714,
+ 0x1720, 0x1736,
+ 0x1740, 0x1753,
+ 0x1760, 0x176c,
+ 0x176e, 0x1770,
+ 0x1772, 0x1773,
+ 0x1780, 0x17dd,
+ 0x17e0, 0x17e9,
+ 0x17f0, 0x17f9,
+ 0x1800, 0x180e,
+ 0x1810, 0x1819,
+ 0x1820, 0x1877,
+ 0x1880, 0x18aa,
+ 0x18b0, 0x18f5,
+ 0x1900, 0x191c,
+ 0x1920, 0x192b,
+ 0x1930, 0x193b,
+ 0x1940, 0x1940,
+ 0x1944, 0x196d,
+ 0x1970, 0x1974,
+ 0x1980, 0x19ab,
+ 0x19b0, 0x19c9,
+ 0x19d0, 0x19da,
+ 0x19de, 0x1a1b,
+ 0x1a1e, 0x1a5e,
+ 0x1a60, 0x1a7c,
+ 0x1a7f, 0x1a89,
+ 0x1a90, 0x1a99,
+ 0x1aa0, 0x1aad,
+ 0x1b00, 0x1b4b,
+ 0x1b50, 0x1b7c,
+ 0x1b80, 0x1bf3,
+ 0x1bfc, 0x1c37,
+ 0x1c3b, 0x1c49,
+ 0x1c4d, 0x1c7f,
+ 0x1cc0, 0x1cc7,
+ 0x1cd0, 0x1cf6,
+ 0x1d00, 0x1de6,
+ 0x1dfc, 0x1f15,
+ 0x1f18, 0x1f1d,
+ 0x1f20, 0x1f45,
+ 0x1f48, 0x1f4d,
+ 0x1f50, 0x1f57,
+ 0x1f59, 0x1f59,
+ 0x1f5b, 0x1f5b,
+ 0x1f5d, 0x1f5d,
+ 0x1f5f, 0x1f7d,
+ 0x1f80, 0x1fb4,
+ 0x1fb6, 0x1fc4,
+ 0x1fc6, 0x1fd3,
+ 0x1fd6, 0x1fdb,
+ 0x1fdd, 0x1fef,
+ 0x1ff2, 0x1ff4,
+ 0x1ff6, 0x1ffe,
+ 0x2000, 0x2064,
+ 0x2066, 0x2071,
+ 0x2074, 0x208e,
+ 0x2090, 0x209c,
+ 0x20a0, 0x20ba,
+ 0x20d0, 0x20f0,
+ 0x2100, 0x2189,
+ 0x2190, 0x23f3,
+ 0x2400, 0x2426,
+ 0x2440, 0x244a,
+ 0x2460, 0x26ff,
+ 0x2701, 0x2b4c,
+ 0x2b50, 0x2b59,
+ 0x2c00, 0x2c2e,
+ 0x2c30, 0x2c5e,
+ 0x2c60, 0x2cf3,
+ 0x2cf9, 0x2d25,
+ 0x2d27, 0x2d27,
+ 0x2d2d, 0x2d2d,
+ 0x2d30, 0x2d67,
+ 0x2d6f, 0x2d70,
+ 0x2d7f, 0x2d96,
+ 0x2da0, 0x2da6,
+ 0x2da8, 0x2dae,
+ 0x2db0, 0x2db6,
+ 0x2db8, 0x2dbe,
+ 0x2dc0, 0x2dc6,
+ 0x2dc8, 0x2dce,
+ 0x2dd0, 0x2dd6,
+ 0x2dd8, 0x2dde,
+ 0x2de0, 0x2e3b,
+ 0x2e80, 0x2e99,
+ 0x2e9b, 0x2ef3,
+ 0x2f00, 0x2fd5,
+ 0x2ff0, 0x2ffb,
+ 0x3000, 0x303f,
+ 0x3041, 0x3096,
+ 0x3099, 0x30ff,
+ 0x3105, 0x312d,
+ 0x3131, 0x318e,
+ 0x3190, 0x31ba,
+ 0x31c0, 0x31e3,
+ 0x31f0, 0x321e,
+ 0x3220, 0x32fe,
+ 0x3300, 0x4db5,
+ 0x4dc0, 0x9fcc,
+ 0xa000, 0xa48c,
+ 0xa490, 0xa4c6,
+ 0xa4d0, 0xa62b,
+ 0xa640, 0xa697,
+ 0xa69f, 0xa6f7,
+ 0xa700, 0xa78e,
+ 0xa790, 0xa793,
+ 0xa7a0, 0xa7aa,
+ 0xa7f8, 0xa82b,
+ 0xa830, 0xa839,
+ 0xa840, 0xa877,
+ 0xa880, 0xa8c4,
+ 0xa8ce, 0xa8d9,
+ 0xa8e0, 0xa8fb,
+ 0xa900, 0xa953,
+ 0xa95f, 0xa97c,
+ 0xa980, 0xa9cd,
+ 0xa9cf, 0xa9d9,
+ 0xa9de, 0xa9df,
+ 0xaa00, 0xaa36,
+ 0xaa40, 0xaa4d,
+ 0xaa50, 0xaa59,
+ 0xaa5c, 0xaa7b,
+ 0xaa80, 0xaac2,
+ 0xaadb, 0xaaf6,
+ 0xab01, 0xab06,
+ 0xab09, 0xab0e,
+ 0xab11, 0xab16,
+ 0xab20, 0xab26,
+ 0xab28, 0xab2e,
+ 0xabc0, 0xabed,
+ 0xabf0, 0xabf9,
+ 0xac00, 0xd7a3,
+ 0xd7b0, 0xd7c6,
+ 0xd7cb, 0xd7fb,
+ 0xd800, 0xfa6d,
+ 0xfa70, 0xfad9,
+ 0xfb00, 0xfb06,
+ 0xfb13, 0xfb17,
+ 0xfb1d, 0xfb36,
+ 0xfb38, 0xfb3c,
+ 0xfb3e, 0xfb3e,
+ 0xfb40, 0xfb41,
+ 0xfb43, 0xfb44,
+ 0xfb46, 0xfbc1,
+ 0xfbd3, 0xfd3f,
+ 0xfd50, 0xfd8f,
+ 0xfd92, 0xfdc7,
+ 0xfdd0, 0xfdfd,
+ 0xfe00, 0xfe19,
+ 0xfe20, 0xfe26,
+ 0xfe30, 0xfe52,
+ 0xfe54, 0xfe66,
+ 0xfe68, 0xfe6b,
+ 0xfe70, 0xfe74,
+ 0xfe76, 0xfefc,
+ 0xfeff, 0xfeff,
+ 0xff01, 0xffbe,
+ 0xffc2, 0xffc7,
+ 0xffca, 0xffcf,
+ 0xffd2, 0xffd7,
+ 0xffda, 0xffdc,
+ 0xffe0, 0xffe6,
+ 0xffe8, 0xffee,
+ 0xfff9, 0x1000b,
+ 0x1000d, 0x10026,
+ 0x10028, 0x1003a,
+ 0x1003c, 0x1003d,
+ 0x1003f, 0x1004d,
+ 0x10050, 0x1005d,
+ 0x10080, 0x100fa,
+ 0x10100, 0x10102,
+ 0x10107, 0x10133,
+ 0x10137, 0x1018a,
+ 0x10190, 0x1019b,
+ 0x101d0, 0x101fd,
+ 0x10280, 0x1029c,
+ 0x102a0, 0x102d0,
+ 0x10300, 0x1031e,
+ 0x10320, 0x10323,
+ 0x10330, 0x1034a,
+ 0x10380, 0x1039d,
+ 0x1039f, 0x103c3,
+ 0x103c8, 0x103d5,
+ 0x10400, 0x1049d,
+ 0x104a0, 0x104a9,
+ 0x10800, 0x10805,
+ 0x10808, 0x10808,
+ 0x1080a, 0x10835,
+ 0x10837, 0x10838,
+ 0x1083c, 0x1083c,
+ 0x1083f, 0x10855,
+ 0x10857, 0x1085f,
+ 0x10900, 0x1091b,
+ 0x1091f, 0x10939,
+ 0x1093f, 0x1093f,
+ 0x10980, 0x109b7,
+ 0x109be, 0x109bf,
+ 0x10a00, 0x10a03,
+ 0x10a05, 0x10a06,
+ 0x10a0c, 0x10a13,
+ 0x10a15, 0x10a17,
+ 0x10a19, 0x10a33,
+ 0x10a38, 0x10a3a,
+ 0x10a3f, 0x10a47,
+ 0x10a50, 0x10a58,
+ 0x10a60, 0x10a7f,
+ 0x10b00, 0x10b35,
+ 0x10b39, 0x10b55,
+ 0x10b58, 0x10b72,
+ 0x10b78, 0x10b7f,
+ 0x10c00, 0x10c48,
+ 0x10e60, 0x10e7e,
+ 0x11000, 0x1104d,
+ 0x11052, 0x1106f,
+ 0x11080, 0x110c1,
+ 0x110d0, 0x110e8,
+ 0x110f0, 0x110f9,
+ 0x11100, 0x11134,
+ 0x11136, 0x11143,
+ 0x11180, 0x111c8,
+ 0x111d0, 0x111d9,
+ 0x11680, 0x116b7,
+ 0x116c0, 0x116c9,
+ 0x12000, 0x1236e,
+ 0x12400, 0x12462,
+ 0x12470, 0x12473,
+ 0x13000, 0x1342e,
+ 0x16800, 0x16a38,
+ 0x16f00, 0x16f44,
+ 0x16f50, 0x16f7e,
+ 0x16f8f, 0x16f9f,
+ 0x1b000, 0x1b001,
+ 0x1d000, 0x1d0f5,
+ 0x1d100, 0x1d126,
+ 0x1d129, 0x1d1dd,
+ 0x1d200, 0x1d245,
+ 0x1d300, 0x1d356,
+ 0x1d360, 0x1d371,
+ 0x1d400, 0x1d454,
+ 0x1d456, 0x1d49c,
+ 0x1d49e, 0x1d49f,
+ 0x1d4a2, 0x1d4a2,
+ 0x1d4a5, 0x1d4a6,
+ 0x1d4a9, 0x1d4ac,
+ 0x1d4ae, 0x1d4b9,
+ 0x1d4bb, 0x1d4bb,
+ 0x1d4bd, 0x1d4c3,
+ 0x1d4c5, 0x1d505,
+ 0x1d507, 0x1d50a,
+ 0x1d50d, 0x1d514,
+ 0x1d516, 0x1d51c,
+ 0x1d51e, 0x1d539,
+ 0x1d53b, 0x1d53e,
+ 0x1d540, 0x1d544,
+ 0x1d546, 0x1d546,
+ 0x1d54a, 0x1d550,
+ 0x1d552, 0x1d6a5,
+ 0x1d6a8, 0x1d7cb,
+ 0x1d7ce, 0x1d7ff,
+ 0x1ee00, 0x1ee03,
+ 0x1ee05, 0x1ee1f,
+ 0x1ee21, 0x1ee22,
+ 0x1ee24, 0x1ee24,
+ 0x1ee27, 0x1ee27,
+ 0x1ee29, 0x1ee32,
+ 0x1ee34, 0x1ee37,
+ 0x1ee39, 0x1ee39,
+ 0x1ee3b, 0x1ee3b,
+ 0x1ee42, 0x1ee42,
+ 0x1ee47, 0x1ee47,
+ 0x1ee49, 0x1ee49,
+ 0x1ee4b, 0x1ee4b,
+ 0x1ee4d, 0x1ee4f,
+ 0x1ee51, 0x1ee52,
+ 0x1ee54, 0x1ee54,
+ 0x1ee57, 0x1ee57,
+ 0x1ee59, 0x1ee59,
+ 0x1ee5b, 0x1ee5b,
+ 0x1ee5d, 0x1ee5d,
+ 0x1ee5f, 0x1ee5f,
+ 0x1ee61, 0x1ee62,
+ 0x1ee64, 0x1ee64,
+ 0x1ee67, 0x1ee6a,
+ 0x1ee6c, 0x1ee72,
+ 0x1ee74, 0x1ee77,
+ 0x1ee79, 0x1ee7c,
+ 0x1ee7e, 0x1ee7e,
+ 0x1ee80, 0x1ee89,
+ 0x1ee8b, 0x1ee9b,
+ 0x1eea1, 0x1eea3,
+ 0x1eea5, 0x1eea9,
+ 0x1eeab, 0x1eebb,
+ 0x1eef0, 0x1eef1,
+ 0x1f000, 0x1f02b,
+ 0x1f030, 0x1f093,
+ 0x1f0a0, 0x1f0ae,
+ 0x1f0b1, 0x1f0be,
+ 0x1f0c1, 0x1f0cf,
+ 0x1f0d1, 0x1f0df,
+ 0x1f100, 0x1f10a,
+ 0x1f110, 0x1f12e,
+ 0x1f130, 0x1f16b,
+ 0x1f170, 0x1f19a,
+ 0x1f1e6, 0x1f202,
+ 0x1f210, 0x1f23a,
+ 0x1f240, 0x1f248,
+ 0x1f250, 0x1f251,
+ 0x1f300, 0x1f320,
+ 0x1f330, 0x1f335,
+ 0x1f337, 0x1f37c,
+ 0x1f380, 0x1f393,
+ 0x1f3a0, 0x1f3c4,
+ 0x1f3c6, 0x1f3ca,
+ 0x1f3e0, 0x1f3f0,
+ 0x1f400, 0x1f43e,
+ 0x1f440, 0x1f440,
+ 0x1f442, 0x1f4f7,
+ 0x1f4f9, 0x1f4fc,
+ 0x1f500, 0x1f53d,
+ 0x1f540, 0x1f543,
+ 0x1f550, 0x1f567,
+ 0x1f5fb, 0x1f640,
+ 0x1f645, 0x1f64f,
+ 0x1f680, 0x1f6c5,
+ 0x1f700, 0x1f773,
+ 0x1fffe, 0x2a6d6,
+ 0x2a700, 0x2b734,
+ 0x2b740, 0x2b81d,
+ 0x2f800, 0x2fa1d,
+ 0x2fffe, 0x2ffff,
+ 0x3fffe, 0x3ffff,
+ 0x4fffe, 0x4ffff,
+ 0x5fffe, 0x5ffff,
+ 0x6fffe, 0x6ffff,
+ 0x7fffe, 0x7ffff,
+ 0x8fffe, 0x8ffff,
+ 0x9fffe, 0x9ffff,
+ 0xafffe, 0xaffff,
+ 0xbfffe, 0xbffff,
+ 0xcfffe, 0xcffff,
+ 0xdfffe, 0xdffff,
+ 0xe0001, 0xe0001,
+ 0xe0020, 0xe007f,
+ 0xe0100, 0xe01ef,
+ 0xefffe, 0x10ffff,
+}; /* CR_Age_6_3 */
+
+/* 'Age_7_0': Derived Age 7.0 */
+static const OnigCodePoint CR_Age_7_0[] = {
+ 610,
+ 0x0000, 0x0377,
+ 0x037a, 0x037f,
+ 0x0384, 0x038a,
+ 0x038c, 0x038c,
+ 0x038e, 0x03a1,
+ 0x03a3, 0x052f,
+ 0x0531, 0x0556,
+ 0x0559, 0x055f,
+ 0x0561, 0x0587,
+ 0x0589, 0x058a,
+ 0x058d, 0x058f,
+ 0x0591, 0x05c7,
+ 0x05d0, 0x05ea,
+ 0x05f0, 0x05f4,
+ 0x0600, 0x061c,
+ 0x061e, 0x070d,
+ 0x070f, 0x074a,
+ 0x074d, 0x07b1,
+ 0x07c0, 0x07fa,
+ 0x0800, 0x082d,
+ 0x0830, 0x083e,
+ 0x0840, 0x085b,
+ 0x085e, 0x085e,
+ 0x08a0, 0x08b2,
+ 0x08e4, 0x0983,
+ 0x0985, 0x098c,
+ 0x098f, 0x0990,
+ 0x0993, 0x09a8,
+ 0x09aa, 0x09b0,
+ 0x09b2, 0x09b2,
+ 0x09b6, 0x09b9,
+ 0x09bc, 0x09c4,
+ 0x09c7, 0x09c8,
+ 0x09cb, 0x09ce,
+ 0x09d7, 0x09d7,
+ 0x09dc, 0x09dd,
+ 0x09df, 0x09e3,
+ 0x09e6, 0x09fb,
+ 0x0a01, 0x0a03,
+ 0x0a05, 0x0a0a,
+ 0x0a0f, 0x0a10,
+ 0x0a13, 0x0a28,
+ 0x0a2a, 0x0a30,
+ 0x0a32, 0x0a33,
+ 0x0a35, 0x0a36,
+ 0x0a38, 0x0a39,
+ 0x0a3c, 0x0a3c,
+ 0x0a3e, 0x0a42,
+ 0x0a47, 0x0a48,
+ 0x0a4b, 0x0a4d,
+ 0x0a51, 0x0a51,
+ 0x0a59, 0x0a5c,
+ 0x0a5e, 0x0a5e,
+ 0x0a66, 0x0a75,
+ 0x0a81, 0x0a83,
+ 0x0a85, 0x0a8d,
+ 0x0a8f, 0x0a91,
+ 0x0a93, 0x0aa8,
+ 0x0aaa, 0x0ab0,
+ 0x0ab2, 0x0ab3,
+ 0x0ab5, 0x0ab9,
+ 0x0abc, 0x0ac5,
+ 0x0ac7, 0x0ac9,
+ 0x0acb, 0x0acd,
+ 0x0ad0, 0x0ad0,
+ 0x0ae0, 0x0ae3,
+ 0x0ae6, 0x0af1,
+ 0x0b01, 0x0b03,
+ 0x0b05, 0x0b0c,
+ 0x0b0f, 0x0b10,
+ 0x0b13, 0x0b28,
+ 0x0b2a, 0x0b30,
+ 0x0b32, 0x0b33,
+ 0x0b35, 0x0b39,
+ 0x0b3c, 0x0b44,
+ 0x0b47, 0x0b48,
+ 0x0b4b, 0x0b4d,
+ 0x0b56, 0x0b57,
+ 0x0b5c, 0x0b5d,
+ 0x0b5f, 0x0b63,
+ 0x0b66, 0x0b77,
+ 0x0b82, 0x0b83,
+ 0x0b85, 0x0b8a,
+ 0x0b8e, 0x0b90,
+ 0x0b92, 0x0b95,
+ 0x0b99, 0x0b9a,
+ 0x0b9c, 0x0b9c,
+ 0x0b9e, 0x0b9f,
+ 0x0ba3, 0x0ba4,
+ 0x0ba8, 0x0baa,
+ 0x0bae, 0x0bb9,
+ 0x0bbe, 0x0bc2,
+ 0x0bc6, 0x0bc8,
+ 0x0bca, 0x0bcd,
+ 0x0bd0, 0x0bd0,
+ 0x0bd7, 0x0bd7,
+ 0x0be6, 0x0bfa,
+ 0x0c00, 0x0c03,
+ 0x0c05, 0x0c0c,
+ 0x0c0e, 0x0c10,
+ 0x0c12, 0x0c28,
+ 0x0c2a, 0x0c39,
+ 0x0c3d, 0x0c44,
+ 0x0c46, 0x0c48,
+ 0x0c4a, 0x0c4d,
+ 0x0c55, 0x0c56,
+ 0x0c58, 0x0c59,
+ 0x0c60, 0x0c63,
+ 0x0c66, 0x0c6f,
+ 0x0c78, 0x0c7f,
+ 0x0c81, 0x0c83,
+ 0x0c85, 0x0c8c,
+ 0x0c8e, 0x0c90,
+ 0x0c92, 0x0ca8,
+ 0x0caa, 0x0cb3,
+ 0x0cb5, 0x0cb9,
+ 0x0cbc, 0x0cc4,
+ 0x0cc6, 0x0cc8,
+ 0x0cca, 0x0ccd,
+ 0x0cd5, 0x0cd6,
+ 0x0cde, 0x0cde,
+ 0x0ce0, 0x0ce3,
+ 0x0ce6, 0x0cef,
+ 0x0cf1, 0x0cf2,
+ 0x0d01, 0x0d03,
+ 0x0d05, 0x0d0c,
+ 0x0d0e, 0x0d10,
+ 0x0d12, 0x0d3a,
+ 0x0d3d, 0x0d44,
+ 0x0d46, 0x0d48,
+ 0x0d4a, 0x0d4e,
+ 0x0d57, 0x0d57,
+ 0x0d60, 0x0d63,
+ 0x0d66, 0x0d75,
+ 0x0d79, 0x0d7f,
+ 0x0d82, 0x0d83,
+ 0x0d85, 0x0d96,
+ 0x0d9a, 0x0db1,
+ 0x0db3, 0x0dbb,
+ 0x0dbd, 0x0dbd,
+ 0x0dc0, 0x0dc6,
+ 0x0dca, 0x0dca,
+ 0x0dcf, 0x0dd4,
+ 0x0dd6, 0x0dd6,
+ 0x0dd8, 0x0ddf,
+ 0x0de6, 0x0def,
+ 0x0df2, 0x0df4,
+ 0x0e01, 0x0e3a,
+ 0x0e3f, 0x0e5b,
+ 0x0e81, 0x0e82,
+ 0x0e84, 0x0e84,
+ 0x0e87, 0x0e88,
+ 0x0e8a, 0x0e8a,
+ 0x0e8d, 0x0e8d,
+ 0x0e94, 0x0e97,
+ 0x0e99, 0x0e9f,
+ 0x0ea1, 0x0ea3,
+ 0x0ea5, 0x0ea5,
+ 0x0ea7, 0x0ea7,
+ 0x0eaa, 0x0eab,
+ 0x0ead, 0x0eb9,
+ 0x0ebb, 0x0ebd,
+ 0x0ec0, 0x0ec4,
+ 0x0ec6, 0x0ec6,
+ 0x0ec8, 0x0ecd,
+ 0x0ed0, 0x0ed9,
+ 0x0edc, 0x0edf,
+ 0x0f00, 0x0f47,
+ 0x0f49, 0x0f6c,
+ 0x0f71, 0x0f97,
+ 0x0f99, 0x0fbc,
+ 0x0fbe, 0x0fcc,
+ 0x0fce, 0x0fda,
+ 0x1000, 0x10c5,
+ 0x10c7, 0x10c7,
+ 0x10cd, 0x10cd,
+ 0x10d0, 0x1248,
+ 0x124a, 0x124d,
+ 0x1250, 0x1256,
+ 0x1258, 0x1258,
+ 0x125a, 0x125d,
+ 0x1260, 0x1288,
+ 0x128a, 0x128d,
+ 0x1290, 0x12b0,
+ 0x12b2, 0x12b5,
+ 0x12b8, 0x12be,
+ 0x12c0, 0x12c0,
+ 0x12c2, 0x12c5,
+ 0x12c8, 0x12d6,
+ 0x12d8, 0x1310,
+ 0x1312, 0x1315,
+ 0x1318, 0x135a,
+ 0x135d, 0x137c,
+ 0x1380, 0x1399,
+ 0x13a0, 0x13f4,
+ 0x1400, 0x169c,
+ 0x16a0, 0x16f8,
+ 0x1700, 0x170c,
+ 0x170e, 0x1714,
+ 0x1720, 0x1736,
+ 0x1740, 0x1753,
+ 0x1760, 0x176c,
+ 0x176e, 0x1770,
+ 0x1772, 0x1773,
+ 0x1780, 0x17dd,
+ 0x17e0, 0x17e9,
+ 0x17f0, 0x17f9,
+ 0x1800, 0x180e,
+ 0x1810, 0x1819,
+ 0x1820, 0x1877,
+ 0x1880, 0x18aa,
+ 0x18b0, 0x18f5,
+ 0x1900, 0x191e,
+ 0x1920, 0x192b,
+ 0x1930, 0x193b,
+ 0x1940, 0x1940,
+ 0x1944, 0x196d,
+ 0x1970, 0x1974,
+ 0x1980, 0x19ab,
+ 0x19b0, 0x19c9,
+ 0x19d0, 0x19da,
+ 0x19de, 0x1a1b,
+ 0x1a1e, 0x1a5e,
+ 0x1a60, 0x1a7c,
+ 0x1a7f, 0x1a89,
+ 0x1a90, 0x1a99,
+ 0x1aa0, 0x1aad,
+ 0x1ab0, 0x1abe,
+ 0x1b00, 0x1b4b,
+ 0x1b50, 0x1b7c,
+ 0x1b80, 0x1bf3,
+ 0x1bfc, 0x1c37,
+ 0x1c3b, 0x1c49,
+ 0x1c4d, 0x1c7f,
+ 0x1cc0, 0x1cc7,
+ 0x1cd0, 0x1cf6,
+ 0x1cf8, 0x1cf9,
+ 0x1d00, 0x1df5,
+ 0x1dfc, 0x1f15,
+ 0x1f18, 0x1f1d,
+ 0x1f20, 0x1f45,
+ 0x1f48, 0x1f4d,
+ 0x1f50, 0x1f57,
+ 0x1f59, 0x1f59,
+ 0x1f5b, 0x1f5b,
+ 0x1f5d, 0x1f5d,
+ 0x1f5f, 0x1f7d,
+ 0x1f80, 0x1fb4,
+ 0x1fb6, 0x1fc4,
+ 0x1fc6, 0x1fd3,
+ 0x1fd6, 0x1fdb,
+ 0x1fdd, 0x1fef,
+ 0x1ff2, 0x1ff4,
+ 0x1ff6, 0x1ffe,
+ 0x2000, 0x2064,
+ 0x2066, 0x2071,
+ 0x2074, 0x208e,
+ 0x2090, 0x209c,
+ 0x20a0, 0x20bd,
+ 0x20d0, 0x20f0,
+ 0x2100, 0x2189,
+ 0x2190, 0x23fa,
+ 0x2400, 0x2426,
+ 0x2440, 0x244a,
+ 0x2460, 0x2b73,
+ 0x2b76, 0x2b95,
+ 0x2b98, 0x2bb9,
+ 0x2bbd, 0x2bc8,
+ 0x2bca, 0x2bd1,
+ 0x2c00, 0x2c2e,
+ 0x2c30, 0x2c5e,
+ 0x2c60, 0x2cf3,
+ 0x2cf9, 0x2d25,
+ 0x2d27, 0x2d27,
+ 0x2d2d, 0x2d2d,
+ 0x2d30, 0x2d67,
+ 0x2d6f, 0x2d70,
+ 0x2d7f, 0x2d96,
+ 0x2da0, 0x2da6,
+ 0x2da8, 0x2dae,
+ 0x2db0, 0x2db6,
+ 0x2db8, 0x2dbe,
+ 0x2dc0, 0x2dc6,
+ 0x2dc8, 0x2dce,
+ 0x2dd0, 0x2dd6,
+ 0x2dd8, 0x2dde,
+ 0x2de0, 0x2e42,
+ 0x2e80, 0x2e99,
+ 0x2e9b, 0x2ef3,
+ 0x2f00, 0x2fd5,
+ 0x2ff0, 0x2ffb,
+ 0x3000, 0x303f,
+ 0x3041, 0x3096,
+ 0x3099, 0x30ff,
+ 0x3105, 0x312d,
+ 0x3131, 0x318e,
+ 0x3190, 0x31ba,
+ 0x31c0, 0x31e3,
+ 0x31f0, 0x321e,
+ 0x3220, 0x32fe,
+ 0x3300, 0x4db5,
+ 0x4dc0, 0x9fcc,
+ 0xa000, 0xa48c,
+ 0xa490, 0xa4c6,
+ 0xa4d0, 0xa62b,
+ 0xa640, 0xa69d,
+ 0xa69f, 0xa6f7,
+ 0xa700, 0xa78e,
+ 0xa790, 0xa7ad,
+ 0xa7b0, 0xa7b1,
+ 0xa7f7, 0xa82b,
+ 0xa830, 0xa839,
+ 0xa840, 0xa877,
+ 0xa880, 0xa8c4,
+ 0xa8ce, 0xa8d9,
+ 0xa8e0, 0xa8fb,
+ 0xa900, 0xa953,
+ 0xa95f, 0xa97c,
+ 0xa980, 0xa9cd,
+ 0xa9cf, 0xa9d9,
+ 0xa9de, 0xa9fe,
+ 0xaa00, 0xaa36,
+ 0xaa40, 0xaa4d,
+ 0xaa50, 0xaa59,
+ 0xaa5c, 0xaac2,
+ 0xaadb, 0xaaf6,
+ 0xab01, 0xab06,
+ 0xab09, 0xab0e,
+ 0xab11, 0xab16,
+ 0xab20, 0xab26,
+ 0xab28, 0xab2e,
+ 0xab30, 0xab5f,
+ 0xab64, 0xab65,
+ 0xabc0, 0xabed,
+ 0xabf0, 0xabf9,
+ 0xac00, 0xd7a3,
+ 0xd7b0, 0xd7c6,
+ 0xd7cb, 0xd7fb,
+ 0xd800, 0xfa6d,
+ 0xfa70, 0xfad9,
+ 0xfb00, 0xfb06,
+ 0xfb13, 0xfb17,
+ 0xfb1d, 0xfb36,
+ 0xfb38, 0xfb3c,
+ 0xfb3e, 0xfb3e,
+ 0xfb40, 0xfb41,
+ 0xfb43, 0xfb44,
+ 0xfb46, 0xfbc1,
+ 0xfbd3, 0xfd3f,
+ 0xfd50, 0xfd8f,
+ 0xfd92, 0xfdc7,
+ 0xfdd0, 0xfdfd,
+ 0xfe00, 0xfe19,
+ 0xfe20, 0xfe2d,
+ 0xfe30, 0xfe52,
+ 0xfe54, 0xfe66,
+ 0xfe68, 0xfe6b,
+ 0xfe70, 0xfe74,
+ 0xfe76, 0xfefc,
+ 0xfeff, 0xfeff,
+ 0xff01, 0xffbe,
+ 0xffc2, 0xffc7,
+ 0xffca, 0xffcf,
+ 0xffd2, 0xffd7,
+ 0xffda, 0xffdc,
+ 0xffe0, 0xffe6,
+ 0xffe8, 0xffee,
+ 0xfff9, 0x1000b,
+ 0x1000d, 0x10026,
+ 0x10028, 0x1003a,
+ 0x1003c, 0x1003d,
+ 0x1003f, 0x1004d,
+ 0x10050, 0x1005d,
+ 0x10080, 0x100fa,
+ 0x10100, 0x10102,
+ 0x10107, 0x10133,
+ 0x10137, 0x1018c,
+ 0x10190, 0x1019b,
+ 0x101a0, 0x101a0,
+ 0x101d0, 0x101fd,
+ 0x10280, 0x1029c,
+ 0x102a0, 0x102d0,
+ 0x102e0, 0x102fb,
+ 0x10300, 0x10323,
+ 0x10330, 0x1034a,
+ 0x10350, 0x1037a,
+ 0x10380, 0x1039d,
+ 0x1039f, 0x103c3,
+ 0x103c8, 0x103d5,
+ 0x10400, 0x1049d,
+ 0x104a0, 0x104a9,
+ 0x10500, 0x10527,
+ 0x10530, 0x10563,
+ 0x1056f, 0x1056f,
+ 0x10600, 0x10736,
+ 0x10740, 0x10755,
+ 0x10760, 0x10767,
+ 0x10800, 0x10805,
+ 0x10808, 0x10808,
+ 0x1080a, 0x10835,
+ 0x10837, 0x10838,
+ 0x1083c, 0x1083c,
+ 0x1083f, 0x10855,
+ 0x10857, 0x1089e,
+ 0x108a7, 0x108af,
+ 0x10900, 0x1091b,
+ 0x1091f, 0x10939,
+ 0x1093f, 0x1093f,
+ 0x10980, 0x109b7,
+ 0x109be, 0x109bf,
+ 0x10a00, 0x10a03,
+ 0x10a05, 0x10a06,
+ 0x10a0c, 0x10a13,
+ 0x10a15, 0x10a17,
+ 0x10a19, 0x10a33,
+ 0x10a38, 0x10a3a,
+ 0x10a3f, 0x10a47,
+ 0x10a50, 0x10a58,
+ 0x10a60, 0x10a9f,
+ 0x10ac0, 0x10ae6,
+ 0x10aeb, 0x10af6,
+ 0x10b00, 0x10b35,
+ 0x10b39, 0x10b55,
+ 0x10b58, 0x10b72,
+ 0x10b78, 0x10b91,
+ 0x10b99, 0x10b9c,
+ 0x10ba9, 0x10baf,
+ 0x10c00, 0x10c48,
+ 0x10e60, 0x10e7e,
+ 0x11000, 0x1104d,
+ 0x11052, 0x1106f,
+ 0x1107f, 0x110c1,
+ 0x110d0, 0x110e8,
+ 0x110f0, 0x110f9,
+ 0x11100, 0x11134,
+ 0x11136, 0x11143,
+ 0x11150, 0x11176,
+ 0x11180, 0x111c8,
+ 0x111cd, 0x111cd,
+ 0x111d0, 0x111da,
+ 0x111e1, 0x111f4,
+ 0x11200, 0x11211,
+ 0x11213, 0x1123d,
+ 0x112b0, 0x112ea,
+ 0x112f0, 0x112f9,
+ 0x11301, 0x11303,
+ 0x11305, 0x1130c,
+ 0x1130f, 0x11310,
+ 0x11313, 0x11328,
+ 0x1132a, 0x11330,
+ 0x11332, 0x11333,
+ 0x11335, 0x11339,
+ 0x1133c, 0x11344,
+ 0x11347, 0x11348,
+ 0x1134b, 0x1134d,
+ 0x11357, 0x11357,
+ 0x1135d, 0x11363,
+ 0x11366, 0x1136c,
+ 0x11370, 0x11374,
+ 0x11480, 0x114c7,
+ 0x114d0, 0x114d9,
+ 0x11580, 0x115b5,
+ 0x115b8, 0x115c9,
+ 0x11600, 0x11644,
+ 0x11650, 0x11659,
+ 0x11680, 0x116b7,
+ 0x116c0, 0x116c9,
+ 0x118a0, 0x118f2,
+ 0x118ff, 0x118ff,
+ 0x11ac0, 0x11af8,
+ 0x12000, 0x12398,
+ 0x12400, 0x1246e,
+ 0x12470, 0x12474,
+ 0x13000, 0x1342e,
+ 0x16800, 0x16a38,
+ 0x16a40, 0x16a5e,
+ 0x16a60, 0x16a69,
+ 0x16a6e, 0x16a6f,
+ 0x16ad0, 0x16aed,
+ 0x16af0, 0x16af5,
+ 0x16b00, 0x16b45,
+ 0x16b50, 0x16b59,
+ 0x16b5b, 0x16b61,
+ 0x16b63, 0x16b77,
+ 0x16b7d, 0x16b8f,
+ 0x16f00, 0x16f44,
+ 0x16f50, 0x16f7e,
+ 0x16f8f, 0x16f9f,
+ 0x1b000, 0x1b001,
+ 0x1bc00, 0x1bc6a,
+ 0x1bc70, 0x1bc7c,
+ 0x1bc80, 0x1bc88,
+ 0x1bc90, 0x1bc99,
+ 0x1bc9c, 0x1bca3,
+ 0x1d000, 0x1d0f5,
+ 0x1d100, 0x1d126,
+ 0x1d129, 0x1d1dd,
+ 0x1d200, 0x1d245,
+ 0x1d300, 0x1d356,
+ 0x1d360, 0x1d371,
+ 0x1d400, 0x1d454,
+ 0x1d456, 0x1d49c,
+ 0x1d49e, 0x1d49f,
+ 0x1d4a2, 0x1d4a2,
+ 0x1d4a5, 0x1d4a6,
+ 0x1d4a9, 0x1d4ac,
+ 0x1d4ae, 0x1d4b9,
+ 0x1d4bb, 0x1d4bb,
+ 0x1d4bd, 0x1d4c3,
+ 0x1d4c5, 0x1d505,
+ 0x1d507, 0x1d50a,
+ 0x1d50d, 0x1d514,
+ 0x1d516, 0x1d51c,
+ 0x1d51e, 0x1d539,
+ 0x1d53b, 0x1d53e,
+ 0x1d540, 0x1d544,
+ 0x1d546, 0x1d546,
+ 0x1d54a, 0x1d550,
+ 0x1d552, 0x1d6a5,
+ 0x1d6a8, 0x1d7cb,
+ 0x1d7ce, 0x1d7ff,
+ 0x1e800, 0x1e8c4,
+ 0x1e8c7, 0x1e8d6,
+ 0x1ee00, 0x1ee03,
+ 0x1ee05, 0x1ee1f,
+ 0x1ee21, 0x1ee22,
+ 0x1ee24, 0x1ee24,
+ 0x1ee27, 0x1ee27,
+ 0x1ee29, 0x1ee32,
+ 0x1ee34, 0x1ee37,
+ 0x1ee39, 0x1ee39,
+ 0x1ee3b, 0x1ee3b,
+ 0x1ee42, 0x1ee42,
+ 0x1ee47, 0x1ee47,
+ 0x1ee49, 0x1ee49,
+ 0x1ee4b, 0x1ee4b,
+ 0x1ee4d, 0x1ee4f,
+ 0x1ee51, 0x1ee52,
+ 0x1ee54, 0x1ee54,
+ 0x1ee57, 0x1ee57,
+ 0x1ee59, 0x1ee59,
+ 0x1ee5b, 0x1ee5b,
+ 0x1ee5d, 0x1ee5d,
+ 0x1ee5f, 0x1ee5f,
+ 0x1ee61, 0x1ee62,
+ 0x1ee64, 0x1ee64,
+ 0x1ee67, 0x1ee6a,
+ 0x1ee6c, 0x1ee72,
+ 0x1ee74, 0x1ee77,
+ 0x1ee79, 0x1ee7c,
+ 0x1ee7e, 0x1ee7e,
+ 0x1ee80, 0x1ee89,
+ 0x1ee8b, 0x1ee9b,
+ 0x1eea1, 0x1eea3,
+ 0x1eea5, 0x1eea9,
+ 0x1eeab, 0x1eebb,
+ 0x1eef0, 0x1eef1,
+ 0x1f000, 0x1f02b,
+ 0x1f030, 0x1f093,
+ 0x1f0a0, 0x1f0ae,
+ 0x1f0b1, 0x1f0bf,
+ 0x1f0c1, 0x1f0cf,
+ 0x1f0d1, 0x1f0f5,
+ 0x1f100, 0x1f10c,
+ 0x1f110, 0x1f12e,
+ 0x1f130, 0x1f16b,
+ 0x1f170, 0x1f19a,
+ 0x1f1e6, 0x1f202,
+ 0x1f210, 0x1f23a,
+ 0x1f240, 0x1f248,
+ 0x1f250, 0x1f251,
+ 0x1f300, 0x1f32c,
+ 0x1f330, 0x1f37d,
+ 0x1f380, 0x1f3ce,
+ 0x1f3d4, 0x1f3f7,
+ 0x1f400, 0x1f4fe,
+ 0x1f500, 0x1f54a,
+ 0x1f550, 0x1f579,
+ 0x1f57b, 0x1f5a3,
+ 0x1f5a5, 0x1f642,
+ 0x1f645, 0x1f6cf,
+ 0x1f6e0, 0x1f6ec,
+ 0x1f6f0, 0x1f6f3,
+ 0x1f700, 0x1f773,
+ 0x1f780, 0x1f7d4,
+ 0x1f800, 0x1f80b,
+ 0x1f810, 0x1f847,
+ 0x1f850, 0x1f859,
+ 0x1f860, 0x1f887,
+ 0x1f890, 0x1f8ad,
+ 0x1fffe, 0x2a6d6,
+ 0x2a700, 0x2b734,
+ 0x2b740, 0x2b81d,
+ 0x2f800, 0x2fa1d,
+ 0x2fffe, 0x2ffff,
+ 0x3fffe, 0x3ffff,
+ 0x4fffe, 0x4ffff,
+ 0x5fffe, 0x5ffff,
+ 0x6fffe, 0x6ffff,
+ 0x7fffe, 0x7ffff,
+ 0x8fffe, 0x8ffff,
+ 0x9fffe, 0x9ffff,
+ 0xafffe, 0xaffff,
+ 0xbfffe, 0xbffff,
+ 0xcfffe, 0xcffff,
+ 0xdfffe, 0xdffff,
+ 0xe0001, 0xe0001,
+ 0xe0020, 0xe007f,
+ 0xe0100, 0xe01ef,
+ 0xefffe, 0x10ffff,
+}; /* CR_Age_7_0 */
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+
/* 'In_Basic_Latin': Block */
#define CR_In_Basic_Latin CR_ASCII
@@ -24485,6 +27846,12 @@ static const OnigCodePoint CR_In_Tai_Tham[] = {
0x1a20, 0x1aaf,
}; /* CR_In_Tai_Tham */
+/* 'In_Combining_Diacritical_Marks_Extended': Block */
+static const OnigCodePoint CR_In_Combining_Diacritical_Marks_Extended[] = {
+ 1,
+ 0x1ab0, 0x1aff,
+}; /* CR_In_Combining_Diacritical_Marks_Extended */
+
/* 'In_Balinese': Block */
static const OnigCodePoint CR_In_Balinese[] = {
1,
@@ -24921,7 +28288,10 @@ static const OnigCodePoint CR_In_Devanagari_Extended[] = {
}; /* CR_In_Devanagari_Extended */
/* 'In_Kayah_Li': Block */
-#define CR_In_Kayah_Li CR_Kayah_Li
+static const OnigCodePoint CR_In_Kayah_Li[] = {
+ 1,
+ 0xa900, 0xa92f,
+}; /* CR_In_Kayah_Li */
/* 'In_Rejang': Block */
static const OnigCodePoint CR_In_Rejang[] = {
@@ -24941,6 +28311,12 @@ static const OnigCodePoint CR_In_Javanese[] = {
0xa980, 0xa9df,
}; /* CR_In_Javanese */
+/* 'In_Myanmar_Extended_B': Block */
+static const OnigCodePoint CR_In_Myanmar_Extended_B[] = {
+ 1,
+ 0xa9e0, 0xa9ff,
+}; /* CR_In_Myanmar_Extended_B */
+
/* 'In_Cham': Block */
static const OnigCodePoint CR_In_Cham[] = {
1,
@@ -24971,6 +28347,12 @@ static const OnigCodePoint CR_In_Ethiopic_Extended_A[] = {
0xab00, 0xab2f,
}; /* CR_In_Ethiopic_Extended_A */
+/* 'In_Latin_Extended_E': Block */
+static const OnigCodePoint CR_In_Latin_Extended_E[] = {
+ 1,
+ 0xab30, 0xab6f,
+}; /* CR_In_Latin_Extended_E */
+
/* 'In_Meetei_Mayek': Block */
static const OnigCodePoint CR_In_Meetei_Mayek[] = {
1,
@@ -25127,6 +28509,12 @@ static const OnigCodePoint CR_In_Carian[] = {
0x102a0, 0x102df,
}; /* CR_In_Carian */
+/* 'In_Coptic_Epact_Numbers': Block */
+static const OnigCodePoint CR_In_Coptic_Epact_Numbers[] = {
+ 1,
+ 0x102e0, 0x102ff,
+}; /* CR_In_Coptic_Epact_Numbers */
+
/* 'In_Old_Italic': Block */
static const OnigCodePoint CR_In_Old_Italic[] = {
1,
@@ -25139,6 +28527,12 @@ static const OnigCodePoint CR_In_Gothic[] = {
0x10330, 0x1034f,
}; /* CR_In_Gothic */
+/* 'In_Old_Permic': Block */
+static const OnigCodePoint CR_In_Old_Permic[] = {
+ 1,
+ 0x10350, 0x1037f,
+}; /* CR_In_Old_Permic */
+
/* 'In_Ugaritic': Block */
static const OnigCodePoint CR_In_Ugaritic[] = {
1,
@@ -25163,6 +28557,24 @@ static const OnigCodePoint CR_In_Osmanya[] = {
0x10480, 0x104af,
}; /* CR_In_Osmanya */
+/* 'In_Elbasan': Block */
+static const OnigCodePoint CR_In_Elbasan[] = {
+ 1,
+ 0x10500, 0x1052f,
+}; /* CR_In_Elbasan */
+
+/* 'In_Caucasian_Albanian': Block */
+static const OnigCodePoint CR_In_Caucasian_Albanian[] = {
+ 1,
+ 0x10530, 0x1056f,
+}; /* CR_In_Caucasian_Albanian */
+
+/* 'In_Linear_A': Block */
+static const OnigCodePoint CR_In_Linear_A[] = {
+ 1,
+ 0x10600, 0x1077f,
+}; /* CR_In_Linear_A */
+
/* 'In_Cypriot_Syllabary': Block */
static const OnigCodePoint CR_In_Cypriot_Syllabary[] = {
1,
@@ -25175,6 +28587,15 @@ static const OnigCodePoint CR_In_Imperial_Aramaic[] = {
0x10840, 0x1085f,
}; /* CR_In_Imperial_Aramaic */
+/* 'In_Palmyrene': Block */
+#define CR_In_Palmyrene CR_Palmyrene
+
+/* 'In_Nabataean': Block */
+static const OnigCodePoint CR_In_Nabataean[] = {
+ 1,
+ 0x10880, 0x108af,
+}; /* CR_In_Nabataean */
+
/* 'In_Phoenician': Block */
static const OnigCodePoint CR_In_Phoenician[] = {
1,
@@ -25205,6 +28626,15 @@ static const OnigCodePoint CR_In_Kharoshthi[] = {
/* 'In_Old_South_Arabian': Block */
#define CR_In_Old_South_Arabian CR_Old_South_Arabian
+/* 'In_Old_North_Arabian': Block */
+#define CR_In_Old_North_Arabian CR_Old_North_Arabian
+
+/* 'In_Manichaean': Block */
+static const OnigCodePoint CR_In_Manichaean[] = {
+ 1,
+ 0x10ac0, 0x10aff,
+}; /* CR_In_Manichaean */
+
/* 'In_Avestan': Block */
static const OnigCodePoint CR_In_Avestan[] = {
1,
@@ -25223,6 +28653,12 @@ static const OnigCodePoint CR_In_Inscriptional_Pahlavi[] = {
0x10b60, 0x10b7f,
}; /* CR_In_Inscriptional_Pahlavi */
+/* 'In_Psalter_Pahlavi': Block */
+static const OnigCodePoint CR_In_Psalter_Pahlavi[] = {
+ 1,
+ 0x10b80, 0x10baf,
+}; /* CR_In_Psalter_Pahlavi */
+
/* 'In_Old_Turkic': Block */
static const OnigCodePoint CR_In_Old_Turkic[] = {
1,
@@ -25259,18 +28695,78 @@ static const OnigCodePoint CR_In_Chakma[] = {
0x11100, 0x1114f,
}; /* CR_In_Chakma */
+/* 'In_Mahajani': Block */
+static const OnigCodePoint CR_In_Mahajani[] = {
+ 1,
+ 0x11150, 0x1117f,
+}; /* CR_In_Mahajani */
+
/* 'In_Sharada': Block */
static const OnigCodePoint CR_In_Sharada[] = {
1,
0x11180, 0x111df,
}; /* CR_In_Sharada */
+/* 'In_Sinhala_Archaic_Numbers': Block */
+static const OnigCodePoint CR_In_Sinhala_Archaic_Numbers[] = {
+ 1,
+ 0x111e0, 0x111ff,
+}; /* CR_In_Sinhala_Archaic_Numbers */
+
+/* 'In_Khojki': Block */
+static const OnigCodePoint CR_In_Khojki[] = {
+ 1,
+ 0x11200, 0x1124f,
+}; /* CR_In_Khojki */
+
+/* 'In_Khudawadi': Block */
+static const OnigCodePoint CR_In_Khudawadi[] = {
+ 1,
+ 0x112b0, 0x112ff,
+}; /* CR_In_Khudawadi */
+
+/* 'In_Grantha': Block */
+static const OnigCodePoint CR_In_Grantha[] = {
+ 1,
+ 0x11300, 0x1137f,
+}; /* CR_In_Grantha */
+
+/* 'In_Tirhuta': Block */
+static const OnigCodePoint CR_In_Tirhuta[] = {
+ 1,
+ 0x11480, 0x114df,
+}; /* CR_In_Tirhuta */
+
+/* 'In_Siddham': Block */
+static const OnigCodePoint CR_In_Siddham[] = {
+ 1,
+ 0x11580, 0x115ff,
+}; /* CR_In_Siddham */
+
+/* 'In_Modi': Block */
+static const OnigCodePoint CR_In_Modi[] = {
+ 1,
+ 0x11600, 0x1165f,
+}; /* CR_In_Modi */
+
/* 'In_Takri': Block */
static const OnigCodePoint CR_In_Takri[] = {
1,
0x11680, 0x116cf,
}; /* CR_In_Takri */
+/* 'In_Warang_Citi': Block */
+static const OnigCodePoint CR_In_Warang_Citi[] = {
+ 1,
+ 0x118a0, 0x118ff,
+}; /* CR_In_Warang_Citi */
+
+/* 'In_Pau_Cin_Hau': Block */
+static const OnigCodePoint CR_In_Pau_Cin_Hau[] = {
+ 1,
+ 0x11ac0, 0x11aff,
+}; /* CR_In_Pau_Cin_Hau */
+
/* 'In_Cuneiform': Block */
static const OnigCodePoint CR_In_Cuneiform[] = {
1,
@@ -25295,6 +28791,24 @@ static const OnigCodePoint CR_In_Bamum_Supplement[] = {
0x16800, 0x16a3f,
}; /* CR_In_Bamum_Supplement */
+/* 'In_Mro': Block */
+static const OnigCodePoint CR_In_Mro[] = {
+ 1,
+ 0x16a40, 0x16a6f,
+}; /* CR_In_Mro */
+
+/* 'In_Bassa_Vah': Block */
+static const OnigCodePoint CR_In_Bassa_Vah[] = {
+ 1,
+ 0x16ad0, 0x16aff,
+}; /* CR_In_Bassa_Vah */
+
+/* 'In_Pahawh_Hmong': Block */
+static const OnigCodePoint CR_In_Pahawh_Hmong[] = {
+ 1,
+ 0x16b00, 0x16b8f,
+}; /* CR_In_Pahawh_Hmong */
+
/* 'In_Miao': Block */
static const OnigCodePoint CR_In_Miao[] = {
1,
@@ -25307,6 +28821,18 @@ static const OnigCodePoint CR_In_Kana_Supplement[] = {
0x1b000, 0x1b0ff,
}; /* CR_In_Kana_Supplement */
+/* 'In_Duployan': Block */
+static const OnigCodePoint CR_In_Duployan[] = {
+ 1,
+ 0x1bc00, 0x1bc9f,
+}; /* CR_In_Duployan */
+
+/* 'In_Shorthand_Format_Controls': Block */
+static const OnigCodePoint CR_In_Shorthand_Format_Controls[] = {
+ 1,
+ 0x1bca0, 0x1bcaf,
+}; /* CR_In_Shorthand_Format_Controls */
+
/* 'In_Byzantine_Musical_Symbols': Block */
static const OnigCodePoint CR_In_Byzantine_Musical_Symbols[] = {
1,
@@ -25343,6 +28869,12 @@ static const OnigCodePoint CR_In_Mathematical_Alphanumeric_Symbols[] = {
0x1d400, 0x1d7ff,
}; /* CR_In_Mathematical_Alphanumeric_Symbols */
+/* 'In_Mende_Kikakui': Block */
+static const OnigCodePoint CR_In_Mende_Kikakui[] = {
+ 1,
+ 0x1e800, 0x1e8df,
+}; /* CR_In_Mende_Kikakui */
+
/* 'In_Arabic_Mathematical_Alphabetic_Symbols': Block */
static const OnigCodePoint CR_In_Arabic_Mathematical_Alphabetic_Symbols[] = {
1,
@@ -25379,11 +28911,11 @@ static const OnigCodePoint CR_In_Enclosed_Ideographic_Supplement[] = {
0x1f200, 0x1f2ff,
}; /* CR_In_Enclosed_Ideographic_Supplement */
-/* 'In_Miscellaneous_Symbols_And_Pictographs': Block */
-static const OnigCodePoint CR_In_Miscellaneous_Symbols_And_Pictographs[] = {
+/* 'In_Miscellaneous_Symbols_and_Pictographs': Block */
+static const OnigCodePoint CR_In_Miscellaneous_Symbols_and_Pictographs[] = {
1,
0x1f300, 0x1f5ff,
-}; /* CR_In_Miscellaneous_Symbols_And_Pictographs */
+}; /* CR_In_Miscellaneous_Symbols_and_Pictographs */
/* 'In_Emoticons': Block */
static const OnigCodePoint CR_In_Emoticons[] = {
@@ -25391,11 +28923,17 @@ static const OnigCodePoint CR_In_Emoticons[] = {
0x1f600, 0x1f64f,
}; /* CR_In_Emoticons */
-/* 'In_Transport_And_Map_Symbols': Block */
-static const OnigCodePoint CR_In_Transport_And_Map_Symbols[] = {
+/* 'In_Ornamental_Dingbats': Block */
+static const OnigCodePoint CR_In_Ornamental_Dingbats[] = {
+ 1,
+ 0x1f650, 0x1f67f,
+}; /* CR_In_Ornamental_Dingbats */
+
+/* 'In_Transport_and_Map_Symbols': Block */
+static const OnigCodePoint CR_In_Transport_and_Map_Symbols[] = {
1,
0x1f680, 0x1f6ff,
-}; /* CR_In_Transport_And_Map_Symbols */
+}; /* CR_In_Transport_and_Map_Symbols */
/* 'In_Alchemical_Symbols': Block */
static const OnigCodePoint CR_In_Alchemical_Symbols[] = {
@@ -25403,6 +28941,18 @@ static const OnigCodePoint CR_In_Alchemical_Symbols[] = {
0x1f700, 0x1f77f,
}; /* CR_In_Alchemical_Symbols */
+/* 'In_Geometric_Shapes_Extended': Block */
+static const OnigCodePoint CR_In_Geometric_Shapes_Extended[] = {
+ 1,
+ 0x1f780, 0x1f7ff,
+}; /* CR_In_Geometric_Shapes_Extended */
+
+/* 'In_Supplemental_Arrows_C': Block */
+static const OnigCodePoint CR_In_Supplemental_Arrows_C[] = {
+ 1,
+ 0x1f800, 0x1f8ff,
+}; /* CR_In_Supplemental_Arrows_C */
+
/* 'In_CJK_Unified_Ideographs_Extension_B': Block */
static const OnigCodePoint CR_In_CJK_Unified_Ideographs_Extension_B[] = {
1,
@@ -25453,38 +29003,42 @@ static const OnigCodePoint CR_In_Supplementary_Private_Use_Area_B[] = {
/* 'In_No_Block': Block */
static const OnigCodePoint CR_In_No_Block[] = {
- 36,
+ 40,
0x0860, 0x089f,
- 0x1ab0, 0x1aff,
0x1c80, 0x1cbf,
0x2fe0, 0x2fef,
- 0xa9e0, 0xa9ff,
- 0xab30, 0xabbf,
+ 0xab70, 0xabbf,
0x10200, 0x1027f,
- 0x102e0, 0x102ff,
- 0x10350, 0x1037f,
0x103e0, 0x103ff,
- 0x104b0, 0x107ff,
- 0x10860, 0x108ff,
+ 0x104b0, 0x104ff,
+ 0x10570, 0x105ff,
+ 0x10780, 0x107ff,
+ 0x108b0, 0x108ff,
0x10940, 0x1097f,
- 0x10a80, 0x10aff,
- 0x10b80, 0x10bff,
+ 0x10aa0, 0x10abf,
+ 0x10bb0, 0x10bff,
0x10c50, 0x10e5f,
0x10e80, 0x10fff,
- 0x11150, 0x1117f,
- 0x111e0, 0x1167f,
- 0x116d0, 0x11fff,
+ 0x11250, 0x112af,
+ 0x11380, 0x1147f,
+ 0x114e0, 0x1157f,
+ 0x11660, 0x1167f,
+ 0x116d0, 0x1189f,
+ 0x11900, 0x11abf,
+ 0x11b00, 0x11fff,
0x12480, 0x12fff,
0x13430, 0x167ff,
- 0x16a40, 0x16eff,
+ 0x16a70, 0x16acf,
+ 0x16b90, 0x16eff,
0x16fa0, 0x1afff,
- 0x1b100, 0x1cfff,
+ 0x1b100, 0x1bbff,
+ 0x1bcb0, 0x1cfff,
0x1d250, 0x1d2ff,
0x1d380, 0x1d3ff,
- 0x1d800, 0x1edff,
+ 0x1d800, 0x1e7ff,
+ 0x1e8e0, 0x1edff,
0x1ef00, 0x1efff,
- 0x1f650, 0x1f67f,
- 0x1f780, 0x1ffff,
+ 0x1f900, 0x1ffff,
0x2a6e0, 0x2a6ff,
0x2b820, 0x2f7ff,
0x2fa20, 0xdffff,
@@ -25671,6 +29225,29 @@ static const OnigCodePoint* const CodeRanges[] = {
CR_Sharada,
CR_Sora_Sompeng,
CR_Takri,
+ CR_Caucasian_Albanian,
+ CR_Bassa_Vah,
+ CR_Duployan,
+ CR_Elbasan,
+ CR_Grantha,
+ CR_Pahawh_Hmong,
+ CR_Khojki,
+ CR_Linear_A,
+ CR_Mahajani,
+ CR_Manichaean,
+ CR_Mende_Kikakui,
+ CR_Modi,
+ CR_Mro,
+ CR_Old_North_Arabian,
+ CR_Nabataean,
+ CR_Palmyrene,
+ CR_Pau_Cin_Hau,
+ CR_Old_Permic,
+ CR_Psalter_Pahlavi,
+ CR_Siddham,
+ CR_Khudawadi,
+ CR_Tirhuta,
+ CR_Warang_Citi,
CR_White_Space,
CR_Bidi_Control,
CR_Join_Control,
@@ -25704,6 +29281,7 @@ static const OnigCodePoint* const CodeRanges[] = {
CR_Pattern_White_Space,
CR_Pattern_Syntax,
CR_Unknown,
+#ifdef USE_UNICODE_AGE_PROPERTIES
CR_Age_1_1,
CR_Age_2_0,
CR_Age_2_1,
@@ -25717,6 +29295,10 @@ static const OnigCodePoint* const CodeRanges[] = {
CR_Age_5_2,
CR_Age_6_0,
CR_Age_6_1,
+ CR_Age_6_2,
+ CR_Age_6_3,
+ CR_Age_7_0,
+#endif /* USE_UNICODE_AGE_PROPERTIES */
CR_In_Basic_Latin,
CR_In_Latin_1_Supplement,
CR_In_Latin_Extended_A,
@@ -25772,6 +29354,7 @@ static const OnigCodePoint* const CodeRanges[] = {
CR_In_Khmer_Symbols,
CR_In_Buginese,
CR_In_Tai_Tham,
+ CR_In_Combining_Diacritical_Marks_Extended,
CR_In_Balinese,
CR_In_Sundanese,
CR_In_Batak,
@@ -25850,11 +29433,13 @@ static const OnigCodePoint* const CodeRanges[] = {
CR_In_Rejang,
CR_In_Hangul_Jamo_Extended_A,
CR_In_Javanese,
+ CR_In_Myanmar_Extended_B,
CR_In_Cham,
CR_In_Myanmar_Extended_A,
CR_In_Tai_Viet,
CR_In_Meetei_Mayek_Extensions,
CR_In_Ethiopic_Extended_A,
+ CR_In_Latin_Extended_E,
CR_In_Meetei_Mayek,
CR_In_Hangul_Syllables,
CR_In_Hangul_Jamo_Extended_B,
@@ -25881,54 +29466,83 @@ static const OnigCodePoint* const CodeRanges[] = {
CR_In_Phaistos_Disc,
CR_In_Lycian,
CR_In_Carian,
+ CR_In_Coptic_Epact_Numbers,
CR_In_Old_Italic,
CR_In_Gothic,
+ CR_In_Old_Permic,
CR_In_Ugaritic,
CR_In_Old_Persian,
CR_In_Deseret,
CR_In_Shavian,
CR_In_Osmanya,
+ CR_In_Elbasan,
+ CR_In_Caucasian_Albanian,
+ CR_In_Linear_A,
CR_In_Cypriot_Syllabary,
CR_In_Imperial_Aramaic,
+ CR_In_Palmyrene,
+ CR_In_Nabataean,
CR_In_Phoenician,
CR_In_Lydian,
CR_In_Meroitic_Hieroglyphs,
CR_In_Meroitic_Cursive,
CR_In_Kharoshthi,
CR_In_Old_South_Arabian,
+ CR_In_Old_North_Arabian,
+ CR_In_Manichaean,
CR_In_Avestan,
CR_In_Inscriptional_Parthian,
CR_In_Inscriptional_Pahlavi,
+ CR_In_Psalter_Pahlavi,
CR_In_Old_Turkic,
CR_In_Rumi_Numeral_Symbols,
CR_In_Brahmi,
CR_In_Kaithi,
CR_In_Sora_Sompeng,
CR_In_Chakma,
+ CR_In_Mahajani,
CR_In_Sharada,
+ CR_In_Sinhala_Archaic_Numbers,
+ CR_In_Khojki,
+ CR_In_Khudawadi,
+ CR_In_Grantha,
+ CR_In_Tirhuta,
+ CR_In_Siddham,
+ CR_In_Modi,
CR_In_Takri,
+ CR_In_Warang_Citi,
+ CR_In_Pau_Cin_Hau,
CR_In_Cuneiform,
CR_In_Cuneiform_Numbers_and_Punctuation,
CR_In_Egyptian_Hieroglyphs,
CR_In_Bamum_Supplement,
+ CR_In_Mro,
+ CR_In_Bassa_Vah,
+ CR_In_Pahawh_Hmong,
CR_In_Miao,
CR_In_Kana_Supplement,
+ CR_In_Duployan,
+ CR_In_Shorthand_Format_Controls,
CR_In_Byzantine_Musical_Symbols,
CR_In_Musical_Symbols,
CR_In_Ancient_Greek_Musical_Notation,
CR_In_Tai_Xuan_Jing_Symbols,
CR_In_Counting_Rod_Numerals,
CR_In_Mathematical_Alphanumeric_Symbols,
+ CR_In_Mende_Kikakui,
CR_In_Arabic_Mathematical_Alphabetic_Symbols,
CR_In_Mahjong_Tiles,
CR_In_Domino_Tiles,
CR_In_Playing_Cards,
CR_In_Enclosed_Alphanumeric_Supplement,
CR_In_Enclosed_Ideographic_Supplement,
- CR_In_Miscellaneous_Symbols_And_Pictographs,
+ CR_In_Miscellaneous_Symbols_and_Pictographs,
CR_In_Emoticons,
- CR_In_Transport_And_Map_Symbols,
+ CR_In_Ornamental_Dingbats,
+ CR_In_Transport_and_Map_Symbols,
CR_In_Alchemical_Symbols,
+ CR_In_Geometric_Shapes_Extended,
+ CR_In_Supplemental_Arrows_C,
CR_In_CJK_Unified_Ideographs_Extension_B,
CR_In_CJK_Unified_Ideographs_Extension_C,
CR_In_CJK_Unified_Ideographs_Extension_D,
@@ -25954,12 +29568,16 @@ static const struct uniname2ctype_struct *uniname2ctype_p(const char *, unsigned
#define MAX_HASH_VALUE 19
/* maximum key range = 14, duplicates = 0 */
#else /* USE_UNICODE_PROPERTIES */
-#define TOTAL_KEYWORDS 625
+#ifndef USE_UNICODE_AGE_PROPERTIES
+#define TOTAL_KEYWORDS 689
+#else /* USE_UNICODE_AGE_PROPERTIES */
+#define TOTAL_KEYWORDS 705
+#endif /* USE_UNICODE_AGE_PROPERTIES */
#define MIN_WORD_LENGTH 1
#define MAX_WORD_LENGTH 44
#define MIN_HASH_VALUE 3
-#define MAX_HASH_VALUE 4167
-/* maximum key range = 4165, duplicates = 0 */
+#define MAX_HASH_VALUE 4322
+/* maximum key range = 4320, duplicates = 0 */
#endif /* USE_UNICODE_PROPERTIES */
#ifdef __GNUC__
@@ -25995,19 +29613,24 @@ uniname2ctype_hash (str, len)
2, 20, 1, 20, 1, 7, 4, 6, 20, 1,
4, 20, 20, 20, 20, 20, 20, 20
#else /* USE_UNICODE_PROPERTIES */
- 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,
- 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,
- 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,
- 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,
- 4168, 4168, 4168, 4168, 4168, 4168, 1, 4168, 13, 1,
- 3, 28, 31, 10, 27, 4168, 4168, 4168, 4168, 4168,
- 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,
- 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,
- 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,
- 4168, 4168, 4168, 4168, 4168, 4168, 4168, 13, 854, 14,
- 443, 19, 7, 570, 335, 4, 66, 1159, 102, 34,
- 1, 178, 474, 1, 192, 2, 64, 1117, 491, 264,
- 256, 1305, 3, 4168, 4168, 4168, 4168, 4168
+ 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323,
+ 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323,
+ 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323,
+ 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323,
+#ifndef USE_UNICODE_AGE_PROPERTIES
+ 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323,
+ 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323,
+#else /* USE_UNICODE_AGE_PROPERTIES */
+ 4323, 4323, 4323, 4323, 4323, 4323, 1, 4323, 12, 1,
+ 2, 9, 18, 11, 6, 10, 4323, 4323, 4323, 4323,
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323,
+ 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323,
+ 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323, 4323,
+ 4323, 4323, 4323, 4323, 4323, 4323, 4323, 13, 931, 6,
+ 382, 25, 311, 891, 277, 4, 272, 1436, 120, 7,
+ 1, 303, 456, 1, 232, 32, 65, 732, 1411, 163,
+ 883, 1255, 8, 4323, 4323, 4323, 4323, 4323
#endif /* USE_UNICODE_PROPERTIES */
};
#ifndef USE_UNICODE_PROPERTIES
@@ -26071,630 +29694,722 @@ struct uniname2ctype_pool_t
char uniname2ctype_pool_str19[sizeof("blank")];
#else /* USE_UNICODE_PROPERTIES */
char uniname2ctype_pool_str3[sizeof("n")];
- char uniname2ctype_pool_str5[sizeof("s")];
- char uniname2ctype_pool_str7[sizeof("z")];
- char uniname2ctype_pool_str9[sizeof("zs")];
- char uniname2ctype_pool_str16[sizeof("zzzz")];
- char uniname2ctype_pool_str18[sizeof("cn")];
- char uniname2ctype_pool_str20[sizeof("cs")];
- char uniname2ctype_pool_str24[sizeof("ci")];
- char uniname2ctype_pool_str29[sizeof("c")];
- char uniname2ctype_pool_str30[sizeof("cf")];
- char uniname2ctype_pool_str32[sizeof("sc")];
- char uniname2ctype_pool_str34[sizeof("cans")];
+ char uniname2ctype_pool_str10[sizeof("cn")];
+ char uniname2ctype_pool_str11[sizeof("mn")];
+ char uniname2ctype_pool_str13[sizeof("c")];
+ char uniname2ctype_pool_str15[sizeof("m")];
+ char uniname2ctype_pool_str16[sizeof("ci")];
+ char uniname2ctype_pool_str17[sizeof("z")];
+ char uniname2ctype_pool_str20[sizeof("cc")];
+ char uniname2ctype_pool_str21[sizeof("mc")];
+ char uniname2ctype_pool_str29[sizeof("mani")];
+ char uniname2ctype_pool_str31[sizeof("inmanichaean")];
char uniname2ctype_pool_str35[sizeof("qaai")];
- char uniname2ctype_pool_str38[sizeof("mn")];
- char uniname2ctype_pool_str42[sizeof("ascii")];
- char uniname2ctype_pool_str44[sizeof("cc")];
- char uniname2ctype_pool_str45[sizeof("qaac")];
- char uniname2ctype_pool_str49[sizeof("inavestan")];
- char uniname2ctype_pool_str52[sizeof("inspecials")];
- char uniname2ctype_pool_str62[sizeof("inipaextensions")];
- char uniname2ctype_pool_str64[sizeof("mc")];
- char uniname2ctype_pool_str66[sizeof("insamaritan")];
- char uniname2ctype_pool_str69[sizeof("m")];
- char uniname2ctype_pool_str72[sizeof("sm")];
- char uniname2ctype_pool_str74[sizeof("me")];
- char uniname2ctype_pool_str82[sizeof("inarmenian")];
- char uniname2ctype_pool_str84[sizeof("incuneiform")];
- char uniname2ctype_pool_str86[sizeof("mandaic")];
- char uniname2ctype_pool_str90[sizeof("inancientsymbols")];
- char uniname2ctype_pool_str92[sizeof("incuneiformnumbersandpunctuation")];
- char uniname2ctype_pool_str96[sizeof("inthai")];
- char uniname2ctype_pool_str99[sizeof("inmusicalsymbols")];
- char uniname2ctype_pool_str100[sizeof("inmiscellaneoussymbols")];
- char uniname2ctype_pool_str106[sizeof("incham")];
- char uniname2ctype_pool_str109[sizeof("inmiscellaneoussymbolsandarrows")];
- char uniname2ctype_pool_str113[sizeof("initialpunctuation")];
- char uniname2ctype_pool_str114[sizeof("inmiscellaneoussymbolsandpictographs")];
- char uniname2ctype_pool_str116[sizeof("inthaana")];
- char uniname2ctype_pool_str124[sizeof("taile")];
- char uniname2ctype_pool_str125[sizeof("mtei")];
- char uniname2ctype_pool_str132[sizeof("lc")];
- char uniname2ctype_pool_str133[sizeof("lana")];
- char uniname2ctype_pool_str134[sizeof("inlycian")];
- char uniname2ctype_pool_str135[sizeof("intransportandmapsymbols")];
- char uniname2ctype_pool_str136[sizeof("incontrolpictures")];
- char uniname2ctype_pool_str142[sizeof("sinhala")];
- char uniname2ctype_pool_str151[sizeof("incommonindicnumberforms")];
- char uniname2ctype_pool_str156[sizeof("inmiscellaneousmathematicalsymbolsa")];
- char uniname2ctype_pool_str158[sizeof("sterm")];
- char uniname2ctype_pool_str167[sizeof("inmyanmarextendeda")];
- char uniname2ctype_pool_str172[sizeof("lm")];
- char uniname2ctype_pool_str175[sizeof("taiviet")];
- char uniname2ctype_pool_str179[sizeof("inlinearbideograms")];
- char uniname2ctype_pool_str180[sizeof("intaitham")];
- char uniname2ctype_pool_str184[sizeof("latn")];
- char uniname2ctype_pool_str186[sizeof("latin")];
- char uniname2ctype_pool_str187[sizeof("ital")];
- char uniname2ctype_pool_str189[sizeof("alnum")];
- char uniname2ctype_pool_str199[sizeof("inmalayalam")];
- char uniname2ctype_pool_str201[sizeof("intaile")];
- char uniname2ctype_pool_str202[sizeof("tale")];
- char uniname2ctype_pool_str205[sizeof("l")];
- char uniname2ctype_pool_str207[sizeof("nl")];
- char uniname2ctype_pool_str209[sizeof("zl")];
- char uniname2ctype_pool_str216[sizeof("intamil")];
- char uniname2ctype_pool_str217[sizeof("taml")];
- char uniname2ctype_pool_str218[sizeof("inlatinextendeda")];
- char uniname2ctype_pool_str220[sizeof("inlatinextendedc")];
- char uniname2ctype_pool_str223[sizeof("inrunic")];
- char uniname2ctype_pool_str224[sizeof("incarian")];
- char uniname2ctype_pool_str225[sizeof("insyriac")];
- char uniname2ctype_pool_str227[sizeof("cari")];
- char uniname2ctype_pool_str230[sizeof("inmeeteimayekextensions")];
- char uniname2ctype_pool_str231[sizeof("osma")];
- char uniname2ctype_pool_str232[sizeof("lt")];
- char uniname2ctype_pool_str233[sizeof("miao")];
- char uniname2ctype_pool_str234[sizeof("insharada")];
- char uniname2ctype_pool_str239[sizeof("incyrillic")];
- char uniname2ctype_pool_str240[sizeof("carian")];
- char uniname2ctype_pool_str244[sizeof("armn")];
- char uniname2ctype_pool_str245[sizeof("samr")];
- char uniname2ctype_pool_str247[sizeof("armi")];
- char uniname2ctype_pool_str248[sizeof("inideographicdescriptioncharacters")];
- char uniname2ctype_pool_str252[sizeof("inosmanya")];
- char uniname2ctype_pool_str253[sizeof("armenian")];
- char uniname2ctype_pool_str254[sizeof("inmyanmar")];
- char uniname2ctype_pool_str255[sizeof("samaritan")];
- char uniname2ctype_pool_str256[sizeof("arabic")];
- char uniname2ctype_pool_str259[sizeof("incherokee")];
- char uniname2ctype_pool_str261[sizeof("connectorpunctuation")];
- char uniname2ctype_pool_str263[sizeof("merc")];
- char uniname2ctype_pool_str264[sizeof("inmiscellaneoustechnical")];
- char uniname2ctype_pool_str268[sizeof("inenclosedalphanumerics")];
- char uniname2ctype_pool_str279[sizeof("inemoticons")];
- char uniname2ctype_pool_str281[sizeof("joinc")];
- char uniname2ctype_pool_str288[sizeof("cntrl")];
- char uniname2ctype_pool_str301[sizeof("inenclosedcjklettersandmonths")];
- char uniname2ctype_pool_str303[sizeof("cwcf")];
- char uniname2ctype_pool_str304[sizeof("inruminumeralsymbols")];
- char uniname2ctype_pool_str308[sizeof("ll")];
- char uniname2ctype_pool_str313[sizeof("term")];
- char uniname2ctype_pool_str316[sizeof("inlatinextendedadditional")];
- char uniname2ctype_pool_str320[sizeof("tamil")];
- char uniname2ctype_pool_str321[sizeof("loe")];
- char uniname2ctype_pool_str329[sizeof("newtailue")];
- char uniname2ctype_pool_str330[sizeof("cwcm")];
- char uniname2ctype_pool_str339[sizeof("inenclosedalphanumericsupplement")];
- char uniname2ctype_pool_str346[sizeof("sinh")];
- char uniname2ctype_pool_str347[sizeof("zinh")];
- char uniname2ctype_pool_str349[sizeof("meroiticcursive")];
- char uniname2ctype_pool_str353[sizeof("han")];
- char uniname2ctype_pool_str357[sizeof("hani")];
- char uniname2ctype_pool_str358[sizeof("inopticalcharacterrecognition")];
- char uniname2ctype_pool_str359[sizeof("no")];
- char uniname2ctype_pool_str360[sizeof("so")];
- char uniname2ctype_pool_str364[sizeof("innewtailue")];
- char uniname2ctype_pool_str365[sizeof("insinhala")];
- char uniname2ctype_pool_str367[sizeof("innko")];
- char uniname2ctype_pool_str372[sizeof("co")];
- char uniname2ctype_pool_str375[sizeof("shavian")];
- char uniname2ctype_pool_str378[sizeof("terminalpunctuation")];
- char uniname2ctype_pool_str386[sizeof("intaixuanjingsymbols")];
- char uniname2ctype_pool_str387[sizeof("inethiopic")];
- char uniname2ctype_pool_str389[sizeof("sora")];
- char uniname2ctype_pool_str398[sizeof("inarrows")];
- char uniname2ctype_pool_str400[sizeof("cham")];
- char uniname2ctype_pool_str403[sizeof("inlowsurrogates")];
- char uniname2ctype_pool_str405[sizeof("oriya")];
- char uniname2ctype_pool_str406[sizeof("ext")];
- char uniname2ctype_pool_str409[sizeof("cwt")];
- char uniname2ctype_pool_str412[sizeof("common")];
- char uniname2ctype_pool_str414[sizeof("inmiao")];
- char uniname2ctype_pool_str420[sizeof("thai")];
- char uniname2ctype_pool_str425[sizeof("intifinagh")];
- char uniname2ctype_pool_str426[sizeof("ethi")];
- char uniname2ctype_pool_str427[sizeof("mero")];
- char uniname2ctype_pool_str428[sizeof("chakma")];
- char uniname2ctype_pool_str429[sizeof("thaa")];
- char uniname2ctype_pool_str430[sizeof("inscriptionalparthian")];
- char uniname2ctype_pool_str432[sizeof("tifinagh")];
- char uniname2ctype_pool_str436[sizeof("titlecaseletter")];
- char uniname2ctype_pool_str445[sizeof("thaana")];
- char uniname2ctype_pool_str449[sizeof("asciihexdigit")];
- char uniname2ctype_pool_str450[sizeof("math")];
- char uniname2ctype_pool_str453[sizeof("di")];
- char uniname2ctype_pool_str454[sizeof("ids")];
- char uniname2ctype_pool_str460[sizeof("lo")];
- char uniname2ctype_pool_str468[sizeof("inlao")];
- char uniname2ctype_pool_str470[sizeof("taitham")];
- char uniname2ctype_pool_str474[sizeof("lao")];
- char uniname2ctype_pool_str475[sizeof("laoo")];
- char uniname2ctype_pool_str476[sizeof("dia")];
- char uniname2ctype_pool_str478[sizeof("idc")];
- char uniname2ctype_pool_str480[sizeof("ps")];
- char uniname2ctype_pool_str481[sizeof("insundanese")];
- char uniname2ctype_pool_str484[sizeof("pi")];
- char uniname2ctype_pool_str485[sizeof("cwl")];
- char uniname2ctype_pool_str490[sizeof("pf")];
- char uniname2ctype_pool_str495[sizeof("mand")];
- char uniname2ctype_pool_str496[sizeof("insylotinagri")];
- char uniname2ctype_pool_str497[sizeof("vs")];
- char uniname2ctype_pool_str503[sizeof("mongolian")];
- char uniname2ctype_pool_str504[sizeof("pc")];
- char uniname2ctype_pool_str506[sizeof("inmandaic")];
- char uniname2ctype_pool_str509[sizeof("invai")];
- char uniname2ctype_pool_str511[sizeof("lineseparator")];
- char uniname2ctype_pool_str514[sizeof("pe")];
- char uniname2ctype_pool_str515[sizeof("vai")];
- char uniname2ctype_pool_str516[sizeof("vaii")];
- char uniname2ctype_pool_str517[sizeof("idst")];
- char uniname2ctype_pool_str520[sizeof("indominotiles")];
- char uniname2ctype_pool_str521[sizeof("inshavian")];
- char uniname2ctype_pool_str522[sizeof("inspacingmodifierletters")];
- char uniname2ctype_pool_str524[sizeof("format")];
- char uniname2ctype_pool_str528[sizeof("inphaistosdisc")];
- char uniname2ctype_pool_str531[sizeof("hano")];
- char uniname2ctype_pool_str532[sizeof("space")];
- char uniname2ctype_pool_str542[sizeof("indeseret")];
- char uniname2ctype_pool_str545[sizeof("inolchiki")];
- char uniname2ctype_pool_str548[sizeof("hira")];
- char uniname2ctype_pool_str553[sizeof("joincontrol")];
- char uniname2ctype_pool_str555[sizeof("idcontinue")];
- char uniname2ctype_pool_str558[sizeof("inmahjongtiles")];
- char uniname2ctype_pool_str560[sizeof("patws")];
- char uniname2ctype_pool_str563[sizeof("inlydian")];
- char uniname2ctype_pool_str564[sizeof("cher")];
- char uniname2ctype_pool_str568[sizeof("inhiragana")];
- char uniname2ctype_pool_str572[sizeof("inogham")];
- char uniname2ctype_pool_str574[sizeof("avst")];
- char uniname2ctype_pool_str575[sizeof("inscriptionalpahlavi")];
- char uniname2ctype_pool_str579[sizeof("incoptic")];
- char uniname2ctype_pool_str587[sizeof("java")];
- char uniname2ctype_pool_str589[sizeof("inmathematicalalphanumericsymbols")];
- char uniname2ctype_pool_str594[sizeof("letter")];
- char uniname2ctype_pool_str604[sizeof("injavanese")];
- char uniname2ctype_pool_str608[sizeof("avestan")];
- char uniname2ctype_pool_str612[sizeof("age=1.1")];
- char uniname2ctype_pool_str613[sizeof("lepc")];
- char uniname2ctype_pool_str614[sizeof("age=2.1")];
- char uniname2ctype_pool_str616[sizeof("inlepcha")];
- char uniname2ctype_pool_str617[sizeof("javanese")];
- char uniname2ctype_pool_str618[sizeof("shaw")];
- char uniname2ctype_pool_str619[sizeof("finalpunctuation")];
+ char uniname2ctype_pool_str36[sizeof("zzzz")];
+ char uniname2ctype_pool_str37[sizeof("qaac")];
+ char uniname2ctype_pool_str44[sizeof("incham")];
+ char uniname2ctype_pool_str46[sizeof("sc")];
+ char uniname2ctype_pool_str48[sizeof("sm")];
+ char uniname2ctype_pool_str51[sizeof("mandaic")];
+ char uniname2ctype_pool_str55[sizeof("incuneiform")];
+ char uniname2ctype_pool_str56[sizeof("cans")];
+ char uniname2ctype_pool_str59[sizeof("me")];
+ char uniname2ctype_pool_str61[sizeof("inarmenian")];
+ char uniname2ctype_pool_str64[sizeof("ascii")];
+ char uniname2ctype_pool_str65[sizeof("s")];
+ char uniname2ctype_pool_str69[sizeof("insamaritan")];
+ char uniname2ctype_pool_str72[sizeof("cs")];
+ char uniname2ctype_pool_str74[sizeof("zs")];
+ char uniname2ctype_pool_str85[sizeof("inavestan")];
+ char uniname2ctype_pool_str92[sizeof("incommonindicnumberforms")];
+ char uniname2ctype_pool_str96[sizeof("incuneiformnumbersandpunctuation")];
+ char uniname2ctype_pool_str97[sizeof("inthai")];
+ char uniname2ctype_pool_str98[sizeof("inipaextensions")];
+ char uniname2ctype_pool_str105[sizeof("mtei")];
+ char uniname2ctype_pool_str110[sizeof("inspecials")];
+ char uniname2ctype_pool_str114[sizeof("initialpunctuation")];
+ char uniname2ctype_pool_str115[sizeof("inancientsymbols")];
+ char uniname2ctype_pool_str117[sizeof("inthaana")];
+ char uniname2ctype_pool_str130[sizeof("inmiscellaneousmathematicalsymbolsa")];
+ char uniname2ctype_pool_str134[sizeof("lc")];
+ char uniname2ctype_pool_str135[sizeof("inmusicalsymbols")];
+ char uniname2ctype_pool_str136[sizeof("lm")];
+ char uniname2ctype_pool_str137[sizeof("taile")];
+ char uniname2ctype_pool_str141[sizeof("sterm")];
+ char uniname2ctype_pool_str142[sizeof("lina")];
+ char uniname2ctype_pool_str144[sizeof("inlycian")];
+ char uniname2ctype_pool_str147[sizeof("inmyanmarextendeda")];
+ char uniname2ctype_pool_str151[sizeof("lana")];
+ char uniname2ctype_pool_str153[sizeof("alnum")];
+ char uniname2ctype_pool_str155[sizeof("intaitham")];
+ char uniname2ctype_pool_str157[sizeof("incontrolpictures")];
+ char uniname2ctype_pool_str161[sizeof("inmiscellaneoussymbols")];
+ char uniname2ctype_pool_str163[sizeof("inmalayalam")];
+ char uniname2ctype_pool_str166[sizeof("intransportandmapsymbols")];
+ char uniname2ctype_pool_str170[sizeof("inmiscellaneoussymbolsandarrows")];
+ char uniname2ctype_pool_str173[sizeof("inlineara")];
+ char uniname2ctype_pool_str175[sizeof("inmiscellaneoussymbolsandpictographs")];
+ char uniname2ctype_pool_str183[sizeof("taiviet")];
+ char uniname2ctype_pool_str186[sizeof("cwcm")];
+ char uniname2ctype_pool_str190[sizeof("sinhala")];
+ char uniname2ctype_pool_str203[sizeof("latn")];
+ char uniname2ctype_pool_str205[sizeof("latin")];
+ char uniname2ctype_pool_str206[sizeof("ital")];
+ char uniname2ctype_pool_str208[sizeof("intamil")];
+ char uniname2ctype_pool_str209[sizeof("taml")];
+ char uniname2ctype_pool_str223[sizeof("inlatinextendedc")];
+ char uniname2ctype_pool_str226[sizeof("intaile")];
+ char uniname2ctype_pool_str227[sizeof("tale")];
+ char uniname2ctype_pool_str237[sizeof("inlatinextendeda")];
+ char uniname2ctype_pool_str239[sizeof("inlinearbideograms")];
+ char uniname2ctype_pool_str240[sizeof("newtailue")];
+ char uniname2ctype_pool_str241[sizeof("l")];
+ char uniname2ctype_pool_str243[sizeof("nl")];
+ char uniname2ctype_pool_str247[sizeof("inmeeteimayekextensions")];
+ char uniname2ctype_pool_str250[sizeof("zl")];
+ char uniname2ctype_pool_str252[sizeof("lt")];
+ char uniname2ctype_pool_str255[sizeof("inrunic")];
+ char uniname2ctype_pool_str256[sizeof("incarian")];
+ char uniname2ctype_pool_str257[sizeof("armn")];
+ char uniname2ctype_pool_str259[sizeof("cari")];
+ char uniname2ctype_pool_str260[sizeof("armi")];
+ char uniname2ctype_pool_str261[sizeof("inlatinextendede")];
+ char uniname2ctype_pool_str263[sizeof("incyrillic")];
+ char uniname2ctype_pool_str266[sizeof("armenian")];
+ char uniname2ctype_pool_str267[sizeof("inmyanmar")];
+ char uniname2ctype_pool_str270[sizeof("innewtailue")];
+ char uniname2ctype_pool_str272[sizeof("carian")];
+ char uniname2ctype_pool_str274[sizeof("merc")];
+ char uniname2ctype_pool_str280[sizeof("arabic")];
+ char uniname2ctype_pool_str284[sizeof("inmiscellaneoustechnical")];
+ char uniname2ctype_pool_str287[sizeof("insyriac")];
+ char uniname2ctype_pool_str288[sizeof("samr")];
+ char uniname2ctype_pool_str294[sizeof("zinh")];
+ char uniname2ctype_pool_str295[sizeof("han")];
+ char uniname2ctype_pool_str298[sizeof("samaritan")];
+ char uniname2ctype_pool_str299[sizeof("hani")];
+ char uniname2ctype_pool_str302[sizeof("cwt")];
+ char uniname2ctype_pool_str303[sizeof("incherokee")];
+ char uniname2ctype_pool_str304[sizeof("insharada")];
+ char uniname2ctype_pool_str307[sizeof("cham")];
+ char uniname2ctype_pool_str315[sizeof("manichaean")];
+ char uniname2ctype_pool_str316[sizeof("inmahajani")];
+ char uniname2ctype_pool_str317[sizeof("cntrl")];
+ char uniname2ctype_pool_str318[sizeof("sinh")];
+ char uniname2ctype_pool_str320[sizeof("inruminumeralsymbols")];
+ char uniname2ctype_pool_str327[sizeof("inethiopic")];
+ char uniname2ctype_pool_str330[sizeof("tamil")];
+ char uniname2ctype_pool_str331[sizeof("miao")];
+ char uniname2ctype_pool_str332[sizeof("inenclosedalphanumerics")];
+ char uniname2ctype_pool_str333[sizeof("term")];
+ char uniname2ctype_pool_str335[sizeof("chakma")];
+ char uniname2ctype_pool_str337[sizeof("insinhala")];
+ char uniname2ctype_pool_str347[sizeof("shavian")];
+ char uniname2ctype_pool_str350[sizeof("inosmanya")];
+ char uniname2ctype_pool_str353[sizeof("inlatinextendedadditional")];
+ char uniname2ctype_pool_str359[sizeof("osma")];
+ char uniname2ctype_pool_str362[sizeof("ll")];
+ char uniname2ctype_pool_str363[sizeof("thai")];
+ char uniname2ctype_pool_str366[sizeof("math")];
+ char uniname2ctype_pool_str372[sizeof("thaa")];
+ char uniname2ctype_pool_str374[sizeof("inenclosedalphanumericsupplement")];
+ char uniname2ctype_pool_str375[sizeof("ethi")];
+ char uniname2ctype_pool_str376[sizeof("connectorpunctuation")];
+ char uniname2ctype_pool_str380[sizeof("inlowsurrogates")];
+ char uniname2ctype_pool_str382[sizeof("insinhalaarchaicnumbers")];
+ char uniname2ctype_pool_str386[sizeof("taitham")];
+ char uniname2ctype_pool_str388[sizeof("thaana")];
+ char uniname2ctype_pool_str390[sizeof("lineara")];
+ char uniname2ctype_pool_str392[sizeof("di")];
+ char uniname2ctype_pool_str401[sizeof("idc")];
+ char uniname2ctype_pool_str405[sizeof("meroiticcursive")];
+ char uniname2ctype_pool_str407[sizeof("mand")];
+ char uniname2ctype_pool_str408[sizeof("inmodi")];
+ char uniname2ctype_pool_str410[sizeof("inmandaic")];
+ char uniname2ctype_pool_str412[sizeof("cwl")];
+ char uniname2ctype_pool_str414[sizeof("asciihexdigit")];
+ char uniname2ctype_pool_str415[sizeof("dia")];
+ char uniname2ctype_pool_str418[sizeof("terminalpunctuation")];
+ char uniname2ctype_pool_str419[sizeof("mend")];
+ char uniname2ctype_pool_str423[sizeof("sind")];
+ char uniname2ctype_pool_str425[sizeof("wara")];
+ char uniname2ctype_pool_str433[sizeof("inwarangciti")];
+ char uniname2ctype_pool_str439[sizeof("inideographicdescriptioncharacters")];
+ char uniname2ctype_pool_str441[sizeof("inemoticons")];
+ char uniname2ctype_pool_str453[sizeof("ids")];
+ char uniname2ctype_pool_str456[sizeof("insundanese")];
+ char uniname2ctype_pool_str466[sizeof("pi")];
+ char uniname2ctype_pool_str468[sizeof("indominotiles")];
+ char uniname2ctype_pool_str470[sizeof("pc")];
+ char uniname2ctype_pool_str476[sizeof("loe")];
+ char uniname2ctype_pool_str477[sizeof("titlecaseletter")];
+ char uniname2ctype_pool_str485[sizeof("inopticalcharacterrecognition")];
+ char uniname2ctype_pool_str487[sizeof("idst")];
+ char uniname2ctype_pool_str489[sizeof("shaw")];
+ char uniname2ctype_pool_str490[sizeof("cwcf")];
+ char uniname2ctype_pool_str493[sizeof("idcontinue")];
+ char uniname2ctype_pool_str502[sizeof("inphaistosdisc")];
+ char uniname2ctype_pool_str508[sizeof("pe")];
+ char uniname2ctype_pool_str518[sizeof("indeseret")];
+ char uniname2ctype_pool_str519[sizeof("inspacingmodifierletters")];
+ char uniname2ctype_pool_str520[sizeof("inlydian")];
+ char uniname2ctype_pool_str522[sizeof("ps")];
+ char uniname2ctype_pool_str530[sizeof("hira")];
+ char uniname2ctype_pool_str536[sizeof("whitespace")];
+ char uniname2ctype_pool_str540[sizeof("inscriptionalparthian")];
+ char uniname2ctype_pool_str544[sizeof("cher")];
+ char uniname2ctype_pool_str545[sizeof("inmathematicalalphanumericsymbols")];
+ char uniname2ctype_pool_str546[sizeof("incoptic")];
+ char uniname2ctype_pool_str550[sizeof("inhiragana")];
+ char uniname2ctype_pool_str554[sizeof("inenclosedcjklettersandmonths")];
+ char uniname2ctype_pool_str556[sizeof("space")];
+ char uniname2ctype_pool_str570[sizeof("oriya")];
+ char uniname2ctype_pool_str571[sizeof("mero")];
+ char uniname2ctype_pool_str573[sizeof("mahj")];
+ char uniname2ctype_pool_str582[sizeof("tirh")];
+ char uniname2ctype_pool_str584[sizeof("sora")];
+ char uniname2ctype_pool_str587[sizeof("inscriptionalpahlavi")];
+ char uniname2ctype_pool_str593[sizeof("inarrows")];
+ char uniname2ctype_pool_str594[sizeof("mahajani")];
+ char uniname2ctype_pool_str596[sizeof("joinc")];
+ char uniname2ctype_pool_str597[sizeof("incopticepactnumbers")];
+ char uniname2ctype_pool_str598[sizeof("hano")];
+ char uniname2ctype_pool_str600[sizeof("palm")];
+ char uniname2ctype_pool_str601[sizeof("intirhuta")];
+ char uniname2ctype_pool_str603[sizeof("patws")];
+ char uniname2ctype_pool_str604[sizeof("inolchiki")];
+ char uniname2ctype_pool_str608[sizeof("inlepcha")];
+ char uniname2ctype_pool_str609[sizeof("no")];
+ char uniname2ctype_pool_str611[sizeof("lepc")];
+ char uniname2ctype_pool_str612[sizeof("inogham")];
+ char uniname2ctype_pool_str614[sizeof("co")];
+ char uniname2ctype_pool_str617[sizeof("innko")];
char uniname2ctype_pool_str620[sizeof("alpha")];
- char uniname2ctype_pool_str621[sizeof("age=5.1")];
- char uniname2ctype_pool_str622[sizeof("inmongolian")];
- char uniname2ctype_pool_str623[sizeof("age=5.2")];
- char uniname2ctype_pool_str626[sizeof("age=2.0")];
- char uniname2ctype_pool_str627[sizeof("ahex")];
- char uniname2ctype_pool_str630[sizeof("ingeneralpunctuation")];
- char uniname2ctype_pool_str631[sizeof("oids")];
- char uniname2ctype_pool_str632[sizeof("odi")];
- char uniname2ctype_pool_str633[sizeof("age=5.0")];
- char uniname2ctype_pool_str636[sizeof("tavt")];
- char uniname2ctype_pool_str637[sizeof("intaiviet")];
- char uniname2ctype_pool_str638[sizeof("age=6.1")];
- char uniname2ctype_pool_str639[sizeof("age=3.1")];
- char uniname2ctype_pool_str640[sizeof("insundanesesupplement")];
- char uniname2ctype_pool_str641[sizeof("age=3.2")];
- char uniname2ctype_pool_str642[sizeof("age=4.1")];
- char uniname2ctype_pool_str643[sizeof("oidc")];
- char uniname2ctype_pool_str646[sizeof("tfng")];
- char uniname2ctype_pool_str647[sizeof("insmallformvariants")];
- char uniname2ctype_pool_str648[sizeof("ideo")];
- char uniname2ctype_pool_str649[sizeof("intags")];
- char uniname2ctype_pool_str650[sizeof("age=6.0")];
- char uniname2ctype_pool_str651[sizeof("age=3.0")];
- char uniname2ctype_pool_str653[sizeof("whitespace")];
- char uniname2ctype_pool_str654[sizeof("age=4.0")];
- char uniname2ctype_pool_str655[sizeof("inolditalic")];
- char uniname2ctype_pool_str660[sizeof("oalpha")];
- char uniname2ctype_pool_str668[sizeof("ingujarati")];
- char uniname2ctype_pool_str672[sizeof("control")];
- char uniname2ctype_pool_str679[sizeof("diacritic")];
- char uniname2ctype_pool_str682[sizeof("tagbanwa")];
- char uniname2ctype_pool_str690[sizeof("inphoenician")];
- char uniname2ctype_pool_str701[sizeof("ininscriptionalparthian")];
- char uniname2ctype_pool_str703[sizeof("ininscriptionalpahlavi")];
- char uniname2ctype_pool_str704[sizeof("coptic")];
- char uniname2ctype_pool_str705[sizeof("dsrt")];
- char uniname2ctype_pool_str706[sizeof("inmodifiertoneletters")];
- char uniname2ctype_pool_str709[sizeof("xids")];
- char uniname2ctype_pool_str713[sizeof("hanunoo")];
- char uniname2ctype_pool_str715[sizeof("inoldturkic")];
- char uniname2ctype_pool_str721[sizeof("xidc")];
- char uniname2ctype_pool_str725[sizeof("idstart")];
- char uniname2ctype_pool_str729[sizeof("inimperialaramaic")];
- char uniname2ctype_pool_str730[sizeof("invariationselectors")];
- char uniname2ctype_pool_str734[sizeof("copt")];
- char uniname2ctype_pool_str737[sizeof("caseignorable")];
- char uniname2ctype_pool_str738[sizeof("prti")];
- char uniname2ctype_pool_str739[sizeof("nchar")];
- char uniname2ctype_pool_str746[sizeof("deseret")];
- char uniname2ctype_pool_str747[sizeof("decimalnumber")];
- char uniname2ctype_pool_str748[sizeof("cprt")];
- char uniname2ctype_pool_str750[sizeof("inlatin1supplement")];
- char uniname2ctype_pool_str771[sizeof("imperialaramaic")];
- char uniname2ctype_pool_str776[sizeof("privateuse")];
- char uniname2ctype_pool_str777[sizeof("casedletter")];
- char uniname2ctype_pool_str778[sizeof("lowercase")];
- char uniname2ctype_pool_str780[sizeof("spaceseparator")];
- char uniname2ctype_pool_str784[sizeof("radical")];
- char uniname2ctype_pool_str787[sizeof("mong")];
- char uniname2ctype_pool_str788[sizeof("canadianaboriginal")];
- char uniname2ctype_pool_str792[sizeof("letternumber")];
- char uniname2ctype_pool_str796[sizeof("insorasompeng")];
- char uniname2ctype_pool_str797[sizeof("dash")];
- char uniname2ctype_pool_str798[sizeof("wspace")];
- char uniname2ctype_pool_str799[sizeof("ogam")];
- char uniname2ctype_pool_str802[sizeof("invariationselectorssupplement")];
- char uniname2ctype_pool_str803[sizeof("print")];
- char uniname2ctype_pool_str811[sizeof("otheridcontinue")];
- char uniname2ctype_pool_str815[sizeof("ingurmukhi")];
- char uniname2ctype_pool_str818[sizeof("closepunctuation")];
- char uniname2ctype_pool_str823[sizeof("olditalic")];
- char uniname2ctype_pool_str824[sizeof("noncharactercodepoint")];
- char uniname2ctype_pool_str826[sizeof("sharada")];
- char uniname2ctype_pool_str827[sizeof("ingeometricshapes")];
- char uniname2ctype_pool_str830[sizeof("otheralphabetic")];
- char uniname2ctype_pool_str831[sizeof("patternwhitespace")];
- char uniname2ctype_pool_str832[sizeof("po")];
- char uniname2ctype_pool_str833[sizeof("rjng")];
- char uniname2ctype_pool_str835[sizeof("ingreekandcoptic")];
- char uniname2ctype_pool_str841[sizeof("xdigit")];
- char uniname2ctype_pool_str850[sizeof("gothic")];
- char uniname2ctype_pool_str851[sizeof("inoldsoutharabian")];
- char uniname2ctype_pool_str852[sizeof("xidstart")];
- char uniname2ctype_pool_str854[sizeof("inrejang")];
- char uniname2ctype_pool_str860[sizeof("idsbinaryoperator")];
- char uniname2ctype_pool_str867[sizeof("olower")];
- char uniname2ctype_pool_str869[sizeof("hex")];
- char uniname2ctype_pool_str870[sizeof("inenclosedideographicsupplement")];
- char uniname2ctype_pool_str874[sizeof("inalphabeticpresentationforms")];
- char uniname2ctype_pool_str879[sizeof("inbasiclatin")];
- char uniname2ctype_pool_str884[sizeof("othersymbol")];
- char uniname2ctype_pool_str889[sizeof("nd")];
- char uniname2ctype_pool_str890[sizeof("sd")];
- char uniname2ctype_pool_str900[sizeof("omath")];
- char uniname2ctype_pool_str901[sizeof("separator")];
- char uniname2ctype_pool_str907[sizeof("inarabic")];
- char uniname2ctype_pool_str912[sizeof("xidcontinue")];
- char uniname2ctype_pool_str913[sizeof("otheridstart")];
- char uniname2ctype_pool_str914[sizeof("grext")];
- char uniname2ctype_pool_str917[sizeof("otherlowercase")];
- char uniname2ctype_pool_str919[sizeof("phli")];
- char uniname2ctype_pool_str920[sizeof("cased")];
- char uniname2ctype_pool_str923[sizeof("hang")];
- char uniname2ctype_pool_str931[sizeof("xpeo")];
- char uniname2ctype_pool_str933[sizeof("lower")];
- char uniname2ctype_pool_str936[sizeof("modifierletter")];
- char uniname2ctype_pool_str938[sizeof("inphoneticextensions")];
- char uniname2ctype_pool_str939[sizeof("inarabicpresentationformsa")];
- char uniname2ctype_pool_str943[sizeof("innumberforms")];
- char uniname2ctype_pool_str945[sizeof("oldpersian")];
- char uniname2ctype_pool_str946[sizeof("incyrillicextendeda")];
- char uniname2ctype_pool_str947[sizeof("inverticalforms")];
- char uniname2ctype_pool_str949[sizeof("p")];
- char uniname2ctype_pool_str950[sizeof("inbyzantinemusicalsymbols")];
- char uniname2ctype_pool_str951[sizeof("inmathematicaloperators")];
- char uniname2ctype_pool_str952[sizeof("intibetan")];
- char uniname2ctype_pool_str953[sizeof("zp")];
- char uniname2ctype_pool_str956[sizeof("ingeorgian")];
- char uniname2ctype_pool_str960[sizeof("inbraillepatterns")];
- char uniname2ctype_pool_str962[sizeof("lepcha")];
- char uniname2ctype_pool_str963[sizeof("geor")];
- char uniname2ctype_pool_str964[sizeof("invedicextensions")];
- char uniname2ctype_pool_str965[sizeof("linb")];
- char uniname2ctype_pool_str966[sizeof("other")];
- char uniname2ctype_pool_str970[sizeof("deva")];
- char uniname2ctype_pool_str972[sizeof("indevanagari")];
- char uniname2ctype_pool_str973[sizeof("othernumber")];
- char uniname2ctype_pool_str974[sizeof("bamum")];
- char uniname2ctype_pool_str976[sizeof("shrd")];
- char uniname2ctype_pool_str977[sizeof("bali")];
- char uniname2ctype_pool_str981[sizeof("devanagari")];
- char uniname2ctype_pool_str983[sizeof("extender")];
- char uniname2ctype_pool_str988[sizeof("inherited")];
- char uniname2ctype_pool_str989[sizeof("glagolitic")];
- char uniname2ctype_pool_str990[sizeof("tibt")];
- char uniname2ctype_pool_str994[sizeof("inbalinese")];
- char uniname2ctype_pool_str996[sizeof("ingothic")];
- char uniname2ctype_pool_str997[sizeof("inmiscellaneousmathematicalsymbolsb")];
- char uniname2ctype_pool_str998[sizeof("limb")];
- char uniname2ctype_pool_str1000[sizeof("bengali")];
- char uniname2ctype_pool_str1003[sizeof("phoenician")];
- char uniname2ctype_pool_str1004[sizeof("insuperscriptsandsubscripts")];
- char uniname2ctype_pool_str1006[sizeof("inmeroitichieroglyphs")];
- char uniname2ctype_pool_str1007[sizeof("tibetan")];
- char uniname2ctype_pool_str1010[sizeof("inphoneticextensionssupplement")];
- char uniname2ctype_pool_str1016[sizeof("balinese")];
- char uniname2ctype_pool_str1021[sizeof("lowercaseletter")];
- char uniname2ctype_pool_str1031[sizeof("indingbats")];
- char uniname2ctype_pool_str1035[sizeof("inprivateusearea")];
- char uniname2ctype_pool_str1039[sizeof("assigned")];
- char uniname2ctype_pool_str1044[sizeof("patternsyntax")];
- char uniname2ctype_pool_str1051[sizeof("inhangulsyllables")];
- char uniname2ctype_pool_str1065[sizeof("sarb")];
- char uniname2ctype_pool_str1067[sizeof("brai")];
- char uniname2ctype_pool_str1069[sizeof("insupplementalmathematicaloperators")];
- char uniname2ctype_pool_str1070[sizeof("phnx")];
- char uniname2ctype_pool_str1072[sizeof("ingreekextended")];
- char uniname2ctype_pool_str1074[sizeof("otherletter")];
- char uniname2ctype_pool_str1076[sizeof("arab")];
- char uniname2ctype_pool_str1078[sizeof("inlatinextendedd")];
- char uniname2ctype_pool_str1081[sizeof("word")];
- char uniname2ctype_pool_str1084[sizeof("inphagspa")];
- char uniname2ctype_pool_str1087[sizeof("inblockelements")];
- char uniname2ctype_pool_str1092[sizeof("ethiopic")];
- char uniname2ctype_pool_str1094[sizeof("inethiopicextendeda")];
- char uniname2ctype_pool_str1107[sizeof("brahmi")];
- char uniname2ctype_pool_str1110[sizeof("logicalorderexception")];
- char uniname2ctype_pool_str1114[sizeof("inoldpersian")];
- char uniname2ctype_pool_str1129[sizeof("inletterlikesymbols")];
- char uniname2ctype_pool_str1133[sizeof("sorasompeng")];
- char uniname2ctype_pool_str1135[sizeof("hiragana")];
- char uniname2ctype_pool_str1142[sizeof("inhanguljamoextendeda")];
- char uniname2ctype_pool_str1147[sizeof("othermath")];
- char uniname2ctype_pool_str1150[sizeof("digit")];
- char uniname2ctype_pool_str1151[sizeof("goth")];
- char uniname2ctype_pool_str1156[sizeof("ogham")];
- char uniname2ctype_pool_str1162[sizeof("sundanese")];
- char uniname2ctype_pool_str1170[sizeof("saurashtra")];
- char uniname2ctype_pool_str1173[sizeof("linearb")];
- char uniname2ctype_pool_str1179[sizeof("graphemebase")];
- char uniname2ctype_pool_str1185[sizeof("inunifiedcanadianaboriginalsyllabics")];
- char uniname2ctype_pool_str1186[sizeof("cuneiform")];
- char uniname2ctype_pool_str1188[sizeof("inkannada")];
- char uniname2ctype_pool_str1190[sizeof("kana")];
- char uniname2ctype_pool_str1195[sizeof("inancientgreeknumbers")];
- char uniname2ctype_pool_str1196[sizeof("incjkstrokes")];
- char uniname2ctype_pool_str1198[sizeof("inglagolitic")];
- char uniname2ctype_pool_str1202[sizeof("inancientgreekmusicalnotation")];
- char uniname2ctype_pool_str1212[sizeof("inchakma")];
- char uniname2ctype_pool_str1215[sizeof("plrd")];
- char uniname2ctype_pool_str1219[sizeof("inbrahmi")];
- char uniname2ctype_pool_str1224[sizeof("cakm")];
- char uniname2ctype_pool_str1225[sizeof("incjkcompatibilityforms")];
- char uniname2ctype_pool_str1229[sizeof("lisu")];
- char uniname2ctype_pool_str1230[sizeof("incjkcompatibilityideographs")];
- char uniname2ctype_pool_str1231[sizeof("intagalog")];
- char uniname2ctype_pool_str1244[sizeof("inkaithi")];
- char uniname2ctype_pool_str1245[sizeof("insupplementalarrowsa")];
- char uniname2ctype_pool_str1249[sizeof("takri")];
- char uniname2ctype_pool_str1253[sizeof("ideographic")];
- char uniname2ctype_pool_str1256[sizeof("hexdigit")];
- char uniname2ctype_pool_str1259[sizeof("glag")];
- char uniname2ctype_pool_str1261[sizeof("softdotted")];
- char uniname2ctype_pool_str1262[sizeof("variationselector")];
- char uniname2ctype_pool_str1264[sizeof("inkatakana")];
- char uniname2ctype_pool_str1265[sizeof("meeteimayek")];
- char uniname2ctype_pool_str1274[sizeof("otherpunctuation")];
- char uniname2ctype_pool_str1279[sizeof("inhanguljamo")];
- char uniname2ctype_pool_str1282[sizeof("kali")];
- char uniname2ctype_pool_str1289[sizeof("braille")];
- char uniname2ctype_pool_str1298[sizeof("incombininghalfmarks")];
- char uniname2ctype_pool_str1300[sizeof("talu")];
- char uniname2ctype_pool_str1302[sizeof("incjkcompatibilityideographssupplement")];
- char uniname2ctype_pool_str1306[sizeof("telu")];
- char uniname2ctype_pool_str1307[sizeof("idsb")];
- char uniname2ctype_pool_str1310[sizeof("tglg")];
- char uniname2ctype_pool_str1313[sizeof("inmeeteimayek")];
- char uniname2ctype_pool_str1315[sizeof("yi")];
- char uniname2ctype_pool_str1318[sizeof("phagspa")];
- char uniname2ctype_pool_str1321[sizeof("yiii")];
- char uniname2ctype_pool_str1323[sizeof("inarabicmathematicalalphabeticsymbols")];
- char uniname2ctype_pool_str1328[sizeof("saur")];
- char uniname2ctype_pool_str1330[sizeof("ogrext")];
+ char uniname2ctype_pool_str622[sizeof("psalterpahlavi")];
+ char uniname2ctype_pool_str623[sizeof("inmro")];
+ char uniname2ctype_pool_str624[sizeof("inpalmyrene")];
+ char uniname2ctype_pool_str627[sizeof("common")];
+ char uniname2ctype_pool_str630[sizeof("cf")];
+ char uniname2ctype_pool_str637[sizeof("inmiao")];
+ char uniname2ctype_pool_str640[sizeof("so")];
+ char uniname2ctype_pool_str650[sizeof("diacritic")];
+ char uniname2ctype_pool_str658[sizeof("insundanesesupplement")];
+ char uniname2ctype_pool_str672[sizeof("intifinagh")];
+ char uniname2ctype_pool_str679[sizeof("tifinagh")];
+ char uniname2ctype_pool_str696[sizeof("odi")];
+ char uniname2ctype_pool_str699[sizeof("oidc")];
+ char uniname2ctype_pool_str700[sizeof("modi")];
+ char uniname2ctype_pool_str703[sizeof("decimalnumber")];
+ char uniname2ctype_pool_str705[sizeof("letter")];
+ char uniname2ctype_pool_str708[sizeof("dash")];
+ char uniname2ctype_pool_str709[sizeof("insylotinagri")];
+ char uniname2ctype_pool_str711[sizeof("inolditalic")];
+ char uniname2ctype_pool_str713[sizeof("wspace")];
+ char uniname2ctype_pool_str715[sizeof("dsrt")];
+ char uniname2ctype_pool_str718[sizeof("ideo")];
+ char uniname2ctype_pool_str722[sizeof("siddham")];
+ char uniname2ctype_pool_str724[sizeof("perm")];
+ char uniname2ctype_pool_str725[sizeof("oids")];
+ char uniname2ctype_pool_str727[sizeof("inmahjongtiles")];
+ char uniname2ctype_pool_str728[sizeof("lo")];
+ char uniname2ctype_pool_str730[sizeof("lineseparator")];
+ char uniname2ctype_pool_str731[sizeof("imperialaramaic")];
+ char uniname2ctype_pool_str735[sizeof("idstart")];
+ char uniname2ctype_pool_str736[sizeof("inlao")];
+ char uniname2ctype_pool_str737[sizeof("sharada")];
+ char uniname2ctype_pool_str742[sizeof("lao")];
+ char uniname2ctype_pool_str743[sizeof("laoo")];
+ char uniname2ctype_pool_str744[sizeof("mongolian")];
+ char uniname2ctype_pool_str745[sizeof("oalpha")];
+ char uniname2ctype_pool_str749[sizeof("inimperialaramaic")];
+ char uniname2ctype_pool_str753[sizeof("nchar")];
+ char uniname2ctype_pool_str758[sizeof("inlatin1supplement")];
+ char uniname2ctype_pool_str761[sizeof("prti")];
+ char uniname2ctype_pool_str763[sizeof("cprt")];
+ char uniname2ctype_pool_str767[sizeof("nd")];
+ char uniname2ctype_pool_str768[sizeof("deseret")];
+ char uniname2ctype_pool_str772[sizeof("inoldturkic")];
+ char uniname2ctype_pool_str773[sizeof("radical")];
+ char uniname2ctype_pool_str777[sizeof("canadianaboriginal")];
+ char uniname2ctype_pool_str779[sizeof("inmodifiertoneletters")];
+ char uniname2ctype_pool_str783[sizeof("incaucasianalbanian")];
+ char uniname2ctype_pool_str787[sizeof("coptic")];
+ char uniname2ctype_pool_str796[sizeof("casedletter")];
+ char uniname2ctype_pool_str798[sizeof("sd")];
+ char uniname2ctype_pool_str803[sizeof("inphoenician")];
+ char uniname2ctype_pool_str804[sizeof("sidd")];
+ char uniname2ctype_pool_str805[sizeof("privateuse")];
+ char uniname2ctype_pool_str813[sizeof("sundanese")];
+ char uniname2ctype_pool_str815[sizeof("inancientgreekmusicalnotation")];
+ char uniname2ctype_pool_str817[sizeof("insiddham")];
+ char uniname2ctype_pool_str820[sizeof("cased")];
+ char uniname2ctype_pool_str827[sizeof("print")];
+ char uniname2ctype_pool_str830[sizeof("ininscriptionalparthian")];
+ char uniname2ctype_pool_str832[sizeof("ininscriptionalpahlavi")];
+ char uniname2ctype_pool_str834[sizeof("copt")];
+ char uniname2ctype_pool_str838[sizeof("inancientgreeknumbers")];
+ char uniname2ctype_pool_str845[sizeof("saurashtra")];
+ char uniname2ctype_pool_str848[sizeof("mro")];
+ char uniname2ctype_pool_str849[sizeof("mroo")];
+ char uniname2ctype_pool_str850[sizeof("inalphabeticpresentationforms")];
+ char uniname2ctype_pool_str858[sizeof("lowercase")];
+ char uniname2ctype_pool_str861[sizeof("phli")];
+ char uniname2ctype_pool_str864[sizeof("patternwhitespace")];
+ char uniname2ctype_pool_str866[sizeof("inenclosedideographicsupplement")];
+ char uniname2ctype_pool_str869[sizeof("spaceseparator")];
+ char uniname2ctype_pool_str871[sizeof("inmathematicaloperators")];
+ char uniname2ctype_pool_str882[sizeof("omath")];
+ char uniname2ctype_pool_str892[sizeof("lisu")];
+ char uniname2ctype_pool_str895[sizeof("inpsalterpahlavi")];
+ char uniname2ctype_pool_str898[sizeof("olditalic")];
+ char uniname2ctype_pool_str905[sizeof("hanunoo")];
+ char uniname2ctype_pool_str909[sizeof("inherited")];
+ char uniname2ctype_pool_str910[sizeof("lepcha")];
+ char uniname2ctype_pool_str913[sizeof("p")];
+ char uniname2ctype_pool_str916[sizeof("inmongolian")];
+ char uniname2ctype_pool_str922[sizeof("zp")];
+ char uniname2ctype_pool_str923[sizeof("finalpunctuation")];
+ char uniname2ctype_pool_str925[sizeof("otheridcontinue")];
+ char uniname2ctype_pool_str927[sizeof("shrd")];
+ char uniname2ctype_pool_str932[sizeof("ingrantha")];
+ char uniname2ctype_pool_str934[sizeof("talu")];
+ char uniname2ctype_pool_str936[sizeof("otheralphabetic")];
+ char uniname2ctype_pool_str938[sizeof("noncharactercodepoint")];
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ char uniname2ctype_pool_str939[sizeof("age=1.1")];
+ char uniname2ctype_pool_str940[sizeof("age=2.1")];
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ char uniname2ctype_pool_str941[sizeof("closepunctuation")];
+ char uniname2ctype_pool_str943[sizeof("letternumber")];
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ char uniname2ctype_pool_str944[sizeof("age=6.1")];
+ char uniname2ctype_pool_str945[sizeof("age=6.2")];
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ char uniname2ctype_pool_str946[sizeof("telu")];
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ char uniname2ctype_pool_str947[sizeof("age=3.1")];
+ char uniname2ctype_pool_str948[sizeof("age=3.2")];
+ char uniname2ctype_pool_str949[sizeof("age=5.1")];
+ char uniname2ctype_pool_str950[sizeof("age=5.2")];
+ char uniname2ctype_pool_str951[sizeof("age=2.0")];
+ char uniname2ctype_pool_str952[sizeof("age=6.3")];
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ char uniname2ctype_pool_str953[sizeof("inshorthandformatcontrols")];
+ char uniname2ctype_pool_str954[sizeof("inoldnortharabian")];
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ char uniname2ctype_pool_str955[sizeof("age=6.0")];
+ char uniname2ctype_pool_str956[sizeof("age=4.1")];
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ char uniname2ctype_pool_str957[sizeof("ingeneralpunctuation")];
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ char uniname2ctype_pool_str958[sizeof("age=3.0")];
+ char uniname2ctype_pool_str959[sizeof("age=7.0")];
+ char uniname2ctype_pool_str960[sizeof("age=5.0")];
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ char uniname2ctype_pool_str962[sizeof("innabataean")];
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ char uniname2ctype_pool_str967[sizeof("age=4.0")];
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ char uniname2ctype_pool_str970[sizeof("bamum")];
+ char uniname2ctype_pool_str972[sizeof("control")];
+ char uniname2ctype_pool_str974[sizeof("induployan")];
+ char uniname2ctype_pool_str975[sizeof("inlatinextendedd")];
+ char uniname2ctype_pool_str976[sizeof("inarabic")];
+ char uniname2ctype_pool_str982[sizeof("runic")];
+ char uniname2ctype_pool_str984[sizeof("inelbasan")];
+ char uniname2ctype_pool_str985[sizeof("inoldsoutharabian")];
+ char uniname2ctype_pool_str986[sizeof("inbasiclatin")];
+ char uniname2ctype_pool_str995[sizeof("format")];
+ char uniname2ctype_pool_str996[sizeof("innumberforms")];
+ char uniname2ctype_pool_str998[sizeof("inugaritic")];
+ char uniname2ctype_pool_str999[sizeof("separator")];
+ char uniname2ctype_pool_str1000[sizeof("idsbinaryoperator")];
+ char uniname2ctype_pool_str1004[sizeof("tagbanwa")];
+ char uniname2ctype_pool_str1012[sizeof("bass")];
+ char uniname2ctype_pool_str1013[sizeof("saur")];
+ char uniname2ctype_pool_str1014[sizeof("nbat")];
+ char uniname2ctype_pool_str1017[sizeof("intaixuanjingsymbols")];
+ char uniname2ctype_pool_str1019[sizeof("joincontrol")];
+ char uniname2ctype_pool_str1023[sizeof("otheridstart")];
+ char uniname2ctype_pool_str1027[sizeof("inbyzantinemusicalsymbols")];
+ char uniname2ctype_pool_str1031[sizeof("intags")];
+ char uniname2ctype_pool_str1033[sizeof("nabataean")];
+ char uniname2ctype_pool_str1034[sizeof("insuperscriptsandsubscripts")];
+ char uniname2ctype_pool_str1036[sizeof("intibetan")];
+ char uniname2ctype_pool_str1039[sizeof("insaurashtra")];
+ char uniname2ctype_pool_str1040[sizeof("othersymbol")];
+ char uniname2ctype_pool_str1041[sizeof("ext")];
+ char uniname2ctype_pool_str1046[sizeof("inarabicpresentationformsa")];
+ char uniname2ctype_pool_str1048[sizeof("inmiscellaneousmathematicalsymbolsb")];
+ char uniname2ctype_pool_str1049[sizeof("otherlowercase")];
+ char uniname2ctype_pool_str1052[sizeof("phoenician")];
+ char uniname2ctype_pool_str1055[sizeof("lower")];
+ char uniname2ctype_pool_str1060[sizeof("linb")];
+ char uniname2ctype_pool_str1064[sizeof("po")];
+ char uniname2ctype_pool_str1065[sizeof("inmyanmarextendedb")];
+ char uniname2ctype_pool_str1066[sizeof("limb")];
+ char uniname2ctype_pool_str1068[sizeof("inbraillepatterns")];
+ char uniname2ctype_pool_str1069[sizeof("tibt")];
+ char uniname2ctype_pool_str1070[sizeof("cuneiform")];
+ char uniname2ctype_pool_str1072[sizeof("bali")];
+ char uniname2ctype_pool_str1073[sizeof("oldpersian")];
+ char uniname2ctype_pool_str1077[sizeof("oldpermic")];
+ char uniname2ctype_pool_str1080[sizeof("pf")];
+ char uniname2ctype_pool_str1084[sizeof("word")];
+ char uniname2ctype_pool_str1086[sizeof("tibetan")];
+ char uniname2ctype_pool_str1089[sizeof("incyrillicsupplement")];
+ char uniname2ctype_pool_str1093[sizeof("elba")];
+ char uniname2ctype_pool_str1094[sizeof("insupplementalmathematicaloperators")];
+ char uniname2ctype_pool_str1095[sizeof("inbalinese")];
+ char uniname2ctype_pool_str1101[sizeof("bengali")];
+ char uniname2ctype_pool_str1104[sizeof("caseignorable")];
+ char uniname2ctype_pool_str1107[sizeof("incountingrodnumerals")];
+ char uniname2ctype_pool_str1114[sizeof("other")];
+ char uniname2ctype_pool_str1118[sizeof("tirhuta")];
+ char uniname2ctype_pool_str1121[sizeof("othernumber")];
+ char uniname2ctype_pool_str1123[sizeof("balinese")];
+ char uniname2ctype_pool_str1129[sizeof("elbasan")];
+ char uniname2ctype_pool_str1134[sizeof("inunifiedcanadianaboriginalsyllabics")];
+ char uniname2ctype_pool_str1136[sizeof("lowercaseletter")];
+ char uniname2ctype_pool_str1140[sizeof("ethiopic")];
+ char uniname2ctype_pool_str1141[sizeof("gran")];
+ char uniname2ctype_pool_str1149[sizeof("ingurmukhi")];
+ char uniname2ctype_pool_str1151[sizeof("sund")];
+ char uniname2ctype_pool_str1153[sizeof("inethiopicsupplement")];
+ char uniname2ctype_pool_str1160[sizeof("inoldpersian")];
+ char uniname2ctype_pool_str1163[sizeof("inoldpermic")];
+ char uniname2ctype_pool_str1170[sizeof("othermath")];
+ char uniname2ctype_pool_str1174[sizeof("unassigned")];
+ char uniname2ctype_pool_str1180[sizeof("hmng")];
+ char uniname2ctype_pool_str1181[sizeof("narb")];
+ char uniname2ctype_pool_str1184[sizeof("brai")];
+ char uniname2ctype_pool_str1186[sizeof("hang")];
+ char uniname2ctype_pool_str1187[sizeof("insorasompeng")];
+ char uniname2ctype_pool_str1193[sizeof("arab")];
+ char uniname2ctype_pool_str1194[sizeof("plrd")];
+ char uniname2ctype_pool_str1195[sizeof("ingujarati")];
+ char uniname2ctype_pool_str1197[sizeof("brahmi")];
+ char uniname2ctype_pool_str1201[sizeof("runr")];
+ char uniname2ctype_pool_str1202[sizeof("ahex")];
+ char uniname2ctype_pool_str1206[sizeof("mong")];
+ char uniname2ctype_pool_str1211[sizeof("pauc")];
+ char uniname2ctype_pool_str1212[sizeof("sarb")];
+ char uniname2ctype_pool_str1218[sizeof("ogam")];
+ char uniname2ctype_pool_str1221[sizeof("olower")];
+ char uniname2ctype_pool_str1222[sizeof("pd")];
+ char uniname2ctype_pool_str1235[sizeof("number")];
+ char uniname2ctype_pool_str1238[sizeof("inbrahmi")];
+ char uniname2ctype_pool_str1240[sizeof("otherletter")];
+ char uniname2ctype_pool_str1252[sizeof("ingothic")];
+ char uniname2ctype_pool_str1254[sizeof("phagspa")];
+ char uniname2ctype_pool_str1262[sizeof("inletterlikesymbols")];
+ char uniname2ctype_pool_str1265[sizeof("yi")];
+ char uniname2ctype_pool_str1269[sizeof("hangul")];
+ char uniname2ctype_pool_str1271[sizeof("yiii")];
+ char uniname2ctype_pool_str1272[sizeof("tfng")];
+ char uniname2ctype_pool_str1273[sizeof("insupplementalarrowsc")];
+ char uniname2ctype_pool_str1277[sizeof("ingreekandcoptic")];
+ char uniname2ctype_pool_str1279[sizeof("xidc")];
+ char uniname2ctype_pool_str1280[sizeof("insupplementalarrowsa")];
+ char uniname2ctype_pool_str1281[sizeof("gothic")];
+ char uniname2ctype_pool_str1283[sizeof("grext")];
+ char uniname2ctype_pool_str1285[sizeof("incombininghalfmarks")];
+ char uniname2ctype_pool_str1286[sizeof("deprecated")];
+ char uniname2ctype_pool_str1287[sizeof("inbassavah")];
+ char uniname2ctype_pool_str1305[sizeof("xids")];
+ char uniname2ctype_pool_str1308[sizeof("linearb")];
+ char uniname2ctype_pool_str1312[sizeof("ingeometricshapes")];
+ char uniname2ctype_pool_str1313[sizeof("phlp")];
+ char uniname2ctype_pool_str1314[sizeof("warangciti")];
+ char uniname2ctype_pool_str1317[sizeof("inblockelements")];
+ char uniname2ctype_pool_str1318[sizeof("modifierletter")];
+ char uniname2ctype_pool_str1321[sizeof("indingbats")];
+ char uniname2ctype_pool_str1322[sizeof("dep")];
+ char uniname2ctype_pool_str1324[sizeof("punct")];
+ char uniname2ctype_pool_str1327[sizeof("inhanunoo")];
char uniname2ctype_pool_str1334[sizeof("bidic")];
- char uniname2ctype_pool_str1341[sizeof("inkanasupplement")];
- char uniname2ctype_pool_str1343[sizeof("runic")];
- char uniname2ctype_pool_str1344[sizeof("inalchemicalsymbols")];
- char uniname2ctype_pool_str1350[sizeof("georgian")];
- char uniname2ctype_pool_str1351[sizeof("inugaritic")];
- char uniname2ctype_pool_str1354[sizeof("insaurashtra")];
- char uniname2ctype_pool_str1356[sizeof("inhighprivateusesurrogates")];
- char uniname2ctype_pool_str1362[sizeof("pd")];
- char uniname2ctype_pool_str1372[sizeof("incountingrodnumerals")];
- char uniname2ctype_pool_str1377[sizeof("inarabicextendeda")];
- char uniname2ctype_pool_str1389[sizeof("inkharoshthi")];
- char uniname2ctype_pool_str1393[sizeof("idstrinaryoperator")];
- char uniname2ctype_pool_str1396[sizeof("phag")];
- char uniname2ctype_pool_str1398[sizeof("brah")];
- char uniname2ctype_pool_str1402[sizeof("mark")];
- char uniname2ctype_pool_str1404[sizeof("hebr")];
- char uniname2ctype_pool_str1411[sizeof("inkhmersymbols")];
- char uniname2ctype_pool_str1413[sizeof("dep")];
- char uniname2ctype_pool_str1416[sizeof("inkhmer")];
- char uniname2ctype_pool_str1422[sizeof("deprecated")];
- char uniname2ctype_pool_str1424[sizeof("rejang")];
- char uniname2ctype_pool_str1429[sizeof("lyci")];
- char uniname2ctype_pool_str1431[sizeof("intakri")];
- char uniname2ctype_pool_str1432[sizeof("takr")];
- char uniname2ctype_pool_str1435[sizeof("incyrillicsupplement")];
- char uniname2ctype_pool_str1436[sizeof("changeswhencasefolded")];
- char uniname2ctype_pool_str1438[sizeof("indevanagariextended")];
- char uniname2ctype_pool_str1442[sizeof("lycian")];
- char uniname2ctype_pool_str1443[sizeof("inbengali")];
- char uniname2ctype_pool_str1448[sizeof("beng")];
- char uniname2ctype_pool_str1450[sizeof("graph")];
- char uniname2ctype_pool_str1452[sizeof("inyijinghexagramsymbols")];
- char uniname2ctype_pool_str1457[sizeof("olck")];
- char uniname2ctype_pool_str1460[sizeof("inarabicsupplement")];
- char uniname2ctype_pool_str1462[sizeof("inbuginese")];
- char uniname2ctype_pool_str1463[sizeof("changeswhencasemapped")];
- char uniname2ctype_pool_str1468[sizeof("olchiki")];
- char uniname2ctype_pool_str1478[sizeof("inaegeannumbers")];
- char uniname2ctype_pool_str1479[sizeof("mlym")];
- char uniname2ctype_pool_str1480[sizeof("alphabetic")];
- char uniname2ctype_pool_str1492[sizeof("sylotinagri")];
- char uniname2ctype_pool_str1498[sizeof("changeswhentitlecased")];
- char uniname2ctype_pool_str1504[sizeof("tagalog")];
- char uniname2ctype_pool_str1505[sizeof("tagb")];
- char uniname2ctype_pool_str1506[sizeof("runr")];
- char uniname2ctype_pool_str1510[sizeof("malayalam")];
- char uniname2ctype_pool_str1512[sizeof("inoriya")];
- char uniname2ctype_pool_str1516[sizeof("intagbanwa")];
- char uniname2ctype_pool_str1517[sizeof("syrc")];
- char uniname2ctype_pool_str1519[sizeof("nko")];
- char uniname2ctype_pool_str1520[sizeof("nkoo")];
- char uniname2ctype_pool_str1523[sizeof("inethiopicextended")];
- char uniname2ctype_pool_str1525[sizeof("kaithi")];
- char uniname2ctype_pool_str1530[sizeof("mathsymbol")];
- char uniname2ctype_pool_str1531[sizeof("inyiradicals")];
- char uniname2ctype_pool_str1536[sizeof("insupplementaryprivateuseareaa")];
- char uniname2ctype_pool_str1540[sizeof("osmanya")];
- char uniname2ctype_pool_str1546[sizeof("syriac")];
- char uniname2ctype_pool_str1548[sizeof("otherdefaultignorablecodepoint")];
- char uniname2ctype_pool_str1561[sizeof("number")];
- char uniname2ctype_pool_str1565[sizeof("inlinearbsyllabary")];
- char uniname2ctype_pool_str1566[sizeof("kthi")];
- char uniname2ctype_pool_str1567[sizeof("sund")];
- char uniname2ctype_pool_str1569[sizeof("mymr")];
- char uniname2ctype_pool_str1571[sizeof("incombiningdiacriticalmarks")];
- char uniname2ctype_pool_str1578[sizeof("enclosingmark")];
- char uniname2ctype_pool_str1581[sizeof("incombiningdiacriticalmarksforsymbols")];
- char uniname2ctype_pool_str1583[sizeof("inethiopicsupplement")];
- char uniname2ctype_pool_str1590[sizeof("unassigned")];
- char uniname2ctype_pool_str1591[sizeof("sylo")];
- char uniname2ctype_pool_str1595[sizeof("combiningmark")];
- char uniname2ctype_pool_str1598[sizeof("myanmar")];
- char uniname2ctype_pool_str1605[sizeof("graphemeextend")];
- char uniname2ctype_pool_str1606[sizeof("bidicontrol")];
- char uniname2ctype_pool_str1609[sizeof("inhalfwidthandfullwidthforms")];
+ char uniname2ctype_pool_str1344[sizeof("ingreekextended")];
+ char uniname2ctype_pool_str1353[sizeof("idsb")];
+ char uniname2ctype_pool_str1359[sizeof("assigned")];
+ char uniname2ctype_pool_str1364[sizeof("otherpunctuation")];
+ char uniname2ctype_pool_str1368[sizeof("inhangulsyllables")];
+ char uniname2ctype_pool_str1373[sizeof("inarabicmathematicalalphabeticsymbols")];
+ char uniname2ctype_pool_str1385[sizeof("inornamentaldingbats")];
+ char uniname2ctype_pool_str1387[sizeof("inphagspa")];
+ char uniname2ctype_pool_str1389[sizeof("lyci")];
+ char uniname2ctype_pool_str1393[sizeof("mlym")];
+ char uniname2ctype_pool_str1399[sizeof("inarabicextendeda")];
+ char uniname2ctype_pool_str1400[sizeof("rjng")];
+ char uniname2ctype_pool_str1402[sizeof("lycian")];
+ char uniname2ctype_pool_str1403[sizeof("inalchemicalsymbols")];
+ char uniname2ctype_pool_str1409[sizeof("xdigit")];
+ char uniname2ctype_pool_str1412[sizeof("digit")];
+ char uniname2ctype_pool_str1420[sizeof("xidstart")];
+ char uniname2ctype_pool_str1421[sizeof("inrejang")];
+ char uniname2ctype_pool_str1424[sizeof("malayalam")];
+ char uniname2ctype_pool_str1425[sizeof("idstrinaryoperator")];
+ char uniname2ctype_pool_str1429[sizeof("invai")];
+ char uniname2ctype_pool_str1435[sizeof("vai")];
+ char uniname2ctype_pool_str1436[sizeof("vaii")];
+ char uniname2ctype_pool_str1438[sizeof("hiragana")];
+ char uniname2ctype_pool_str1442[sizeof("ingeorgian")];
+ char uniname2ctype_pool_str1448[sizeof("braille")];
+ char uniname2ctype_pool_str1455[sizeof("geor")];
+ char uniname2ctype_pool_str1457[sizeof("brah")];
+ char uniname2ctype_pool_str1463[sizeof("glagolitic")];
+ char uniname2ctype_pool_str1465[sizeof("inkannada")];
+ char uniname2ctype_pool_str1466[sizeof("cakm")];
+ char uniname2ctype_pool_str1467[sizeof("kana")];
+ char uniname2ctype_pool_str1469[sizeof("hebr")];
+ char uniname2ctype_pool_str1471[sizeof("inshavian")];
+ char uniname2ctype_pool_str1477[sizeof("vs")];
+ char uniname2ctype_pool_str1481[sizeof("inchakma")];
+ char uniname2ctype_pool_str1490[sizeof("ogham")];
+ char uniname2ctype_pool_str1491[sizeof("sylotinagri")];
+ char uniname2ctype_pool_str1492[sizeof("inunifiedcanadianaboriginalsyllabicsextended")];
+ char uniname2ctype_pool_str1495[sizeof("inmeroitichieroglyphs")];
+ char uniname2ctype_pool_str1498[sizeof("grantha")];
+ char uniname2ctype_pool_str1500[sizeof("graphemebase")];
+ char uniname2ctype_pool_str1502[sizeof("mathsymbol")];
+ char uniname2ctype_pool_str1505[sizeof("mymr")];
+ char uniname2ctype_pool_str1513[sizeof("insupplementaryprivateuseareaa")];
+ char uniname2ctype_pool_str1514[sizeof("mendekikakui")];
+ char uniname2ctype_pool_str1516[sizeof("incjkcompatibilityforms")];
+ char uniname2ctype_pool_str1518[sizeof("inhalfwidthandfullwidthforms")];
+ char uniname2ctype_pool_str1521[sizeof("incjkcompatibilityideographs")];
+ char uniname2ctype_pool_str1522[sizeof("inkaithi")];
+ char uniname2ctype_pool_str1525[sizeof("avst")];
+ char uniname2ctype_pool_str1526[sizeof("inarabicsupplement")];
+ char uniname2ctype_pool_str1527[sizeof("takri")];
+ char uniname2ctype_pool_str1529[sizeof("syrc")];
+ char uniname2ctype_pool_str1533[sizeof("meeteimayek")];
+ char uniname2ctype_pool_str1534[sizeof("myanmar")];
+ char uniname2ctype_pool_str1535[sizeof("avestan")];
+ char uniname2ctype_pool_str1536[sizeof("inhanguljamoextendeda")];
+ char uniname2ctype_pool_str1540[sizeof("goth")];
+ char uniname2ctype_pool_str1542[sizeof("inkatakana")];
+ char uniname2ctype_pool_str1544[sizeof("incyrillicextendeda")];
+ char uniname2ctype_pool_str1549[sizeof("alphabetic")];
+ char uniname2ctype_pool_str1550[sizeof("syriac")];
+ char uniname2ctype_pool_str1551[sizeof("ideographic")];
+ char uniname2ctype_pool_str1555[sizeof("incjkstrokes")];
+ char uniname2ctype_pool_str1557[sizeof("inlinearbsyllabary")];
+ char uniname2ctype_pool_str1558[sizeof("tavt")];
+ char uniname2ctype_pool_str1559[sizeof("intaiviet")];
+ char uniname2ctype_pool_str1564[sizeof("incjkcompatibilityideographssupplement")];
+ char uniname2ctype_pool_str1576[sizeof("inmeeteimayek")];
+ char uniname2ctype_pool_str1577[sizeof("kali")];
+ char uniname2ctype_pool_str1581[sizeof("inyiradicals")];
+ char uniname2ctype_pool_str1586[sizeof("lu")];
+ char uniname2ctype_pool_str1587[sizeof("inoriya")];
+ char uniname2ctype_pool_str1590[sizeof("hebrew")];
+ char uniname2ctype_pool_str1596[sizeof("extender")];
+ char uniname2ctype_pool_str1598[sizeof("inhighprivateusesurrogates")];
+ char uniname2ctype_pool_str1600[sizeof("limbu")];
+ char uniname2ctype_pool_str1606[sizeof("inbuhid")];
+ char uniname2ctype_pool_str1608[sizeof("inethiopicextendeda")];
+ char uniname2ctype_pool_str1609[sizeof("xidcontinue")];
+ char uniname2ctype_pool_str1611[sizeof("inyijinghexagramsymbols")];
+ char uniname2ctype_pool_str1612[sizeof("logicalorderexception")];
+ char uniname2ctype_pool_str1616[sizeof("inhebrew")];
char uniname2ctype_pool_str1617[sizeof("cyrl")];
- char uniname2ctype_pool_str1620[sizeof("knda")];
- char uniname2ctype_pool_str1634[sizeof("inunifiedcanadianaboriginalsyllabicsextended")];
- char uniname2ctype_pool_str1635[sizeof("xsux")];
- char uniname2ctype_pool_str1636[sizeof("modifiersymbol")];
- char uniname2ctype_pool_str1643[sizeof("incombiningdiacriticalmarkssupplement")];
- char uniname2ctype_pool_str1645[sizeof("inhanunoo")];
- char uniname2ctype_pool_str1648[sizeof("inbuhid")];
- char uniname2ctype_pool_str1649[sizeof("kannada")];
- char uniname2ctype_pool_str1658[sizeof("inhebrew")];
- char uniname2ctype_pool_str1662[sizeof("grbase")];
- char uniname2ctype_pool_str1664[sizeof("spacingmark")];
- char uniname2ctype_pool_str1670[sizeof("inkatakanaphoneticextensions")];
- char uniname2ctype_pool_str1676[sizeof("hangul")];
- char uniname2ctype_pool_str1683[sizeof("incjksymbolsandpunctuation")];
- char uniname2ctype_pool_str1688[sizeof("bopo")];
- char uniname2ctype_pool_str1692[sizeof("orya")];
- char uniname2ctype_pool_str1699[sizeof("inbopomofo")];
- char uniname2ctype_pool_str1701[sizeof("kharoshthi")];
- char uniname2ctype_pool_str1703[sizeof("khar")];
- char uniname2ctype_pool_str1709[sizeof("changeswhenlowercased")];
- char uniname2ctype_pool_str1724[sizeof("khmr")];
- char uniname2ctype_pool_str1725[sizeof("punct")];
- char uniname2ctype_pool_str1729[sizeof("symbol")];
- char uniname2ctype_pool_str1732[sizeof("cherokee")];
- char uniname2ctype_pool_str1737[sizeof("cyrillic")];
- char uniname2ctype_pool_str1759[sizeof("inkangxiradicals")];
- char uniname2ctype_pool_str1761[sizeof("hebrew")];
- char uniname2ctype_pool_str1780[sizeof("inarabicpresentationformsb")];
- char uniname2ctype_pool_str1787[sizeof("incyrillicextendedb")];
- char uniname2ctype_pool_str1790[sizeof("ugaritic")];
- char uniname2ctype_pool_str1829[sizeof("incurrencysymbols")];
- char uniname2ctype_pool_str1831[sizeof("meroitichieroglyphs")];
- char uniname2ctype_pool_str1835[sizeof("inhighsurrogates")];
- char uniname2ctype_pool_str1853[sizeof("nonspacingmark")];
- char uniname2ctype_pool_str1858[sizeof("lydi")];
- char uniname2ctype_pool_str1864[sizeof("patsyn")];
- char uniname2ctype_pool_str1868[sizeof("orkh")];
- char uniname2ctype_pool_str1871[sizeof("lydian")];
- char uniname2ctype_pool_str1896[sizeof("ugar")];
- char uniname2ctype_pool_str1899[sizeof("othergraphemeextend")];
- char uniname2ctype_pool_str1900[sizeof("inlatinextendedb")];
- char uniname2ctype_pool_str1904[sizeof("bopomofo")];
- char uniname2ctype_pool_str1917[sizeof("khmer")];
- char uniname2ctype_pool_str1925[sizeof("uideo")];
- char uniname2ctype_pool_str1932[sizeof("otheruppercase")];
- char uniname2ctype_pool_str1944[sizeof("grek")];
- char uniname2ctype_pool_str1949[sizeof("gujr")];
- char uniname2ctype_pool_str1970[sizeof("gujarati")];
- char uniname2ctype_pool_str1983[sizeof("inhanguljamoextendedb")];
- char uniname2ctype_pool_str1988[sizeof("defaultignorablecodepoint")];
- char uniname2ctype_pool_str2005[sizeof("inplayingcards")];
- char uniname2ctype_pool_str2022[sizeof("bamu")];
- char uniname2ctype_pool_str2028[sizeof("inkanbun")];
- char uniname2ctype_pool_str2033[sizeof("incjkradicalssupplement")];
- char uniname2ctype_pool_str2046[sizeof("cypriot")];
- char uniname2ctype_pool_str2051[sizeof("inbamum")];
- char uniname2ctype_pool_str2053[sizeof("inmeroiticcursive")];
- char uniname2ctype_pool_str2055[sizeof("oldturkic")];
- char uniname2ctype_pool_str2086[sizeof("insupplementalarrowsb")];
- char uniname2ctype_pool_str2087[sizeof("surrogate")];
- char uniname2ctype_pool_str2094[sizeof("batk")];
- char uniname2ctype_pool_str2102[sizeof("inbatak")];
- char uniname2ctype_pool_str2119[sizeof("inlimbu")];
- char uniname2ctype_pool_str2123[sizeof("incypriotsyllabary")];
- char uniname2ctype_pool_str2129[sizeof("dashpunctuation")];
- char uniname2ctype_pool_str2130[sizeof("innoblock")];
- char uniname2ctype_pool_str2141[sizeof("hyphen")];
- char uniname2ctype_pool_str2162[sizeof("insupplementalpunctuation")];
- char uniname2ctype_pool_str2165[sizeof("ingeorgiansupplement")];
- char uniname2ctype_pool_str2178[sizeof("oupper")];
- char uniname2ctype_pool_str2189[sizeof("paragraphseparator")];
- char uniname2ctype_pool_str2194[sizeof("inbamumsupplement")];
- char uniname2ctype_pool_str2299[sizeof("uppercase")];
- char uniname2ctype_pool_str2313[sizeof("currencysymbol")];
- char uniname2ctype_pool_str2322[sizeof("sk")];
- char uniname2ctype_pool_str2338[sizeof("lu")];
- char uniname2ctype_pool_str2342[sizeof("openpunctuation")];
- char uniname2ctype_pool_str2349[sizeof("inlisu")];
- char uniname2ctype_pool_str2371[sizeof("qmark")];
- char uniname2ctype_pool_str2372[sizeof("egyp")];
- char uniname2ctype_pool_str2377[sizeof("insupplementaryprivateuseareab")];
- char uniname2ctype_pool_str2379[sizeof("limbu")];
- char uniname2ctype_pool_str2400[sizeof("inegyptianhieroglyphs")];
- char uniname2ctype_pool_str2401[sizeof("unifiedideograph")];
- char uniname2ctype_pool_str2413[sizeof("intelugu")];
- char uniname2ctype_pool_str2429[sizeof("katakana")];
- char uniname2ctype_pool_str2442[sizeof("inhangulcompatibilityjamo")];
- char uniname2ctype_pool_str2454[sizeof("upper")];
- char uniname2ctype_pool_str2495[sizeof("inkayahli")];
- char uniname2ctype_pool_str2515[sizeof("cwu")];
- char uniname2ctype_pool_str2523[sizeof("incjkcompatibility")];
- char uniname2ctype_pool_str2542[sizeof("uppercaseletter")];
- char uniname2ctype_pool_str2549[sizeof("bugi")];
- char uniname2ctype_pool_str2588[sizeof("buginese")];
- char uniname2ctype_pool_str2627[sizeof("any")];
- char uniname2ctype_pool_str2651[sizeof("inyisyllables")];
- char uniname2ctype_pool_str2671[sizeof("inbopomofoextended")];
- char uniname2ctype_pool_str2710[sizeof("inboxdrawing")];
- char uniname2ctype_pool_str2724[sizeof("changeswhenuppercased")];
- char uniname2ctype_pool_str2727[sizeof("unknown")];
- char uniname2ctype_pool_str2737[sizeof("quotationmark")];
- char uniname2ctype_pool_str2753[sizeof("buhd")];
- char uniname2ctype_pool_str2785[sizeof("punctuation")];
- char uniname2ctype_pool_str2888[sizeof("oldsoutharabian")];
- char uniname2ctype_pool_str2925[sizeof("kayahli")];
- char uniname2ctype_pool_str2940[sizeof("incjkunifiedideographs")];
- char uniname2ctype_pool_str2961[sizeof("incjkunifiedideographsextensiona")];
- char uniname2ctype_pool_str2962[sizeof("incjkunifiedideographsextensionc")];
- char uniname2ctype_pool_str2995[sizeof("telugu")];
- char uniname2ctype_pool_str3000[sizeof("guru")];
- char uniname2ctype_pool_str3104[sizeof("greek")];
- char uniname2ctype_pool_str3189[sizeof("grlink")];
- char uniname2ctype_pool_str3197[sizeof("buhid")];
- char uniname2ctype_pool_str3254[sizeof("batak")];
- char uniname2ctype_pool_str3292[sizeof("blank")];
- char uniname2ctype_pool_str3391[sizeof("incjkunifiedideographsextensiond")];
- char uniname2ctype_pool_str3459[sizeof("graphemelink")];
- char uniname2ctype_pool_str3480[sizeof("egyptianhieroglyphs")];
- char uniname2ctype_pool_str3802[sizeof("incjkunifiedideographsextensionb")];
- char uniname2ctype_pool_str3922[sizeof("zyyy")];
- char uniname2ctype_pool_str4167[sizeof("gurmukhi")];
+ char uniname2ctype_pool_str1618[sizeof("osmanya")];
+ char uniname2ctype_pool_str1621[sizeof("phnx")];
+ char uniname2ctype_pool_str1622[sizeof("incombiningdiacriticalmarks")];
+ char uniname2ctype_pool_str1626[sizeof("inkanasupplement")];
+ char uniname2ctype_pool_str1627[sizeof("inlisu")];
+ char uniname2ctype_pool_str1628[sizeof("changeswhencasemapped")];
+ char uniname2ctype_pool_str1632[sizeof("incombiningdiacriticalmarksforsymbols")];
+ char uniname2ctype_pool_str1636[sizeof("cwu")];
+ char uniname2ctype_pool_str1641[sizeof("phag")];
+ char uniname2ctype_pool_str1645[sizeof("insmallformvariants")];
+ char uniname2ctype_pool_str1656[sizeof("inpahawhhmong")];
+ char uniname2ctype_pool_str1661[sizeof("otheruppercase")];
+ char uniname2ctype_pool_str1662[sizeof("intelugu")];
+ char uniname2ctype_pool_str1665[sizeof("incombiningdiacriticalmarkssupplement")];
+ char uniname2ctype_pool_str1670[sizeof("ingeometricshapesextended")];
+ char uniname2ctype_pool_str1671[sizeof("xpeo")];
+ char uniname2ctype_pool_str1687[sizeof("bamu")];
+ char uniname2ctype_pool_str1689[sizeof("inbamum")];
+ char uniname2ctype_pool_str1692[sizeof("mark")];
+ char uniname2ctype_pool_str1694[sizeof("dupl")];
+ char uniname2ctype_pool_str1695[sizeof("graph")];
+ char uniname2ctype_pool_str1696[sizeof("dashpunctuation")];
+ char uniname2ctype_pool_str1700[sizeof("patternsyntax")];
+ char uniname2ctype_pool_str1705[sizeof("changeswhentitlecased")];
+ char uniname2ctype_pool_str1706[sizeof("inkharoshthi")];
+ char uniname2ctype_pool_str1712[sizeof("inkhmer")];
+ char uniname2ctype_pool_str1713[sizeof("java")];
+ char uniname2ctype_pool_str1714[sizeof("sylo")];
+ char uniname2ctype_pool_str1719[sizeof("ugaritic")];
+ char uniname2ctype_pool_str1722[sizeof("otherdefaultignorablecodepoint")];
+ char uniname2ctype_pool_str1723[sizeof("softdotted")];
+ char uniname2ctype_pool_str1729[sizeof("uideo")];
+ char uniname2ctype_pool_str1732[sizeof("inphoneticextensions")];
+ char uniname2ctype_pool_str1736[sizeof("injavanese")];
+ char uniname2ctype_pool_str1742[sizeof("invariationselectors")];
+ char uniname2ctype_pool_str1744[sizeof("kaithi")];
+ char uniname2ctype_pool_str1747[sizeof("cyrillic")];
+ char uniname2ctype_pool_str1749[sizeof("intakri")];
+ char uniname2ctype_pool_str1750[sizeof("takr")];
+ char uniname2ctype_pool_str1755[sizeof("javanese")];
+ char uniname2ctype_pool_str1757[sizeof("bidicontrol")];
+ char uniname2ctype_pool_str1758[sizeof("caucasianalbanian")];
+ char uniname2ctype_pool_str1765[sizeof("lydi")];
+ char uniname2ctype_pool_str1772[sizeof("insupplementalpunctuation")];
+ char uniname2ctype_pool_str1775[sizeof("inphoneticextensionssupplement")];
+ char uniname2ctype_pool_str1778[sizeof("lydian")];
+ char uniname2ctype_pool_str1784[sizeof("oldturkic")];
+ char uniname2ctype_pool_str1785[sizeof("invariationselectorssupplement")];
+ char uniname2ctype_pool_str1786[sizeof("kthi")];
+ char uniname2ctype_pool_str1792[sizeof("inhanguljamo")];
+ char uniname2ctype_pool_str1797[sizeof("patsyn")];
+ char uniname2ctype_pool_str1802[sizeof("inlimbu")];
+ char uniname2ctype_pool_str1804[sizeof("sorasompeng")];
+ char uniname2ctype_pool_str1807[sizeof("orya")];
+ char uniname2ctype_pool_str1822[sizeof("inkhmersymbols")];
+ char uniname2ctype_pool_str1824[sizeof("inglagolitic")];
+ char uniname2ctype_pool_str1831[sizeof("indevanagari")];
+ char uniname2ctype_pool_str1835[sizeof("deva")];
+ char uniname2ctype_pool_str1836[sizeof("knda")];
+ char uniname2ctype_pool_str1841[sizeof("inbengali")];
+ char uniname2ctype_pool_str1843[sizeof("symbol")];
+ char uniname2ctype_pool_str1846[sizeof("devanagari")];
+ char uniname2ctype_pool_str1849[sizeof("inmendekikakui")];
+ char uniname2ctype_pool_str1852[sizeof("beng")];
+ char uniname2ctype_pool_str1853[sizeof("invedicextensions")];
+ char uniname2ctype_pool_str1859[sizeof("graphemeextend")];
+ char uniname2ctype_pool_str1865[sizeof("kannada")];
+ char uniname2ctype_pool_str1866[sizeof("inbuginese")];
+ char uniname2ctype_pool_str1869[sizeof("olck")];
+ char uniname2ctype_pool_str1871[sizeof("meroitichieroglyphs")];
+ char uniname2ctype_pool_str1872[sizeof("ugar")];
+ char uniname2ctype_pool_str1874[sizeof("intagalog")];
+ char uniname2ctype_pool_str1878[sizeof("inbamumsupplement")];
+ char uniname2ctype_pool_str1880[sizeof("olchiki")];
+ char uniname2ctype_pool_str1899[sizeof("incurrencysymbols")];
+ char uniname2ctype_pool_str1904[sizeof("tagb")];
+ char uniname2ctype_pool_str1912[sizeof("inaegeannumbers")];
+ char uniname2ctype_pool_str1915[sizeof("intagbanwa")];
+ char uniname2ctype_pool_str1916[sizeof("uppercase")];
+ char uniname2ctype_pool_str1917[sizeof("defaultignorablecodepoint")];
+ char uniname2ctype_pool_str1919[sizeof("glag")];
+ char uniname2ctype_pool_str1921[sizeof("inkatakanaphoneticextensions")];
+ char uniname2ctype_pool_str1932[sizeof("changeswhencasefolded")];
+ char uniname2ctype_pool_str1942[sizeof("inpaucinhau")];
+ char uniname2ctype_pool_str1943[sizeof("inprivateusearea")];
+ char uniname2ctype_pool_str1947[sizeof("paucinhau")];
+ char uniname2ctype_pool_str1953[sizeof("spacingmark")];
+ char uniname2ctype_pool_str1956[sizeof("khmr")];
+ char uniname2ctype_pool_str1962[sizeof("khar")];
+ char uniname2ctype_pool_str1964[sizeof("inarabicpresentationformsb")];
+ char uniname2ctype_pool_str1967[sizeof("changeswhenlowercased")];
+ char uniname2ctype_pool_str1971[sizeof("tglg")];
+ char uniname2ctype_pool_str1976[sizeof("inethiopicextended")];
+ char uniname2ctype_pool_str1980[sizeof("incombiningdiacriticalmarksextended")];
+ char uniname2ctype_pool_str1986[sizeof("oupper")];
+ char uniname2ctype_pool_str1994[sizeof("incjksymbolsandpunctuation")];
+ char uniname2ctype_pool_str1997[sizeof("bopo")];
+ char uniname2ctype_pool_str1998[sizeof("punctuation")];
+ char uniname2ctype_pool_str2002[sizeof("combiningmark")];
+ char uniname2ctype_pool_str2007[sizeof("inplayingcards")];
+ char uniname2ctype_pool_str2008[sizeof("inbopomofo")];
+ char uniname2ctype_pool_str2021[sizeof("hyphen")];
+ char uniname2ctype_pool_str2028[sizeof("inkhojki")];
+ char uniname2ctype_pool_str2046[sizeof("nko")];
+ char uniname2ctype_pool_str2047[sizeof("nkoo")];
+ char uniname2ctype_pool_str2048[sizeof("enclosingmark")];
+ char uniname2ctype_pool_str2053[sizeof("openpunctuation")];
+ char uniname2ctype_pool_str2061[sizeof("currencysymbol")];
+ char uniname2ctype_pool_str2063[sizeof("inverticalforms")];
+ char uniname2ctype_pool_str2071[sizeof("hex")];
+ char uniname2ctype_pool_str2072[sizeof("modifiersymbol")];
+ char uniname2ctype_pool_str2073[sizeof("inlatinextendedb")];
+ char uniname2ctype_pool_str2075[sizeof("kharoshthi")];
+ char uniname2ctype_pool_str2080[sizeof("cherokee")];
+ char uniname2ctype_pool_str2088[sizeof("pahawhhmong")];
+ char uniname2ctype_pool_str2096[sizeof("cypriot")];
+ char uniname2ctype_pool_str2105[sizeof("incypriotsyllabary")];
+ char uniname2ctype_pool_str2110[sizeof("palmyrene")];
+ char uniname2ctype_pool_str2113[sizeof("upper")];
+ char uniname2ctype_pool_str2116[sizeof("aghb")];
+ char uniname2ctype_pool_str2123[sizeof("georgian")];
+ char uniname2ctype_pool_str2131[sizeof("gujr")];
+ char uniname2ctype_pool_str2142[sizeof("grbase")];
+ char uniname2ctype_pool_str2152[sizeof("gujarati")];
+ char uniname2ctype_pool_str2153[sizeof("hexdigit")];
+ char uniname2ctype_pool_str2189[sizeof("khmer")];
+ char uniname2ctype_pool_str2194[sizeof("uppercaseletter")];
+ char uniname2ctype_pool_str2198[sizeof("insupplementalarrowsb")];
+ char uniname2ctype_pool_str2224[sizeof("surrogate")];
+ char uniname2ctype_pool_str2227[sizeof("unifiedideograph")];
+ char uniname2ctype_pool_str2237[sizeof("nonspacingmark")];
+ char uniname2ctype_pool_str2241[sizeof("othergraphemeextend")];
+ char uniname2ctype_pool_str2242[sizeof("indevanagariextended")];
+ char uniname2ctype_pool_str2252[sizeof("orkh")];
+ char uniname2ctype_pool_str2273[sizeof("ingeorgiansupplement")];
+ char uniname2ctype_pool_str2287[sizeof("oldnortharabian")];
+ char uniname2ctype_pool_str2290[sizeof("tagalog")];
+ char uniname2ctype_pool_str2292[sizeof("khoj")];
+ char uniname2ctype_pool_str2311[sizeof("bopomofo")];
+ char uniname2ctype_pool_str2318[sizeof("rejang")];
+ char uniname2ctype_pool_str2326[sizeof("buhd")];
+ char uniname2ctype_pool_str2343[sizeof("incjkradicalssupplement")];
+ char uniname2ctype_pool_str2382[sizeof("inkanbun")];
+ char uniname2ctype_pool_str2406[sizeof("variationselector")];
+ char uniname2ctype_pool_str2417[sizeof("inkangxiradicals")];
+ char uniname2ctype_pool_str2421[sizeof("inhighsurrogates")];
+ char uniname2ctype_pool_str2431[sizeof("insupplementaryprivateuseareab")];
+ char uniname2ctype_pool_str2445[sizeof("ogrext")];
+ char uniname2ctype_pool_str2449[sizeof("batk")];
+ char uniname2ctype_pool_str2454[sizeof("inhanguljamoextendedb")];
+ char uniname2ctype_pool_str2457[sizeof("inbatak")];
+ char uniname2ctype_pool_str2462[sizeof("incyrillicextendedb")];
+ char uniname2ctype_pool_str2502[sizeof("innoblock")];
+ char uniname2ctype_pool_str2527[sizeof("any")];
+ char uniname2ctype_pool_str2534[sizeof("xsux")];
+ char uniname2ctype_pool_str2562[sizeof("bugi")];
+ char uniname2ctype_pool_str2570[sizeof("inkhudawadi")];
+ char uniname2ctype_pool_str2571[sizeof("telugu")];
+ char uniname2ctype_pool_str2579[sizeof("changeswhenuppercased")];
+ char uniname2ctype_pool_str2588[sizeof("grek")];
+ char uniname2ctype_pool_str2591[sizeof("guru")];
+ char uniname2ctype_pool_str2595[sizeof("paragraphseparator")];
+ char uniname2ctype_pool_str2613[sizeof("buginese")];
+ char uniname2ctype_pool_str2617[sizeof("inyisyllables")];
+ char uniname2ctype_pool_str2631[sizeof("egyp")];
+ char uniname2ctype_pool_str2634[sizeof("khudawadi")];
+ char uniname2ctype_pool_str2643[sizeof("unknown")];
+ char uniname2ctype_pool_str2685[sizeof("bassavah")];
+ char uniname2ctype_pool_str2689[sizeof("inegyptianhieroglyphs")];
+ char uniname2ctype_pool_str2709[sizeof("buhid")];
+ char uniname2ctype_pool_str2722[sizeof("inkayahli")];
+ char uniname2ctype_pool_str2732[sizeof("inmeroiticcursive")];
+ char uniname2ctype_pool_str2734[sizeof("incjkcompatibility")];
+ char uniname2ctype_pool_str2787[sizeof("oldsoutharabian")];
+ char uniname2ctype_pool_str2795[sizeof("quotationmark")];
+ char uniname2ctype_pool_str2889[sizeof("inhangulcompatibilityjamo")];
+ char uniname2ctype_pool_str2898[sizeof("qmark")];
+ char uniname2ctype_pool_str2902[sizeof("incjkunifiedideographsextensionc")];
+ char uniname2ctype_pool_str2906[sizeof("sk")];
+ char uniname2ctype_pool_str2909[sizeof("incjkunifiedideographsextensiona")];
+ char uniname2ctype_pool_str2918[sizeof("incjkunifiedideographs")];
+ char uniname2ctype_pool_str2984[sizeof("katakana")];
+ char uniname2ctype_pool_str3112[sizeof("kayahli")];
+ char uniname2ctype_pool_str3137[sizeof("duployan")];
+ char uniname2ctype_pool_str3278[sizeof("incjkunifiedideographsextensiond")];
+ char uniname2ctype_pool_str3360[sizeof("inbopomofoextended")];
+ char uniname2ctype_pool_str3466[sizeof("khojki")];
+ char uniname2ctype_pool_str3777[sizeof("zyyy")];
+ char uniname2ctype_pool_str3778[sizeof("egyptianhieroglyphs")];
+ char uniname2ctype_pool_str3827[sizeof("incjkunifiedideographsextensionb")];
+ char uniname2ctype_pool_str3886[sizeof("batak")];
+ char uniname2ctype_pool_str3941[sizeof("blank")];
+ char uniname2ctype_pool_str3995[sizeof("inboxdrawing")];
+ char uniname2ctype_pool_str4025[sizeof("greek")];
+ char uniname2ctype_pool_str4035[sizeof("gurmukhi")];
+ char uniname2ctype_pool_str4122[sizeof("grlink")];
+ char uniname2ctype_pool_str4322[sizeof("graphemelink")];
#endif /* USE_UNICODE_PROPERTIES */
};
static const struct uniname2ctype_pool_t uniname2ctype_pool_contents =
@@ -26709,644 +30424,736 @@ static const struct uniname2ctype_pool_t uniname2ctype_pool_contents =
"upper",
#else /* USE_UNICODE_PROPERTIES */
"n",
- "s",
- "z",
- "zs",
- "zzzz",
"cn",
- "cs",
- "ci",
+ "mn",
"c",
- "cf",
+ "m",
+ "ci",
+ "z",
+ "cc",
+ "mc",
+ "mani",
+ "inmanichaean",
+ "qaai",
+ "zzzz",
+ "qaac",
+ "incham",
"sc",
+ "sm",
+ "mandaic",
+ "incuneiform",
"cans",
- "qaai",
- "mn",
+ "me",
+ "inarmenian",
#endif /* USE_UNICODE_PROPERTIES */
"ascii",
#ifdef USE_UNICODE_PROPERTIES
- "cc",
- "qaac",
- "inavestan",
- "inspecials",
- "inipaextensions",
- "mc",
+ "s",
"insamaritan",
- "m",
- "sm",
- "me",
- "inarmenian",
- "incuneiform",
- "mandaic",
- "inancientsymbols",
+ "cs",
+ "zs",
+ "inavestan",
+ "incommonindicnumberforms",
"incuneiformnumbersandpunctuation",
"inthai",
- "inmusicalsymbols",
- "inmiscellaneoussymbols",
- "incham",
- "inmiscellaneoussymbolsandarrows",
+ "inipaextensions",
+ "mtei",
+ "inspecials",
"initialpunctuation",
- "inmiscellaneoussymbolsandpictographs",
+ "inancientsymbols",
"inthaana",
- "taile",
- "mtei",
- "lc",
- "lana",
- "inlycian",
- "intransportandmapsymbols",
- "incontrolpictures",
- "sinhala",
- "incommonindicnumberforms",
"inmiscellaneousmathematicalsymbolsa",
+ "lc",
+ "inmusicalsymbols",
+ "lm",
+ "taile",
"sterm",
+ "lina",
+ "inlycian",
"inmyanmarextendeda",
- "lm",
- "taiviet",
- "inlinearbideograms",
+ "lana",
+ "alnum",
"intaitham",
+ "incontrolpictures",
+ "inmiscellaneoussymbols",
+ "inmalayalam",
+ "intransportandmapsymbols",
+ "inmiscellaneoussymbolsandarrows",
+ "inlineara",
+ "inmiscellaneoussymbolsandpictographs",
+ "taiviet",
+ "cwcm",
+ "sinhala",
"latn",
"latin",
"ital",
- "alnum",
- "inmalayalam",
+ "intamil",
+ "taml",
+ "inlatinextendedc",
"intaile",
"tale",
+ "inlatinextendeda",
+ "inlinearbideograms",
+ "newtailue",
"l",
"nl",
+ "inmeeteimayekextensions",
"zl",
- "intamil",
- "taml",
- "inlatinextendeda",
- "inlatinextendedc",
+ "lt",
"inrunic",
"incarian",
- "insyriac",
- "cari",
- "inmeeteimayekextensions",
- "osma",
- "lt",
- "miao",
- "insharada",
- "incyrillic",
- "carian",
"armn",
- "samr",
+ "cari",
"armi",
- "inideographicdescriptioncharacters",
- "inosmanya",
+ "inlatinextendede",
+ "incyrillic",
"armenian",
"inmyanmar",
- "samaritan",
- "arabic",
- "incherokee",
- "connectorpunctuation",
+ "innewtailue",
+ "carian",
"merc",
+ "arabic",
"inmiscellaneoustechnical",
- "inenclosedalphanumerics",
- "inemoticons",
- "joinc",
+ "insyriac",
+ "samr",
+ "zinh",
+ "han",
+ "samaritan",
+ "hani",
+ "cwt",
+ "incherokee",
+ "insharada",
+ "cham",
+ "manichaean",
+ "inmahajani",
#endif /* USE_UNICODE_PROPERTIES */
"cntrl",
#ifdef USE_UNICODE_PROPERTIES
- "inenclosedcjklettersandmonths",
- "cwcf",
+ "sinh",
"inruminumeralsymbols",
- "ll",
- "term",
- "inlatinextendedadditional",
+ "inethiopic",
"tamil",
- "loe",
- "newtailue",
- "cwcm",
- "inenclosedalphanumericsupplement",
- "sinh",
- "zinh",
- "meroiticcursive",
- "han",
- "hani",
- "inopticalcharacterrecognition",
- "no",
- "so",
- "innewtailue",
+ "miao",
+ "inenclosedalphanumerics",
+ "term",
+ "chakma",
"insinhala",
- "innko",
- "co",
"shavian",
- "terminalpunctuation",
- "intaixuanjingsymbols",
- "inethiopic",
- "sora",
- "inarrows",
- "cham",
- "inlowsurrogates",
- "oriya",
- "ext",
- "cwt",
- "common",
- "inmiao",
+ "inosmanya",
+ "inlatinextendedadditional",
+ "osma",
+ "ll",
"thai",
- "intifinagh",
- "ethi",
- "mero",
- "chakma",
+ "math",
"thaa",
- "inscriptionalparthian",
- "tifinagh",
- "titlecaseletter",
+ "inenclosedalphanumericsupplement",
+ "ethi",
+ "connectorpunctuation",
+ "inlowsurrogates",
+ "insinhalaarchaicnumbers",
+ "taitham",
"thaana",
- "asciihexdigit",
- "math",
+ "lineara",
"di",
- "ids",
- "lo",
- "inlao",
- "taitham",
- "lao",
- "laoo",
- "dia",
"idc",
- "ps",
+ "meroiticcursive",
+ "mand",
+ "inmodi",
+ "inmandaic",
+ "cwl",
+ "asciihexdigit",
+ "dia",
+ "terminalpunctuation",
+ "mend",
+ "sind",
+ "wara",
+ "inwarangciti",
+ "inideographicdescriptioncharacters",
+ "inemoticons",
+ "ids",
"insundanese",
"pi",
- "cwl",
- "pf",
- "mand",
- "insylotinagri",
- "vs",
- "mongolian",
+ "indominotiles",
"pc",
- "inmandaic",
- "invai",
- "lineseparator",
- "pe",
- "vai",
- "vaii",
+ "loe",
+ "titlecaseletter",
+ "inopticalcharacterrecognition",
"idst",
- "indominotiles",
- "inshavian",
- "inspacingmodifierletters",
- "format",
+ "shaw",
+ "cwcf",
+ "idcontinue",
"inphaistosdisc",
- "hano",
-#endif /* USE_UNICODE_PROPERTIES */
- "space",
-#ifdef USE_UNICODE_PROPERTIES
+ "pe",
"indeseret",
- "inolchiki",
- "hira",
- "joincontrol",
- "idcontinue",
- "inmahjongtiles",
- "patws",
+ "inspacingmodifierletters",
"inlydian",
+ "ps",
+ "hira",
+ "whitespace",
+ "inscriptionalparthian",
"cher",
+ "inmathematicalalphanumericsymbols",
+ "incoptic",
"inhiragana",
- "inogham",
- "avst",
+ "inenclosedcjklettersandmonths",
+#endif /* USE_UNICODE_PROPERTIES */
+ "space",
+#ifdef USE_UNICODE_PROPERTIES
+ "oriya",
+ "mero",
+ "mahj",
+ "tirh",
+ "sora",
"inscriptionalpahlavi",
- "incoptic",
- "java",
- "inmathematicalalphanumericsymbols",
- "letter",
- "injavanese",
- "avestan",
- "age=1.1",
- "lepc",
- "age=2.1",
+ "inarrows",
+ "mahajani",
+ "joinc",
+ "incopticepactnumbers",
+ "hano",
+ "palm",
+ "intirhuta",
+ "patws",
+ "inolchiki",
"inlepcha",
- "javanese",
- "shaw",
- "finalpunctuation",
+ "no",
+ "lepc",
+ "inogham",
+ "co",
+ "innko",
"alpha",
- "age=5.1",
- "inmongolian",
- "age=5.2",
- "age=2.0",
- "ahex",
- "ingeneralpunctuation",
- "oids",
- "odi",
- "age=5.0",
- "tavt",
- "intaiviet",
- "age=6.1",
- "age=3.1",
+ "psalterpahlavi",
+ "inmro",
+ "inpalmyrene",
+ "common",
+ "cf",
+ "inmiao",
+ "so",
+ "diacritic",
"insundanesesupplement",
- "age=3.2",
- "age=4.1",
+ "intifinagh",
+ "tifinagh",
+ "odi",
"oidc",
- "tfng",
- "insmallformvariants",
- "ideo",
- "intags",
- "age=6.0",
- "age=3.0",
- "whitespace",
- "age=4.0",
+ "modi",
+ "decimalnumber",
+ "letter",
+ "dash",
+ "insylotinagri",
"inolditalic",
- "oalpha",
- "ingujarati",
- "control",
- "diacritic",
- "tagbanwa",
- "inphoenician",
- "ininscriptionalparthian",
- "ininscriptionalpahlavi",
- "coptic",
+ "wspace",
"dsrt",
- "inmodifiertoneletters",
- "xids",
- "hanunoo",
- "inoldturkic",
- "xidc",
+ "ideo",
+ "siddham",
+ "perm",
+ "oids",
+ "inmahjongtiles",
+ "lo",
+ "lineseparator",
+ "imperialaramaic",
"idstart",
+ "inlao",
+ "sharada",
+ "lao",
+ "laoo",
+ "mongolian",
+ "oalpha",
"inimperialaramaic",
- "invariationselectors",
- "copt",
- "caseignorable",
- "prti",
"nchar",
- "deseret",
- "decimalnumber",
- "cprt",
"inlatin1supplement",
- "imperialaramaic",
- "privateuse",
- "casedletter",
- "lowercase",
- "spaceseparator",
+ "prti",
+ "cprt",
+ "nd",
+ "deseret",
+ "inoldturkic",
"radical",
- "mong",
"canadianaboriginal",
- "letternumber",
- "insorasompeng",
- "dash",
- "wspace",
- "ogam",
- "invariationselectorssupplement",
+ "inmodifiertoneletters",
+ "incaucasianalbanian",
+ "coptic",
+ "casedletter",
+ "sd",
+ "inphoenician",
+ "sidd",
+ "privateuse",
+ "sundanese",
+ "inancientgreekmusicalnotation",
+ "insiddham",
+ "cased",
"print",
- "otheridcontinue",
- "ingurmukhi",
- "closepunctuation",
+ "ininscriptionalparthian",
+ "ininscriptionalpahlavi",
+ "copt",
+ "inancientgreeknumbers",
+ "saurashtra",
+ "mro",
+ "mroo",
+ "inalphabeticpresentationforms",
+ "lowercase",
+ "phli",
+ "patternwhitespace",
+ "inenclosedideographicsupplement",
+ "spaceseparator",
+ "inmathematicaloperators",
+ "omath",
+ "lisu",
+ "inpsalterpahlavi",
"olditalic",
- "noncharactercodepoint",
- "sharada",
- "ingeometricshapes",
+ "hanunoo",
+ "inherited",
+ "lepcha",
+ "p",
+ "inmongolian",
+ "zp",
+ "finalpunctuation",
+ "otheridcontinue",
+ "shrd",
+ "ingrantha",
+ "talu",
"otheralphabetic",
- "patternwhitespace",
- "po",
- "rjng",
- "ingreekandcoptic",
- "xdigit",
- "gothic",
+ "noncharactercodepoint",
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ "age=1.1",
+ "age=2.1",
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ "closepunctuation",
+ "letternumber",
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ "age=6.1",
+ "age=6.2",
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ "telu",
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ "age=3.1",
+ "age=3.2",
+ "age=5.1",
+ "age=5.2",
+ "age=2.0",
+ "age=6.3",
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ "inshorthandformatcontrols",
+ "inoldnortharabian",
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ "age=6.0",
+ "age=4.1",
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ "ingeneralpunctuation",
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ "age=3.0",
+ "age=7.0",
+ "age=5.0",
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ "innabataean",
+#ifdef USE_UNICODE_AGE_PROPERTIES
+ "age=4.0",
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ "bamum",
+ "control",
+ "induployan",
+ "inlatinextendedd",
+ "inarabic",
+ "runic",
+ "inelbasan",
"inoldsoutharabian",
- "xidstart",
- "inrejang",
- "idsbinaryoperator",
- "olower",
- "hex",
- "inenclosedideographicsupplement",
- "inalphabeticpresentationforms",
"inbasiclatin",
- "othersymbol",
- "nd",
- "sd",
- "omath",
+ "format",
+ "innumberforms",
+ "inugaritic",
"separator",
- "inarabic",
- "xidcontinue",
+ "idsbinaryoperator",
+ "tagbanwa",
+ "bass",
+ "saur",
+ "nbat",
+ "intaixuanjingsymbols",
+ "joincontrol",
"otheridstart",
- "grext",
+ "inbyzantinemusicalsymbols",
+ "intags",
+ "nabataean",
+ "insuperscriptsandsubscripts",
+ "intibetan",
+ "insaurashtra",
+ "othersymbol",
+ "ext",
+ "inarabicpresentationformsa",
+ "inmiscellaneousmathematicalsymbolsb",
"otherlowercase",
- "phli",
- "cased",
- "hang",
- "xpeo",
+ "phoenician",
#endif /* USE_UNICODE_PROPERTIES */
"lower",
#ifndef USE_UNICODE_PROPERTIES
"graph",
#else /* USE_UNICODE_PROPERTIES */
- "modifierletter",
- "inphoneticextensions",
- "inarabicpresentationformsa",
- "innumberforms",
- "oldpersian",
- "incyrillicextendeda",
- "inverticalforms",
- "p",
- "inbyzantinemusicalsymbols",
- "inmathematicaloperators",
- "intibetan",
- "zp",
- "ingeorgian",
- "inbraillepatterns",
- "lepcha",
- "geor",
- "invedicextensions",
"linb",
- "other",
- "deva",
- "indevanagari",
- "othernumber",
- "bamum",
- "shrd",
- "bali",
- "devanagari",
- "extender",
- "inherited",
- "glagolitic",
+ "po",
+ "inmyanmarextendedb",
+ "limb",
+ "inbraillepatterns",
"tibt",
+ "cuneiform",
+ "bali",
+ "oldpersian",
+ "oldpermic",
+ "pf",
+ "word",
+ "tibetan",
+ "incyrillicsupplement",
+ "elba",
+ "insupplementalmathematicaloperators",
"inbalinese",
- "ingothic",
- "inmiscellaneousmathematicalsymbolsb",
- "limb",
"bengali",
- "phoenician",
- "insuperscriptsandsubscripts",
- "inmeroitichieroglyphs",
- "tibetan",
- "inphoneticextensionssupplement",
+ "caseignorable",
+ "incountingrodnumerals",
+ "other",
+ "tirhuta",
+ "othernumber",
"balinese",
+ "elbasan",
+ "inunifiedcanadianaboriginalsyllabics",
"lowercaseletter",
- "indingbats",
- "inprivateusearea",
- "assigned",
- "patternsyntax",
- "inhangulsyllables",
- "sarb",
+ "ethiopic",
+ "gran",
+ "ingurmukhi",
+ "sund",
+ "inethiopicsupplement",
+ "inoldpersian",
+ "inoldpermic",
+ "othermath",
+ "unassigned",
+ "hmng",
+ "narb",
"brai",
- "insupplementalmathematicaloperators",
- "phnx",
- "ingreekextended",
- "otherletter",
+ "hang",
+ "insorasompeng",
"arab",
- "inlatinextendedd",
- "word",
- "inphagspa",
- "inblockelements",
- "ethiopic",
- "inethiopicextendeda",
+ "plrd",
+ "ingujarati",
"brahmi",
- "logicalorderexception",
- "inoldpersian",
+ "runr",
+ "ahex",
+ "mong",
+ "pauc",
+ "sarb",
+ "ogam",
+ "olower",
+ "pd",
+ "number",
+ "inbrahmi",
+ "otherletter",
+ "ingothic",
+ "phagspa",
"inletterlikesymbols",
- "sorasompeng",
- "hiragana",
- "inhanguljamoextendeda",
- "othermath",
+ "yi",
+ "hangul",
+ "yiii",
+ "tfng",
+ "insupplementalarrowsc",
+ "ingreekandcoptic",
+ "xidc",
+ "insupplementalarrowsa",
+ "gothic",
+ "grext",
+ "incombininghalfmarks",
+ "deprecated",
+ "inbassavah",
+ "xids",
+ "linearb",
+ "ingeometricshapes",
+ "phlp",
+ "warangciti",
+ "inblockelements",
+ "modifierletter",
+ "indingbats",
+ "dep",
+ "punct",
+ "inhanunoo",
+ "bidic",
+ "ingreekextended",
+ "idsb",
+ "assigned",
+ "otherpunctuation",
+ "inhangulsyllables",
+ "inarabicmathematicalalphabeticsymbols",
+ "inornamentaldingbats",
+ "inphagspa",
+ "lyci",
+ "mlym",
+ "inarabicextendeda",
+ "rjng",
+ "lycian",
+ "inalchemicalsymbols",
+ "xdigit",
#endif /* USE_UNICODE_PROPERTIES */
"digit",
#ifndef USE_UNICODE_PROPERTIES
"blank"
#else /* USE_UNICODE_PROPERTIES */
- "goth",
- "ogham",
- "sundanese",
- "saurashtra",
- "linearb",
- "graphemebase",
- "inunifiedcanadianaboriginalsyllabics",
- "cuneiform",
+ "xidstart",
+ "inrejang",
+ "malayalam",
+ "idstrinaryoperator",
+ "invai",
+ "vai",
+ "vaii",
+ "hiragana",
+ "ingeorgian",
+ "braille",
+ "geor",
+ "brah",
+ "glagolitic",
"inkannada",
+ "cakm",
"kana",
- "inancientgreeknumbers",
- "incjkstrokes",
- "inglagolitic",
- "inancientgreekmusicalnotation",
+ "hebr",
+ "inshavian",
+ "vs",
"inchakma",
- "plrd",
- "inbrahmi",
- "cakm",
+ "ogham",
+ "sylotinagri",
+ "inunifiedcanadianaboriginalsyllabicsextended",
+ "inmeroitichieroglyphs",
+ "grantha",
+ "graphemebase",
+ "mathsymbol",
+ "mymr",
+ "insupplementaryprivateuseareaa",
+ "mendekikakui",
"incjkcompatibilityforms",
- "lisu",
+ "inhalfwidthandfullwidthforms",
"incjkcompatibilityideographs",
- "intagalog",
"inkaithi",
- "insupplementalarrowsa",
+ "avst",
+ "inarabicsupplement",
"takri",
- "ideographic",
- "hexdigit",
- "glag",
- "softdotted",
- "variationselector",
- "inkatakana",
+ "syrc",
"meeteimayek",
- "otherpunctuation",
- "inhanguljamo",
- "kali",
- "braille",
- "incombininghalfmarks",
- "talu",
+ "myanmar",
+ "avestan",
+ "inhanguljamoextendeda",
+ "goth",
+ "inkatakana",
+ "incyrillicextendeda",
+ "alphabetic",
+ "syriac",
+ "ideographic",
+ "incjkstrokes",
+ "inlinearbsyllabary",
+ "tavt",
+ "intaiviet",
"incjkcompatibilityideographssupplement",
- "telu",
- "idsb",
- "tglg",
"inmeeteimayek",
- "yi",
- "phagspa",
- "yiii",
- "inarabicmathematicalalphabeticsymbols",
- "saur",
- "ogrext",
- "bidic",
- "inkanasupplement",
- "runic",
- "inalchemicalsymbols",
- "georgian",
- "inugaritic",
- "insaurashtra",
+ "kali",
+ "inyiradicals",
+ "lu",
+ "inoriya",
+ "hebrew",
+ "extender",
"inhighprivateusesurrogates",
- "pd",
- "incountingrodnumerals",
- "inarabicextendeda",
- "inkharoshthi",
- "idstrinaryoperator",
+ "limbu",
+ "inbuhid",
+ "inethiopicextendeda",
+ "xidcontinue",
+ "inyijinghexagramsymbols",
+ "logicalorderexception",
+ "inhebrew",
+ "cyrl",
+ "osmanya",
+ "phnx",
+ "incombiningdiacriticalmarks",
+ "inkanasupplement",
+ "inlisu",
+ "changeswhencasemapped",
+ "incombiningdiacriticalmarksforsymbols",
+ "cwu",
"phag",
- "brah",
+ "insmallformvariants",
+ "inpahawhhmong",
+ "otheruppercase",
+ "intelugu",
+ "incombiningdiacriticalmarkssupplement",
+ "ingeometricshapesextended",
+ "xpeo",
+ "bamu",
+ "inbamum",
"mark",
- "hebr",
- "inkhmersymbols",
- "dep",
+ "dupl",
+ "graph",
+ "dashpunctuation",
+ "patternsyntax",
+ "changeswhentitlecased",
+ "inkharoshthi",
"inkhmer",
- "deprecated",
- "rejang",
- "lyci",
+ "java",
+ "sylo",
+ "ugaritic",
+ "otherdefaultignorablecodepoint",
+ "softdotted",
+ "uideo",
+ "inphoneticextensions",
+ "injavanese",
+ "invariationselectors",
+ "kaithi",
+ "cyrillic",
"intakri",
"takr",
- "incyrillicsupplement",
- "changeswhencasefolded",
- "indevanagariextended",
- "lycian",
+ "javanese",
+ "bidicontrol",
+ "caucasianalbanian",
+ "lydi",
+ "insupplementalpunctuation",
+ "inphoneticextensionssupplement",
+ "lydian",
+ "oldturkic",
+ "invariationselectorssupplement",
+ "kthi",
+ "inhanguljamo",
+ "patsyn",
+ "inlimbu",
+ "sorasompeng",
+ "orya",
+ "inkhmersymbols",
+ "inglagolitic",
+ "indevanagari",
+ "deva",
+ "knda",
"inbengali",
+ "symbol",
+ "devanagari",
+ "inmendekikakui",
"beng",
- "graph",
- "inyijinghexagramsymbols",
- "olck",
- "inarabicsupplement",
+ "invedicextensions",
+ "graphemeextend",
+ "kannada",
"inbuginese",
- "changeswhencasemapped",
+ "olck",
+ "meroitichieroglyphs",
+ "ugar",
+ "intagalog",
+ "inbamumsupplement",
"olchiki",
- "inaegeannumbers",
- "mlym",
- "alphabetic",
- "sylotinagri",
- "changeswhentitlecased",
- "tagalog",
+ "incurrencysymbols",
"tagb",
- "runr",
- "malayalam",
- "inoriya",
+ "inaegeannumbers",
"intagbanwa",
- "syrc",
- "nko",
- "nkoo",
- "inethiopicextended",
- "kaithi",
- "mathsymbol",
- "inyiradicals",
- "insupplementaryprivateuseareaa",
- "osmanya",
- "syriac",
- "otherdefaultignorablecodepoint",
- "number",
- "inlinearbsyllabary",
- "kthi",
- "sund",
- "mymr",
- "incombiningdiacriticalmarks",
- "enclosingmark",
- "incombiningdiacriticalmarksforsymbols",
- "inethiopicsupplement",
- "unassigned",
- "sylo",
- "combiningmark",
- "myanmar",
- "graphemeextend",
- "bidicontrol",
- "inhalfwidthandfullwidthforms",
- "cyrl",
- "knda",
- "inunifiedcanadianaboriginalsyllabicsextended",
- "xsux",
- "modifiersymbol",
- "incombiningdiacriticalmarkssupplement",
- "inhanunoo",
- "inbuhid",
- "kannada",
- "inhebrew",
- "grbase",
- "spacingmark",
+ "uppercase",
+ "defaultignorablecodepoint",
+ "glag",
"inkatakanaphoneticextensions",
- "hangul",
+ "changeswhencasefolded",
+ "inpaucinhau",
+ "inprivateusearea",
+ "paucinhau",
+ "spacingmark",
+ "khmr",
+ "khar",
+ "inarabicpresentationformsb",
+ "changeswhenlowercased",
+ "tglg",
+ "inethiopicextended",
+ "incombiningdiacriticalmarksextended",
+ "oupper",
"incjksymbolsandpunctuation",
"bopo",
- "orya",
+ "punctuation",
+ "combiningmark",
+ "inplayingcards",
"inbopomofo",
+ "hyphen",
+ "inkhojki",
+ "nko",
+ "nkoo",
+ "enclosingmark",
+ "openpunctuation",
+ "currencysymbol",
+ "inverticalforms",
+ "hex",
+ "modifiersymbol",
+ "inlatinextendedb",
"kharoshthi",
- "khar",
- "changeswhenlowercased",
- "khmr",
- "punct",
- "symbol",
"cherokee",
- "cyrillic",
- "inkangxiradicals",
- "hebrew",
- "inarabicpresentationformsb",
- "incyrillicextendedb",
- "ugaritic",
- "incurrencysymbols",
- "meroitichieroglyphs",
- "inhighsurrogates",
- "nonspacingmark",
- "lydi",
- "patsyn",
- "orkh",
- "lydian",
- "ugar",
- "othergraphemeextend",
- "inlatinextendedb",
- "bopomofo",
- "khmer",
- "uideo",
- "otheruppercase",
- "grek",
+ "pahawhhmong",
+ "cypriot",
+ "incypriotsyllabary",
+ "palmyrene",
+ "upper",
+ "aghb",
+ "georgian",
"gujr",
+ "grbase",
"gujarati",
- "inhanguljamoextendedb",
- "defaultignorablecodepoint",
- "inplayingcards",
- "bamu",
- "inkanbun",
- "incjkradicalssupplement",
- "cypriot",
- "inbamum",
- "inmeroiticcursive",
- "oldturkic",
+ "hexdigit",
+ "khmer",
+ "uppercaseletter",
"insupplementalarrowsb",
"surrogate",
+ "unifiedideograph",
+ "nonspacingmark",
+ "othergraphemeextend",
+ "indevanagariextended",
+ "orkh",
+ "ingeorgiansupplement",
+ "oldnortharabian",
+ "tagalog",
+ "khoj",
+ "bopomofo",
+ "rejang",
+ "buhd",
+ "incjkradicalssupplement",
+ "inkanbun",
+ "variationselector",
+ "inkangxiradicals",
+ "inhighsurrogates",
+ "insupplementaryprivateuseareab",
+ "ogrext",
"batk",
+ "inhanguljamoextendedb",
"inbatak",
- "inlimbu",
- "incypriotsyllabary",
- "dashpunctuation",
+ "incyrillicextendedb",
"innoblock",
- "hyphen",
- "insupplementalpunctuation",
- "ingeorgiansupplement",
- "oupper",
+ "any",
+ "xsux",
+ "bugi",
+ "inkhudawadi",
+ "telugu",
+ "changeswhenuppercased",
+ "grek",
+ "guru",
"paragraphseparator",
- "inbamumsupplement",
- "uppercase",
- "currencysymbol",
- "sk",
- "lu",
- "openpunctuation",
- "inlisu",
- "qmark",
+ "buginese",
+ "inyisyllables",
"egyp",
- "insupplementaryprivateuseareab",
- "limbu",
+ "khudawadi",
+ "unknown",
+ "bassavah",
"inegyptianhieroglyphs",
- "unifiedideograph",
- "intelugu",
- "katakana",
- "inhangulcompatibilityjamo",
- "upper",
+ "buhid",
"inkayahli",
- "cwu",
+ "inmeroiticcursive",
"incjkcompatibility",
- "uppercaseletter",
- "bugi",
- "buginese",
- "any",
- "inyisyllables",
- "inbopomofoextended",
- "inboxdrawing",
- "changeswhenuppercased",
- "unknown",
- "quotationmark",
- "buhd",
- "punctuation",
"oldsoutharabian",
- "kayahli",
- "incjkunifiedideographs",
- "incjkunifiedideographsextensiona",
+ "quotationmark",
+ "inhangulcompatibilityjamo",
+ "qmark",
"incjkunifiedideographsextensionc",
- "telugu",
- "guru",
- "greek",
- "grlink",
- "buhid",
- "batak",
- "blank",
+ "sk",
+ "incjkunifiedideographsextensiona",
+ "incjkunifiedideographs",
+ "katakana",
+ "kayahli",
+ "duployan",
"incjkunifiedideographsextensiond",
- "graphemelink",
+ "inbopomofoextended",
+ "khojki",
+ "zyyy",
"egyptianhieroglyphs",
"incjkunifiedideographsextensionb",
- "zyyy",
- "gurmukhi"
+ "batak",
+ "blank",
+ "inboxdrawing",
+ "greek",
+ "gurmukhi",
+ "grlink",
+ "graphemelink"
#endif /* USE_UNICODE_PROPERTIES */
};
#define uniname2ctype_pool ((const char *) &uniname2ctype_pool_contents)
@@ -27366,1138 +31173,1296 @@ uniname2ctype_p (str, len)
#ifdef USE_UNICODE_PROPERTIES
{-1}, {-1}, {-1},
{(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3, 34},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str5, 46},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str7, 51},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str9, 54},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str16, 208},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str10, 20},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str11, 33},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str18, 20},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str13, 17},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str20, 22},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str15, 30},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str16, 60},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str17, 51},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str20, 18},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str21, 31},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str29, 185},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str31, 438},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str24, 60},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str29, 17},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str30, 19},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str35, 114},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str36, 231},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str37, 128},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str44, 383},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str32, 47},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str46, 47},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str34, 101},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str35, 114},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str48, 49},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str38, 33},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str51, 168},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str42, 14},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str55, 461},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str56, 101},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str59, 32},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str44, 18},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str45, 128},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str61, 258},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str64, 14},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str65, 46},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str49, 401},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str69, 265},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str52, 377},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str72, 22},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str74, 54},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str62, 226},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str64, 31},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str85, 439},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str92, 374},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str96, 462},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str97, 278},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str98, 252},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str105, 159},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str110, 406},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str114, 43},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str115, 411},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str66, 239},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str69, 30},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str117, 263},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str130, 333},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str134, 24},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str135, 473},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str136, 26},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str137, 120},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str141, 227},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str142, 183},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str144, 413},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str72, 49},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str147, 384},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str151, 151},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str74, 32},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str82, 232},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str153, 13},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str84, 412},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str155, 302},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str86, 168},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str157, 325},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str90, 382},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str161, 331},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str92, 413},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str96, 252},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str163, 276},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str99, 419},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str100, 304},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str106, 355},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str109, 312},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str166, 488},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str113, 43},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str114, 430},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str170, 339},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str173, 426},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str116, 237},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str175, 485},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str124, 120},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str125, 159},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str132, 24},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str133, 151},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str134, 384},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str135, 432},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str136, 298},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str142, 92},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str151, 347},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str156, 306},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str158, 204},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str167, 356},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str172, 26},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str183, 152},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str175, 152},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str186, 65},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str179, 379},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str180, 276},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str190, 92},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str184, 75},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str203, 75},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str186, 75},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str187, 111},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str205, 75},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str206, 111},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str189, 13},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str208, 273},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str209, 88},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str199, 250},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str201, 272},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str202, 120},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str223, 341},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str205, 23},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str226, 298},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str227, 120},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str237, 250},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str207, 36},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str239, 408},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str240, 129},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str241, 23},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str209, 52},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str216, 247},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str217, 88},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str218, 224},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str243, 36},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str247, 386},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str250, 52},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str220, 314},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str252, 28},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str223, 263},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str224, 385},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str225, 235},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str255, 289},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str256, 414},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str257, 78},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str227, 148},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str259, 148},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str260, 160},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str261, 388},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str263, 256},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str230, 358},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str231, 124},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str232, 28},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str233, 172},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str234, 410},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str239, 230},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str240, 148},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str244, 78},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str245, 155},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str266, 78},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str267, 281},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str270, 299},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str247, 160},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str248, 323},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str272, 148},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str274, 170},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str280, 80},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str252, 392},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str253, 78},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str254, 255},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str255, 155},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str256, 80},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str284, 324},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str287, 261},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str288, 155},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str294, 114},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str295, 109},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str298, 155},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str299, 109},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str302, 63},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str303, 286},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str304, 450},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str307, 150},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str315, 185},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str316, 449},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str317, 3},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str318, 92},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str320, 444},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str327, 284},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str259, 260},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str330, 88},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str331, 172},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str332, 327},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str333, 205},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str261, 39},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str335, 169},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str263, 170},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str264, 297},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str268, 300},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str337, 277},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str347, 123},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str350, 423},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str353, 314},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str359, 124},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str362, 25},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str363, 93},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str366, 55},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str372, 82},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str279, 431},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str374, 483},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str375, 99},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str376, 39},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str380, 394},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str281, 178},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str288, 3},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str382, 451},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str301, 333},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str386, 151},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str388, 82},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str303, 64},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str304, 405},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str390, 183},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str392, 70},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str401, 67},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str308, 25},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str313, 182},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str405, 170},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str407, 168},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str408, 457},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str410, 266},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str412, 61},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str414, 208},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str415, 211},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str316, 287},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str418, 205},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str419, 186},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str320, 88},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str321, 201},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str329, 129},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str330, 65},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str339, 428},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str346, 92},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str347, 114},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str423, 196},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str349, 170},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str353, 109},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str357, 109},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str358, 299},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str359, 37},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str360, 50},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str364, 273},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str365, 251},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str425, 198},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str433, 459},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str439, 350},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str367, 238},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str372, 21},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str441, 486},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str375, 123},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str453, 66},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str378, 182},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str386, 421},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str387, 258},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str456, 305},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str466, 43},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str389, 174},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str398, 295},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str468, 481},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str400, 150},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str403, 365},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str470, 39},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str476, 224},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str477, 28},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str485, 326},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str405, 87},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str406, 189},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str409, 63},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str487, 218},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str489, 123},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str490, 64},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str412, 74},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str493, 67},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str502, 412},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str508, 41},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str518, 421},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str519, 253},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str520, 432},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str414, 416},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str522, 45},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str530, 106},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str420, 93},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str536, 199},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str540, 162},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str544, 100},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str545, 477},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str546, 342},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str550, 352},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str554, 360},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str556, 9},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str425, 317},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str426, 99},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str427, 171},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str428, 169},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str429, 82},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str430, 162},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str570, 87},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str571, 171},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str432, 131},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str436, 28},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str573, 184},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str445, 82},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str449, 185},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str450, 55},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str582, 197},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str584, 174},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str453, 70},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str454, 66},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str587, 163},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str460, 27},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str468, 253},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str593, 322},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str594, 184},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str596, 201},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str597, 415},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str598, 116},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str470, 151},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str600, 191},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str601, 455},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str603, 229},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str604, 308},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str474, 94},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str475, 94},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str476, 188},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str608, 307},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str609, 37},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str478, 67},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str611, 141},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str612, 288},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str480, 45},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str481, 278},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str614, 21},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str484, 43},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str485, 61},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str490, 42},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str495, 168},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str496, 346},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str497, 205},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str503, 105},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str504, 39},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str506, 240},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str617, 264},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str509, 341},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str620, 1},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str511, 52},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str622, 194},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str623, 465},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str624, 429},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str514, 41},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str515, 143},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str516, 143},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str517, 195},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str627, 74},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str520, 426},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str521, 391},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str522, 227},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str524, 19},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str528, 383},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str630, 19},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str637, 468},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str531, 116},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str532, 9},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str640, 50},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str542, 390},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str650, 211},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str658, 309},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str672, 344},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str679, 131},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str696, 221},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str545, 281},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str699, 226},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str700, 187},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str548, 106},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str553, 178},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str703, 35},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str555, 67},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str705, 23},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str558, 425},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str708, 202},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str709, 373},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str711, 416},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str560, 206},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str713, 199},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str715, 113},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str563, 396},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str564, 100},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str718, 210},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str722, 195},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str724, 193},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str725, 225},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str727, 480},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str728, 27},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str730, 52},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str731, 160},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str735, 66},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str736, 279},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str737, 173},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str742, 94},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str743, 94},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str744, 105},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str745, 209},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str568, 325},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str749, 428},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str572, 262},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str753, 215},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str758, 249},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str761, 162},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str574, 153},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str575, 163},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str763, 125},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str579, 315},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str587, 158},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str767, 35},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str768, 113},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str772, 443},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str773, 219},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str777, 101},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str589, 423},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str594, 23},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str604, 354},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str779, 371},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str608, 153},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str783, 425},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str612, 209},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str613, 141},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str614, 211},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str787, 128},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str796, 24},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str616, 280},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str617, 158},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str618, 123},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str619, 42},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str620, 1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str621, 218},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str622, 269},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str623, 219},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str626, 210},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str627, 185},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str630, 289},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str631, 202},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str632, 198},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str633, 217},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str798, 223},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str803, 431},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str804, 195},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str805, 21},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str813, 140},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str815, 474},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str817, 456},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str636, 152},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str637, 357},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str638, 221},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str639, 213},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str640, 282},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str641, 214},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str642, 216},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str643, 203},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str820, 59},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str827, 7},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str646, 131},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str647, 374},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str648, 187},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str649, 438},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str650, 220},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str651, 212},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str830, 440},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str653, 176},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str654, 215},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str655, 386},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str660, 186},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str668, 245},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str832, 441},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str834, 128},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str672, 18},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str838, 410},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str679, 188},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str845, 144},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str682, 118},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str848, 188},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str849, 188},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str850, 397},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str690, 395},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str701, 402},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str703, 403},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str704, 128},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str705, 113},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str706, 344},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str858, 57},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str709, 68},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str713, 116},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str861, 163},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str864, 229},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str715, 404},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str721, 69},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str725, 66},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str729, 394},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str730, 370},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str734, 128},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str866, 484},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str737, 60},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str738, 162},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str739, 192},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str746, 113},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str747, 35},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str748, 125},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str869, 54},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str750, 223},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str871, 323},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str882, 206},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str892, 156},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str771, 160},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str895, 442},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str898, 111},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str905, 116},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str909, 114},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str910, 141},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str913, 38},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str916, 295},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str922, 53},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str923, 42},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str925, 226},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str927, 173},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str776, 21},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str777, 24},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str778, 57},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str932, 454},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str780, 54},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str784, 196},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str934, 129},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str936, 209},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str938, 215},
+#ifndef USE_UNICODE_AGE_PROPERTIES
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str787, 105},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str788, 101},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str792, 36},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str796, 408},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str797, 179},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str798, 176},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str799, 102},
+#else /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str939, 232},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str940, 234},
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str941, 41},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str943, 36},
+#ifndef USE_UNICODE_AGE_PROPERTIES
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str802, 439},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str803, 7},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str811, 203},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str815, 244},
+#else /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str944, 244},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str945, 245},
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str946, 89},
+#ifndef USE_UNICODE_AGE_PROPERTIES
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+#else /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str947, 236},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str948, 237},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str949, 241},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str950, 242},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str951, 233},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str952, 246},
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str953, 471},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str954, 437},
+#ifndef USE_UNICODE_AGE_PROPERTIES
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str818, 41},
+#else /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str955, 243},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str956, 239},
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str957, 316},
+#ifndef USE_UNICODE_AGE_PROPERTIES
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str823, 111},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str824, 192},
+#else /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str958, 235},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str959, 247},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str960, 240},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str826, 173},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str827, 303},
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str962, 430},
+#ifndef USE_UNICODE_AGE_PROPERTIES
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+#else /* USE_UNICODE_AGE_PROPERTIES */
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str967, 238},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str830, 186},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str831, 206},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str832, 44},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str833, 146},
+#endif /* USE_UNICODE_AGE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str970, 157},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str835, 229},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str841, 11},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str850, 112},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str851, 400},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str852, 68},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str972, 18},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str854, 352},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str974, 470},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str975, 372},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str976, 260},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str860, 194},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str867, 190},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str982, 103},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str869, 184},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str870, 429},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str984, 424},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str985, 436},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str986, 248},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str995, 19},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str996, 321},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str998, 419},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str999, 51},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1000, 217},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str874, 368},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str879, 222},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str884, 50},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str889, 35},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str890, 200},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str900, 183},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str901, 51},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str907, 234},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str912, 69},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str913, 202},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str914, 71},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1004, 118},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1012, 177},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1013, 144},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1014, 190},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str917, 190},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1017, 475},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str919, 163},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str920, 59},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str923, 98},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str931, 133},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1019, 201},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1023, 225},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1027, 472},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1031, 496},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str933, 6},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1033, 190},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1034, 317},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1036, 280},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str936, 26},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1039, 376},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1040, 50},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1041, 212},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1046, 398},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str938, 284},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str939, 369},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1048, 337},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1049, 213},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1052, 137},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1055, 6},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1060, 121},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str943, 294},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1064, 44},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1065, 382},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1066, 119},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str945, 133},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str946, 319},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str947, 371},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1068, 335},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1069, 95},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1070, 136},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str949, 38},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str950, 418},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str951, 296},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str952, 254},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str953, 53},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1072, 135},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1073, 133},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1077, 193},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str956, 256},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1080, 42},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str960, 308},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1084, 12},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str962, 141},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str963, 97},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str964, 283},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str965, 121},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str966, 17},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1086, 95},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1089, 257},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str970, 83},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str972, 242},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str973, 37},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str974, 157},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str976, 173},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str977, 135},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1093, 179},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1094, 338},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1095, 304},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1101, 84},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1104, 60},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1107, 476},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1114, 17},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str981, 83},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1118, 197},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1121, 37},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str983, 189},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1123, 135},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1129, 179},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str988, 114},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str989, 130},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str990, 95},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1134, 287},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1136, 25},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str994, 277},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1140, 99},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1141, 180},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1149, 270},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str996, 387},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str997, 310},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str998, 119},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1151, 140},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1000, 84},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1153, 285},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1160, 420},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1003, 137},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1004, 290},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1006, 397},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1007, 95},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1163, 418},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1170, 206},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1174, 20},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1180, 181},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1181, 189},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1010, 285},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1184, 126},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1186, 98},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1187, 447},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1016, 135},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1021, 25},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1031, 305},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1193, 80},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1194, 172},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1195, 271},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1197, 167},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1035, 366},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1201, 103},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1202, 208},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1039, 16},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1206, 105},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1044, 207},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1051, 361},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1211, 192},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1212, 161},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1218, 102},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1221, 213},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1222, 40},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1065, 161},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1235, 34},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1238, 445},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1067, 126},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1240, 27},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1252, 417},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1069, 311},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1070, 137},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1254, 138},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1262, 320},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1265, 110},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1269, 98},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1072, 288},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1271, 110},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1272, 131},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1273, 491},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1277, 255},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1074, 27},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1279, 69},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1280, 334},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1281, 112},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1076, 80},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1283, 71},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1078, 345},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1285, 401},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1286, 222},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1287, 466},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1305, 68},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1081, 12},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1308, 121},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1312, 330},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1313, 194},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1314, 198},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1084, 348},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1317, 329},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1318, 26},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1087, 302},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1092, 99},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1321, 332},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1322, 222},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1094, 359},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1107, 167},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1324, 8},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1110, 201},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1114, 389},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1327, 291},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1334, 200},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1344, 315},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1353, 217},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1129, 293},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1359, 16},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1364, 44},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1133, 174},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1135, 106},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1142, 353},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1368, 390},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1147, 183},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1373, 479},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1150, 4},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1151, 112},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1156, 102},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1385, 487},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1387, 375},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1389, 147},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1393, 91},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1399, 267},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1400, 146},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1402, 147},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1403, 489},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1162, 140},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1409, 11},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1412, 4},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1170, 144},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1420, 68},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1421, 379},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1173, 121},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1424, 91},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1425, 218},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1429, 368},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1179, 72},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1435, 143},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1436, 143},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1438, 106},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1442, 282},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1185, 261},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1186, 136},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1448, 126},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1455, 97},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1188, 249},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1457, 167},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1463, 130},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1190, 107},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1195, 381},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1196, 331},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1465, 275},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1466, 169},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1467, 107},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1198, 313},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1202, 420},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1212, 409},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1215, 172},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1219, 406},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1224, 169},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1225, 373},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1229, 156},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1230, 367},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1231, 264},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1244, 407},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1245, 307},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1249, 175},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1469, 79},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1471, 422},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1477, 228},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1253, 187},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1481, 448},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1490, 102},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1491, 132},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1492, 296},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1256, 184},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1495, 433},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1259, 130},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1498, 180},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1261, 200},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1262, 205},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1500, 72},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1264, 326},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1265, 159},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1274, 44},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1279, 257},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1502, 49},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1282, 145},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1289, 126},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1298, 372},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1505, 96},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1513, 498},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1514, 186},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1300, 129},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1516, 402},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1302, 437},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1306, 89},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1307, 194},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1518, 405},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1310, 115},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1521, 396},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1522, 446},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1313, 360},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1525, 153},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1526, 262},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1527, 175},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1315, 110},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1318, 138},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1321, 110},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1529, 81},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1533, 159},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1534, 96},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1535, 153},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1536, 380},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1540, 112},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1323, 424},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1328, 144},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1542, 353},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1330, 193},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1544, 346},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1549, 56},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1550, 81},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1551, 210},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1334, 177},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1341, 417},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1343, 103},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1344, 433},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1350, 97},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1351, 388},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1354, 349},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1555, 358},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1356, 364},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1362, 40},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1372, 422},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1557, 407},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1558, 152},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1559, 385},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1377, 241},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1564, 495},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1389, 399},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1576, 389},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1577, 145},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1393, 195},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1581, 366},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1586, 29},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1587, 272},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1396, 138},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1398, 167},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1402, 30},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1590, 79},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1596, 212},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1404, 79},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1411, 274},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1598, 393},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1413, 199},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1416, 268},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1600, 119},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1422, 199},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1606, 292},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1424, 146},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1429, 147},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1608, 387},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1609, 69},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1431, 411},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1432, 175},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1611, 363},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1612, 224},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1616, 259},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1617, 77},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1618, 124},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1435, 231},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1436, 64},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1438, 350},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1621, 137},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1622, 254},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1626, 469},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1627, 367},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1628, 65},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1442, 147},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1443, 243},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1632, 319},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1636, 62},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1448, 84},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1450, 5},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1641, 138},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1645, 403},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1452, 336},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1656, 467},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1457, 142},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1661, 214},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1662, 274},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1460, 236},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1462, 275},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1463, 65},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1665, 313},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1468, 142},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1478, 380},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1479, 91},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1480, 56},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1670, 490},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1671, 133},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1492, 132},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1498, 63},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1504, 115},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1505, 118},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1506, 103},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1510, 91},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1512, 246},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1516, 267},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1517, 81},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1687, 157},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1519, 139},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1520, 139},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1689, 370},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1523, 318},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1692, 30},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1525, 165},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1694, 178},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1695, 5},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1696, 40},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1700, 230},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1530, 49},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1531, 339},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1705, 63},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1706, 435},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1712, 294},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1713, 158},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1714, 132},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1536, 440},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1540, 124},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1719, 122},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1722, 221},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1723, 223},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1546, 81},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1548, 198},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1561, 34},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1729, 220},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1732, 311},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1565, 378},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1566, 165},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1567, 140},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1569, 96},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1736, 381},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1742, 399},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1571, 228},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1578, 32},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1744, 165},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1581, 292},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1747, 77},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1583, 259},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1749, 458},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1750, 175},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1755, 158},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1757, 200},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1758, 176},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1590, 20},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1591, 132},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1595, 30},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1598, 96},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1765, 149},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1605, 71},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1606, 177},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1772, 347},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1609, 376},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1617, 77},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1775, 312},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1620, 90},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1778, 149},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1784, 164},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1785, 497},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1786, 165},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1792, 283},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1634, 270},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1635, 136},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1636, 48},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1643, 286},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1797, 230},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1802, 297},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1645, 265},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1804, 174},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1648, 266},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1649, 90},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1658, 233},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1662, 72},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1664, 31},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1670, 332},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1807, 87},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1676, 98},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1822, 300},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1824, 340},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1683, 324},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1688, 108},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1831, 268},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1692, 87},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1699, 327},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1701, 134},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1835, 83},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1836, 90},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1841, 269},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1703, 134},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1843, 46},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1846, 83},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1849, 478},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1852, 84},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1853, 310},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1709, 61},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1859, 71},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1724, 104},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1725, 8},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1729, 46},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1865, 90},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1866, 301},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1732, 100},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1737, 77},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1869, 142},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1871, 171},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1872, 122},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1874, 290},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1759, 322},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1878, 464},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1761, 79},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1880, 142},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1780, 375},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1787, 342},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1899, 318},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1904, 118},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1912, 409},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1790, 122},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1915, 293},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1916, 58},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1917, 70},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1919, 130},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1921, 359},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1932, 64},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1942, 460},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1943, 395},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1947, 192},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1953, 31},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1829, 291},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1956, 104},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1962, 134},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1831, 171},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1964, 404},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1967, 61},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1835, 363},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1853, 33},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1971, 115},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1858, 149},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1864, 207},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1976, 345},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1868, 164},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1871, 149},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1896, 122},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1980, 303},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1986, 214},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1994, 351},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1899, 193},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1900, 225},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1997, 108},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1998, 38},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1904, 108},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2002, 30},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2007, 482},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2008, 354},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1917, 104},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1925, 197},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2021, 203},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1932, 191},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2028, 452},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1944, 76},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2046, 139},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2047, 139},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2048, 32},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1949, 86},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1970, 86},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1983, 362},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2053, 45},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2061, 47},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2063, 400},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2071, 207},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2072, 48},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2073, 251},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2075, 134},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1988, 70},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2080, 100},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2005, 427},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2088, 181},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2022, 157},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2028, 329},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2096, 125},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2105, 427},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2033, 321},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2110, 191},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2113, 10},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2116, 176},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2123, 97},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2131, 86},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2046, 125},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2051, 343},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2053, 398},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2055, 164},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2142, 72},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2152, 86},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2153, 207},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2086, 309},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2087, 22},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2094, 166},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2102, 279},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2119, 271},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2189, 104},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2194, 29},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2123, 393},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2129, 40},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2130, 442},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2141, 180},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2198, 336},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2224, 22},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2162, 320},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2165, 316},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2227, 220},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2237, 33},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2178, 191},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2241, 216},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2242, 377},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2252, 164},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2189, 53},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2194, 415},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2273, 343},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2287, 189},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2290, 115},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2292, 182},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2311, 108},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2318, 146},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2326, 117},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2343, 348},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2382, 356},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2299, 58},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2406, 228},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2313, 47},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2322, 48},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2338, 29},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2417, 349},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2342, 45},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2349, 340},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2421, 392},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2431, 499},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2445, 216},
{-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2371, 181},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2372, 154},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2449, 166},
{-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2377, 441},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2379, 119},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2454, 391},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2457, 306},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2462, 369},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2400, 414},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2401, 197},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2413, 248},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2502, 500},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2429, 107},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2527, 15},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2534, 136},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2442, 328},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2562, 127},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2570, 453},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2571, 89},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2579, 62},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2588, 76},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2454, 10},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2591, 85},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2595, 53},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2613, 127},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2617, 365},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2631, 154},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2634, 196},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2643, 231},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2495, 351},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2515, 62},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2523, 334},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2685, 177},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2689, 463},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2542, 29},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2549, 127},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2709, 117},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2722, 378},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2732, 434},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2734, 361},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2588, 127},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2787, 161},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2795, 204},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2627, 15},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2651, 338},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2671, 330},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2710, 301},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2724, 62},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2889, 355},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2898, 204},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2902, 493},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2906, 48},
{-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2727, 208},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2737, 181},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2909, 362},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2918, 364},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2753, 117},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2785, 38},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2984, 107},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
@@ -28506,28 +32471,20 @@ uniname2ctype_p (str, len)
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2888, 161},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2925, 145},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2940, 337},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3112, 145},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2961, 335},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2962, 435},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3137, 178},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2995, 89},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3000, 85},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
@@ -28539,10 +32496,10 @@ uniname2ctype_p (str, len)
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3104, 76},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3278, 494},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
@@ -28550,27 +32507,39 @@ uniname2ctype_p (str, len)
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3189, 73},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3197, 117},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3360, 357},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3254, 166},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3292, 2},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+#endif /* USE_UNICODE_PROPERTIES */
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+#ifndef USE_UNICODE_PROPERTIES
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str6, 12},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str7, 7},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str8, 8},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str9, 1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str10, 13},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str11, 11},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str12, 10},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str13, 14},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str14, 3},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str15, 9},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str16, 6},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str17, 5},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str18, 4},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str19, 2}
+#else /* USE_UNICODE_PROPERTIES */
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3466, 182},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
@@ -28578,8 +32547,6 @@ uniname2ctype_p (str, len)
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3391, 436},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
@@ -28587,12 +32554,8 @@ uniname2ctype_p (str, len)
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1}, {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3459, 73},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3480, 154},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
@@ -28611,62 +32574,56 @@ uniname2ctype_p (str, len)
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3777, 74},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3778, 154},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3827, 492},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3886, 166},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
-#endif /* USE_UNICODE_PROPERTIES */
- {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
-#ifndef USE_UNICODE_PROPERTIES
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str6, 12},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str7, 7},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str8, 8},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str9, 1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str10, 13},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str11, 11},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str12, 10},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str13, 14},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str14, 3},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str15, 9},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str16, 6},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str17, 5},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str18, 4},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str19, 2}
-#else /* USE_UNICODE_PROPERTIES */
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3802, 434},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3941, 2},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3995, 328},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str4025, 76},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str4035, 85},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
- {-1}, {-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3922, 74},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
+ {-1}, {-1}, {-1}, {-1}, {-1},
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str4122, 73},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
@@ -28690,7 +32647,7 @@ uniname2ctype_p (str, len)
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},
{-1},
- {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str4167, 85}
+ {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str4322, 73}
#endif /* USE_UNICODE_PROPERTIES */
};
diff --git a/enc/us_ascii.c b/enc/us_ascii.c
index 1b47778391..18d0685040 100644
--- a/enc/us_ascii.c
+++ b/enc/us_ascii.c
@@ -3,9 +3,9 @@
static int
us_ascii_mbc_enc_len(const UChar* p, const UChar* e, OnigEncoding enc)
{
- if (*p & 0x80)
- return ONIGENC_CONSTRUCT_MBCLEN_INVALID();
- return ONIGENC_CONSTRUCT_MBCLEN_CHARFOUND(1);
+ if (*p & 0x80)
+ return ONIGENC_CONSTRUCT_MBCLEN_INVALID();
+ return ONIGENC_CONSTRUCT_MBCLEN_CHARFOUND(1);
}
OnigEncodingDefine(us_ascii, US_ASCII) = {
diff --git a/enc/utf_16be.c b/enc/utf_16be.c
index 3af8359caf..a61ae00863 100644
--- a/enc/utf_16be.c
+++ b/enc/utf_16be.c
@@ -29,10 +29,6 @@
#include "regenc.h"
-#define UTF16_IS_SURROGATE_FIRST(c) (((c) & 0xfc) == 0xd8)
-#define UTF16_IS_SURROGATE_SECOND(c) (((c) & 0xfc) == 0xdc)
-#define UTF16_IS_SURROGATE(c) (((c) & 0xf8) == 0xd8)
-
#if 0
static const int EncLen_UTF16[] = {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
diff --git a/enc/utf_16le.c b/enc/utf_16le.c
index 453c771cc5..7d176e710e 100644
--- a/enc/utf_16le.c
+++ b/enc/utf_16le.c
@@ -29,10 +29,6 @@
#include "regenc.h"
-#define UTF16_IS_SURROGATE_FIRST(c) (((c) & 0xfc) == 0xd8)
-#define UTF16_IS_SURROGATE_SECOND(c) (((c) & 0xfc) == 0xdc)
-#define UTF16_IS_SURROGATE(c) (((c) & 0xf8) == 0xd8)
-
#if 0
static const int EncLen_UTF16[] = {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
diff --git a/enc/utf_8.c b/enc/utf_8.c
index dae1f3a1bc..b8f38e9d58 100644
--- a/enc/utf_8.c
+++ b/enc/utf_8.c
@@ -367,7 +367,7 @@ code_to_mbc(OnigCodePoint code, UChar *buf, OnigEncoding enc ARG_UNUSED)
static int
mbc_case_fold(OnigCaseFoldType flag, const UChar** pp,
- const UChar* end, UChar* fold, OnigEncoding enc)
+ const UChar* end, UChar* fold, OnigEncoding enc)
{
const UChar* p = *pp;
@@ -395,7 +395,7 @@ mbc_case_fold(OnigCaseFoldType flag, const UChar** pp,
static int
get_ctype_code_range(OnigCtype ctype, OnigCodePoint *sb_out,
- const OnigCodePoint* ranges[], OnigEncoding enc ARG_UNUSED)
+ const OnigCodePoint* ranges[], OnigEncoding enc ARG_UNUSED)
{
*sb_out = 0x80;
return onigenc_unicode_ctype_code_range(ctype, ranges);
diff --git a/enc/windows_1251.c b/enc/windows_1251.c
index 73060962c3..191d631b88 100644
--- a/enc/windows_1251.c
+++ b/enc/windows_1251.c
@@ -167,7 +167,7 @@ cp1251_apply_all_case_fold(OnigCaseFoldType flag,
OnigApplyAllCaseFoldFunc f, void* arg, OnigEncoding enc ARG_UNUSED)
{
return onigenc_apply_all_case_fold_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, f, arg);
}
@@ -176,7 +176,7 @@ cp1251_get_case_fold_codes_by_str(OnigCaseFoldType flag,
const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[], OnigEncoding enc ARG_UNUSED)
{
return onigenc_get_case_fold_codes_by_str_with_map(
- sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,
+ numberof(CaseFoldMap), CaseFoldMap, 0,
flag, p, end, items);
}
diff --git a/encoding.c b/encoding.c
index 9ade26d291..e3a0978253 100644
--- a/encoding.c
+++ b/encoding.c
@@ -20,6 +20,8 @@
#undef rb_utf8_encindex
#undef rb_usascii_encindex
+typedef OnigEncodingType rb_raw_encoding;
+
#if defined __GNUC__ && __GNUC__ >= 4
#pragma GCC visibility push(default)
int rb_enc_register(const char *name, rb_encoding *encoding);
@@ -50,6 +52,13 @@ static struct {
st_table *names;
} enc_table;
+#define ENC_DUMMY_FLAG (1<<24)
+#define ENC_INDEX_MASK (~(~0U<<24))
+
+#define ENC_TO_ENCINDEX(enc) (int)((enc)->ruby_encoding_index & ENC_INDEX_MASK)
+#define ENC_DUMMY_P(enc) ((enc)->ruby_encoding_index & ENC_DUMMY_FLAG)
+#define ENC_SET_DUMMY(enc) ((enc)->ruby_encoding_index |= ENC_DUMMY_FLAG)
+
void rb_enc_init(void);
#define ENCODING_COUNT ENCINDEX_BUILTIN_MAX
@@ -80,7 +89,7 @@ static const rb_data_type_t encoding_data_type = {
static VALUE
enc_new(rb_encoding *encoding)
{
- return TypedData_Wrap_Struct(rb_cEncoding, &encoding_data_type, encoding);
+ return TypedData_Wrap_Struct(rb_cEncoding, &encoding_data_type, (void *)encoding);
}
static VALUE
@@ -107,6 +116,18 @@ rb_enc_from_encoding(rb_encoding *encoding)
return rb_enc_from_encoding_index(idx);
}
+int
+rb_enc_to_index(rb_encoding *enc)
+{
+ return enc ? ENC_TO_ENCINDEX(enc) : 0;
+}
+
+int
+rb_enc_dummy_p(rb_encoding *enc)
+{
+ return ENC_DUMMY_P(enc) != 0;
+}
+
static int enc_autoload(rb_encoding *);
static int
@@ -254,9 +275,10 @@ enc_table_expand(int newsize)
}
static int
-enc_register_at(int index, const char *name, rb_encoding *encoding)
+enc_register_at(int index, const char *name, rb_encoding *base_encoding)
{
struct rb_encoding_entry *ent = &enc_table.list[index];
+ rb_raw_encoding *encoding;
VALUE list;
if (!valid_encoding_name_p(name)) return -1;
@@ -266,18 +288,19 @@ enc_register_at(int index, const char *name, rb_encoding *encoding)
else if (STRCASECMP(name, ent->name)) {
return -1;
}
- if (!ent->enc) {
- ent->enc = xmalloc(sizeof(rb_encoding));
+ encoding = (rb_raw_encoding *)ent->enc;
+ if (!encoding) {
+ encoding = xmalloc(sizeof(rb_encoding));
}
- if (encoding) {
- *ent->enc = *encoding;
+ if (base_encoding) {
+ *encoding = *base_encoding;
}
else {
- memset(ent->enc, 0, sizeof(*ent->enc));
+ memset(encoding, 0, sizeof(*ent->enc));
}
- encoding = ent->enc;
encoding->name = name;
encoding->ruby_encoding_index = index;
+ ent->enc = encoding;
st_insert(enc_table.names, (st_data_t)name, (st_data_t)index);
list = rb_encoding_list;
if (list && NIL_P(rb_ary_entry(list, index))) {
@@ -348,7 +371,7 @@ set_base_encoding(int index, rb_encoding *base)
rb_encoding *enc = enc_table.list[index].enc;
enc_table.list[index].base = base;
- if (rb_enc_dummy_p(base)) ENC_SET_DUMMY(enc);
+ if (ENC_DUMMY_P(base)) ENC_SET_DUMMY((rb_raw_encoding *)enc);
return enc;
}
@@ -372,7 +395,7 @@ rb_enc_set_dummy(int index)
{
rb_encoding *enc = enc_table.list[index].enc;
- ENC_SET_DUMMY(enc);
+ ENC_SET_DUMMY((rb_raw_encoding *)enc);
return index;
}
@@ -439,7 +462,7 @@ rb_define_dummy_encoding(const char *name)
int index = rb_enc_replicate(name, rb_ascii8bit_encoding());
rb_encoding *enc = enc_table.list[index].enc;
- ENC_SET_DUMMY(enc);
+ ENC_SET_DUMMY((rb_raw_encoding *)enc);
return index;
}
@@ -450,7 +473,7 @@ rb_encdb_dummy(const char *name)
rb_enc_registered(name));
rb_encoding *enc = enc_table.list[index].enc;
- ENC_SET_DUMMY(enc);
+ ENC_SET_DUMMY((rb_raw_encoding *)enc);
return index;
}
@@ -553,7 +576,7 @@ rb_encdb_alias(const char *alias, const char *orig)
void
rb_encdb_set_unicode(int index)
{
- rb_enc_from_index(index)->flags |= ONIGENC_FLAG_UNICODE;
+ ((rb_raw_encoding *)rb_enc_from_index(index))->flags |= ONIGENC_FLAG_UNICODE;
}
extern rb_encoding OnigEncodingUTF_8;
@@ -671,7 +694,7 @@ enc_autoload(rb_encoding *enc)
}
i = enc->ruby_encoding_index;
enc_register_at(i & ENC_INDEX_MASK, rb_enc_name(enc), base);
- enc->ruby_encoding_index = i;
+ ((rb_raw_encoding *)enc)->ruby_encoding_index = i;
}
else {
i = load_encoding(rb_enc_name(enc));
@@ -720,6 +743,7 @@ enc_capable(VALUE obj)
case T_STRING:
case T_REGEXP:
case T_FILE:
+ case T_SYMBOL:
return TRUE;
case T_DATA:
if (is_data_encoding(obj)) return TRUE;
@@ -743,7 +767,7 @@ rb_enc_get_index(VALUE obj)
if (SPECIAL_CONST_P(obj)) {
if (!SYMBOL_P(obj)) return -1;
- obj = rb_id2str(SYM2ID(obj));
+ obj = rb_sym2str(obj);
}
switch (BUILTIN_TYPE(obj)) {
as_default:
@@ -1467,7 +1491,6 @@ rb_enc_default_internal(void)
* * Time#zone
* * Values from ENV
* * Values in ARGV including $PROGRAM_NAME
- * * __FILE__
*
* Additionally String#encode and String#encode! use the default internal
* encoding if no encoding is given.
diff --git a/enum.c b/enum.c
index 9d1d36d0dd..7920b93c55 100644
--- a/enum.c
+++ b/enum.c
@@ -1105,6 +1105,190 @@ DEFINE_ENUMFUNCS(one)
return Qnil;
}
+struct nmin_data {
+ long n;
+ long bufmax;
+ long curlen;
+ VALUE buf;
+ int (*cmpfunc)(const void *, const void *, void *);
+ int rev; /* max if 1 */
+ int by; /* min_by if 1 */
+ const char *method;
+};
+
+static int
+nmin_cmp(const void *ap, const void *bp, void *_data)
+{
+ struct nmin_data *data = (struct nmin_data *)_data;
+ VALUE a = *(const VALUE *)ap, b = *(const VALUE *)bp;
+ VALUE cmp = rb_funcall(a, id_cmp, 1, b);
+ if (RBASIC(data->buf)->klass) {
+ rb_raise(rb_eRuntimeError, "%s reentered", data->method);
+ }
+ return rb_cmpint(cmp, a, b);
+}
+
+static int
+nmin_block_cmp(const void *ap, const void *bp, void *_data)
+{
+ struct nmin_data *data = (struct nmin_data *)_data;
+ VALUE a = *(const VALUE *)ap, b = *(const VALUE *)bp;
+ VALUE cmp = rb_yield_values(2, a, b);
+ if (RBASIC(data->buf)->klass) {
+ rb_raise(rb_eRuntimeError, "%s reentered", data->method);
+ }
+ return rb_cmpint(cmp, a, b);
+}
+
+
+static void
+nmin_filter(struct nmin_data *data)
+{
+ long n;
+ VALUE *beg;
+ int eltsize;
+ long numelts;
+
+ long left, right;
+
+ long i, j;
+
+ if (data->curlen <= data->n)
+ return;
+
+ n = data->n;
+ beg = RARRAY_PTR(data->buf);
+ eltsize = data->by ? 2 : 1;
+ numelts = data->curlen;
+
+ left = 0;
+ right = numelts-1;
+
+#define GETPTR(i) (beg+(i)*eltsize)
+
+#define SWAP(i, j) do { \
+ VALUE tmp[2]; \
+ memcpy(tmp, GETPTR(i), sizeof(VALUE)*eltsize); \
+ memcpy(GETPTR(i), GETPTR(j), sizeof(VALUE)*eltsize); \
+ memcpy(GETPTR(j), tmp, sizeof(VALUE)*eltsize); \
+} while (0)
+
+ while (1) {
+ long pivot_index = left + (right-left)/2;
+ long store_index;
+ long num_pivots = 1;
+
+ SWAP(pivot_index, right);
+ pivot_index = right;
+
+ store_index = left;
+ i = left;
+ while (i <= right-num_pivots) {
+ int c = data->cmpfunc(GETPTR(i), GETPTR(pivot_index), data);
+ if (data->rev)
+ c = -c;
+ if (c == 0) {
+ SWAP(i, right-num_pivots);
+ num_pivots++;
+ continue;
+ }
+ if (c < 0) {
+ SWAP(i, store_index);
+ store_index++;
+ }
+ i++;
+ }
+ j = store_index;
+ for (i = right; right-num_pivots < i; i--) {
+ if (i <= j)
+ break;
+ SWAP(j, i);
+ j++;
+ }
+
+ if (store_index <= n && n <= store_index+num_pivots)
+ break;
+
+ if (n < store_index) {
+ right = store_index-1;
+ }
+ else {
+ left = store_index+num_pivots;
+ }
+ }
+#undef GETPTR
+#undef SWAP
+
+ data->curlen = data->n;
+ rb_ary_resize(data->buf, data->n * eltsize);
+}
+
+static VALUE
+nmin_i(VALUE i, VALUE *_data, int argc, VALUE *argv)
+{
+ struct nmin_data *data = (struct nmin_data *)_data;
+
+ ENUM_WANT_SVALUE();
+
+ if (data->by)
+ rb_ary_push(data->buf, rb_yield(i));
+ rb_ary_push(data->buf, i);
+
+ data->curlen++;
+
+ if (data->curlen == data->bufmax) {
+ nmin_filter(data);
+ }
+
+ return Qnil;
+}
+
+static VALUE
+nmin_run(VALUE obj, VALUE num, int by, int rev)
+{
+ VALUE result;
+ struct nmin_data data;
+
+ data.n = NUM2LONG(num);
+ if (data.n < 0)
+ rb_raise(rb_eArgError, "negative size (%ld)", data.n);
+ if (data.n == 0)
+ return rb_ary_new2(0);
+ if (LONG_MAX/4/(by ? 2 : 1) < data.n)
+ rb_raise(rb_eArgError, "too big size");
+ data.bufmax = data.n * 4;
+ data.curlen = 0;
+ data.buf = rb_ary_tmp_new(data.bufmax * (by ? 2 : 1));
+ data.cmpfunc = by ? nmin_cmp :
+ rb_block_given_p() ? nmin_block_cmp :
+ nmin_cmp;
+ data.rev = rev;
+ data.by = by;
+ data.method = rev ? (by ? "max_by" : "max")
+ : (by ? "min_by" : "min");
+ rb_block_call(obj, id_each, 0, 0, nmin_i, (VALUE)&data);
+ nmin_filter(&data);
+ result = data.buf;
+ if (by) {
+ long i;
+ ruby_qsort(RARRAY_PTR(result),
+ RARRAY_LEN(result)/2,
+ sizeof(VALUE)*2,
+ data.cmpfunc, (void *)&data);
+ for (i=1; i<RARRAY_LEN(result); i+=2) {
+ RARRAY_PTR(result)[i/2] = RARRAY_PTR(result)[i];
+ }
+ rb_ary_resize(result, RARRAY_LEN(result)/2);
+ }
+ else {
+ ruby_qsort(RARRAY_PTR(result), RARRAY_LEN(result), sizeof(VALUE),
+ data.cmpfunc, (void *)&data);
+ }
+ *((VALUE *)&RBASIC(result)->klass) = rb_cArray;
+ return result;
+
+}
+
/*
* call-seq:
* enum.one? [{ |obj| block }] -> true or false
@@ -1122,7 +1306,6 @@ DEFINE_ENUMFUNCS(one)
* [ nil, true, false ].one? #=> true
*
*/
-
static VALUE
enum_one(VALUE obj)
{
@@ -1210,8 +1393,10 @@ min_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
/*
* call-seq:
- * enum.min -> obj
- * enum.min { |a, b| block } -> obj
+ * enum.min -> obj
+ * enum.min {| a,b | block } -> obj
+ * enum.min(n) -> array
+ * enum.min(n) {| a,b | block } -> array
*
* Returns the object in <i>enum</i> with the minimum value. The
* first form assumes all objects implement <code>Comparable</code>;
@@ -1220,13 +1405,26 @@ min_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
* a = %w(albatross dog horse)
* a.min #=> "albatross"
* a.min { |a, b| a.length <=> b.length } #=> "dog"
+ *
+ * If the +n+ argument is given, minimum +n+ elements are returned
+ * as an array.
+ *
+ * a = %w[albatross dog horse]
+ * a.min(2) #=> ["albatross", "dog"]
+ * a.min(2) {|a, b| a.length <=> b.length } #=> ["dog", "horse"]
*/
static VALUE
-enum_min(VALUE obj)
+enum_min(int argc, VALUE *argv, VALUE obj)
{
NODE *memo = NEW_MEMO(Qundef, 0, 0);
VALUE result;
+ VALUE num;
+
+ rb_scan_args(argc, argv, "01", &num);
+
+ if (!NIL_P(num))
+ return nmin_run(obj, num, 0, 0);
if (rb_block_given_p()) {
rb_block_call(obj, id_each, 0, 0, min_ii, (VALUE)memo);
@@ -1281,8 +1479,10 @@ max_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
/*
* call-seq:
- * enum.max -> obj
- * enum.max { |a, b| block } -> obj
+ * enum.max -> obj
+ * enum.max { |a, b| block } -> obj
+ * enum.max(n) -> obj
+ * enum.max(n) {|a,b| block } -> obj
*
* Returns the object in _enum_ with the maximum value. The
* first form assumes all objects implement <code>Comparable</code>;
@@ -1291,13 +1491,26 @@ max_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
* a = %w(albatross dog horse)
* a.max #=> "horse"
* a.max { |a, b| a.length <=> b.length } #=> "albatross"
+ *
+ * If the +n+ argument is given, maximum +n+ elements are returned
+ * as an array.
+ *
+ * a = %w[albatross dog horse]
+ * a.max(2) #=> ["dog", "horse"]
+ * a.max(2) {|a, b| a.length <=> b.length } #=> ["horse", "albatross"]
*/
static VALUE
-enum_max(VALUE obj)
+enum_max(int argc, VALUE *argv, VALUE obj)
{
NODE *memo = NEW_MEMO(Qundef, 0, 0);
VALUE result;
+ VALUE num;
+
+ rb_scan_args(argc, argv, "01", &num);
+
+ if (!NIL_P(num))
+ return nmin_run(obj, num, 0, 1);
if (rb_block_given_p()) {
rb_block_call(obj, id_each, 0, 0, max_ii, (VALUE)memo);
@@ -1485,8 +1698,10 @@ min_by_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
/*
* call-seq:
- * enum.min_by { |obj| block } -> obj
- * enum.min_by -> an_enumerator
+ * enum.min_by {|obj| block } -> obj
+ * enum.min_by -> an_enumerator
+ * enum.min_by(n) {|obj| block } -> array
+ * enum.min_by(n) -> an_enumerator
*
* Returns the object in <i>enum</i> that gives the minimum
* value from the given block.
@@ -1495,14 +1710,26 @@ min_by_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
*
* a = %w(albatross dog horse)
* a.min_by { |x| x.length } #=> "dog"
+ *
+ * If the +n+ argument is given, minimum +n+ elements are returned
+ * as an array.
+ *
+ * a = %w[albatross dog horse]
+ * p a.min_by(2) {|x| x.length } #=> ["dog", "horse"]
*/
static VALUE
-enum_min_by(VALUE obj)
+enum_min_by(int argc, VALUE *argv, VALUE obj)
{
NODE *memo;
+ VALUE num;
- RETURN_SIZED_ENUMERATOR(obj, 0, 0, enum_size);
+ rb_scan_args(argc, argv, "01", &num);
+
+ RETURN_SIZED_ENUMERATOR(obj, argc, argv, enum_size);
+
+ if (!NIL_P(num))
+ return nmin_run(obj, num, 1, 0);
memo = NEW_MEMO(Qundef, Qnil, 0);
rb_block_call(obj, id_each, 0, 0, min_by_i, (VALUE)memo);
@@ -1531,8 +1758,10 @@ max_by_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
/*
* call-seq:
- * enum.max_by { |obj| block } -> obj
- * enum.max_by -> an_enumerator
+ * enum.max_by {|obj| block } -> obj
+ * enum.max_by -> an_enumerator
+ * enum.max_by(n) {|obj| block } -> obj
+ * enum.max_by(n) -> an_enumerator
*
* Returns the object in <i>enum</i> that gives the maximum
* value from the given block.
@@ -1541,14 +1770,71 @@ max_by_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
*
* a = %w(albatross dog horse)
* a.max_by { |x| x.length } #=> "albatross"
+ *
+ * If the +n+ argument is given, minimum +n+ elements are returned
+ * as an array.
+ *
+ * a = %w[albatross dog horse]
+ * a.max_by(2) {|x| x.length } #=> ["horse", "albatross"]
+ *
+ * enum.max_by(n) can be used to implement weighted random sampling.
+ * Following example implements and use Enumerable#wsample.
+ *
+ * module Enumerable
+ * # weighted random sampling.
+ * #
+ * # Pavlos S. Efraimidis, Paul G. Spirakis
+ * # Weighted random sampling with a reservoir
+ * # Information Processing Letters
+ * # Volume 97, Issue 5 (16 March 2006)
+ * def wsample(n)
+ * self.max_by(n) {|v| rand ** (1.0/yield(v)) }
+ * end
+ * end
+ * e = (-20..20).to_a*10000
+ * a = e.wsample(20000) {|x|
+ * Math.exp(-(x/5.0)**2) # normal distribution
+ * }
+ * # a is 20000 samples from e.
+ * p a.length #=> 20000
+ * h = a.group_by {|x| x }
+ * -10.upto(10) {|x| puts "*" * (h[x].length/30.0).to_i if h[x] }
+ * #=> *
+ * # ***
+ * # ******
+ * # ***********
+ * # ******************
+ * # *****************************
+ * # *****************************************
+ * # ****************************************************
+ * # ***************************************************************
+ * # ********************************************************************
+ * # ***********************************************************************
+ * # ***********************************************************************
+ * # **************************************************************
+ * # ****************************************************
+ * # ***************************************
+ * # ***************************
+ * # ******************
+ * # ***********
+ * # *******
+ * # ***
+ * # *
+ *
*/
static VALUE
-enum_max_by(VALUE obj)
+enum_max_by(int argc, VALUE *argv, VALUE obj)
{
NODE *memo;
+ VALUE num;
- RETURN_SIZED_ENUMERATOR(obj, 0, 0, enum_size);
+ rb_scan_args(argc, argv, "01", &num);
+
+ RETURN_SIZED_ENUMERATOR(obj, argc, argv, enum_size);
+
+ if (!NIL_P(num))
+ return nmin_run(obj, num, 1, 1);
memo = NEW_MEMO(Qundef, Qnil, 0);
rb_block_call(obj, id_each, 0, 0, max_by_i, (VALUE)memo);
@@ -1816,6 +2102,9 @@ enum_each_entry(int argc, VALUE *argv, VALUE obj)
return obj;
}
+#define dont_recycle_block_arg(arity) ((arity) == 1 || (arity) < 0)
+#define nd_no_recycle u2.value
+
static VALUE
each_slice_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, m))
{
@@ -1829,7 +2118,13 @@ each_slice_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, m))
if (RARRAY_LEN(ary) == size) {
v = rb_yield(ary);
- memo->u1.value = rb_ary_new2(size);
+
+ if (memo->nd_no_recycle) {
+ memo->u1.value = rb_ary_new2(size);
+ }
+ else {
+ rb_ary_clear(ary);
+ }
}
return v;
@@ -1871,11 +2166,13 @@ enum_each_slice(VALUE obj, VALUE n)
long size = NUM2LONG(n);
VALUE ary;
NODE *memo;
+ int arity;
if (size <= 0) rb_raise(rb_eArgError, "invalid slice size");
RETURN_SIZED_ENUMERATOR(obj, 1, &n, enum_each_slice_size);
ary = rb_ary_new2(size);
- memo = NEW_MEMO(ary, 0, size);
+ arity = rb_block_arity();
+ memo = NEW_MEMO(ary, dont_recycle_block_arg(arity), size);
rb_block_call(obj, id_each, 0, 0, each_slice_i, (VALUE)memo);
ary = memo->u1.value;
if (RARRAY_LEN(ary) > 0) rb_yield(ary);
@@ -1897,7 +2194,10 @@ each_cons_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
}
rb_ary_push(ary, i);
if (RARRAY_LEN(ary) == size) {
- v = rb_yield(rb_ary_dup(ary));
+ if (memo->nd_no_recycle) {
+ ary = rb_ary_dup(ary);
+ }
+ v = rb_yield(ary);
}
return v;
}
@@ -1942,10 +2242,12 @@ enum_each_cons(VALUE obj, VALUE n)
{
long size = NUM2LONG(n);
NODE *memo;
+ int arity;
if (size <= 0) rb_raise(rb_eArgError, "invalid size");
RETURN_SIZED_ENUMERATOR(obj, 1, &n, enum_each_cons_size);
- memo = NEW_MEMO(rb_ary_new2(size), 0, size);
+ arity = rb_block_arity();
+ memo = NEW_MEMO(rb_ary_new2(size), dont_recycle_block_arg(arity), size);
rb_block_call(obj, id_each, 0, 0, each_cons_i, (VALUE)memo);
return Qnil;
@@ -2078,6 +2380,7 @@ zip_i(RB_BLOCK_CALL_FUNC_ARGLIST(val, memoval))
* a = [ 4, 5, 6 ]
* b = [ 7, 8, 9 ]
*
+ * a.zip(b) #=> [[4, 7], [5, 8], [6, 9]]
* [1, 2, 3].zip(a, b) #=> [[1, 4, 7], [2, 5, 8], [3, 6, 9]]
* [1, 2].zip(a, b) #=> [[1, 4, 7], [2, 5, 8]]
* a.zip([1, 2], [8]) #=> [[4, 1, 8], [5, 2, nil], [6, nil, nil]]
@@ -2140,6 +2443,7 @@ take_i(RB_BLOCK_CALL_FUNC_ARGLIST(i, args))
*
* a = [1, 2, 3, 4, 5, 0]
* a.take(3) #=> [1, 2, 3]
+ * a.take(30) #=> [1, 2, 3, 4, 5, 0]
*
*/
@@ -2374,7 +2678,7 @@ static VALUE
chunk_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, _argp))
{
struct chunk_arg *argp = MEMO_FOR(struct chunk_arg, _argp);
- VALUE v;
+ VALUE v, s;
VALUE alone = ID2SYM(rb_intern("_alone"));
VALUE separator = ID2SYM(rb_intern("_separator"));
@@ -2398,7 +2702,7 @@ chunk_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, _argp))
argp->prev_value = argp->prev_elts = Qnil;
}
}
- else if (SYMBOL_P(v) && rb_id2name(SYM2ID(v))[0] == '_') {
+ else if (SYMBOL_P(v) && (s = rb_sym2str(v), RSTRING_PTR(s)[0] == '_')) {
rb_raise(rb_eRuntimeError, "symbols beginning with an underscore are reserved");
}
else {
@@ -2778,6 +3082,130 @@ enum_slice_before(int argc, VALUE *argv, VALUE enumerable)
return enumerator;
}
+
+struct sliceafter_arg {
+ VALUE pat;
+ VALUE pred;
+ VALUE prev_elts;
+ VALUE yielder;
+};
+
+static VALUE
+sliceafter_ii(RB_BLOCK_CALL_FUNC_ARGLIST(i, _memo))
+{
+#define UPDATE_MEMO ((void)(memo = MEMO_FOR(struct sliceafter_arg, _memo)))
+ struct sliceafter_arg *memo;
+ int split_p;
+ UPDATE_MEMO;
+
+ ENUM_WANT_SVALUE();
+
+ if (NIL_P(memo->prev_elts)) {
+ memo->prev_elts = rb_ary_new3(1, i);
+ }
+ else {
+ rb_ary_push(memo->prev_elts, i);
+ }
+
+ if (NIL_P(memo->pred)) {
+ split_p = RTEST(rb_funcall(memo->pat, id_eqq, 1, i));
+ UPDATE_MEMO;
+ }
+ else {
+ split_p = RTEST(rb_funcall(memo->pred, id_call, 1, i));
+ UPDATE_MEMO;
+ }
+
+ if (split_p) {
+ rb_funcall(memo->yielder, id_lshift, 1, memo->prev_elts);
+ UPDATE_MEMO;
+ memo->prev_elts = Qnil;
+ }
+
+ return Qnil;
+#undef UPDATE_MEMO
+}
+
+static VALUE
+sliceafter_i(RB_BLOCK_CALL_FUNC_ARGLIST(yielder, enumerator))
+{
+ VALUE enumerable;
+ VALUE arg;
+ struct sliceafter_arg *memo = NEW_MEMO_FOR(struct sliceafter_arg, arg);
+
+ enumerable = rb_ivar_get(enumerator, rb_intern("sliceafter_enum"));
+ memo->pat = rb_ivar_get(enumerator, rb_intern("sliceafter_pat"));
+ memo->pred = rb_attr_get(enumerator, rb_intern("sliceafter_pred"));
+ memo->prev_elts = Qnil;
+ memo->yielder = yielder;
+
+ rb_block_call(enumerable, id_each, 0, 0, sliceafter_ii, arg);
+ memo = MEMO_FOR(struct sliceafter_arg, arg);
+ if (!NIL_P(memo->prev_elts))
+ rb_funcall(memo->yielder, id_lshift, 1, memo->prev_elts);
+ return Qnil;
+}
+
+/*
+ * call-seq:
+ * enum.slice_after(pattern) -> an_enumerator
+ * enum.slice_after { |elt| bool } -> an_enumerator
+ *
+ * Creates an enumerator for each chunked elements.
+ * The ends of chunks are defined by _pattern_ and the block.
+ *
+ * If <code>_pattern_ === _elt_</code> returns <code>true</code> or the block
+ * returns <code>true</code> for the element, the element is end of a
+ * chunk.
+ *
+ * The <code>===</code> and _block_ is called from the first element to the last
+ * element of _enum_.
+ *
+ * The result enumerator yields the chunked elements as an array.
+ * So +each+ method can be called as follows:
+ *
+ * enum.slice_after(pattern).each { |ary| ... }
+ * enum.slice_after { |elt| bool }.each { |ary| ... }
+ *
+ * Other methods of the Enumerator class and Enumerable module,
+ * such as +map+, etc., are also usable.
+ *
+ * For example, continuation lines (lines end with backslash) can be
+ * concatenated as follows:
+ *
+ * lines = ["foo\n", "bar\\\n", "baz\n", "\n", "qux\n"]
+ * e = lines.slice_after(/(?<!\\)\n\z/)
+ * p e.to_a
+ * #=> [["foo\n"], ["bar\\\n", "baz\n"], ["\n"], ["qux\n"]]
+ * p e.map {|ll| ll[0...-1].map {|l| l.sub(/\\\n\z/, "") }.join + ll.last }
+ * #=>["foo\n", "barbaz\n", "\n", "qux\n"]
+ *
+ */
+
+static VALUE
+enum_slice_after(int argc, VALUE *argv, VALUE enumerable)
+{
+ VALUE enumerator;
+ VALUE pat = Qnil, pred = Qnil;
+
+ if (rb_block_given_p()) {
+ if (0 < argc)
+ rb_raise(rb_eArgError, "both pattan and block are given");
+ pred = rb_block_proc();
+ }
+ else {
+ rb_scan_args(argc, argv, "1", &pat);
+ }
+
+ enumerator = rb_obj_alloc(rb_cEnumerator);
+ rb_ivar_set(enumerator, rb_intern("sliceafter_enum"), enumerable);
+ rb_ivar_set(enumerator, rb_intern("sliceafter_pat"), pat);
+ rb_ivar_set(enumerator, rb_intern("sliceafter_pred"), pred);
+
+ rb_block_call(enumerator, idInitialize, 0, 0, sliceafter_i, enumerator);
+ return enumerator;
+}
+
/*
* The <code>Enumerable</code> mixin provides collection classes with
* several traversal and searching methods, and with the ability to
@@ -2824,11 +3252,11 @@ Init_Enumerable(void)
rb_define_method(rb_mEnumerable, "any?", enum_any, 0);
rb_define_method(rb_mEnumerable, "one?", enum_one, 0);
rb_define_method(rb_mEnumerable, "none?", enum_none, 0);
- rb_define_method(rb_mEnumerable, "min", enum_min, 0);
- rb_define_method(rb_mEnumerable, "max", enum_max, 0);
+ rb_define_method(rb_mEnumerable, "min", enum_min, -1);
+ rb_define_method(rb_mEnumerable, "max", enum_max, -1);
rb_define_method(rb_mEnumerable, "minmax", enum_minmax, 0);
- rb_define_method(rb_mEnumerable, "min_by", enum_min_by, 0);
- rb_define_method(rb_mEnumerable, "max_by", enum_max_by, 0);
+ rb_define_method(rb_mEnumerable, "min_by", enum_min_by, -1);
+ rb_define_method(rb_mEnumerable, "max_by", enum_max_by, -1);
rb_define_method(rb_mEnumerable, "minmax_by", enum_minmax_by, 0);
rb_define_method(rb_mEnumerable, "member?", enum_member, 1);
rb_define_method(rb_mEnumerable, "include?", enum_member, 1);
@@ -2846,6 +3274,7 @@ Init_Enumerable(void)
rb_define_method(rb_mEnumerable, "cycle", enum_cycle, -1);
rb_define_method(rb_mEnumerable, "chunk", enum_chunk, -1);
rb_define_method(rb_mEnumerable, "slice_before", enum_slice_before, -1);
+ rb_define_method(rb_mEnumerable, "slice_after", enum_slice_after, -1);
id_next = rb_intern("next");
id_call = rb_intern("call");
diff --git a/enumerator.c b/enumerator.c
index c452b1776a..eaa3d73464 100644
--- a/enumerator.c
+++ b/enumerator.c
@@ -267,7 +267,7 @@ enumerator_allocate(VALUE klass)
}
static VALUE
-enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, VALUE *argv, rb_enumerator_size_func *size_fn, VALUE size)
+enumerator_init(VALUE enum_obj, VALUE obj, VALUE meth, int argc, const VALUE *argv, rb_enumerator_size_func *size_fn, VALUE size)
{
struct enumerator *ptr;
@@ -398,16 +398,16 @@ enumerator_init_copy(VALUE obj, VALUE orig)
* For backwards compatibility; use rb_enumeratorize_with_size
*/
VALUE
-rb_enumeratorize(VALUE obj, VALUE meth, int argc, VALUE *argv)
+rb_enumeratorize(VALUE obj, VALUE meth, int argc, const VALUE *argv)
{
return rb_enumeratorize_with_size(obj, meth, argc, argv, 0);
}
static VALUE
-lazy_to_enum_i(VALUE self, VALUE meth, int argc, VALUE *argv, rb_enumerator_size_func *size_fn);
+lazy_to_enum_i(VALUE self, VALUE meth, int argc, const VALUE *argv, rb_enumerator_size_func *size_fn);
VALUE
-rb_enumeratorize_with_size(VALUE obj, VALUE meth, int argc, VALUE *argv, rb_enumerator_size_func *size_fn)
+rb_enumeratorize_with_size(VALUE obj, VALUE meth, int argc, const VALUE *argv, rb_enumerator_size_func *size_fn)
{
/* Similar effect as calling obj.to_enum, i.e. dispatching to either
Kernel#to_enum vs Lazy#to_enum */
@@ -422,13 +422,13 @@ static VALUE
enumerator_block_call(VALUE obj, rb_block_call_func *func, VALUE arg)
{
int argc = 0;
- VALUE *argv = 0;
+ const VALUE *argv = 0;
const struct enumerator *e = enumerator_ptr(obj);
ID meth = e->meth;
if (e->args) {
argc = RARRAY_LENINT(e->args);
- argv = RARRAY_PTR(e->args);
+ argv = RARRAY_CONST_PTR(e->args);
}
return rb_block_call(e->obj, meth, argc, argv, func, arg);
}
@@ -975,13 +975,15 @@ append_method(VALUE obj, VALUE str, ID default_method, VALUE default_args)
method = rb_attr_get(obj, id_method);
if (method != Qfalse) {
- ID mid = default_method;
if (!NIL_P(method)) {
Check_Type(method, T_SYMBOL);
- mid = SYM2ID(method);
+ method = rb_sym2str(method);
+ }
+ else {
+ method = rb_id2str(default_method);
}
rb_str_buf_cat2(str, ":");
- rb_str_buf_append(str, rb_id2str(mid));
+ rb_str_buf_append(str, method);
}
eargs = rb_attr_get(obj, id_arguments);
@@ -1140,7 +1142,8 @@ yielder_yield(VALUE obj, VALUE args)
}
/* :nodoc: */
-static VALUE yielder_yield_push(VALUE obj, VALUE args)
+static VALUE
+yielder_yield_push(VALUE obj, VALUE args)
{
yielder_yield(obj, args);
return obj;
@@ -1458,7 +1461,7 @@ enumerable_lazy(VALUE obj)
}
static VALUE
-lazy_to_enum_i(VALUE obj, VALUE meth, int argc, VALUE *argv, rb_enumerator_size_func *size_fn)
+lazy_to_enum_i(VALUE obj, VALUE meth, int argc, const VALUE *argv, rb_enumerator_size_func *size_fn)
{
return enumerator_init(enumerator_allocate(rb_cLazy),
obj, meth, argc, argv, size_fn, Qnil);
@@ -2036,6 +2039,7 @@ InitVM_Enumerator(void)
rb_define_method(rb_cLazy, "lazy", lazy_lazy, 0);
rb_define_method(rb_cLazy, "chunk", lazy_super, -1);
rb_define_method(rb_cLazy, "slice_before", lazy_super, -1);
+ rb_define_method(rb_cLazy, "slice_after", lazy_super, -1);
rb_define_alias(rb_cLazy, "force", "to_a");
@@ -2060,6 +2064,7 @@ InitVM_Enumerator(void)
rb_provide("enumerator.so"); /* for backward compatibility */
}
+#undef rb_intern
void
Init_Enumerator(void)
{
diff --git a/error.c b/error.c
index e90f9b410a..3c2b60ba3b 100644
--- a/error.c
+++ b/error.c
@@ -292,41 +292,78 @@ rb_bug_reporter_add(void (*func)(FILE *, void *), void *data)
return 1;
}
-static void
-report_bug(const char *file, int line, const char *fmt, va_list args)
+/* SIGSEGV handler might have a very small stack. Thus we need to use it carefully. */
+#define REPORT_BUG_BUFSIZ 256
+static FILE *
+bug_report_file(const char *file, int line)
{
- /* SIGSEGV handler might have a very small stack. Thus we need to use it carefully. */
- char buf[256];
+ char buf[REPORT_BUG_BUFSIZ];
FILE *out = stderr;
- int len = err_position_0(buf, 256, file, line);
+ int len = err_position_0(buf, sizeof(buf), file, line);
if ((ssize_t)fwrite(buf, 1, len, out) == (ssize_t)len ||
(ssize_t)fwrite(buf, 1, len, (out = stdout)) == (ssize_t)len) {
+ return out;
+ }
+ return NULL;
+}
+
+static void
+bug_report_begin(FILE *out, const char *fmt, va_list args)
+{
+ char buf[REPORT_BUG_BUFSIZ];
- fputs("[BUG] ", out);
- vsnprintf(buf, 256, fmt, args);
- fputs(buf, out);
- snprintf(buf, 256, "\n%s\n\n", ruby_description);
- fputs(buf, out);
+ fputs("[BUG] ", out);
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ fputs(buf, out);
+ snprintf(buf, sizeof(buf), "\n%s\n\n", ruby_description);
+ fputs(buf, out);
+}
- rb_vm_bugreport();
+#define bug_report_begin(out, fmt) do { \
+ va_list args; \
+ va_start(args, fmt); \
+ bug_report_begin(out, fmt, args); \
+ va_end(args); \
+} while (0)
- /* call additional bug reporters */
- {
- int i;
- for (i=0; i<bug_reporters_size; i++) {
- struct bug_reporters *reporter = &bug_reporters[i];
- (*reporter->func)(out, reporter->data);
- }
+static void
+bug_report_end(FILE *out)
+{
+ /* call additional bug reporters */
+ {
+ int i;
+ for (i=0; i<bug_reporters_size; i++) {
+ struct bug_reporters *reporter = &bug_reporters[i];
+ (*reporter->func)(out, reporter->data);
}
- fprintf(out, REPORTBUG_MSG);
}
+ fprintf(out, REPORTBUG_MSG);
+}
+
+#define report_bug(file, line, fmt, ctx) do { \
+ FILE *out = bug_report_file(file, line); \
+ if (out) { \
+ bug_report_begin(out, fmt); \
+ rb_vm_bugreport(ctx); \
+ bug_report_end(out); \
+ } \
+} while (0) \
+
+NORETURN(static void die(void));
+static void
+die(void)
+{
+#if defined(_WIN32) && defined(RUBY_MSVCRT_VERSION) && RUBY_MSVCRT_VERSION >= 80
+ _set_abort_behavior( 0, _CALL_REPORTFAULT);
+#endif
+
+ abort();
}
void
rb_bug(const char *fmt, ...)
{
- va_list args;
const char *file = NULL;
int line = 0;
@@ -335,17 +372,28 @@ rb_bug(const char *fmt, ...)
line = rb_sourceline();
}
- va_start(args, fmt);
- report_bug(file, line, fmt, args);
- va_end(args);
+ report_bug(file, line, fmt, NULL);
-#if defined(_WIN32) && defined(RUBY_MSVCRT_VERSION) && RUBY_MSVCRT_VERSION >= 80
- _set_abort_behavior( 0, _CALL_REPORTFAULT);
-#endif
+ die();
+}
- abort();
+void
+rb_bug_context(const void *ctx, const char *fmt, ...)
+{
+ const char *file = NULL;
+ int line = 0;
+
+ if (GET_THREAD()) {
+ file = rb_sourcefile();
+ line = rb_sourceline();
+ }
+
+ report_bug(file, line, fmt, ctx);
+
+ die();
}
+
void
rb_bug_errno(const char *mesg, int errno_arg)
{
@@ -394,11 +442,7 @@ rb_async_bug_errno(const char *mesg, int errno_arg)
void
rb_compile_bug(const char *file, int line, const char *fmt, ...)
{
- va_list args;
-
- va_start(args, fmt);
- report_bug(file, line, fmt, args);
- va_end(args);
+ report_bug(file, line, fmt, NULL);
abort();
}
@@ -809,6 +853,15 @@ rb_exc_set_backtrace(VALUE exc, VALUE bt)
return exc_set_backtrace(exc, bt);
}
+/*
+ * call-seq:
+ * exception.cause -> an_exception or nil
+ *
+ * Returns the previous exception ($!) at the time this exception was raised.
+ * This is useful for wrapping exceptions and retaining the original exception
+ * information.
+ */
+
VALUE
exc_cause(VALUE exc)
{
@@ -1740,18 +1793,14 @@ syserr_eqq(VALUE self, VALUE exc)
* * LoadError
* * NotImplementedError
* * SyntaxError
- * * SecurityError
* * SignalException
* * Interrupt
* * StandardError -- default for +rescue+
* * ArgumentError
- * * EncodingError
- * * FiberError
- * * IOError
- * * EOFError
* * IndexError
- * * KeyError
* * StopIteration
+ * * IOError
+ * * EOFError
* * LocalJumpError
* * NameError
* * NoMethodError
@@ -1759,13 +1808,14 @@ syserr_eqq(VALUE self, VALUE exc)
* * FloatDomainError
* * RegexpError
* * RuntimeError -- default for +raise+
+ * * SecurityError
* * SystemCallError
* * Errno::*
+ * * SystemStackError
* * ThreadError
* * TypeError
* * ZeroDivisionError
* * SystemExit
- * * SystemStackError
* * fatal -- impossible to rescue
*/
@@ -1806,7 +1856,7 @@ Init_Exception(void)
rb_eLoadError = rb_define_class("LoadError", rb_eScriptError);
/* the path failed to load */
- rb_attr(rb_eLoadError, rb_intern("path"), 1, 0, Qfalse);
+ rb_attr(rb_eLoadError, rb_intern_const("path"), 1, 0, Qfalse);
rb_eNotImpError = rb_define_class("NotImplementedError", rb_eScriptError);
diff --git a/eval.c b/eval.c
index ed1eacead1..1dabe2e24b 100644
--- a/eval.c
+++ b/eval.c
@@ -20,9 +20,7 @@
#include "vm_core.h"
#include "probes_helper.h"
-NORETURN(void rb_raise_jump(VALUE));
-
-NODE *rb_vm_get_cref(const rb_iseq_t *, const VALUE *);
+NORETURN(void rb_raise_jump(VALUE, VALUE));
VALUE rb_eLocalJumpError;
VALUE rb_eSysStackError;
@@ -53,6 +51,8 @@ ruby_setup(void)
ruby_init_stack((void *)&state);
Init_BareVM();
Init_heap();
+ Init_vm_objects();
+ Init_frozen_strings();
PUSH_TAG();
if ((state = EXEC_TAG()) == 0) {
@@ -82,7 +82,7 @@ ruby_init(void)
/*! Processes command line arguments and compiles the Ruby source to execute.
*
* This function does:
- * \li Processes the given command line flags and arguments for ruby(1)
+ * \li Processes the given command line flags and arguments for ruby(1)
* \li compiles the source code from the given argument, -e or stdin, and
* \li returns the compiled source as an opaque pointer to an internal data structure
*
@@ -412,8 +412,21 @@ rb_frozen_class_p(VALUE klass)
if (OBJ_FROZEN(klass)) {
const char *desc;
- if (FL_TEST(klass, FL_SINGLETON))
+ if (FL_TEST(klass, FL_SINGLETON)) {
desc = "object";
+ klass = rb_ivar_get(klass, id__attached__);
+ if (!SPECIAL_CONST_P(klass)) {
+ switch (BUILTIN_TYPE(klass)) {
+ case T_MODULE:
+ case T_ICLASS:
+ desc = "Module";
+ break;
+ case T_CLASS:
+ desc = "Class";
+ break;
+ }
+ }
+ }
else {
switch (BUILTIN_TYPE(klass)) {
case T_MODULE:
@@ -431,7 +444,7 @@ rb_frozen_class_p(VALUE klass)
}
}
-NORETURN(static void rb_longjmp(int, volatile VALUE));
+NORETURN(static void rb_longjmp(int, volatile VALUE, VALUE));
static VALUE get_errinfo(void);
static VALUE get_thread_errinfo(rb_thread_t *th);
@@ -461,41 +474,56 @@ exc_setup_cause(VALUE exc, VALUE cause)
return exc;
}
+static inline int
+sysstack_error_p(VALUE exc)
+{
+ return exc == sysstack_error || (!SPECIAL_CONST_P(exc) && RBASIC_CLASS(exc) == rb_eSysStackError);
+}
+
static void
-setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg)
+setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg, VALUE cause)
{
- VALUE at;
VALUE e;
- const char *file;
+ const char *file = 0;
volatile int line = 0;
+ int nocause = 0;
if (NIL_P(mesg)) {
mesg = th->errinfo;
if (INTERNAL_EXCEPTION_P(mesg)) JUMP_TAG(TAG_FATAL);
+ nocause = 1;
}
if (NIL_P(mesg)) {
mesg = rb_exc_new(rb_eRuntimeError, 0, 0);
+ nocause = 0;
}
- exc_setup_cause(mesg, get_thread_errinfo(th));
+ if (cause == Qundef) {
+ cause = nocause ? Qnil : get_thread_errinfo(th);
+ }
+ exc_setup_cause(mesg, cause);
file = rb_sourcefile();
if (file) line = rb_sourceline();
if (file && !NIL_P(mesg)) {
- if (mesg == sysstack_error) {
- at = rb_enc_sprintf(rb_usascii_encoding(), "%s:%d", file, line);
- at = rb_ary_new3(1, at);
- rb_iv_set(mesg, "bt", at);
- }
- else {
- at = get_backtrace(mesg);
- if (NIL_P(at)) {
+ VALUE at;
+ if (sysstack_error_p(mesg)) {
+ if (NIL_P(rb_attr_get(mesg, idBt))) {
at = rb_vm_backtrace_object();
- if (OBJ_FROZEN(mesg)) {
- mesg = rb_obj_dup(mesg);
+ if (mesg == sysstack_error) {
+ VALUE ruby_vm_sysstack_error_copy(void);
+ mesg = ruby_vm_sysstack_error_copy();
}
- rb_iv_set(mesg, "bt_locations", at);
- set_backtrace(mesg, at);
+ rb_ivar_set(mesg, idBt, at);
+ rb_ivar_set(mesg, idBt_locations, at);
+ }
+ }
+ else if (NIL_P(get_backtrace(mesg))) {
+ at = rb_vm_backtrace_object();
+ if (OBJ_FROZEN(mesg)) {
+ mesg = rb_obj_dup(mesg);
}
+ rb_ivar_set(mesg, idBt_locations, at);
+ set_backtrace(mesg, at);
}
}
@@ -514,16 +542,16 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg)
e = rb_obj_as_string(mesg);
th->errinfo = mesg;
if (file && line) {
- warn_printf("Exception `%s' at %s:%d - %"PRIsVALUE"\n",
- rb_obj_classname(th->errinfo), file, line, e);
+ warn_printf("Exception `%"PRIsVALUE"' at %s:%d - %"PRIsVALUE"\n",
+ rb_obj_class(mesg), file, line, e);
}
else if (file) {
- warn_printf("Exception `%s' at %s - %"PRIsVALUE"\n",
- rb_obj_classname(th->errinfo), file, e);
+ warn_printf("Exception `%"PRIsVALUE"' at %s - %"PRIsVALUE"\n",
+ rb_obj_class(mesg), file, e);
}
else {
- warn_printf("Exception `%s' - %"PRIsVALUE"\n",
- rb_obj_classname(th->errinfo), e);
+ warn_printf("Exception `%"PRIsVALUE"' - %"PRIsVALUE"\n",
+ rb_obj_class(mesg), e);
}
}
POP_TAG();
@@ -553,15 +581,15 @@ setup_exception(rb_thread_t *th, int tag, volatile VALUE mesg)
}
static void
-rb_longjmp(int tag, volatile VALUE mesg)
+rb_longjmp(int tag, volatile VALUE mesg, VALUE cause)
{
rb_thread_t *th = GET_THREAD();
- setup_exception(th, tag, mesg);
+ setup_exception(th, tag, mesg, cause);
rb_thread_raised_clear(th);
JUMP_TAG(tag);
}
-static VALUE make_exception(int argc, VALUE *argv, int isstr);
+static VALUE make_exception(int argc, const VALUE *argv, int isstr);
void
rb_exc_raise(VALUE mesg)
@@ -569,7 +597,7 @@ rb_exc_raise(VALUE mesg)
if (!NIL_P(mesg)) {
mesg = make_exception(1, &mesg, FALSE);
}
- rb_longjmp(TAG_RAISE, mesg);
+ rb_longjmp(TAG_RAISE, mesg, Qundef);
}
void
@@ -578,7 +606,7 @@ rb_exc_fatal(VALUE mesg)
if (!NIL_P(mesg)) {
mesg = make_exception(1, &mesg, FALSE);
}
- rb_longjmp(TAG_FATAL, mesg);
+ rb_longjmp(TAG_FATAL, mesg, Qnil);
}
void
@@ -587,6 +615,30 @@ rb_interrupt(void)
rb_raise(rb_eInterrupt, "%s", "");
}
+enum {raise_opt_cause, raise_max_opt};
+
+static int
+extract_raise_opts(int argc, VALUE *argv, VALUE *opts)
+{
+ int i;
+ if (argc > 0) {
+ VALUE opt = argv[argc-1];
+ if (RB_TYPE_P(opt, T_HASH)) {
+ if (!RHASH_EMPTY_P(opt)) {
+ ID keywords[1];
+ CONST_ID(keywords[0], "cause");
+ rb_get_kwargs(opt, keywords, 0, -1-raise_max_opt, opts);
+ if (RHASH_EMPTY_P(opt)) --argc;
+ return argc;
+ }
+ }
+ }
+ for (i = 0; i < raise_max_opt; ++i) {
+ opts[i] = Qundef;
+ }
+ return argc;
+}
+
/*
* call-seq:
* raise
@@ -615,20 +667,26 @@ static VALUE
rb_f_raise(int argc, VALUE *argv)
{
VALUE err;
+ VALUE opts[raise_max_opt], *const cause = &opts[raise_opt_cause];
+
+ argc = extract_raise_opts(argc, argv, opts);
if (argc == 0) {
+ if (*cause != Qundef) {
+ rb_raise(rb_eArgError, "only cause is given with no arguments");
+ }
err = get_errinfo();
if (!NIL_P(err)) {
argc = 1;
argv = &err;
}
}
- rb_raise_jump(rb_make_exception(argc, argv));
+ rb_raise_jump(rb_make_exception(argc, argv), *cause);
UNREACHABLE;
}
static VALUE
-make_exception(int argc, VALUE *argv, int isstr)
+make_exception(int argc, const VALUE *argv, int isstr)
{
VALUE mesg, exc;
ID exception;
@@ -657,7 +715,7 @@ make_exception(int argc, VALUE *argv, int isstr)
exc = argv[0];
n = 1;
exception_call:
- if (exc == sysstack_error) return exc;
+ if (sysstack_error_p(exc)) return exc;
CONST_ID(exception, "exception");
mesg = rb_check_funcall(exc, exception, n, argv+1);
if (mesg == Qundef) {
@@ -679,13 +737,13 @@ make_exception(int argc, VALUE *argv, int isstr)
}
VALUE
-rb_make_exception(int argc, VALUE *argv)
+rb_make_exception(int argc, const VALUE *argv)
{
return make_exception(argc, argv, TRUE);
}
void
-rb_raise_jump(VALUE mesg)
+rb_raise_jump(VALUE mesg, VALUE cause)
{
rb_thread_t *th = GET_THREAD();
rb_control_frame_t *cfp = th->cfp;
@@ -696,7 +754,7 @@ rb_raise_jump(VALUE mesg)
th->cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(th->cfp);
EXEC_EVENT_HOOK(th, RUBY_EVENT_C_RETURN, self, mid, klass, Qnil);
- setup_exception(th, TAG_RAISE, mesg);
+ setup_exception(th, TAG_RAISE, mesg, cause);
rb_thread_raised_clear(th);
JUMP_TAG(TAG_RAISE);
@@ -978,19 +1036,6 @@ prev_frame_func(void)
return frame_func_id(prev_cfp);
}
-ID
-rb_frame_last_func(void)
-{
- rb_thread_t *th = GET_THREAD();
- rb_control_frame_t *cfp = th->cfp;
- ID mid;
-
- while (!(mid = frame_func_id(cfp)) &&
- (cfp = RUBY_VM_PREVIOUS_CONTROL_FRAME(cfp),
- !RUBY_VM_CONTROL_FRAME_STACK_OVERFLOW_P(th, cfp)));
- return mid;
-}
-
/*
* call-seq:
* append_features(mod) -> mod
@@ -1308,7 +1353,7 @@ mod_using(VALUE self, VALUE module)
}
void
-rb_obj_call_init(VALUE obj, int argc, VALUE *argv)
+rb_obj_call_init(VALUE obj, int argc, const VALUE *argv)
{
PASS_PASSED_BLOCK();
rb_funcall2(obj, idInitialize, argc, argv);
@@ -1659,8 +1704,5 @@ Init_eval(void)
rb_define_global_function("trace_var", rb_f_trace_var, -1); /* in variable.c */
rb_define_global_function("untrace_var", rb_f_untrace_var, -1); /* in variable.c */
- exception_error = rb_exc_new3(rb_eFatal,
- rb_obj_freeze(rb_str_new2("exception reentered")));
- OBJ_TAINT(exception_error);
- OBJ_FREEZE(exception_error);
+ rb_vm_register_special_exception(ruby_error_reenter, rb_eFatal, "exception reentered");
}
diff --git a/eval_error.c b/eval_error.c
index 2ce661204c..0c323c21c7 100644
--- a/eval_error.c
+++ b/eval_error.c
@@ -170,8 +170,8 @@ error_print(void)
}
if (tail) {
warn_print2(tail, elen - len - 1);
- if (einfo[elen-1] != '\n') warn_print2("\n", 1);
}
+ if (tail ? einfo[elen-1] != '\n' : !epath) warn_print2("\n", 1);
}
}
@@ -208,8 +208,8 @@ ruby_error_print(void)
error_print();
}
-void
-rb_print_undef(VALUE klass, ID id, int scope)
+static const char *
+method_scope_name(int scope)
{
const char *v;
@@ -219,7 +219,14 @@ rb_print_undef(VALUE klass, ID id, int scope)
case NOEX_PRIVATE: v = " private"; break;
case NOEX_PROTECTED: v = " protected"; break;
}
- rb_name_error(id, "undefined%s method `%"PRIsVALUE"' for %s `%"PRIsVALUE"'", v,
+ return v;
+}
+
+void
+rb_print_undef(VALUE klass, ID id, int scope)
+{
+ const char *v = method_scope_name(scope);
+ rb_name_error(id, "undefined%s method `%"PRIsVALUE"' for %s `% "PRIsVALUE"'", v,
QUOTE_ID(id),
(RB_TYPE_P(klass, T_MODULE)) ? "module" : "class",
rb_class_name(klass));
@@ -228,12 +235,23 @@ rb_print_undef(VALUE klass, ID id, int scope)
void
rb_print_undef_str(VALUE klass, VALUE name)
{
- rb_name_error_str(name, "undefined method `%"PRIsVALUE"' for %s `%"PRIsVALUE"'",
+ rb_name_error_str(name, "undefined method `%"PRIsVALUE"' for %s `% "PRIsVALUE"'",
QUOTE(name),
(RB_TYPE_P(klass, T_MODULE)) ? "module" : "class",
rb_class_name(klass));
}
+void
+rb_print_inaccessible(VALUE klass, ID id, int scope)
+{
+ const char *v = method_scope_name(scope);
+ rb_name_error(id, "method `%"PRIsVALUE"' for %s `% "PRIsVALUE"' is %s",
+ QUOTE_ID(id),
+ (RB_TYPE_P(klass, T_MODULE)) ? "module" : "class",
+ rb_class_name(klass),
+ v);
+}
+
static int
sysexit_status(VALUE err)
{
@@ -284,7 +302,8 @@ error_handle(int ex)
if (rb_obj_is_kind_of(errinfo, rb_eSystemExit)) {
status = sysexit_status(errinfo);
}
- else if (rb_obj_is_instance_of(errinfo, rb_eSignal)) {
+ else if (rb_obj_is_instance_of(errinfo, rb_eSignal) &&
+ rb_iv_get(errinfo, "signo") != INT2FIX(SIGSEGV)) {
/* no message when exiting by signal */
}
else {
diff --git a/eval_intern.h b/eval_intern.h
index 2e00efde03..c457deb8db 100644
--- a/eval_intern.h
+++ b/eval_intern.h
@@ -129,18 +129,22 @@ LONG WINAPI rb_w32_stack_overflow_handler(struct _EXCEPTION_POINTERS *);
_th->tag = _tag.prev; \
} while (0)
-#define TH_POP_TAG2() \
+#define TH_TMPPOP_TAG() \
_th->tag = _tag.prev
-#define TH_PUSH_TAG2() (_th->tag = &_tag, 0)
-
-#define TH_TMPPOP_TAG() TH_POP_TAG2()
-
-#define TH_REPUSH_TAG() TH_PUSH_TAG2()
+#define TH_REPUSH_TAG() (void)(_th->tag = &_tag)
#define PUSH_TAG() TH_PUSH_TAG(GET_THREAD())
#define POP_TAG() TH_POP_TAG()
+#if defined __GNUC__ && __GNUC__ == 4 && (__GNUC_MINOR__ >= 6 && __GNUC_MINOR__ <= 8)
+# define VAR_FROM_MEMORY(var) __extension__(*(__typeof__(var) volatile *)&(var))
+# define VAR_INITIALIZED(var) ((var) = VAR_FROM_MEMORY(var))
+#else
+# define VAR_FROM_MEMORY(var) (var)
+# define VAR_INITIALIZED(var) ((void)&(var))
+#endif
+
/* clear th->state, and return the value */
static inline int
rb_threadptr_tag_state(rb_thread_t *th)
@@ -163,7 +167,7 @@ rb_threadptr_tag_jump(rb_thread_t *th, int st)
[ISO/IEC 9899:1999] 7.13.1.1
*/
#define TH_EXEC_TAG() \
- (ruby_setjmp(_tag.buf) ? rb_threadptr_tag_state(_th) : TH_PUSH_TAG2())
+ (ruby_setjmp(_tag.buf) ? rb_threadptr_tag_state(VAR_FROM_MEMORY(_th)) : (TH_REPUSH_TAG(), 0))
#define EXEC_TAG() \
TH_EXEC_TAG()
@@ -225,8 +229,8 @@ int rb_threadptr_reset_raised(rb_thread_t *th);
#define rb_thread_raised_p(th, f) (((th)->raised_flag & (f)) != 0)
#define rb_thread_raised_clear(th) ((th)->raised_flag = 0)
-VALUE rb_f_eval(int argc, VALUE *argv, VALUE self);
-VALUE rb_make_exception(int argc, VALUE *argv);
+VALUE rb_f_eval(int argc, const VALUE *argv, VALUE self);
+VALUE rb_make_exception(int argc, const VALUE *argv);
NORETURN(void rb_method_name_error(VALUE, VALUE));
@@ -234,9 +238,10 @@ NORETURN(void rb_fiber_start(void));
NORETURN(void rb_print_undef(VALUE, ID, int));
NORETURN(void rb_print_undef_str(VALUE, VALUE));
+NORETURN(void rb_print_inaccessible(VALUE, ID, int));
NORETURN(void rb_vm_localjump_error(const char *,VALUE, int));
NORETURN(void rb_vm_jump_tag_but_local_jump(int));
-NORETURN(void rb_raise_method_missing(rb_thread_t *th, int argc, VALUE *argv,
+NORETURN(void rb_raise_method_missing(rb_thread_t *th, int argc, const VALUE *argv,
VALUE obj, int call_status));
VALUE rb_vm_make_jump_tag_but_local_jump(int state, VALUE val);
diff --git a/eval_jump.c b/eval_jump.c
index 30094e9176..5443ed224e 100644
--- a/eval_jump.c
+++ b/eval_jump.c
@@ -123,6 +123,7 @@ rb_exec_end_proc(void)
exec_end_procs_chain(&end_procs);
}
else {
+ VAR_INITIALIZED(th);
TH_TMPPOP_TAG();
error_handle(status);
if (!NIL_P(th->errinfo)) errinfo = th->errinfo;
diff --git a/ext/-test-/bignum/bigzero.c b/ext/-test-/bignum/bigzero.c
index 2f7c272744..a3bf8af459 100644
--- a/ext/-test-/bignum/bigzero.c
+++ b/ext/-test-/bignum/bigzero.c
@@ -1,11 +1,12 @@
#include "ruby.h"
+#include "internal.h"
static VALUE
bug_big_zero(VALUE self, VALUE length)
{
long len = NUM2ULONG(length);
VALUE z = rb_big_new(len, 1);
- MEMZERO(RBIGNUM_DIGITS(z), BDIGIT, len);
+ MEMZERO(BIGNUM_DIGITS(z), BDIGIT, len);
return z;
}
@@ -14,7 +15,7 @@ bug_big_negzero(VALUE self, VALUE length)
{
long len = NUM2ULONG(length);
VALUE z = rb_big_new(len, 0);
- MEMZERO(RBIGNUM_DIGITS(z), BDIGIT, len);
+ MEMZERO(BIGNUM_DIGITS(z), BDIGIT, len);
return z;
}
diff --git a/ext/-test-/bignum/intpack.c b/ext/-test-/bignum/intpack.c
index 03023196e6..b7435b2025 100644
--- a/ext/-test-/bignum/intpack.c
+++ b/ext/-test-/bignum/intpack.c
@@ -49,7 +49,7 @@ static VALUE
rb_integer_test_numbits_2comp_without_sign(VALUE val)
{
size_t size;
- int neg = FIXNUM_P(val) ? FIX2LONG(val) < 0 : RBIGNUM_NEGATIVE_P(val);
+ int neg = FIXNUM_P(val) ? FIX2LONG(val) < 0 : BIGNUM_NEGATIVE_P(val);
size = rb_absint_numwords(val, 1, NULL) - (neg && rb_absint_singlebit_p(val));
return SIZET2NUM(size);
}
@@ -57,7 +57,7 @@ rb_integer_test_numbits_2comp_without_sign(VALUE val)
static VALUE
rb_integer_test_numbytes_2comp_with_sign(VALUE val)
{
- int neg = FIXNUM_P(val) ? FIX2LONG(val) < 0 : RBIGNUM_NEGATIVE_P(val);
+ int neg = FIXNUM_P(val) ? FIX2LONG(val) < 0 : BIGNUM_NEGATIVE_P(val);
int nlz_bits;
size_t size = rb_absint_size(val, &nlz_bits);
if (nlz_bits == 0 && !(neg && rb_absint_singlebit_p(val)))
diff --git a/ext/-test-/bignum/mul.c b/ext/-test-/bignum/mul.c
index 758465b567..c0514a5a0d 100644
--- a/ext/-test-/bignum/mul.c
+++ b/ext/-test-/bignum/mul.c
@@ -55,8 +55,8 @@ mul_gmp(VALUE x, VALUE y)
void
Init_mul(VALUE klass)
{
- rb_define_const(rb_cBignum, "SIZEOF_BDIGITS", INT2NUM(SIZEOF_BDIGITS));
- rb_define_const(rb_cBignum, "BITSPERDIG", INT2NUM(SIZEOF_BDIGITS * CHAR_BIT));
+ rb_define_const(rb_cBignum, "SIZEOF_BDIGIT", INT2NUM(SIZEOF_BDIGIT));
+ rb_define_const(rb_cBignum, "BITSPERDIG", INT2NUM(SIZEOF_BDIGIT * CHAR_BIT));
rb_define_method(rb_cInteger, "big_mul_normal", mul_normal, 1);
rb_define_method(rb_cInteger, "big_sq_fast", sq_fast, 0);
rb_define_method(rb_cInteger, "big_mul_balance", mul_balance, 1);
diff --git a/ext/-test-/file/fs.c b/ext/-test-/file/fs.c
new file mode 100644
index 0000000000..4a41bf33b9
--- /dev/null
+++ b/ext/-test-/file/fs.c
@@ -0,0 +1,60 @@
+#include "ruby/ruby.h"
+#include "ruby/io.h"
+
+#ifdef __linux__
+# define HAVE_GETMNTENT
+#endif
+
+#ifdef HAVE_GETMNTENT
+# include <stdio.h>
+# include <mntent.h>
+#endif
+
+VALUE
+get_fsname(VALUE self, VALUE str)
+{
+#ifdef HAVE_GETMNTENT
+ const char *path;
+ struct mntent mntbuf;
+ static const int buflen = 4096;
+ char *buf = alloca(buflen);
+ int len = 0;
+ FILE *fp;
+#define FSNAME_LEN 100
+ char name[FSNAME_LEN] = "";
+
+ FilePathValue(str);
+ path = RSTRING_PTR(str);
+ fp = setmntent("/etc/mtab", "r");
+ if (!fp) rb_sys_fail("setmntent(/etb/mtab)");;
+
+ while (getmntent_r(fp, &mntbuf, buf, buflen)) {
+ int i;
+ char *mnt_dir = mntbuf.mnt_dir;
+ for (i=0; mnt_dir[i]; i++) {
+ if (mnt_dir[i] != path[i]) {
+ goto next_entry;
+ }
+ }
+ if (i >= len) {
+ len = i;
+ strlcpy(name, mntbuf.mnt_type, FSNAME_LEN);
+ }
+next_entry:
+ ;
+ }
+ endmntent(fp);
+
+ if (!len) rb_sys_fail("no matching entry");;
+ return rb_str_new_cstr(name);
+#else
+ return Qnil;
+#endif
+}
+
+void
+Init_fs(VALUE module)
+{
+ VALUE fs = rb_define_module_under(module, "Fs");
+ rb_define_module_function(fs, "fsname", get_fsname, 1);
+}
diff --git a/ext/-test-/float/depend b/ext/-test-/float/depend
new file mode 100644
index 0000000000..dff14550f7
--- /dev/null
+++ b/ext/-test-/float/depend
@@ -0,0 +1,3 @@
+$(OBJS): $(HDRS) $(ruby_headers)
+
+nextafter.o: nextafter.c $(top_srcdir)/missing/nextafter.c
diff --git a/ext/-test-/float/extconf.rb b/ext/-test-/float/extconf.rb
new file mode 100644
index 0000000000..0a9a299aa5
--- /dev/null
+++ b/ext/-test-/float/extconf.rb
@@ -0,0 +1,7 @@
+$INCFLAGS << " -I$(topdir) -I$(top_srcdir)"
+$srcs = Dir[File.join($srcdir, "*.{#{SRC_EXT.join(%q{,})}}")]
+inits = $srcs.map {|s| File.basename(s, ".*")}
+inits.delete("init")
+inits.map! {|s|"X(#{s})"}
+$defs << "-DTEST_INIT_FUNCS(X)=\"#{inits.join(' ')}\""
+create_makefile("-test-/float")
diff --git a/ext/-test-/float/init.c b/ext/-test-/float/init.c
new file mode 100644
index 0000000000..d962108e39
--- /dev/null
+++ b/ext/-test-/float/init.c
@@ -0,0 +1,11 @@
+#include "ruby.h"
+
+#define init(n) {void Init_##n(VALUE klass); Init_##n(klass);}
+
+void
+Init_float(void)
+{
+ VALUE mBug = rb_define_module("Bug");
+ VALUE klass = rb_define_class_under(mBug, "Float", rb_cObject);
+ TEST_INIT_FUNCS(init);
+}
diff --git a/ext/-test-/float/nextafter.c b/ext/-test-/float/nextafter.c
new file mode 100644
index 0000000000..30fb71f520
--- /dev/null
+++ b/ext/-test-/float/nextafter.c
@@ -0,0 +1,36 @@
+#include "ruby.h"
+
+static VALUE
+system_nextafter_m(VALUE klass, VALUE vx, VALUE vy)
+{
+ double x, y, z;
+
+ x = NUM2DBL(vx);
+ y = NUM2DBL(vy);
+ z = nextafter(x, y);
+
+ return DBL2NUM(z);
+}
+
+#define nextafter missing_nextafter
+#include "../../../missing/nextafter.c"
+#undef nextafter
+
+static VALUE
+missing_nextafter_m(VALUE klass, VALUE vx, VALUE vy)
+{
+ double x, y, z;
+
+ x = NUM2DBL(vx);
+ y = NUM2DBL(vy);
+ z = missing_nextafter(x, y);
+
+ return DBL2NUM(z);
+}
+
+void
+Init_nextafter(VALUE klass)
+{
+ rb_define_singleton_method(klass, "system_nextafter", system_nextafter_m, 2);
+ rb_define_singleton_method(klass, "missing_nextafter", missing_nextafter_m, 2);
+}
diff --git a/ext/-test-/old_thread_select/depend b/ext/-test-/old_thread_select/depend
deleted file mode 100644
index e786dc71d2..0000000000
--- a/ext/-test-/old_thread_select/depend
+++ /dev/null
@@ -1,4 +0,0 @@
-$(OBJS): $(HDRS) $(ruby_headers) \
- $(hdrdir)/ruby/io.h \
- $(hdrdir)/ruby/encoding.h \
- $(hdrdir)/ruby/oniguruma.h
diff --git a/ext/-test-/old_thread_select/extconf.rb b/ext/-test-/old_thread_select/extconf.rb
deleted file mode 100644
index 730d9ec901..0000000000
--- a/ext/-test-/old_thread_select/extconf.rb
+++ /dev/null
@@ -1,4 +0,0 @@
-$warnflags = "-Wno-deprecated-declarations"
-$warnflags = "" unless try_compile("", $warnflags)
-
-create_makefile("-test-/old_thread_select/old_thread_select")
diff --git a/ext/-test-/old_thread_select/old_thread_select.c b/ext/-test-/old_thread_select/old_thread_select.c
deleted file mode 100644
index e374f02355..0000000000
--- a/ext/-test-/old_thread_select/old_thread_select.c
+++ /dev/null
@@ -1,75 +0,0 @@
-/* test case for deprecated C API */
-#include "ruby/ruby.h"
-#include "ruby/io.h"
-
-static fd_set * array2fdset(fd_set *fds, VALUE ary, int *max)
-{
- long i;
-
- if (NIL_P(ary))
- return NULL;
-
- FD_ZERO(fds);
- Check_Type(ary, T_ARRAY);
- for (i = 0; i < RARRAY_LEN(ary); i++) {
- VALUE val = RARRAY_PTR(ary)[i];
- int fd;
-
- Check_Type(val, T_FIXNUM);
- fd = FIX2INT(val);
- if (fd >= *max)
- *max = fd + 1;
- FD_SET(fd, fds);
- }
-
- return fds;
-}
-
-static void fdset2array(VALUE dst, fd_set *fds, int max)
-{
- int i;
-
- rb_ary_clear(dst);
-
- for (i = 0; i < max; i++) {
- if (FD_ISSET(i, fds))
- rb_ary_push(dst, INT2NUM(i));
- }
-}
-
-static VALUE
-old_thread_select(VALUE klass, VALUE r, VALUE w, VALUE e, VALUE timeout)
-{
- struct timeval tv;
- struct timeval *tvp = NULL;
- fd_set rfds, wfds, efds;
- fd_set *rp, *wp, *ep;
- int rc;
- int max = 0;
-
- if (!NIL_P(timeout)) {
- tv = rb_time_timeval(timeout);
- tvp = &tv;
- }
- rp = array2fdset(&rfds, r, &max);
- wp = array2fdset(&wfds, w, &max);
- ep = array2fdset(&efds, e, &max);
- rc = rb_thread_select(max, rp, wp, ep, tvp);
- if (rc == -1)
- rb_sys_fail("rb_wait_for_single_fd");
-
- if (rp)
- fdset2array(r, &rfds, max);
- if (wp)
- fdset2array(w, &wfds, max);
- if (ep)
- fdset2array(e, &efds, max);
- return INT2NUM(rc);
-}
-
-void
-Init_old_thread_select(void)
-{
- rb_define_singleton_method(rb_cIO, "old_thread_select",
- old_thread_select, 4);
-}
diff --git a/ext/-test-/printf/printf.c b/ext/-test-/printf/printf.c
index 1ebe80411b..336f918986 100644
--- a/ext/-test-/printf/printf.c
+++ b/ext/-test-/printf/printf.c
@@ -44,8 +44,8 @@ printf_test_call(int argc, VALUE *argv, VALUE self)
{
VALUE opt, type, num, result;
char format[sizeof(int) * 6 + 8], *p = format, cnv;
- int n;
- const char *s;
+ int n = 0;
+ const char *s = 0;
rb_scan_args(argc, argv, "2:", &type, &num, &opt);
Check_Type(type, T_STRING);
diff --git a/ext/-test-/string/coderange.c b/ext/-test-/string/coderange.c
index 2f1e6a06a8..b93172d72d 100644
--- a/ext/-test-/string/coderange.c
+++ b/ext/-test-/string/coderange.c
@@ -2,10 +2,11 @@
#include "ruby/encoding.h"
static VALUE sym_7bit, sym_valid, sym_unknown, sym_broken;
+
static VALUE
-str_coderange(VALUE str)
+coderange_int2sym(int coderange)
{
- switch (ENC_CODERANGE(str)) {
+ switch (coderange) {
case ENC_CODERANGE_7BIT:
return sym_7bit;
case ENC_CODERANGE_VALID:
@@ -19,6 +20,21 @@ str_coderange(VALUE str)
UNREACHABLE;
}
+/* return coderange without scan */
+static VALUE
+str_coderange(VALUE str)
+{
+ return coderange_int2sym(ENC_CODERANGE(str));
+}
+
+/* scan coderange and return the result */
+static VALUE
+str_coderange_scan(VALUE str)
+{
+ ENC_CODERANGE_SET(str, ENC_CODERANGE_UNKNOWN);
+ return coderange_int2sym(rb_enc_str_coderange(str));
+}
+
void
Init_coderange(VALUE klass)
{
@@ -27,4 +43,5 @@ Init_coderange(VALUE klass)
sym_unknown = ID2SYM(rb_intern("unknown"));
sym_broken = ID2SYM(rb_intern("broken"));
rb_define_method(klass, "coderange", str_coderange, 0);
+ rb_define_method(klass, "coderange_scan", str_coderange_scan, 0);
}
diff --git a/ext/-test-/symbol/extconf.rb b/ext/-test-/symbol/extconf.rb
index 0b7c3876fa..fc00ec9abf 100644
--- a/ext/-test-/symbol/extconf.rb
+++ b/ext/-test-/symbol/extconf.rb
@@ -3,4 +3,5 @@ inits = $srcs.map {|s| File.basename(s, ".*")}
inits.delete("init")
inits.map! {|s|"X(#{s})"}
$defs << "-DTEST_INIT_FUNCS(X)=\"#{inits.join(' ')}\""
+have_func("rb_pin_dynamic_symbol")
create_makefile("-test-/symbol")
diff --git a/ext/-test-/symbol/init.c b/ext/-test-/symbol/init.c
index e740345f2a..3b7cf15899 100644
--- a/ext/-test-/symbol/init.c
+++ b/ext/-test-/symbol/init.c
@@ -2,10 +2,17 @@
#define init(n) {void Init_##n(VALUE klass); Init_##n(klass);}
+static VALUE
+sym_find(VALUE dummy, VALUE sym)
+{
+ return rb_check_symbol(&sym);
+}
+
void
Init_symbol(void)
{
VALUE mBug = rb_define_module("Bug");
VALUE klass = rb_define_class_under(mBug, "Symbol", rb_cSymbol);
+ rb_define_singleton_method(klass, "find", sym_find, 1);
TEST_INIT_FUNCS(init);
}
diff --git a/ext/-test-/symbol/intern.c b/ext/-test-/symbol/intern.c
deleted file mode 100644
index 6ae86a6104..0000000000
--- a/ext/-test-/symbol/intern.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "ruby.h"
-
-static VALUE
-bug_sym_interned_p(VALUE self, VALUE name)
-{
- ID id = rb_check_id(&name);
- return id ? Qtrue : Qfalse;
-}
-
-void
-Init_intern(VALUE klass)
-{
- rb_define_singleton_method(klass, "interned?", bug_sym_interned_p, 1);
-}
diff --git a/ext/-test-/symbol/type.c b/ext/-test-/symbol/type.c
index 17f2d6824b..e51e09eb26 100644
--- a/ext/-test-/symbol/type.c
+++ b/ext/-test-/symbol/type.c
@@ -38,13 +38,41 @@ bug_sym_attrset(VALUE self, VALUE name)
static VALUE
bug_id2str(VALUE self, VALUE sym)
{
- return rb_id2str(SYM2ID(sym));
+ return rb_sym2str(sym);
}
+static VALUE
+bug_static_p(VALUE self, VALUE sym)
+{
+ return STATIC_SYM_P(sym) ? Qtrue : Qfalse;
+}
+
+static VALUE
+bug_dynamic_p(VALUE self, VALUE sym)
+{
+ return DYNAMIC_SYM_P(sym) ? Qtrue : Qfalse;
+}
+
+#ifdef HAVE_RB_PIN_DYNAMIC_SYMBOL
+ID rb_pin_dynamic_symbol(VALUE);
+
+static VALUE
+bug_pindown(VALUE self, VALUE sym)
+{
+ rb_pin_dynamic_symbol(sym);
+ return sym;
+}
+#endif
+
void
Init_type(VALUE klass)
{
FOREACH_ID_TYPES(declare_symbol_type_p);
rb_define_singleton_method(klass, "attrset", bug_sym_attrset, 1);
rb_define_singleton_method(klass, "id2str", bug_id2str, 1);
+ rb_define_singleton_method(klass, "static?", bug_static_p, 1);
+ rb_define_singleton_method(klass, "dynamic?", bug_dynamic_p, 1);
+#ifdef HAVE_RB_PIN_DYNAMIC_SYMBOL
+ rb_define_singleton_method(klass, "pindown", bug_pindown, 1);
+#endif
}
diff --git a/ext/-test-/win32/console/attribute.c b/ext/-test-/win32/console/attribute.c
new file mode 100644
index 0000000000..8941272ea7
--- /dev/null
+++ b/ext/-test-/win32/console/attribute.c
@@ -0,0 +1,56 @@
+#include <ruby.h>
+
+static VALUE rb_cConsoleScreenBufferInfo;
+
+static VALUE
+console_info(VALUE io)
+{
+ int fd = NUM2INT(rb_funcallv(io, rb_intern("fileno"), 0, 0));
+ HANDLE h = (HANDLE)rb_w32_get_osfhandle(fd);
+ CONSOLE_SCREEN_BUFFER_INFO csbi;
+
+ if (h == (HANDLE)-1) rb_raise(rb_eIOError, "invalid io");
+ if (!GetConsoleScreenBufferInfo(h, &csbi))
+ rb_syserr_fail(rb_w32_map_errno(GetLastError()), "not console");
+ return rb_struct_new(rb_cConsoleScreenBufferInfo,
+ INT2FIX(csbi.dwSize.X), INT2FIX(csbi.dwSize.Y),
+ INT2FIX(csbi.dwCursorPosition.X), INT2FIX(csbi.dwCursorPosition.Y),
+ INT2FIX(csbi.wAttributes));
+}
+
+static VALUE
+console_set_attribute(VALUE io, VALUE attr)
+{
+ int fd = NUM2INT(rb_funcallv(io, rb_intern("fileno"), 0, 0));
+ HANDLE h = (HANDLE)rb_w32_get_osfhandle(fd);
+
+ if (h == (HANDLE)-1) rb_raise(rb_eIOError, "invalid io");
+ SetConsoleTextAttribute(h, NUM2INT(attr));
+ return Qnil;
+}
+
+#define FOREGROUND_MASK (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY)
+#define BACKGROUND_MASK (BACKGROUND_BLUE | BACKGROUND_GREEN | BACKGROUND_RED | BACKGROUND_INTENSITY)
+
+void
+Init_attribute(VALUE m)
+{
+ rb_cConsoleScreenBufferInfo = rb_struct_define_under(m, "ConsoleScreenBufferInfo",
+ "size_x", "size_y",
+ "cur_x", "cur_y",
+ "attr", NULL);
+ rb_define_method(rb_cIO, "console_info", console_info, 0);
+ rb_define_method(rb_cIO, "console_attribute", console_set_attribute, 1);
+
+ rb_define_const(m, "FOREGROUND_MASK", INT2FIX(FOREGROUND_MASK));
+ rb_define_const(m, "FOREGROUND_BLUE", INT2FIX(FOREGROUND_BLUE));
+ rb_define_const(m, "FOREGROUND_GREEN", INT2FIX(FOREGROUND_GREEN));
+ rb_define_const(m, "FOREGROUND_RED", INT2FIX(FOREGROUND_RED));
+ rb_define_const(m, "FOREGROUND_INTENSITY", INT2FIX(FOREGROUND_INTENSITY));
+
+ rb_define_const(m, "BACKGROUND_MASK", INT2FIX(BACKGROUND_MASK));
+ rb_define_const(m, "BACKGROUND_BLUE", INT2FIX(BACKGROUND_BLUE));
+ rb_define_const(m, "BACKGROUND_GREEN", INT2FIX(BACKGROUND_GREEN));
+ rb_define_const(m, "BACKGROUND_RED", INT2FIX(BACKGROUND_RED));
+ rb_define_const(m, "BACKGROUND_INTENSITY", INT2FIX(BACKGROUND_INTENSITY));
+}
diff --git a/ext/-test-/win32/console/depend b/ext/-test-/win32/console/depend
new file mode 100644
index 0000000000..f4f65adf9a
--- /dev/null
+++ b/ext/-test-/win32/console/depend
@@ -0,0 +1 @@
+attribute.o: $(ruby_headers) $(hdrdir)/ruby/win32.h
diff --git a/ext/-test-/win32/console/extconf.rb b/ext/-test-/win32/console/extconf.rb
new file mode 100644
index 0000000000..4de9fa7e4f
--- /dev/null
+++ b/ext/-test-/win32/console/extconf.rb
@@ -0,0 +1,8 @@
+if $mingw or $mswin
+ $srcs = Dir[File.join($srcdir, "*.{#{SRC_EXT.join(%q{,})}}")]
+ inits = $srcs.map {|s| File.basename(s, ".*")}
+ inits.delete("init")
+ inits.map! {|s|"X(#{s})"}
+ $defs << "-DTEST_INIT_FUNCS(X)=\"#{inits.join(' ')}\""
+ create_makefile("-test-/win32/console")
+end
diff --git a/ext/-test-/win32/console/init.c b/ext/-test-/win32/console/init.c
new file mode 100644
index 0000000000..f2e0d1c821
--- /dev/null
+++ b/ext/-test-/win32/console/init.c
@@ -0,0 +1,11 @@
+#include "ruby.h"
+
+#define init(n) {void Init_##n(VALUE m); Init_##n(m);}
+
+void
+Init_console(void)
+{
+ VALUE mBug = rb_define_module("Bug");
+ VALUE m = rb_define_module_under(mBug, "Win32");
+ TEST_INIT_FUNCS(init);
+}
diff --git a/ext/-test-/win32/dln/libdlntest.c b/ext/-test-/win32/dln/libdlntest.c
index 040ae8125d..5923b732c8 100644
--- a/ext/-test-/win32/dln/libdlntest.c
+++ b/ext/-test-/win32/dln/libdlntest.c
@@ -1,4 +1,4 @@
-extern __declspec(dllexport) void
+void
dlntest_ordinal(void)
{
}
diff --git a/ext/-test-/win32/fd_setsize/depend b/ext/-test-/win32/fd_setsize/depend
index 4936d6b28c..7d40e8d572 100644
--- a/ext/-test-/win32/fd_setsize/depend
+++ b/ext/-test-/win32/fd_setsize/depend
@@ -1,2 +1 @@
-fd_setsize.o: $(top_srcdir)/win32/win32.c \
- $(hdrdir)/ruby/ruby.h
+fd_setsize.o: $(ruby_headers) $(hdrdir)/ruby/win32.h
diff --git a/ext/.document b/ext/.document
index 1de3ab739b..2e6fc78879 100644
--- a/ext/.document
+++ b/ext/.document
@@ -43,6 +43,7 @@ mathn/rational/rational.c
nkf/lib
nkf/nkf.c
objspace/objspace.c
+objspace/objspace_dump.c
objspace/object_tracing.c
openssl/lib
openssl/ossl.c
@@ -88,7 +89,6 @@ pty/lib
pty/pty.c
racc/cparse/cparse.c
readline/readline.c
-refinement/refinement.c
ripper/lib
ripper/ripper.c
sdbm/init.c
@@ -99,5 +99,5 @@ syslog/syslog.c
syslog/lib
thread/thread.c
win32ole/lib
-win32ole/win32ole.c
+win32ole/*.c
zlib/zlib.c
diff --git a/ext/Setup.nacl b/ext/Setup.nacl
index d5c1e20777..28eafb5082 100644
--- a/ext/Setup.nacl
+++ b/ext/Setup.nacl
@@ -1,5 +1,5 @@
# #option nodynamic
-#
+#
# #Win32API
# bigdecimal
# continuation
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 6425a17db2..08febb5585 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -18,6 +18,7 @@
# define BIGDECIMAL_ENABLE_VPRINT 1
#endif
#include "bigdecimal.h"
+#include "ruby/util.h"
#ifndef BIGDECIMAL_DEBUG
# define NDEBUG
@@ -71,9 +72,9 @@ static ID id_eq;
/* MACRO's to guard objects from GC by keeping them in stack */
#define ENTER(n) volatile VALUE RB_UNUSED_VAR(vStack[n]);int iStack=0
-#define PUSH(x) vStack[iStack++] = (VALUE)(x);
-#define SAVE(p) PUSH(p->obj);
-#define GUARD_OBJ(p,y) {p=y;SAVE(p);}
+#define PUSH(x) (vStack[iStack++] = (VALUE)(x))
+#define SAVE(p) PUSH((p)->obj)
+#define GUARD_OBJ(p,y) ((p)=(y), SAVE(p))
#define BASE_FIG RMPD_COMPONENT_FIGURES
#define BASE RMPD_BASE
@@ -85,19 +86,29 @@ static ID id_eq;
#define DBLE_FIG (DBL_DIG+1) /* figure of double */
#endif
-#ifndef RBIGNUM_ZERO_P
-# define RBIGNUM_ZERO_P(x) rb_bigzero_p(x)
-#endif
-
#ifndef RRATIONAL_ZERO_P
-# define RRATIONAL_ZERO_P(x) (FIXNUM_P(RRATIONAL(x)->num) && \
- FIX2LONG(RRATIONAL(x)->num) == 0)
+# define RRATIONAL_ZERO_P(x) (FIXNUM_P(rb_rational_num(x)) && \
+ FIX2LONG(rb_rational_num(x)) == 0)
#endif
#ifndef RRATIONAL_NEGATIVE_P
# define RRATIONAL_NEGATIVE_P(x) RTEST(rb_funcall((x), '<', 1, INT2FIX(0)))
#endif
+#ifndef DECIMAL_SIZE_OF_BITS
+#define DECIMAL_SIZE_OF_BITS(n) (((n) * 3010 + 9998) / 9999)
+/* an approximation of ceil(n * log10(2)), upto 65536 at least */
+#endif
+
+#ifdef PRIsVALUE
+# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj)
+# define RB_OBJ_STRING(obj) (obj)
+#else
+# define PRIsVALUE "s"
+# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj)
+# define RB_OBJ_STRING(obj) StringValueCStr(obj)
+#endif
+
/*
* ================== Ruby Interface part ==========================
*/
@@ -224,11 +235,11 @@ again:
if (prec < 0) goto unable_to_coerce_without_prec;
if (orig == Qundef ? (orig = v, 1) : orig != v) {
- num = RRATIONAL(v)->num;
+ num = rb_rational_num(v);
pv = GetVpValueWithPrec(num, -1, must);
if (pv == NULL) goto SomeOneMayDoIt;
- v = BigDecimal_div2(ToValue(pv), RRATIONAL(v)->den, LONG2NUM(prec));
+ v = BigDecimal_div2(ToValue(pv), rb_rational_den(v), LONG2NUM(prec));
goto again;
}
@@ -273,8 +284,8 @@ SomeOneMayDoIt:
unable_to_coerce_without_prec:
if (must) {
rb_raise(rb_eArgError,
- "%s can't be coerced into BigDecimal without a precision",
- rb_obj_classname(v));
+ "%"PRIsVALUE" can't be coerced into BigDecimal without a precision",
+ RB_OBJ_CLASSNAME(v));
}
return NULL;
}
@@ -2080,7 +2091,7 @@ is_negative(VALUE x)
return FIX2LONG(x) < 0;
}
else if (RB_TYPE_P(x, T_BIGNUM)) {
- return RBIGNUM_NEGATIVE_P(x);
+ return FIX2INT(rb_big_cmp(x, INT2FIX(0))) < 0;
}
else if (RB_TYPE_P(x, T_FLOAT)) {
return RFLOAT_VALUE(x) < 0.0;
@@ -2103,7 +2114,7 @@ is_zero(VALUE x)
return Qfalse;
case T_RATIONAL:
- num = RRATIONAL(x)->num;
+ num = rb_rational_num(x);
return FIXNUM_P(num) && FIX2LONG(num) == 0;
default:
@@ -2126,8 +2137,8 @@ is_one(VALUE x)
return Qfalse;
case T_RATIONAL:
- num = RRATIONAL(x)->num;
- den = RRATIONAL(x)->den;
+ num = rb_rational_num(x);
+ den = rb_rational_den(x);
return FIXNUM_P(den) && FIX2LONG(den) == 1 &&
FIXNUM_P(num) && FIX2LONG(num) == 1;
@@ -2233,14 +2244,14 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
break;
case T_RATIONAL:
- if (is_zero(RRATIONAL(vexp)->num)) {
+ if (is_zero(rb_rational_num(vexp))) {
if (is_positive(vexp)) {
vexp = INT2FIX(0);
goto retry;
}
}
- else if (is_one(RRATIONAL(vexp)->den)) {
- vexp = RRATIONAL(vexp)->num;
+ else if (is_one(rb_rational_den(vexp))) {
+ vexp = rb_rational_num(vexp);
goto retry;
}
exp = GetVpValueWithPrec(vexp, n, 1);
@@ -2260,8 +2271,8 @@ BigDecimal_power(int argc, VALUE*argv, VALUE self)
/* fall through */
default:
rb_raise(rb_eTypeError,
- "wrong argument type %s (expected scalar Numeric)",
- rb_obj_classname(vexp));
+ "wrong argument type %"PRIsVALUE" (expected scalar Numeric)",
+ RB_OBJ_CLASSNAME(vexp));
}
if (VpIsZero(x)) {
@@ -2452,6 +2463,19 @@ static Real *BigDecimal_new(int argc, VALUE *argv);
*
* The actual number of significant digits used in computation is usually
* larger than the specified number.
+ *
+ * ==== Exceptions
+ *
+ * TypeError:: If the +initial+ type is neither Fixnum, Bignum, Float,
+ * Rational, nor BigDecimal, this exception is raised.
+ *
+ * TypeError:: If the +digits+ is not a Fixnum, this exception is raised.
+ *
+ * ArgumentError:: If +initial+ is a Float, and the +digits+ is larger than
+ * Float::DIG + 1, this exception is raised.
+ *
+ * ArgumentError:: If the +initial+ is a Float or Rational, and the +digits+
+ * value is omitted, this exception is raised.
*/
static VALUE
BigDecimal_initialize(int argc, VALUE *argv, VALUE self)
@@ -2524,7 +2548,7 @@ BigDecimal_new(int argc, VALUE *argv)
if (NIL_P(nFig)) {
rb_raise(rb_eArgError,
"can't omit precision for a %"PRIsVALUE".",
- rb_obj_class(iniValue));
+ RB_OBJ_CLASSNAME(iniValue));
}
return GetVpValueWithPrec(iniValue, mf, 1);
@@ -2537,7 +2561,7 @@ BigDecimal_new(int argc, VALUE *argv)
return VpAlloc(mf, RSTRING_PTR(iniValue));
}
-/* See also BigDecimal::new */
+/* See also BigDecimal.new */
static VALUE
BigDecimal_global_new(int argc, VALUE *argv, VALUE self)
{
@@ -2866,8 +2890,9 @@ BigMath_s_log(VALUE klass, VALUE x, VALUE vprec)
goto get_vp_value;
case T_BIGNUM:
- zero = RBIGNUM_ZERO_P(x);
- negative = RBIGNUM_NEGATIVE_P(x);
+ i = FIX2INT(rb_big_cmp(x, INT2FIX(0)));
+ zero = i == 0;
+ negative = i < 0;
get_vp_value:
if (zero || negative) break;
vx = GetVpValue(x, 0);
@@ -2928,8 +2953,8 @@ get_vp_value:
RB_GC_GUARD(vn) = SSIZET2NUM(n);
expo = VpExponent10(vx);
if (expo < 0 || expo >= 3) {
- char buf[16];
- snprintf(buf, 16, "1E%"PRIdVALUE, -expo);
+ char buf[DECIMAL_SIZE_OF_BITS(SIZEOF_VALUE * CHAR_BIT) + 4];
+ snprintf(buf, sizeof(buf), "1E%"PRIdVALUE, -expo);
x = BigDecimal_mult2(x, ToValue(VpCreateRbObject(1, buf)), vn);
}
else {
diff --git a/ext/bigdecimal/bigdecimal.gemspec b/ext/bigdecimal/bigdecimal.gemspec
index 7be9d7275b..e4f58c1adf 100644
--- a/ext/bigdecimal/bigdecimal.gemspec
+++ b/ext/bigdecimal/bigdecimal.gemspec
@@ -1,5 +1,5 @@
# -*- ruby -*-
-_VERSION = "1.2.4"
+_VERSION = "1.2.5"
date = %w$Date:: $[1]
Gem::Specification.new do |s|
diff --git a/ext/bigdecimal/bigdecimal.h b/ext/bigdecimal/bigdecimal.h
index 805990d99c..9d3e0fcd29 100644
--- a/ext/bigdecimal/bigdecimal.h
+++ b/ext/bigdecimal/bigdecimal.h
@@ -291,7 +291,7 @@ VP_EXPORT Real *VpOne(void);
#define VpIsZero(a) (VpIsPosZero(a) || VpIsNegZero(a))
#define VpSetPosZero(a) ((a)->frac[0]=0,(a)->Prec=1,(a)->sign=VP_SIGN_POSITIVE_ZERO)
#define VpSetNegZero(a) ((a)->frac[0]=0,(a)->Prec=1,(a)->sign=VP_SIGN_NEGATIVE_ZERO)
-#define VpSetZero(a,s) ( ((s)>0)?VpSetPosZero(a):VpSetNegZero(a) )
+#define VpSetZero(a,s) (void)(((s)>0)?VpSetPosZero(a):VpSetNegZero(a))
/* NaN */
#define VpIsNaN(a) ((a)->sign==VP_SIGN_NaN)
@@ -304,7 +304,7 @@ VP_EXPORT Real *VpOne(void);
#define VpIsDef(a) ( !(VpIsNaN(a)||VpIsInf(a)) )
#define VpSetPosInf(a) ((a)->frac[0]=0,(a)->Prec=1,(a)->sign=VP_SIGN_POSITIVE_INFINITE)
#define VpSetNegInf(a) ((a)->frac[0]=0,(a)->Prec=1,(a)->sign=VP_SIGN_NEGATIVE_INFINITE)
-#define VpSetInf(a,s) ( ((s)>0)?VpSetPosInf(a):VpSetNegInf(a) )
+#define VpSetInf(a,s) (void)(((s)>0)?VpSetPosInf(a):VpSetNegInf(a))
#define VpHasVal(a) (a->frac[0])
#define VpIsOne(a) ((a->Prec==1)&&(a->frac[0]==1)&&(a->exponent==1))
#define VpExponent(a) (a->exponent)
diff --git a/ext/bigdecimal/depend b/ext/bigdecimal/depend
index a68128478c..0a83c1f17f 100644
--- a/ext/bigdecimal/depend
+++ b/ext/bigdecimal/depend
@@ -1 +1 @@
-bigdecimal.o: bigdecimal.c bigdecimal.h $(HDRS) $(ruby_headers)
+bigdecimal.o: bigdecimal.c bigdecimal.h $(HDRS) $(ruby_headers) $(hdrdir)/ruby/util.h
diff --git a/ext/bigdecimal/lib/bigdecimal/jacobian.rb b/ext/bigdecimal/lib/bigdecimal/jacobian.rb
index eb9b1c9fc5..d56caab0d3 100644
--- a/ext/bigdecimal/lib/bigdecimal/jacobian.rb
+++ b/ext/bigdecimal/lib/bigdecimal/jacobian.rb
@@ -75,7 +75,7 @@ module Jacobian
# Computes the Jacobian of f at x. fx is the value of f at x.
def jacobian(f,fx,x)
n = x.size
- dfdx = Array::new(n*n)
+ dfdx = Array.new(n*n)
for i in 0...n do
df = dfdxi(f,fx,x,i)
for j in 0...n do
diff --git a/ext/bigdecimal/lib/bigdecimal/math.rb b/ext/bigdecimal/lib/bigdecimal/math.rb
index 907d3b3829..4a4fcc2b06 100644
--- a/ext/bigdecimal/lib/bigdecimal/math.rb
+++ b/ext/bigdecimal/lib/bigdecimal/math.rb
@@ -36,8 +36,8 @@ module BigMath
# Computes the square root of +decimal+ to the specified number of digits of
# precision, +numeric+.
#
- # BigMath::sqrt(BigDecimal.new('2'), 16).to_s
- # #=> "0.14142135623730950488016887242096975E1"
+ # BigMath.sqrt(BigDecimal.new('2'), 16).to_s
+ # #=> "0.1414213562373095048801688724E1"
#
def sqrt(x, prec)
x.sqrt(prec)
@@ -51,7 +51,7 @@ module BigMath
#
# If +decimal+ is Infinity or NaN, returns NaN.
#
- # BigMath::sin(BigMath::PI(5)/4, 5).to_s
+ # BigMath.sin(BigMath.PI(5)/4, 5).to_s
# #=> "0.70710678118654752440082036563292800375E0"
#
def sin(x, prec)
@@ -95,7 +95,7 @@ module BigMath
#
# If +decimal+ is Infinity or NaN, returns NaN.
#
- # BigMath::cos(BigMath::PI(4), 16).to_s
+ # BigMath.cos(BigMath.PI(4), 16).to_s
# #=> "-0.999999999999999999999999999999856613163740061349E0"
#
def cos(x, prec)
@@ -139,7 +139,7 @@ module BigMath
#
# If +decimal+ is NaN, returns NaN.
#
- # BigMath::atan(BigDecimal.new('-1'), 16).to_s
+ # BigMath.atan(BigDecimal.new('-1'), 16).to_s
# #=> "-0.785398163397448309615660845819878471907514682065E0"
#
def atan(x, prec)
@@ -176,11 +176,11 @@ module BigMath
# Computes the value of pi to the specified number of digits of precision,
# +numeric+.
#
- # BigMath::PI(10).to_s
+ # BigMath.PI(10).to_s
# #=> "0.3141592653589793238462643388813853786957412E1"
#
def PI(prec)
- raise ArgumentError, "Zero or negative argument for PI" if prec <= 0
+ raise ArgumentError, "Zero or negative precision for PI" if prec <= 0
n = prec + BigDecimal.double_fig
zero = BigDecimal("0")
one = BigDecimal("1")
@@ -221,7 +221,7 @@ module BigMath
# Computes e (the base of natural logarithms) to the specified number of
# digits of precision, +numeric+.
#
- # BigMath::E(10).to_s
+ # BigMath.E(10).to_s
# #=> "0.271828182845904523536028752390026306410273E1"
#
def E(prec)
diff --git a/ext/bigdecimal/sample/linear.rb b/ext/bigdecimal/sample/linear.rb
index 93d558b539..a33255f591 100644
--- a/ext/bigdecimal/sample/linear.rb
+++ b/ext/bigdecimal/sample/linear.rb
@@ -16,8 +16,8 @@ require "bigdecimal/ludcmp"
#
# NOTE:
-# Change following BigDecimal::limit() if needed.
-BigDecimal::limit(100)
+# Change following BigDecimal.limit() if needed.
+BigDecimal.limit(100)
#
include LUSolve
@@ -27,8 +27,8 @@ def rd_order(na)
end
na = ARGV.size
-zero = BigDecimal::new("0.0")
-one = BigDecimal::new("1.0")
+zero = BigDecimal.new("0.0")
+one = BigDecimal.new("1.0")
while (n=rd_order(na))>0
a = []
@@ -40,10 +40,10 @@ while (n=rd_order(na))>0
for i in 0...n do
for j in 0...n do
printf("A[%d,%d]? ",i,j); s = ARGF.gets
- a << BigDecimal::new(s);
- as << BigDecimal::new(s);
+ a << BigDecimal.new(s);
+ as << BigDecimal.new(s);
end
- printf("Contatant vector element b[%d] ? ",i); b << BigDecimal::new(ARGF.gets);
+ printf("Contatant vector element b[%d] ? ",i); b << BigDecimal.new(ARGF.gets);
end
else
# Read data from specified file.
@@ -53,10 +53,10 @@ while (n=rd_order(na))>0
printf("%d) %s",i,s)
s = s.split
for j in 0...n do
- a << BigDecimal::new(s[j]);
- as << BigDecimal::new(s[j]);
+ a << BigDecimal.new(s[j]);
+ as << BigDecimal.new(s[j]);
end
- b << BigDecimal::new(s[n]);
+ b << BigDecimal.new(s[n]);
end
end
x = lusolve(a,b,ludecomp(a,n,zero,one),zero)
diff --git a/ext/bigdecimal/sample/nlsolve.rb b/ext/bigdecimal/sample/nlsolve.rb
index 692a5023cc..7fa921c2c3 100644
--- a/ext/bigdecimal/sample/nlsolve.rb
+++ b/ext/bigdecimal/sample/nlsolve.rb
@@ -11,11 +11,11 @@ include Newton
class Function # :nodoc: all
def initialize()
- @zero = BigDecimal::new("0.0")
- @one = BigDecimal::new("1.0")
- @two = BigDecimal::new("2.0")
- @ten = BigDecimal::new("10.0")
- @eps = BigDecimal::new("1.0e-16")
+ @zero = BigDecimal.new("0.0")
+ @one = BigDecimal.new("1.0")
+ @two = BigDecimal.new("2.0")
+ @ten = BigDecimal.new("10.0")
+ @eps = BigDecimal.new("1.0e-16")
end
def zero;@zero;end
def one ;@one ;end
@@ -31,8 +31,9 @@ class Function # :nodoc: all
f
end
end
- f = BigDecimal::limit(100)
- f = Function.new
- x = [f.zero,f.zero] # Initial values
- n = nlsolve(f,x)
- p x
+
+f = BigDecimal.limit(100)
+f = Function.new
+x = [f.zero,f.zero] # Initial values
+n = nlsolve(f,x)
+p x
diff --git a/ext/coverage/depend b/ext/coverage/depend
index 1227a5c9ae..ad0ac1cdfa 100644
--- a/ext/coverage/depend
+++ b/ext/coverage/depend
@@ -8,4 +8,4 @@ $(OBJS): $(HDRS) $(ruby_headers) \
$(top_srcdir)/ruby_atomic.h \
$(top_srcdir)/thread_pthread.h \
$(top_srcdir)/internal.h \
- $(top_srcdir)/thread_native.h
+ $(top_srcdir)/include/ruby/thread_native.h
diff --git a/ext/date/date_core.c b/ext/date/date_core.c
index 1685d15e61..7ed21db5fc 100644
--- a/ext/date/date_core.c
+++ b/ext/date/date_core.c
@@ -1,5 +1,5 @@
/*
- date_core.c: Coded by Tadayoshi Funaba 2010-2013
+ date_core.c: Coded by Tadayoshi Funaba 2010-2014
*/
#include "ruby.h"
@@ -114,7 +114,7 @@ f_zero_p(VALUE x)
return Qfalse;
case T_RATIONAL:
{
- VALUE num = RRATIONAL(x)->num;
+ VALUE num = rb_rational_num(x);
return f_boolcast(FIXNUM_P(num) && FIX2LONG(num) == 0);
}
}
@@ -304,10 +304,10 @@ union DateData {
inline static VALUE
canon(VALUE x)
{
- if (TYPE(x) == T_RATIONAL) {
- VALUE den = RRATIONAL(x)->den;
+ if (RB_TYPE_P(x, T_RATIONAL)) {
+ VALUE den = rb_rational_den(x);
if (FIXNUM_P(den) && FIX2LONG(den) == 1)
- return RRATIONAL(x)->num;
+ return rb_rational_num(x);
}
return x;
}
@@ -2373,8 +2373,8 @@ offset_to_sec(VALUE vof, int *rof)
return 1;
}
#endif
- vn = RRATIONAL(vs)->num;
- vd = RRATIONAL(vs)->den;
+ vn = rb_rational_num(vs);
+ vd = rb_rational_den(vs);
if (FIXNUM_P(vn) && FIXNUM_P(vd) && (FIX2LONG(vd) == 1))
n = FIX2LONG(vn);
@@ -3097,7 +3097,7 @@ wholenum_p(VALUE x)
break;
case T_RATIONAL:
{
- VALUE den = RRATIONAL(x)->den;
+ VALUE den = rb_rational_den(x);
return FIXNUM_P(den) && FIX2LONG(den) == 1;
}
break;
@@ -3667,7 +3667,11 @@ rt_rewrite_frags(VALUE hash)
seconds = ref_hash("seconds");
if (!NIL_P(seconds)) {
- VALUE d, h, min, s, fr;
+ VALUE offset, d, h, min, s, fr;
+
+ offset = ref_hash("offset");
+ if (!NIL_P(offset))
+ seconds = f_add(seconds, offset);
d = f_idiv(seconds, INT2FIX(DAY_IN_SECONDS));
fr = f_mod(seconds, INT2FIX(DAY_IN_SECONDS));
@@ -3687,7 +3691,6 @@ rt_rewrite_frags(VALUE hash)
set_hash("sec", s);
set_hash("sec_fraction", fr);
del_hash("seconds");
- del_hash("offset");
}
return hash;
}
@@ -5704,7 +5707,7 @@ d_lite_plus(VALUE self, VALUE other)
int jd, df, s;
if (wholenum_p(other))
- return d_lite_plus(self, RRATIONAL(other)->num);
+ return d_lite_plus(self, rb_rational_num(other));
if (f_positive_p(other))
s = +1;
@@ -5840,7 +5843,7 @@ minus_dd(VALUE self, VALUE other)
if (f_nonzero_p(sf))
r = f_add(r, ns_to_day(sf));
- if (TYPE(r) == T_RATIONAL)
+ if (RB_TYPE_P(r, T_RATIONAL))
return r;
return rb_rational_new1(r);
}
@@ -7045,7 +7048,7 @@ d_lite_marshal_load(VALUE self, VALUE a)
rb_check_frozen(self);
rb_check_trusted(self);
- if (TYPE(a) != T_ARRAY)
+ if (!RB_TYPE_P(a, T_ARRAY))
rb_raise(rb_eTypeError, "expected an array");
switch (RARRAY_LEN(a)) {
diff --git a/ext/date/date_parse.c b/ext/date/date_parse.c
index 3003b45239..239e2643b0 100644
--- a/ext/date/date_parse.c
+++ b/ext/date/date_parse.c
@@ -70,7 +70,7 @@ s3e(VALUE hash, VALUE y, VALUE m, VALUE d, int bc)
{
VALUE c = Qnil;
- if (TYPE(m) != T_STRING)
+ if (!RB_TYPE_P(m, T_STRING))
m = f_to_s(m);
if (!NIL_P(y) && !NIL_P(m) && NIL_P(d)) {
@@ -585,12 +585,12 @@ date_zone_to_diff(VALUE str)
if (NIL_P(hour))
offset = INT2FIX(0);
else {
- if (TYPE(hour) == T_STRING)
+ if (RB_TYPE_P(hour, T_STRING))
hour = str2num(hour);
offset = f_mul(hour, INT2FIX(3600));
}
if (!NIL_P(min)) {
- if (TYPE(min) == T_STRING)
+ if (RB_TYPE_P(min, T_STRING))
min = str2num(min);
offset = f_add(offset, f_mul(min, INT2FIX(60)));
}
diff --git a/ext/date/date_strptime.c b/ext/date/date_strptime.c
index 3e1b0f85ea..e318af19f3 100644
--- a/ext/date/date_strptime.c
+++ b/ext/date/date_strptime.c
@@ -291,8 +291,9 @@ date__strptime_internal(const char *str, size_t slen,
if (!valid_range_p(n, 0, 99))
fail();
set_hash("cwyear",n);
- set_hash("_cent",
- INT2FIX(f_ge_p(n, INT2FIX(69)) ? 19 : 20));
+ if (NIL_P(ref_hash("_cent")))
+ set_hash("_cent",
+ INT2FIX(f_ge_p(n, INT2FIX(69)) ? 19 : 20));
goto matched;
}
@@ -556,8 +557,9 @@ date__strptime_internal(const char *str, size_t slen,
if (sign == -1)
n = f_negate(n);
set_hash("year", n);
- set_hash("_cent",
- INT2FIX(f_ge_p(n, INT2FIX(69)) ? 19 : 20));
+ if (NIL_P(ref_hash("_cent")))
+ set_hash("_cent",
+ INT2FIX(f_ge_p(n, INT2FIX(69)) ? 19 : 20));
goto matched;
}
diff --git a/ext/date/lib/date.rb b/ext/date/lib/date.rb
index d235d76e6f..83234f458b 100644
--- a/ext/date/lib/date.rb
+++ b/ext/date/lib/date.rb
@@ -1,7 +1,6 @@
# date.rb: Written by Tadayoshi Funaba 1998-2011
require 'date_core'
-require 'date/format'
class Date
diff --git a/ext/date/lib/date/format.rb b/ext/date/lib/date/format.rb
deleted file mode 100644
index 892e7aacaa..0000000000
--- a/ext/date/lib/date/format.rb
+++ /dev/null
@@ -1 +0,0 @@
-# format.rb: Written by Tadayoshi Funaba 1999-2011
diff --git a/ext/dbm/dbm.c b/ext/dbm/dbm.c
index 1fdbaa0aca..527d6518d0 100644
--- a/ext/dbm/dbm.c
+++ b/ext/dbm/dbm.c
@@ -45,16 +45,16 @@ closed_dbm(void)
rb_raise(rb_eDBMError, "closed DBM file");
}
-#define GetDBM(obj, dbmp) {\
+#define GetDBM(obj, dbmp) do {\
Data_Get_Struct((obj), struct dbmdata, (dbmp));\
if ((dbmp) == 0) closed_dbm();\
if ((dbmp)->di_dbm == 0) closed_dbm();\
-}
+} while (0)
-#define GetDBM2(obj, data, dbm) {\
- GetDBM((obj), (data));\
- (dbm) = dbmp->di_dbm;\
-}
+#define GetDBM2(obj, dbmp, dbm) do {\
+ GetDBM((obj), (dbmp));\
+ (dbm) = (dbmp)->di_dbm;\
+} while (0)
static void
free_dbm(struct dbmdata *dbmp)
@@ -259,8 +259,11 @@ fdbm_fetch(VALUE obj, VALUE keystr, VALUE ifnone)
value = dbm_fetch(dbm, key);
if (value.dptr == 0) {
not_found:
- if (ifnone == Qnil && rb_block_given_p())
- return rb_yield(rb_tainted_str_new(key.dptr, key.dsize));
+ if (NIL_P(ifnone) && rb_block_given_p()) {
+ keystr = rb_str_dup(keystr);
+ OBJ_TAINT(keystr);
+ return rb_yield(keystr);
+ }
return ifnone;
}
return rb_tainted_str_new(value.dptr, value.dsize);
diff --git a/ext/digest/digest.c b/ext/digest/digest.c
index f1592f4725..2231452c42 100644
--- a/ext/digest/digest.c
+++ b/ext/digest/digest.c
@@ -521,7 +521,7 @@ get_digest_base_metadata(VALUE klass)
Data_Get_Struct(obj, rb_digest_metadata_t, algo);
switch (algo->api_version) {
- case 2:
+ case 3:
break;
/*
@@ -535,6 +535,14 @@ get_digest_base_metadata(VALUE klass)
return algo;
}
+static inline void
+algo_init(const rb_digest_metadata_t *algo, void *pctx)
+{
+ if (algo->init_func(pctx) != 1) {
+ rb_raise(rb_eRuntimeError, "Digest initialization failed.");
+ }
+}
+
static VALUE
rb_digest_base_alloc(VALUE klass)
{
@@ -549,7 +557,7 @@ rb_digest_base_alloc(VALUE klass)
algo = get_digest_base_metadata(klass);
pctx = xmalloc(algo->ctx_size);
- algo->init_func(pctx);
+ algo_init(algo, pctx);
obj = Data_Wrap_Struct(klass, 0, xfree, pctx);
@@ -587,7 +595,7 @@ rb_digest_base_reset(VALUE self)
Data_Get_Struct(self, void, pctx);
- algo->init_func(pctx);
+ algo_init(algo, pctx);
return self;
}
@@ -625,7 +633,7 @@ rb_digest_base_finish(VALUE self)
algo->finish_func(pctx, (unsigned char *)RSTRING_PTR(str));
/* avoid potential coredump caused by use of a finished context */
- algo->init_func(pctx);
+ algo_init(algo, pctx);
return str;
}
diff --git a/ext/digest/digest.h b/ext/digest/digest.h
index 6e4906c859..85848d5682 100644
--- a/ext/digest/digest.h
+++ b/ext/digest/digest.h
@@ -15,11 +15,11 @@
#include "ruby.h"
-#define RUBY_DIGEST_API_VERSION 2
+#define RUBY_DIGEST_API_VERSION 3
-typedef void (*rb_digest_hash_init_func_t)(void *);
+typedef int (*rb_digest_hash_init_func_t)(void *);
typedef void (*rb_digest_hash_update_func_t)(void *, unsigned char *, size_t);
-typedef void (*rb_digest_hash_finish_func_t)(void *, unsigned char *);
+typedef int (*rb_digest_hash_finish_func_t)(void *, unsigned char *);
typedef struct {
int api_version;
diff --git a/ext/digest/lib/digest/hmac.rb b/ext/digest/lib/digest/hmac.rb
deleted file mode 100644
index 3883badc45..0000000000
--- a/ext/digest/lib/digest/hmac.rb
+++ /dev/null
@@ -1,302 +0,0 @@
-# == License
-#
-# Copyright (c) 2006 Akinori MUSHA <knu@iDaemons.org>
-#
-# Documentation by Akinori MUSHA
-#
-# All rights reserved. You can redistribute and/or modify it under
-# the same terms as Ruby.
-#
-# $Id$
-#
-
-warn "use of the experimetal library 'digest/hmac' is discouraged; require 'openssl' and use OpenSSL::HMAC instead." if $VERBOSE
-
-require 'digest'
-
-module Digest
- # = digest/hmac.rb
- #
- # An experimental implementation of HMAC keyed-hashing algorithm
- #
- # == Overview
- #
- # CAUTION: Use of this library is discouraged, because this
- # implementation was meant to be experimental but somehow got into the
- # 1.9 series without being noticed. Please use OpenSSL::HMAC in the
- # "openssl" library instead.
- #
- # == Examples
- #
- # require 'digest/hmac'
- #
- # # one-liner example
- # puts Digest::HMAC.hexdigest("data", "hash key", Digest::SHA1)
- #
- # # rather longer one
- # hmac = Digest::HMAC.new("foo", Digest::RMD160)
- #
- # buf = ""
- # while stream.read(16384, buf)
- # hmac.update(buf)
- # end
- #
- # puts hmac.hexdigest
- #
- class HMAC < Digest::Class
-
- # Creates a Digest::HMAC instance.
-
- def initialize(key, digester)
- @md = digester.new
-
- block_len = @md.block_length
-
- if key.bytesize > block_len
- key = @md.digest(key)
- end
-
- ipad = Array.new(block_len, 0x36)
- opad = Array.new(block_len, 0x5c)
-
- key.bytes.each_with_index { |c, i|
- ipad[i] ^= c
- opad[i] ^= c
- }
-
- @key = key.freeze
- @ipad = ipad.pack('C*').freeze
- @opad = opad.pack('C*').freeze
- @md.update(@ipad)
- end
-
- def initialize_copy(other) # :nodoc:
- @md = other.instance_eval { @md.clone }
- end
-
- # call-seq:
- # hmac.update(string) -> hmac
- # hmac << string -> hmac
- #
- # Updates the hmac using a given +string+ and returns self.
- def update(text)
- @md.update(text)
- self
- end
- alias << update
-
- # call-seq:
- # hmac.reset -> hmac
- #
- # Resets the hmac to the initial state and returns self.
- def reset
- @md.reset
- @md.update(@ipad)
- self
- end
-
- def finish # :nodoc:
- d = @md.digest!
- @md.update(@opad)
- @md.update(d)
- @md.digest!
- end
- private :finish
-
- # call-seq:
- # hmac.digest_length -> Integer
- #
- # Returns the length in bytes of the hash value of the digest.
- def digest_length
- @md.digest_length
- end
-
- # call-seq:
- # hmac.block_length -> Integer
- #
- # Returns the block length in bytes of the hmac.
- def block_length
- @md.block_length
- end
-
- # call-seq:
- # hmac.inspect -> string
- #
- # Creates a printable version of the hmac object.
- def inspect
- sprintf('#<%s: key=%s, digest=%s>', self.class.name, @key.inspect, @md.inspect.sub(/^\#<(.*)>$/) { $1 });
- end
- end
-end
-
-if $0 == __FILE__
- eval DATA.gets(nil), nil, $0, DATA.lineno
-end
-
-__END__
-
-require 'test/unit'
-
-module TM_HMAC
- def test_s_hexdigest
- cases.each { |h|
- digesters.each { |d|
- assert_equal(h[:hexdigest], Digest::HMAC.hexdigest(h[:data], h[:key], d))
- }
- }
- end
-
- def test_hexdigest
- cases.each { |h|
- digesters.each { |d|
- hmac = Digest::HMAC.new(h[:key], d)
-
- hmac.update(h[:data])
-
- assert_equal(h[:hexdigest], hmac.hexdigest)
- }
- }
- end
-
- def test_reset
- cases.each { |h|
- digesters.each { |d|
- hmac = Digest::HMAC.new(h[:key], d)
- hmac.update("test")
- hmac.reset
- hmac.update(h[:data])
-
- assert_equal(h[:hexdigest], hmac.hexdigest)
- }
- }
- end
-end
-
-class TC_HMAC_MD5 < Test::Unit::TestCase
- include TM_HMAC
-
- def digesters
- [Digest::MD5, Digest::MD5.new]
- end
-
- # Taken from RFC 2202: Test Cases for HMAC-MD5 and HMAC-SHA-1
- def cases
- [
- {
- :key => "\x0b" * 16,
- :data => "Hi There",
- :hexdigest => "9294727a3638bb1c13f48ef8158bfc9d",
- }, {
- :key => "Jefe",
- :data => "what do ya want for nothing?",
- :hexdigest => "750c783e6ab0b503eaa86e310a5db738",
- }, {
- :key => "\xaa" * 16,
- :data => "\xdd" * 50,
- :hexdigest => "56be34521d144c88dbb8c733f0e8b3f6",
- }, {
- :key => "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
- :data => "\xcd" * 50,
- :hexdigest => "697eaf0aca3a3aea3a75164746ffaa79",
- }, {
- :key => "\x0c" * 16,
- :data => "Test With Truncation",
- :hexdigest => "56461ef2342edc00f9bab995690efd4c",
- }, {
- :key => "\xaa" * 80,
- :data => "Test Using Larger Than Block-Size Key - Hash Key First",
- :hexdigest => "6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd",
- }, {
- :key => "\xaa" * 80,
- :data => "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
- :hexdigest => "6f630fad67cda0ee1fb1f562db3aa53e",
- }
- ]
- end
-end
-
-class TC_HMAC_SHA1 < Test::Unit::TestCase
- include TM_HMAC
-
- def digesters
- [Digest::SHA1, Digest::SHA1.new]
- end
-
- # Taken from RFC 2202: Test Cases for HMAC-MD5 and HMAC-SHA-1
- def cases
- [
- {
- :key => "\x0b" * 20,
- :data => "Hi There",
- :hexdigest => "b617318655057264e28bc0b6fb378c8ef146be00",
- }, {
- :key => "Jefe",
- :data => "what do ya want for nothing?",
- :hexdigest => "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79",
- }, {
- :key => "\xaa" * 20,
- :data => "\xdd" * 50,
- :hexdigest => "125d7342b9ac11cd91a39af48aa17b4f63f175d3",
- }, {
- :key => "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
- :data => "\xcd" * 50,
- :hexdigest => "4c9007f4026250c6bc8414f9bf50c86c2d7235da",
- }, {
- :key => "\x0c" * 20,
- :data => "Test With Truncation",
- :hexdigest => "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04",
- }, {
- :key => "\xaa" * 80,
- :data => "Test Using Larger Than Block-Size Key - Hash Key First",
- :hexdigest => "aa4ae5e15272d00e95705637ce8a3b55ed402112",
- }, {
- :key => "\xaa" * 80,
- :data => "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
- :hexdigest => "e8e99d0f45237d786d6bbaa7965c7808bbff1a91",
- }
- ]
- end
-end
-
-class TC_HMAC_RMD160 < Test::Unit::TestCase
- include TM_HMAC
-
- def digesters
- [Digest::RMD160, Digest::RMD160.new]
- end
-
- # Taken from RFC 2286: Test Cases for HMAC-RIPEMD160 and HMAC-RIPEMD128
- def cases
- [
- {
- :key => "\x0b" * 20,
- :data => "Hi There",
- :hexdigest => "24cb4bd67d20fc1a5d2ed7732dcc39377f0a5668",
- }, {
- :key => "Jefe",
- :data => "what do ya want for nothing?",
- :hexdigest => "dda6c0213a485a9e24f4742064a7f033b43c4069",
- }, {
- :key => "\xaa" * 20,
- :data => "\xdd" * 50,
- :hexdigest => "b0b105360de759960ab4f35298e116e295d8e7c1",
- }, {
- :key => "\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
- :data => "\xcd" * 50,
- :hexdigest => "d5ca862f4d21d5e610e18b4cf1beb97a4365ecf4",
- }, {
- :key => "\x0c" * 20,
- :data => "Test With Truncation",
- :hexdigest => "7619693978f91d90539ae786500ff3d8e0518e39",
- }, {
- :key => "\xaa" * 80,
- :data => "Test Using Larger Than Block-Size Key - Hash Key First",
- :hexdigest => "6466ca07ac5eac29e1bd523e5ada7605b791fd8b",
- }, {
- :key => "\xaa" * 80,
- :data => "Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
- :hexdigest => "69ea60798d71616cce5fd0871e23754cd75d5a0a",
- }
- ]
- end
-end
diff --git a/ext/digest/md5/md5.c b/ext/digest/md5/md5.c
index 8d7d33c5a6..4ff280bb0a 100644
--- a/ext/digest/md5/md5.c
+++ b/ext/digest/md5/md5.c
@@ -350,7 +350,7 @@ md5_process(MD5_CTX *pms, const uint8_t *data /*[64]*/)
pms->state[3] += d;
}
-void
+int
MD5_Init(MD5_CTX *pms)
{
pms->count[0] = pms->count[1] = 0;
@@ -358,6 +358,7 @@ MD5_Init(MD5_CTX *pms)
pms->state[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
pms->state[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
pms->state[3] = 0x10325476;
+ return 1;
}
void
@@ -398,7 +399,7 @@ MD5_Update(MD5_CTX *pms, const uint8_t *data, size_t nbytes)
memcpy(pms->buffer, p, left);
}
-void
+int
MD5_Finish(MD5_CTX *pms, uint8_t *digest)
{
static const uint8_t pad[64] = {
@@ -419,4 +420,5 @@ MD5_Finish(MD5_CTX *pms, uint8_t *digest)
MD5_Update(pms, data, 8);
for (i = 0; i < 16; ++i)
digest[i] = (uint8_t)(pms->state[i >> 2] >> ((i & 3) << 3));
+ return 1;
}
diff --git a/ext/digest/md5/md5.h b/ext/digest/md5/md5.h
index f4580ef5e7..a0faa25e48 100644
--- a/ext/digest/md5/md5.h
+++ b/ext/digest/md5/md5.h
@@ -69,9 +69,9 @@ typedef struct md5_state_s {
#define MD5_Finish rb_Digest_MD5_Finish
#endif
-void MD5_Init _((MD5_CTX *pms));
+int MD5_Init _((MD5_CTX *pms));
void MD5_Update _((MD5_CTX *pms, const uint8_t *data, size_t nbytes));
-void MD5_Finish _((MD5_CTX *pms, uint8_t *digest));
+int MD5_Finish _((MD5_CTX *pms, uint8_t *digest));
#define MD5_BLOCK_LENGTH 64
#define MD5_DIGEST_LENGTH 16
diff --git a/ext/digest/rmd160/rmd160.c b/ext/digest/rmd160/rmd160.c
index bac77833b1..058d004f3a 100644
--- a/ext/digest/rmd160/rmd160.c
+++ b/ext/digest/rmd160/rmd160.c
@@ -124,7 +124,7 @@
/********************************************************************/
-void
+int
RMD160_Init(RMD160_CTX *context)
{
@@ -138,6 +138,7 @@ RMD160_Init(RMD160_CTX *context)
context->state[4] = 0xc3d2e1f0U;
context->length[0] = context->length[1] = 0;
context->buflen = 0;
+ return 1;
}
/********************************************************************/
@@ -412,7 +413,7 @@ RMD160_Update(RMD160_CTX *context, const uint8_t *data, size_t nbytes)
/********************************************************************/
-void
+int
RMD160_Finish(RMD160_CTX *context, uint8_t digest[20])
{
uint32_t i;
@@ -456,6 +457,7 @@ RMD160_Finish(RMD160_CTX *context, uint8_t digest[20])
digest[i + 3] = (context->state[i>>2] >> 24);
}
}
+ return 1;
}
/************************ end of file rmd160.c **********************/
diff --git a/ext/digest/rmd160/rmd160.h b/ext/digest/rmd160/rmd160.h
index 2c98f11cd0..098fa05a88 100644
--- a/ext/digest/rmd160/rmd160.h
+++ b/ext/digest/rmd160/rmd160.h
@@ -43,10 +43,10 @@ typedef struct {
#endif
__BEGIN_DECLS
-void RMD160_Init _((RMD160_CTX *));
+int RMD160_Init _((RMD160_CTX *));
void RMD160_Transform _((uint32_t[5], const uint32_t[16]));
void RMD160_Update _((RMD160_CTX *, const uint8_t *, size_t));
-void RMD160_Finish _((RMD160_CTX *, uint8_t[20]));
+int RMD160_Finish _((RMD160_CTX *, uint8_t[20]));
__END_DECLS
#define RMD160_BLOCK_LENGTH 64
diff --git a/ext/digest/sha1/sha1.c b/ext/digest/sha1/sha1.c
index 6196ca6b82..5311227549 100644
--- a/ext/digest/sha1/sha1.c
+++ b/ext/digest/sha1/sha1.c
@@ -199,7 +199,7 @@ void SHA1_Transform(uint32_t state[5], const uint8_t buffer[64])
/*
* SHA1_Init - Initialize new context
*/
-void SHA1_Init(SHA1_CTX *context)
+int SHA1_Init(SHA1_CTX *context)
{
_DIAGASSERT(context != 0);
@@ -211,6 +211,7 @@ void SHA1_Init(SHA1_CTX *context)
context->state[3] = 0x10325476;
context->state[4] = 0xC3D2E1F0;
context->count[0] = context->count[1] = 0;
+ return 1;
}
@@ -244,7 +245,7 @@ void SHA1_Update(SHA1_CTX *context, const uint8_t *data, size_t len)
/*
* Add padding and return the message digest.
*/
-void SHA1_Finish(SHA1_CTX* context, uint8_t digest[20])
+int SHA1_Finish(SHA1_CTX* context, uint8_t digest[20])
{
size_t i;
uint8_t finalcount[8];
@@ -266,4 +267,5 @@ void SHA1_Finish(SHA1_CTX* context, uint8_t digest[20])
digest[i] = (uint8_t)
((context->state[i>>2] >> ((3-(i & 3)) * 8) ) & 255);
}
+ return 1;
}
diff --git a/ext/digest/sha1/sha1.h b/ext/digest/sha1/sha1.h
index 55997e73dd..6f1c388cf2 100644
--- a/ext/digest/sha1/sha1.h
+++ b/ext/digest/sha1/sha1.h
@@ -28,9 +28,9 @@ typedef struct {
#endif
void SHA1_Transform _((uint32_t state[5], const uint8_t buffer[64]));
-void SHA1_Init _((SHA1_CTX *context));
+int SHA1_Init _((SHA1_CTX *context));
void SHA1_Update _((SHA1_CTX *context, const uint8_t *data, size_t len));
-void SHA1_Finish _((SHA1_CTX *context, uint8_t digest[20]));
+int SHA1_Finish _((SHA1_CTX *context, uint8_t digest[20]));
#define SHA1_BLOCK_LENGTH 64
#define SHA1_DIGEST_LENGTH 20
diff --git a/ext/digest/sha2/sha2.c b/ext/digest/sha2/sha2.c
index 3457790eea..d0629a2b64 100644
--- a/ext/digest/sha2/sha2.c
+++ b/ext/digest/sha2/sha2.c
@@ -341,13 +341,14 @@ static const char *sha2_hex_digits = "0123456789abcdef";
/*** SHA-256: *********************************************************/
-void SHA256_Init(SHA256_CTX* context) {
+int SHA256_Init(SHA256_CTX* context) {
if (context == (SHA256_CTX*)0) {
- return;
+ return 0;
}
MEMCPY_BCOPY(context->state, sha256_initial_hash_value, SHA256_DIGEST_LENGTH);
MEMSET_BZERO(context->buffer, SHA256_BLOCK_LENGTH);
context->bitcount = 0;
+ return 1;
}
#ifdef SHA2_UNROLL_TRANSFORM
@@ -574,7 +575,7 @@ void SHA256_Update(SHA256_CTX* context, const sha2_byte *data, size_t len) {
usedspace = freespace = 0;
}
-void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) {
+int SHA256_Final(sha2_byte digest[], SHA256_CTX* context) {
sha2_word32 *d = (sha2_word32*)digest;
unsigned int usedspace;
@@ -636,6 +637,7 @@ void SHA256_Final(sha2_byte digest[], SHA256_CTX* context) {
/* Clean up state data: */
MEMSET_BZERO(context, sizeof(*context));
usedspace = 0;
+ return 1;
}
char *SHA256_End(SHA256_CTX* context, char buffer[]) {
@@ -670,13 +672,14 @@ char* SHA256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_S
/*** SHA-512: *********************************************************/
-void SHA512_Init(SHA512_CTX* context) {
+int SHA512_Init(SHA512_CTX* context) {
if (context == (SHA512_CTX*)0) {
- return;
+ return 0;
}
MEMCPY_BCOPY(context->state, sha512_initial_hash_value, SHA512_DIGEST_LENGTH);
MEMSET_BZERO(context->buffer, SHA512_BLOCK_LENGTH);
context->bitcount[0] = context->bitcount[1] = 0;
+ return 1;
}
#ifdef SHA2_UNROLL_TRANSFORM
@@ -940,7 +943,7 @@ void SHA512_Last(SHA512_CTX* context) {
SHA512_Transform(context, (sha2_word64*)context->buffer);
}
-void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) {
+int SHA512_Final(sha2_byte digest[], SHA512_CTX* context) {
sha2_word64 *d = (sha2_word64*)digest;
/* Sanity check: */
@@ -967,6 +970,7 @@ void SHA512_Final(sha2_byte digest[], SHA512_CTX* context) {
/* Zero out state data */
MEMSET_BZERO(context, sizeof(*context));
+ return 1;
}
char *SHA512_End(SHA512_CTX* context, char buffer[]) {
@@ -1001,20 +1005,21 @@ char* SHA512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_S
/*** SHA-384: *********************************************************/
-void SHA384_Init(SHA384_CTX* context) {
+int SHA384_Init(SHA384_CTX* context) {
if (context == (SHA384_CTX*)0) {
- return;
+ return 0;
}
MEMCPY_BCOPY(context->state, sha384_initial_hash_value, SHA512_DIGEST_LENGTH);
MEMSET_BZERO(context->buffer, SHA384_BLOCK_LENGTH);
context->bitcount[0] = context->bitcount[1] = 0;
+ return 1;
}
void SHA384_Update(SHA384_CTX* context, const sha2_byte* data, size_t len) {
SHA512_Update((SHA512_CTX*)context, data, len);
}
-void SHA384_Final(sha2_byte digest[], SHA384_CTX* context) {
+int SHA384_Final(sha2_byte digest[], SHA384_CTX* context) {
sha2_word64 *d = (sha2_word64*)digest;
/* Sanity check: */
@@ -1041,6 +1046,7 @@ void SHA384_Final(sha2_byte digest[], SHA384_CTX* context) {
/* Zero out state data */
MEMSET_BZERO(context, sizeof(*context));
+ return 1;
}
char *SHA384_End(SHA384_CTX* context, char buffer[]) {
diff --git a/ext/digest/sha2/sha2.h b/ext/digest/sha2/sha2.h
index 465398ee19..e58f15ae12 100644
--- a/ext/digest/sha2/sha2.h
+++ b/ext/digest/sha2/sha2.h
@@ -165,52 +165,52 @@ typedef SHA512_CTX SHA384_CTX;
#ifndef NOPROTO
-void SHA256_Init(SHA256_CTX *);
+int SHA256_Init(SHA256_CTX *);
void SHA256_Update(SHA256_CTX*, const uint8_t*, size_t);
-void SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*);
+int SHA256_Final(uint8_t[SHA256_DIGEST_LENGTH], SHA256_CTX*);
char* SHA256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]);
char* SHA256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]);
-void SHA384_Init(SHA384_CTX*);
+int SHA384_Init(SHA384_CTX*);
void SHA384_Update(SHA384_CTX*, const uint8_t*, size_t);
-void SHA384_Final(uint8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*);
+int SHA384_Final(uint8_t[SHA384_DIGEST_LENGTH], SHA384_CTX*);
char* SHA384_End(SHA384_CTX*, char[SHA384_DIGEST_STRING_LENGTH]);
char* SHA384_Data(const uint8_t*, size_t, char[SHA384_DIGEST_STRING_LENGTH]);
-void SHA512_Init(SHA512_CTX*);
+int SHA512_Init(SHA512_CTX*);
void SHA512_Update(SHA512_CTX*, const uint8_t*, size_t);
-void SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
+int SHA512_Final(uint8_t[SHA512_DIGEST_LENGTH], SHA512_CTX*);
char* SHA512_End(SHA512_CTX*, char[SHA512_DIGEST_STRING_LENGTH]);
char* SHA512_Data(const uint8_t*, size_t, char[SHA512_DIGEST_STRING_LENGTH]);
#else /* NOPROTO */
-void SHA256_Init();
+int SHA256_Init();
void SHA256_Update();
#ifdef RUBY
-void SHA256_Finish();
+int SHA256_Finish();
#else
-void SHA256_Final();
+int SHA256_Final();
#endif /* RUBY */
char* SHA256_End();
char* SHA256_Data();
-void SHA384_Init();
+int SHA384_Init();
void SHA384_Update();
#ifdef RUBY
-void SHA384_Finish();
+int SHA384_Finish();
#else
-void SHA384_Final();
+int SHA384_Final();
#endif /* RUBY */
char* SHA384_End();
char* SHA384_Data();
-void SHA512_Init();
+int SHA512_Init();
void SHA512_Update();
#ifdef RUBY
-void SHA512_Finish();
+int SHA512_Finish();
#else
-void SHA512_Final();
+int SHA512_Final();
#endif /* RUBY */
char* SHA512_End();
char* SHA512_Data();
diff --git a/ext/dl/callback/extconf.rb b/ext/dl/callback/extconf.rb
index 6c3387670d..f3b79b0a33 100644
--- a/ext/dl/callback/extconf.rb
+++ b/ext/dl/callback/extconf.rb
@@ -1,6 +1,6 @@
require 'mkmf'
-if compiled?("dl")
+begin
callbacks = (0..8).map{|i| "callback-#{i}"}.unshift("callback")
callback_srcs = callbacks.map{|basename| "#{basename}.c"}
callback_objs = callbacks.map{|basename| "#{basename}.o"}
diff --git a/ext/dl/dl.c b/ext/dl/dl.c
index 23f5d7fe6e..7ad77dd6b2 100644
--- a/ext/dl/dl.c
+++ b/ext/dl/dl.c
@@ -81,7 +81,7 @@ rb_dl_malloc(VALUE self, VALUE size)
{
void *ptr;
- ptr = (void*)ruby_xmalloc(NUM2INT(size));
+ ptr = (void*)ruby_xmalloc(NUM2SIZET(size));
return PTR2NUM(ptr);
}
@@ -97,7 +97,7 @@ rb_dl_realloc(VALUE self, VALUE addr, VALUE size)
{
void *ptr = NUM2PTR(addr);
- ptr = (void*)ruby_xrealloc(ptr, NUM2INT(size));
+ ptr = (void*)ruby_xrealloc(ptr, NUM2SIZET(size));
return PTR2NUM(ptr);
}
diff --git a/ext/etc/depend b/ext/etc/depend
index 2db89d969c..a73a18465a 100644
--- a/ext/etc/depend
+++ b/ext/etc/depend
@@ -1,3 +1,9 @@
-etc.o : etc.c $(HDRS) $(ruby_headers) \
+etc.o : etc.c constdefs.h $(HDRS) $(ruby_headers) \
+ $(hdrdir)/ruby/io.h \
$(hdrdir)/ruby/encoding.h \
$(hdrdir)/ruby/oniguruma.h
+
+constdefs.h : $(srcdir)/mkconstants.rb
+ @echo "generating constant definitions"
+ @$(RUBY) $(srcdir)/mkconstants.rb -o constdefs.h
+
diff --git a/ext/etc/etc.c b/ext/etc/etc.c
index 3d195e44c6..6168ed1510 100644
--- a/ext/etc/etc.c
+++ b/ext/etc/etc.c
@@ -9,6 +9,7 @@
#include "ruby.h"
#include "ruby/encoding.h"
+#include "ruby/io.h"
#include <sys/types.h>
#ifdef HAVE_UNISTD_H
@@ -23,6 +24,12 @@
#include <grp.h>
#endif
+#include <errno.h>
+
+#ifdef HAVE_SYS_UTSNAME_H
+#include <sys/utsname.h>
+#endif
+
static VALUE sPasswd;
#ifdef HAVE_GETGRENT
static VALUE sGroup;
@@ -33,6 +40,7 @@ static VALUE sGroup;
#ifndef CSIDL_COMMON_APPDATA
#define CSIDL_COMMON_APPDATA 35
#endif
+#define HAVE_UNAME 1
#endif
#ifndef _WIN32
@@ -40,6 +48,8 @@ char *getenv();
#endif
char *getlogin();
+#include "constdefs.h"
+
/* call-seq:
* getlogin -> String
*
@@ -67,15 +77,8 @@ etc_getlogin(VALUE obj)
login = getenv("USER");
#endif
- if (login) {
-#ifdef _WIN32
- rb_encoding *extenc = rb_utf8_encoding();
-#else
- rb_encoding *extenc = rb_locale_encoding();
-#endif
- return rb_external_str_new_with_enc(login, strlen(login), extenc);
- }
-
+ if (login)
+ return rb_tainted_str_new2(login);
return Qnil;
}
@@ -643,6 +646,251 @@ etc_systmpdir(void)
return tmpdir;
}
+#ifdef HAVE_UNAME
+/*
+ * Returns the system information obtained by uname system call.
+ *
+ * The return value is a hash which has 5 keys at least:
+ * :sysname, :nodename, :release, :version, :machine
+ *
+ * Example:
+ *
+ * require 'etc'
+ * require 'pp'
+ *
+ * pp Etc.uname
+ * #=> {:sysname=>"Linux",
+ * # :nodename=>"boron",
+ * # :release=>"2.6.18-6-xen-686",
+ * # :version=>"#1 SMP Thu Nov 5 19:54:42 UTC 2009",
+ * # :machine=>"i686"}
+ *
+ */
+static VALUE
+etc_uname(VALUE obj)
+{
+#ifdef _WIN32
+ OSVERSIONINFOW v;
+ SYSTEM_INFO s;
+ const char *sysname, *mach;
+ VALUE result, release, version;
+ VALUE vbuf, nodename = Qnil;
+ DWORD len = 0;
+ WCHAR *buf;
+
+ v.dwOSVersionInfoSize = sizeof(v);
+ if (!GetVersionExW(&v))
+ rb_sys_fail("GetVersionEx");
+
+ result = rb_hash_new();
+ switch (v.dwPlatformId) {
+ case VER_PLATFORM_WIN32s:
+ sysname = "Win32s";
+ break;
+ case VER_PLATFORM_WIN32_NT:
+ sysname = "Windows_NT";
+ break;
+ case VER_PLATFORM_WIN32_WINDOWS:
+ default:
+ sysname = "Windows";
+ break;
+ }
+ rb_hash_aset(result, ID2SYM(rb_intern("sysname")), rb_str_new_cstr(sysname));
+ release = rb_sprintf("%lu.%lu.%lu", v.dwMajorVersion, v.dwMinorVersion, v.dwBuildNumber);
+ rb_hash_aset(result, ID2SYM(rb_intern("release")), release);
+ version = rb_sprintf("%s Version %"PRIsVALUE": %"PRIsVALUE, sysname, release,
+ rb_w32_conv_from_wchar(v.szCSDVersion, rb_utf8_encoding()));
+ rb_hash_aset(result, ID2SYM(rb_intern("version")), version);
+
+# if defined _MSC_VER && _MSC_VER < 1300
+# define GET_COMPUTER_NAME(ptr, plen) GetComputerNameW(ptr, plen)
+# else
+# define GET_COMPUTER_NAME(ptr, plen) GetComputerNameExW(ComputerNameDnsFullyQualified, ptr, plen)
+# endif
+ GET_COMPUTER_NAME(NULL, &len);
+ buf = ALLOCV_N(WCHAR, vbuf, len);
+ if (GET_COMPUTER_NAME(buf, &len)) {
+ nodename = rb_w32_conv_from_wchar(buf, rb_utf8_encoding());
+ }
+ ALLOCV_END(vbuf);
+ if (NIL_P(nodename)) nodename = rb_str_new(0, 0);
+ rb_hash_aset(result, ID2SYM(rb_intern("nodename")), nodename);
+
+# ifndef PROCESSOR_ARCHITECTURE_AMD64
+# define PROCESSOR_ARCHITECTURE_AMD64 9
+# endif
+# ifndef PROCESSOR_ARCHITECTURE_IA64
+# define PROCESSOR_ARCHITECTURE_IA64 6
+# endif
+# ifndef PROCESSOR_ARCHITECTURE_INTEL
+# define PROCESSOR_ARCHITECTURE_INTEL 0
+# endif
+ GetSystemInfo(&s);
+ switch (s.wProcessorArchitecture) {
+ case PROCESSOR_ARCHITECTURE_AMD64:
+ mach = "x64";
+ break;
+ case PROCESSOR_ARCHITECTURE_ARM:
+ mach = "ARM";
+ break;
+ case PROCESSOR_ARCHITECTURE_IA64:
+ mach = "IA64";
+ break;
+ case PROCESSOR_ARCHITECTURE_INTEL:
+ mach = "x86";
+ break;
+ default:
+ mach = "unknown";
+ break;
+ }
+
+ rb_hash_aset(result, ID2SYM(rb_intern("machine")), rb_str_new_cstr(mach));
+#else
+ struct utsname u;
+ int ret;
+ VALUE result;
+
+ ret = uname(&u);
+ if (ret == -1)
+ rb_sys_fail("uname");
+
+ result = rb_hash_new();
+ rb_hash_aset(result, ID2SYM(rb_intern("sysname")), rb_str_new_cstr(u.sysname));
+ rb_hash_aset(result, ID2SYM(rb_intern("nodename")), rb_str_new_cstr(u.nodename));
+ rb_hash_aset(result, ID2SYM(rb_intern("release")), rb_str_new_cstr(u.release));
+ rb_hash_aset(result, ID2SYM(rb_intern("version")), rb_str_new_cstr(u.version));
+ rb_hash_aset(result, ID2SYM(rb_intern("machine")), rb_str_new_cstr(u.machine));
+#endif
+
+ return result;
+}
+#else
+#define etc_uname rb_f_notimplement
+#endif
+
+#ifdef HAVE_SYSCONF
+/*
+ * Returns system configuration variable using sysconf().
+ *
+ * _name_ should be a constant under <code>Etc</code> which begins with <code>SC_</code>.
+ *
+ * The return value is an integer or nil.
+ * nil means indefinite limit. (sysconf() returns -1 but errno is not set.)
+ *
+ * Etc.sysconf(Etc::SC_ARG_MAX) #=> 2097152
+ *
+ * # Number of processors.
+ * # It is not standardized.
+ * Etc.sysconf(Etc::SC_NPROCESSORS_ONLN) #=> 4
+ *
+ */
+static VALUE
+etc_sysconf(VALUE obj, VALUE arg)
+{
+ int name;
+ long ret;
+
+ name = NUM2INT(arg);
+
+ errno = 0;
+ ret = sysconf(name);
+ if (ret == -1) {
+ if (errno == 0) /* no limit */
+ return Qnil;
+ rb_sys_fail("sysconf");
+ }
+ return LONG2NUM(ret);
+}
+#else
+#define etc_sysconf rb_f_notimplement
+#endif
+
+#ifdef HAVE_CONFSTR
+/*
+ * Returns system configuration variable using confstr().
+ *
+ * _name_ should be a constant under <code>Etc</code> which begins with <code>CS_</code>.
+ *
+ * The return value is a string or nil.
+ * nil means no configuration-defined value. (confstr() returns 0 but errno is not set.)
+ *
+ * Etc.confstr(Etc::CS_PATH) #=> "/bin:/usr/bin"
+ *
+ * # GNU/Linux
+ * Etc.confstr(Etc::CS_GNU_LIBC_VERSION) #=> "glibc 2.18"
+ * Etc.confstr(Etc::CS_GNU_LIBPTHREAD_VERSION) #=> "NPTL 2.18"
+ *
+ */
+static VALUE
+etc_confstr(VALUE obj, VALUE arg)
+{
+ int name;
+ char localbuf[128], *buf = localbuf;
+ size_t bufsize = sizeof(localbuf), ret;
+ VALUE tmp;
+
+ name = NUM2INT(arg);
+
+ errno = 0;
+ ret = confstr(name, buf, bufsize);
+ if (bufsize < ret) {
+ bufsize = ret;
+ buf = ALLOCV_N(char, tmp, bufsize);
+ errno = 0;
+ ret = confstr(name, buf, bufsize);
+ }
+ if (bufsize < ret)
+ rb_bug("required buffer size for confstr() changed dynamically.");
+ if (ret == 0) {
+ if (errno == 0) /* no configuration-defined value */
+ return Qnil;
+ rb_sys_fail("confstr");
+ }
+ return rb_str_new_cstr(buf);
+}
+#else
+#define etc_confstr rb_f_notimplement
+#endif
+
+#ifdef HAVE_FPATHCONF
+/*
+ * Returns pathname configuration variable using fpathconf().
+ *
+ * _name_ should be a constant under <code>Etc</code> which begins with <code>PC_</code>.
+ *
+ * The return value is an integer or nil.
+ * nil means indefinite limit. (fpathconf() returns -1 but errno is not set.)
+ *
+ * require 'etc'
+ * IO.pipe {|r, w|
+ * p w.pathconf(Etc::PC_PIPE_BUF) #=> 4096
+ * }
+ *
+ */
+static VALUE
+io_pathconf(VALUE io, VALUE arg)
+{
+ int name;
+ long ret;
+ rb_io_t *fptr;
+
+ name = NUM2INT(arg);
+
+ GetOpenFile(io, fptr);
+
+ errno = 0;
+ ret = fpathconf(fptr->fd, name);
+ if (ret == -1) {
+ if (errno == 0) /* no limit */
+ return Qnil;
+ rb_sys_fail("fpathconf");
+ }
+ return LONG2NUM(ret);
+}
+#else
+#define io_pathconf rb_f_notimplement
+#endif
+
/*
* The Etc module provides access to information typically stored in
* files in the /etc directory on Unix systems.
@@ -675,6 +923,8 @@ Init_etc(void)
VALUE mEtc;
mEtc = rb_define_module("Etc");
+ init_constants(mEtc);
+
rb_define_module_function(mEtc, "getlogin", etc_getlogin, 0);
rb_define_module_function(mEtc, "getpwuid", etc_getpwuid, -1);
@@ -692,6 +942,10 @@ Init_etc(void)
rb_define_module_function(mEtc, "getgrent", etc_getgrent, 0);
rb_define_module_function(mEtc, "sysconfdir", etc_sysconfdir, 0);
rb_define_module_function(mEtc, "systmpdir", etc_systmpdir, 0);
+ rb_define_module_function(mEtc, "uname", etc_uname, 0);
+ rb_define_module_function(mEtc, "sysconf", etc_sysconf, 1);
+ rb_define_module_function(mEtc, "confstr", etc_confstr, 1);
+ rb_define_method(rb_cIO, "pathconf", io_pathconf, 1);
sPasswd = rb_struct_define_under(mEtc, "Passwd",
"name",
diff --git a/ext/etc/extconf.rb b/ext/etc/extconf.rb
index 1967560cd4..c6b41a4c92 100644
--- a/ext/etc/extconf.rb
+++ b/ext/etc/extconf.rb
@@ -1,30 +1,43 @@
require 'mkmf'
+headers = []
+%w[sys/utsname.h].each {|h|
+ if have_header(h, headers)
+ headers << h
+ end
+}
have_library("sun", "getpwnam") # NIS (== YP) interface for IRIX 4
-a = have_func("getlogin")
-b = have_func("getpwent")
-c = have_func("getgrent")
+have_func("uname((struct utsname *)NULL)", headers)
+have_func("getlogin")
+have_func("getpwent")
+have_func("getgrent")
sysconfdir = RbConfig.expand(RbConfig::CONFIG["sysconfdir"].dup, "prefix"=>"", "DESTDIR"=>"")
$defs.push("-DSYSCONFDIR=#{Shellwords.escape(sysconfdir.dump)}")
-if a or b or c or sysconfdir
- have_struct_member('struct passwd', 'pw_gecos', 'pwd.h')
- have_struct_member('struct passwd', 'pw_change', 'pwd.h')
- have_struct_member('struct passwd', 'pw_quota', 'pwd.h')
- if have_struct_member('struct passwd', 'pw_age', 'pwd.h')
- case what_type?('struct passwd', 'pw_age', 'pwd.h')
- when "string"
- f = "safe_setup_str"
- when "long long"
- f = "LL2NUM"
- else
- f = "INT2NUM"
- end
- $defs.push("-DPW_AGE2VAL="+f)
+
+have_func("sysconf")
+have_func("confstr")
+have_func("fpathconf")
+
+have_struct_member('struct passwd', 'pw_gecos', 'pwd.h')
+have_struct_member('struct passwd', 'pw_change', 'pwd.h')
+have_struct_member('struct passwd', 'pw_quota', 'pwd.h')
+if have_struct_member('struct passwd', 'pw_age', 'pwd.h')
+ case what_type?('struct passwd', 'pw_age', 'pwd.h')
+ when "string"
+ f = "safe_setup_str"
+ when "long long"
+ f = "LL2NUM"
+ else
+ f = "INT2NUM"
end
- have_struct_member('struct passwd', 'pw_class', 'pwd.h')
- have_struct_member('struct passwd', 'pw_comment', 'pwd.h') unless /cygwin/ === RUBY_PLATFORM
- have_struct_member('struct passwd', 'pw_expire', 'pwd.h')
- have_struct_member('struct passwd', 'pw_passwd', 'pwd.h')
- have_struct_member('struct group', 'gr_passwd', 'grp.h')
- create_makefile("etc")
+ $defs.push("-DPW_AGE2VAL="+f)
end
+have_struct_member('struct passwd', 'pw_class', 'pwd.h')
+have_struct_member('struct passwd', 'pw_comment', 'pwd.h') unless /cygwin/ === RUBY_PLATFORM
+have_struct_member('struct passwd', 'pw_expire', 'pwd.h')
+have_struct_member('struct passwd', 'pw_passwd', 'pwd.h')
+have_struct_member('struct group', 'gr_passwd', 'grp.h')
+
+$distcleanfiles << "constdefs.h"
+
+create_makefile("etc")
diff --git a/ext/etc/mkconstants.rb b/ext/etc/mkconstants.rb
new file mode 100644
index 0000000000..c9fddfd132
--- /dev/null
+++ b/ext/etc/mkconstants.rb
@@ -0,0 +1,331 @@
+require 'optparse'
+require 'erb'
+
+C_ESC = {
+ "\\" => "\\\\",
+ '"' => '\"',
+ "\n" => '\n',
+}
+
+0x00.upto(0x1f) {|ch| C_ESC[[ch].pack("C")] ||= "\\%03o" % ch }
+0x7f.upto(0xff) {|ch| C_ESC[[ch].pack("C")] = "\\%03o" % ch }
+C_ESC_PAT = Regexp.union(*C_ESC.keys)
+
+def c_str(str)
+ '"' + str.gsub(C_ESC_PAT) {|s| C_ESC[s]} + '"'
+end
+
+opt = OptionParser.new
+
+opt.def_option('-h', 'help') {
+ puts opt
+ exit 0
+}
+
+opt_o = nil
+opt.def_option('-o FILE', 'specify output file') {|filename|
+ opt_o = filename
+}
+
+opt_H = nil
+opt.def_option('-H FILE', 'specify output header file') {|filename|
+ opt_H = filename
+}
+
+opt.parse!
+
+h = {}
+COMMENTS = {}
+
+DATA.each_line {|s|
+ next if /\A\s*(\#|\z)/ =~ s
+ name, default_value, comment = s.chomp.split(/\s+/, 3)
+
+ default_value = nil if default_value == 'nil'
+
+ if h.has_key? name
+ warn "#{$.}: warning: duplicate name: #{name}"
+ next
+ end
+ h[name] = default_value
+ COMMENTS[name] = comment if comment
+}
+DEFS = h.to_a
+
+def each_const
+ DEFS.each {|name, default_value|
+ yield name, default_value
+ }
+end
+
+def each_name(pat)
+ DEFS.each {|name, default_value|
+ next if pat !~ name
+ yield name
+ }
+end
+
+ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_decls")
+% each_const {|name, default_value|
+#if !defined(<%=name%>)
+# if defined(HAVE_CONST_<%=name.upcase%>)
+# define <%=name%> <%=name%>
+%if default_value
+# else
+# define <%=name%> <%=default_value%>
+%end
+# endif
+#endif
+% }
+EOS
+
+ERB.new(<<'EOS', nil, '%').def_method(Object, "gen_const_defs")
+% each_const {|name, default_value|
+#if defined(<%=name%>)
+% if comment = COMMENTS[name]
+ /* <%=comment%> */
+% end
+ rb_define_const(mod, <%=c_str name.sub(/\A_*/, '')%>, INTEGER2NUM(<%=name%>));
+#endif
+% }
+EOS
+
+header_result = ERB.new(<<'EOS', nil, '%').result(binding)
+/* autogenerated file */
+
+<%= gen_const_decls %>
+EOS
+
+result = ERB.new(<<'EOS', nil, '%').result(binding)
+/* autogenerated file */
+
+#ifdef HAVE_LONG_LONG
+#define INTEGER2NUM(n) \
+ (FIXNUM_MAX < (n) ? ULL2NUM(n) : \
+ FIXNUM_MIN > (LONG_LONG)(n) ? LL2NUM(n) : \
+ LONG2FIX(n))
+#else
+#define INTEGER2NUM(n) \
+ (FIXNUM_MAX < (n) ? ULONG2NUM(n) : \
+ FIXNUM_MIN > (long)(n) ? LONG2NUM(n) : \
+ LONG2FIX(n))
+#endif
+
+static void
+init_constants(VALUE mod)
+{
+<%= gen_const_defs %>
+}
+EOS
+
+if opt_H
+ File.open(opt_H, 'w') {|f|
+ f << header_result
+ }
+else
+ result = header_result + result
+end
+
+if opt_o
+ File.open(opt_o, 'w') {|f|
+ f << result
+ }
+else
+ $stdout << result
+end
+
+__END__
+# SUSv4
+_SC_AIO_LISTIO_MAX
+_SC_AIO_MAX
+_SC_AIO_PRIO_DELTA_MAX
+_SC_ARG_MAX
+_SC_ATEXIT_MAX
+_SC_BC_BASE_MAX
+_SC_BC_DIM_MAX
+_SC_BC_SCALE_MAX
+_SC_BC_STRING_MAX
+_SC_CHILD_MAX
+_SC_CLK_TCK
+_SC_COLL_WEIGHTS_MAX
+_SC_DELAYTIMER_MAX
+_SC_EXPR_NEST_MAX
+_SC_HOST_NAME_MAX
+_SC_IOV_MAX
+_SC_LINE_MAX
+_SC_LOGIN_NAME_MAX
+_SC_NGROUPS_MAX
+_SC_GETGR_R_SIZE_MAX
+_SC_GETPW_R_SIZE_MAX
+_SC_MQ_OPEN_MAX
+_SC_MQ_PRIO_MAX
+_SC_OPEN_MAX
+_SC_ADVISORY_INFO
+_SC_BARRIERS
+_SC_ASYNCHRONOUS_IO
+_SC_CLOCK_SELECTION
+_SC_CPUTIME
+_SC_FSYNC
+_SC_IPV6
+_SC_JOB_CONTROL
+_SC_MAPPED_FILES
+_SC_MEMLOCK
+_SC_MEMLOCK_RANGE
+_SC_MEMORY_PROTECTION
+_SC_MESSAGE_PASSING
+_SC_MONOTONIC_CLOCK
+_SC_PRIORITIZED_IO
+_SC_PRIORITY_SCHEDULING
+_SC_RAW_SOCKETS
+_SC_READER_WRITER_LOCKS
+_SC_REALTIME_SIGNALS
+_SC_REGEXP
+_SC_SAVED_IDS
+_SC_SEMAPHORES
+_SC_SHARED_MEMORY_OBJECTS
+_SC_SHELL
+_SC_SPAWN
+_SC_SPIN_LOCKS
+_SC_SPORADIC_SERVER
+_SC_SS_REPL_MAX
+_SC_SYNCHRONIZED_IO
+_SC_THREAD_ATTR_STACKADDR
+_SC_THREAD_ATTR_STACKSIZE
+_SC_THREAD_CPUTIME
+_SC_THREAD_PRIO_INHERIT
+_SC_THREAD_PRIO_PROTECT
+_SC_THREAD_PRIORITY_SCHEDULING
+_SC_THREAD_PROCESS_SHARED
+_SC_THREAD_ROBUST_PRIO_INHERIT
+_SC_THREAD_ROBUST_PRIO_PROTECT
+_SC_THREAD_SAFE_FUNCTIONS
+_SC_THREAD_SPORADIC_SERVER
+_SC_THREADS
+_SC_TIMEOUTS
+_SC_TIMERS
+_SC_TRACE
+_SC_TRACE_EVENT_FILTER
+_SC_TRACE_EVENT_NAME_MAX
+_SC_TRACE_INHERIT
+_SC_TRACE_LOG
+_SC_TRACE_NAME_MAX
+_SC_TRACE_SYS_MAX
+_SC_TRACE_USER_EVENT_MAX
+_SC_TYPED_MEMORY_OBJECTS
+_SC_VERSION
+_SC_V7_ILP32_OFF32
+_SC_V7_ILP32_OFFBIG
+_SC_V7_LP64_OFF64
+_SC_V7_LPBIG_OFFBIG
+_SC_V6_ILP32_OFF32
+_SC_V6_ILP32_OFFBIG
+_SC_V6_LP64_OFF64
+_SC_V6_LPBIG_OFFBIG
+_SC_2_C_BIND
+_SC_2_C_DEV
+_SC_2_CHAR_TERM
+_SC_2_FORT_DEV
+_SC_2_FORT_RUN
+_SC_2_LOCALEDEF
+_SC_2_PBS
+_SC_2_PBS_ACCOUNTING
+_SC_2_PBS_CHECKPOINT
+_SC_2_PBS_LOCATE
+_SC_2_PBS_MESSAGE
+_SC_2_PBS_TRACK
+_SC_2_SW_DEV
+_SC_2_UPE
+_SC_2_VERSION
+_SC_PAGE_SIZE
+_SC_PAGESIZE
+_SC_THREAD_DESTRUCTOR_ITERATIONS
+_SC_THREAD_KEYS_MAX
+_SC_THREAD_STACK_MIN
+_SC_THREAD_THREADS_MAX
+_SC_RE_DUP_MAX
+_SC_RTSIG_MAX
+_SC_SEM_NSEMS_MAX
+_SC_SEM_VALUE_MAX
+_SC_SIGQUEUE_MAX
+_SC_STREAM_MAX
+_SC_SYMLOOP_MAX
+_SC_TIMER_MAX
+_SC_TTY_NAME_MAX
+_SC_TZNAME_MAX
+_SC_XOPEN_CRYPT
+_SC_XOPEN_ENH_I18N
+_SC_XOPEN_REALTIME
+_SC_XOPEN_REALTIME_THREADS
+_SC_XOPEN_SHM
+_SC_XOPEN_STREAMS
+_SC_XOPEN_UNIX
+_SC_XOPEN_UUCP
+_SC_XOPEN_VERSION
+
+# non-standard
+_SC_PHYS_PAGES
+_SC_AVPHYS_PAGES
+_SC_NPROCESSORS_CONF
+_SC_NPROCESSORS_ONLN
+_SC_CPUSET_SIZE
+
+# SUSv4
+_CS_PATH
+_CS_POSIX_V7_ILP32_OFF32_CFLAGS
+_CS_POSIX_V7_ILP32_OFF32_LDFLAGS
+_CS_POSIX_V7_ILP32_OFF32_LIBS
+_CS_POSIX_V7_ILP32_OFFBIG_CFLAGS
+_CS_POSIX_V7_ILP32_OFFBIG_LDFLAGS
+_CS_POSIX_V7_ILP32_OFFBIG_LIBS
+_CS_POSIX_V7_LP64_OFF64_CFLAGS
+_CS_POSIX_V7_LP64_OFF64_LDFLAGS
+_CS_POSIX_V7_LP64_OFF64_LIBS
+_CS_POSIX_V7_LPBIG_OFFBIG_CFLAGS
+_CS_POSIX_V7_LPBIG_OFFBIG_LDFLAGS
+_CS_POSIX_V7_LPBIG_OFFBIG_LIBS
+_CS_POSIX_V7_THREADS_CFLAGS
+_CS_POSIX_V7_THREADS_LDFLAGS
+_CS_POSIX_V7_WIDTH_RESTRICTED_ENVS
+_CS_V7_ENV
+_CS_POSIX_V6_ILP32_OFF32_CFLAGS
+_CS_POSIX_V6_ILP32_OFF32_LDFLAGS
+_CS_POSIX_V6_ILP32_OFF32_LIBS
+_CS_POSIX_V6_ILP32_OFFBIG_CFLAGS
+_CS_POSIX_V6_ILP32_OFFBIG_LDFLAGS
+_CS_POSIX_V6_ILP32_OFFBIG_LIBS
+_CS_POSIX_V6_LP64_OFF64_CFLAGS
+_CS_POSIX_V6_LP64_OFF64_LDFLAGS
+_CS_POSIX_V6_LP64_OFF64_LIBS
+_CS_POSIX_V6_LPBIG_OFFBIG_CFLAGS
+_CS_POSIX_V6_LPBIG_OFFBIG_LDFLAGS
+_CS_POSIX_V6_LPBIG_OFFBIG_LIBS
+_CS_POSIX_V6_WIDTH_RESTRICTED_ENVS
+_CS_V6_ENV
+
+# non-standard
+_CS_GNU_LIBC_VERSION
+_CS_GNU_LIBPTHREAD_VERSION
+
+# SUSv4
+_PC_FILESIZEBITS
+_PC_LINK_MAX
+_PC_MAX_CANON
+_PC_MAX_INPUT
+_PC_NAME_MAX
+_PC_PATH_MAX
+_PC_PIPE_BUF
+_PC_2_SYMLINKS
+_PC_ALLOC_SIZE_MIN
+_PC_REC_INCR_XFER_SIZE
+_PC_REC_MAX_XFER_SIZE
+_PC_REC_MIN_XFER_SIZE
+_PC_REC_XFER_ALIGN
+_PC_SYMLINK_MAX
+_PC_CHOWN_RESTRICTED
+_PC_NO_TRUNC
+_PC_VDISABLE
+_PC_ASYNC_IO
+_PC_PRIO_IO
+_PC_SYNC_IO
+_PC_TIMESTAMP_RESOLUTION
+
diff --git a/ext/extmk.rb b/ext/extmk.rb
index ef9afa0676..3a240aad0b 100755
--- a/ext/extmk.rb
+++ b/ext/extmk.rb
@@ -69,6 +69,18 @@ def system(*args)
super
end
+def atomic_write_open(filename)
+ filename_new = filename + ".new.#$$"
+ open(filename_new, "wb") do |f|
+ yield f
+ end
+ if File.binread(filename_new) != (File.binread(filename) rescue nil)
+ File.rename(filename_new, filename)
+ else
+ File.unlink(filename_new)
+ end
+end
+
def extract_makefile(makefile, keep = true)
m = File.read(makefile)
if !(target = m[/^TARGET[ \t]*=[ \t]*(\S*)/, 1])
@@ -129,6 +141,16 @@ def extmake(target)
FileUtils.mkpath target unless File.directory?(target)
begin
+ # don't build if parent library isn't build
+ parent = true
+ d = target
+ until (d = File.dirname(d)) == '.'
+ if File.exist?("#{$top_srcdir}/ext/#{d}/extconf.rb")
+ parent = (/^all:\s*install/ =~ IO.read("#{d}/Makefile") rescue false)
+ break
+ end
+ end
+
dir = Dir.pwd
FileUtils.mkpath target unless File.directory?(target)
Dir.chdir target
@@ -149,8 +171,8 @@ def extmake(target)
makefile = "./Makefile"
static = $static
$static = nil if noinstall = File.fnmatch?("-*", target)
- ok = File.exist?(makefile)
- unless $ignore
+ ok = parent && File.exist?(makefile)
+ if parent && !$ignore
rbconfig0 = RbConfig::CONFIG
mkconfig0 = CONFIG
rbconfig = {
@@ -219,7 +241,7 @@ def extmake(target)
$0 = $PROGRAM_NAME
end
end
- ok &&= File.open(makefile){|f| !f.gets[DUMMY_SIGNATURE]}
+ ok &&= File.open(makefile){|f| s = f.gets and !s[DUMMY_SIGNATURE]}
ok = yield(ok) if block_given?
if ok
open(makefile, "r+b") do |f|
@@ -229,7 +251,7 @@ def extmake(target)
f.truncate(f.pos)
end unless $static
else
- open(makefile, "wb") do |f|
+ atomic_write_open(makefile) do |f|
f.puts "# " + DUMMY_SIGNATURE
f.print(*dummy_makefile(CONFIG["srcdir"]))
end
@@ -276,13 +298,15 @@ def extmake(target)
end
ensure
Logging::log_close
- unless $ignore
+ if rbconfig0
RbConfig.module_eval {
remove_const(:CONFIG)
const_set(:CONFIG, rbconfig0)
remove_const(:MAKEFILE_CONFIG)
const_set(:MAKEFILE_CONFIG, mkconfig0)
}
+ end
+ if mkconfig0
MakeMakefile.class_eval {
remove_const(:CONFIG)
const_set(:CONFIG, mkconfig0)
@@ -347,6 +371,9 @@ def parse_args()
opts.on('--command-output=FILE', String) do |v|
$command_output = v
end
+ opts.on('--gnumake=yes|no', true) do |v|
+ $gnumake = v
+ end
end
begin
$optparser.parse!(ARGV)
@@ -495,6 +522,9 @@ cond = proc {|ext, *|
}.find_all {|ext|
with_config(ext, &cond)
}.sort
+ if $LIBRUBYARG_SHARED.empty? and CONFIG["EXTSTATIC"] == "static"
+ exts.delete_if {|d| File.fnmatch?("-*", d)}
+ end
end
if $extout
@@ -511,7 +541,7 @@ Dir::chdir('ext')
hdrdir = $hdrdir
$hdrdir = ($top_srcdir = relative_from(srcdir, $topdir = "..")) + "/include"
exts.each do |d|
- $static = $force_static ? true : $static_ext[target]
+ $static = $force_static ? true : $static_ext[d]
if $ignore or !$nodynamic or $static
extmake(d) or abort
@@ -636,7 +666,7 @@ $mflags.unshift("topdir=#$topdir")
ENV.delete("RUBYOPT")
if $configure_only and $command_output
exts.map! {|d| "ext/#{d}/."}
- open($command_output, "wb") do |mf|
+ atomic_write_open($command_output) do |mf|
mf.puts "V = 0"
mf.puts "Q1 = $(V:1=)"
mf.puts "Q = $(Q1:0=@)"
@@ -686,15 +716,25 @@ if $configure_only and $command_output
mf.puts
mf.puts "#{rubies.join(' ')}: $(extensions:/.=/#{$force_static ? 'static' : 'all'})"
submake = "$(Q)$(MAKE) $(MFLAGS) $(SUBMAKEOPTS)"
- mf.puts "all static:\n\t#{submake} #{rubies.join(' ')}\n"
+ mf.puts "all static: $(EXTOBJS)\n\t#{submake} #{rubies.join(' ')}\n"
+ $extobjs.each do |tgt|
+ mf.puts "#{tgt}: #{File.dirname(tgt)}/static"
+ end
+ mf.puts "#{rubies.join(' ')}: $(EXTOBJS)"
rubies.each do |tgt|
mf.puts "#{tgt}:\n\t#{submake} $@"
end
mf.puts
- exec = config_string("exec") {|str| str + " "}
+ if $gnumake == "yes"
+ submake = "$(MAKE) -C $(@D)"
+ else
+ submake = "cd $(@D) && "
+ config_string("exec") {|str| submake << str << " "}
+ submake << "$(MAKE)"
+ end
targets.each do |tgt|
exts.each do |d|
- mf.puts "#{d[0..-2]}#{tgt}:\n\t$(Q)cd $(@D) && #{exec}$(MAKE) $(MFLAGS) V=$(V) $(@F)"
+ mf.puts "#{d[0..-2]}#{tgt}:\n\t$(Q)#{submake} $(MFLAGS) V=$(V) $(@F)"
end
end
end
diff --git a/ext/fiddle/fiddle.c b/ext/fiddle/fiddle.c
index 7a7c708245..9f3d1537d6 100644
--- a/ext/fiddle/fiddle.c
+++ b/ext/fiddle/fiddle.c
@@ -48,7 +48,7 @@ rb_fiddle_malloc(VALUE self, VALUE size)
{
void *ptr;
- ptr = (void*)ruby_xmalloc(NUM2INT(size));
+ ptr = (void*)ruby_xmalloc(NUM2SIZET(size));
return PTR2NUM(ptr);
}
@@ -64,7 +64,7 @@ rb_fiddle_realloc(VALUE self, VALUE addr, VALUE size)
{
void *ptr = NUM2PTR(addr);
- ptr = (void*)ruby_xrealloc(ptr, NUM2INT(size));
+ ptr = (void*)ruby_xrealloc(ptr, NUM2SIZET(size));
return PTR2NUM(ptr);
}
diff --git a/ext/fiddle/function.c b/ext/fiddle/function.c
index 4a5a5892a6..50366bb87f 100644
--- a/ext/fiddle/function.c
+++ b/ext/fiddle/function.c
@@ -1,7 +1,28 @@
#include <fiddle.h>
+#ifdef PRIsVALUE
+# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj)
+# define RB_OBJ_STRING(obj) (obj)
+#else
+# define PRIsVALUE "s"
+# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj)
+# define RB_OBJ_STRING(obj) StringValueCStr(obj)
+#endif
+
VALUE cFiddleFunction;
+#define MAX_ARGS (SIZE_MAX / (sizeof(void *) + sizeof(fiddle_generic)) - 1)
+
+#define Check_Max_Args(name, len) \
+ if ((size_t)(len) < MAX_ARGS) { \
+ /* OK */ \
+ } \
+ else { \
+ rb_raise(rb_eTypeError, \
+ name" is so large that it can cause integer overflow (%d)", \
+ (len)); \
+ }
+
static void
deallocate(void *p)
{
@@ -53,12 +74,13 @@ rb_fiddle_new_function(VALUE address, VALUE arg_types, VALUE ret_type)
static int
parse_keyword_arg_i(VALUE key, VALUE value, VALUE self)
{
- if (key == ID2SYM(rb_intern("name"))) {
- rb_iv_set(self, "@name", value);
- } else {
- rb_raise(rb_eArgError, "unknown keyword: %"PRIsVALUE, key);
- }
- return ST_CONTINUE;
+ if (key == ID2SYM(rb_intern("name"))) {
+ rb_iv_set(self, "@name", value);
+ } else {
+ rb_raise(rb_eArgError, "unknown keyword: %"PRIsVALUE,
+ RB_OBJ_STRING(key));
+ }
+ return ST_CONTINUE;
}
static VALUE
@@ -74,6 +96,7 @@ initialize(int argc, VALUE argv[], VALUE self)
if(NIL_P(abi)) abi = INT2NUM(FFI_DEFAULT_ABI);
Check_Type(args, T_ARRAY);
+ Check_Max_Args("args", RARRAY_LENINT(args));
rb_iv_set(self, "@ptr", ptr);
rb_iv_set(self, "@args", args);
@@ -114,11 +137,13 @@ function_call(int argc, VALUE argv[], VALUE self)
void **values;
VALUE cfunc, types, cPointer;
int i;
+ VALUE alloc_buffer = 0;
cfunc = rb_iv_get(self, "@ptr");
types = rb_iv_get(self, "@args");
cPointer = rb_const_get(mFiddle, rb_intern("Pointer"));
+ Check_Max_Args("number of arguments", argc);
if(argc != RARRAY_LENINT(types)) {
rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)",
argc, RARRAY_LENINT(types));
@@ -135,8 +160,9 @@ function_call(int argc, VALUE argv[], VALUE self)
}
}
- values = xcalloc((size_t)argc + 1, (size_t)sizeof(void *));
- generic_args = xcalloc((size_t)argc, (size_t)sizeof(fiddle_generic));
+ generic_args = ALLOCV(alloc_buffer,
+ (size_t)(argc + 1) * sizeof(void *) + (size_t)argc * sizeof(fiddle_generic));
+ values = (void **)((char *)generic_args + (size_t)argc * sizeof(fiddle_generic));
for (i = 0; i < argc; i++) {
VALUE type = RARRAY_PTR(types)[i];
@@ -163,8 +189,7 @@ function_call(int argc, VALUE argv[], VALUE self)
rb_funcall(mFiddle, rb_intern("win32_last_error="), 1, INT2NUM(errno));
#endif
- xfree(values);
- xfree(generic_args);
+ ALLOCV_END(alloc_buffer);
return GENERIC2VALUE(rb_iv_get(self, "@return_type"), retval);
}
diff --git a/ext/fiddle/lib/fiddle/import.rb b/ext/fiddle/lib/fiddle/import.rb
index ec5ee94dcf..34f5d7f81c 100644
--- a/ext/fiddle/lib/fiddle/import.rb
+++ b/ext/fiddle/lib/fiddle/import.rb
@@ -63,7 +63,7 @@ module Fiddle
extend Importer
# Creates an array of handlers for the given +libs+, can be an instance of
- # Fiddle::Handle, Fiddle::Importer, or will create a new istance of
+ # Fiddle::Handle, Fiddle::Importer, or will create a new instance of
# Fiddle::Handle using Fiddle.dlopen
#
# Raises a DLError if the library cannot be loaded.
diff --git a/ext/fiddle/pointer.c b/ext/fiddle/pointer.c
index b763a0c123..a09daf77ea 100644
--- a/ext/fiddle/pointer.c
+++ b/ext/fiddle/pointer.c
@@ -7,6 +7,15 @@
#include <ctype.h>
#include <fiddle.h>
+#ifdef PRIsVALUE
+# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj)
+# define RB_OBJ_STRING(obj) (obj)
+#else
+# define PRIsVALUE "s"
+# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj)
+# define RB_OBJ_STRING(obj) StringValueCStr(obj)
+#endif
+
VALUE rb_cPointer;
typedef void (*freefunc_t)(void*);
@@ -431,7 +440,7 @@ rb_fiddle_ptr_inspect(VALUE self)
TypedData_Get_Struct(self, struct ptr_data, &fiddle_ptr_data_type, data);
return rb_sprintf("#<%"PRIsVALUE":%p ptr=%p size=%ld free=%p>",
- rb_obj_class(self), data, data->ptr, data->size, data->free);
+ RB_OBJ_CLASSNAME(self), data, data->ptr, data->size, data->free);
}
/*
diff --git a/ext/gdbm/gdbm.c b/ext/gdbm/gdbm.c
index 888f95d91f..851afea497 100644
--- a/ext/gdbm/gdbm.c
+++ b/ext/gdbm/gdbm.c
@@ -106,10 +106,10 @@ closed_dbm(void)
if ((dbmp)->di_dbm == 0) closed_dbm();\
} while (0)
-#define GetDBM2(obj, data, dbm) {\
- GetDBM((obj), (data));\
- (dbm) = dbmp->di_dbm;\
-}
+#define GetDBM2(obj, dbmp, dbm) do {\
+ GetDBM((obj), (dbmp));\
+ (dbm) = (dbmp)->di_dbm;\
+} while (0)
static void
free_dbm(struct dbmdata *dbmp)
@@ -878,7 +878,7 @@ fgdbm_each_key(VALUE obj)
* gdbm.each_pair { |key, value| block } -> gdbm
*
* Executes _block_ for each key in the database, passing the _key_ and the
- * correspoding _value_ as a parameter.
+ * corresponding _value_ as a parameter.
*/
static VALUE
fgdbm_each_pair(VALUE obj)
@@ -1062,7 +1062,7 @@ fgdbm_reorganize(VALUE obj)
* gdbm.sync -> gdbm
*
* Unless the _gdbm_ object has been opened with the *SYNC* flag, it is not
- * guarenteed that database modification operations are immediately applied to
+ * guaranteed that database modification operations are immediately applied to
* the database file. This method ensures that all recent modifications
* to the database are written to the file. Blocks until all writing operations
* to the disk have been finished.
diff --git a/ext/io/console/console.c b/ext/io/console/console.c
index 85b6750c9f..de5ca82558 100644
--- a/ext/io/console/console.c
+++ b/ext/io/console/console.c
@@ -689,7 +689,7 @@ console_dev(VALUE klass)
if ((fptr = RFILE(con)->fptr) && GetReadFD(fptr) != -1)
return con;
}
- rb_const_remove(klass, id_console);
+ rb_mod_remove_const(klass, ID2SYM(id_console));
}
{
VALUE args[2];
diff --git a/ext/io/console/io-console.gemspec b/ext/io/console/io-console.gemspec
index 309b9bd85b..f71e1b9b8f 100644
--- a/ext/io/console/io-console.gemspec
+++ b/ext/io/console/io-console.gemspec
@@ -1,5 +1,5 @@
# -*- ruby -*-
-_VERSION = "0.4.3"
+_VERSION = "0.4.2"
date = %w$Date:: $[1]
Gem::Specification.new do |s|
diff --git a/ext/io/wait/wait.c b/ext/io/wait/wait.c
index ce8cfbbeb4..d8bb55fc47 100644
--- a/ext/io/wait/wait.c
+++ b/ext/io/wait/wait.c
@@ -62,7 +62,7 @@ io_nread(VALUE io)
GetOpenFile(io, fptr);
rb_io_check_readable(fptr);
len = rb_io_read_pending(fptr);
- if (len > 0) return INT2FIX(len);
+ if (len > 0) return len;
if (!FIONREAD_POSSIBLE_P(fptr->fd)) return INT2FIX(0);
if (ioctl(fptr->fd, FIONREAD, &n)) return INT2FIX(0);
if (n > 0) return ioctl_arg2num(n);
diff --git a/ext/json/fbuffer/fbuffer.h b/ext/json/fbuffer/fbuffer.h
index af74187566..1e860eb790 100644
--- a/ext/json/fbuffer/fbuffer.h
+++ b/ext/json/fbuffer/fbuffer.h
@@ -25,6 +25,15 @@
#define RSTRING_LEN(string) RSTRING(string)->len
#endif
+#ifdef PRIsVALUE
+# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj)
+# define RB_OBJ_STRING(obj) (obj)
+#else
+# define PRIsVALUE "s"
+# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj)
+# define RB_OBJ_STRING(obj) StringValueCStr(obj)
+#endif
+
#ifdef HAVE_RUBY_ENCODING_H
#include "ruby/encoding.h"
#define FORCE_UTF8(obj) rb_enc_associate((obj), rb_utf8_encoding())
diff --git a/ext/json/generator/generator.c b/ext/json/generator/generator.c
index 550e9beef0..1b9652df24 100644
--- a/ext/json/generator/generator.c
+++ b/ext/json/generator/generator.c
@@ -812,10 +812,10 @@ static void generate_json_float(FBuffer *buffer, VALUE Vstate, JSON_Generator_St
if (!allow_nan) {
if (isinf(value)) {
fbuffer_free(buffer);
- rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
+ rb_raise(eGeneratorError, "%u: %"PRIsVALUE" not allowed in JSON", __LINE__, RB_OBJ_STRING(tmp));
} else if (isnan(value)) {
fbuffer_free(buffer);
- rb_raise(eGeneratorError, "%u: %s not allowed in JSON", __LINE__, StringValueCStr(tmp));
+ rb_raise(eGeneratorError, "%u: %"PRIsVALUE" not allowed in JSON", __LINE__, RB_OBJ_STRING(tmp));
}
}
fbuffer_append_str(buffer, tmp);
diff --git a/ext/nkf/nkf-utf8/nkf.c b/ext/nkf/nkf-utf8/nkf.c
index ca3e438220..65d2c190ec 100644
--- a/ext/nkf/nkf-utf8/nkf.c
+++ b/ext/nkf/nkf-utf8/nkf.c
@@ -4340,7 +4340,7 @@ mime_ungetc_buf(nkf_char c, FILE *f)
static nkf_char
mime_getc_buf(FILE *f)
{
- /* we don't keep eof of mime_input_buf, becase it contains ?= as
+ /* we don't keep eof of mime_input_buf, because it contains ?= as
a terminator. It was checked in mime_integrity. */
return ((mimebuf_f)?
(*i_mgetc_buf)(f):mime_input_buf(mime_input_state.input++));
@@ -5713,9 +5713,9 @@ module_connection(void)
x0201_f = X0201_DEFAULT;
}
- /* replace continucation module, from output side */
+ /* replace continuation module, from output side */
- /* output redicrection */
+ /* output redirection */
#ifdef CHECK_OPTION
if (noout_f || guess_f){
o_putc = no_putc;
@@ -5752,7 +5752,7 @@ module_connection(void)
i_getc = std_getc;
i_ungetc = std_ungetc;
- /* input redicrection */
+ /* input redirection */
#ifdef INPUT_OPTION
if (cap_f){
i_cgetc = i_getc; i_getc = cap_getc;
@@ -5914,7 +5914,7 @@ kanji_convert(FILE *f)
/* in case of 8th bit is on */
if (!estab_f&&!mime_decode_mode) {
/* in case of not established yet */
- /* It is still ambiguious */
+ /* It is still ambiguous */
if (h_conv(f, c2, c1)==EOF) {
LAST;
}
@@ -6898,7 +6898,7 @@ options(unsigned char *cp)
continue;
#endif
case SP:
- /* module muliple options in a string are allowed for Perl moudle */
+ /* module multiple options in a string are allowed for Perl module */
while(*cp && *cp++!='-');
continue;
default:
diff --git a/ext/objspace/object_tracing.c b/ext/objspace/object_tracing.c
index 45b06aef8c..975518c654 100644
--- a/ext/objspace/object_tracing.c
+++ b/ext/objspace/object_tracing.c
@@ -287,7 +287,10 @@ object_allocations_reporter_i(st_data_t key, st_data_t val, st_data_t ptr)
if (info->class_path) fprintf(out, "C: %s", info->class_path);
else fprintf(out, "C: %p", (void *)info->klass);
fprintf(out, "@%s:%lu", info->path ? info->path : "", info->line);
- if (!NIL_P(info->mid)) fprintf(out, " (%s)", rb_id2name(SYM2ID(info->mid)));
+ if (!NIL_P(info->mid)) {
+ VALUE m = rb_sym2str(info->mid);
+ fprintf(out, " (%s)", RSTRING_PTR(m));
+ }
fprintf(out, ")\n");
return ST_CONTINUE;
diff --git a/ext/objspace/objspace.c b/ext/objspace/objspace.c
index b1f1358c01..88ebfca20e 100644
--- a/ext/objspace/objspace.c
+++ b/ext/objspace/objspace.c
@@ -545,7 +545,7 @@ iow_inspect(VALUE self)
VALUE obj = (VALUE)DATA_PTR(self);
VALUE type = type2sym(BUILTIN_TYPE(obj));
- return rb_sprintf("#<InternalObject:%p %s>", (void *)obj, rb_id2name(SYM2ID(type)));
+ return rb_sprintf("#<InternalObject:%p %"PRIsVALUE">", (void *)obj, rb_sym2str(type));
}
/* Returns the Object#object_id of the internal object. */
diff --git a/ext/objspace/objspace_dump.c b/ext/objspace/objspace_dump.c
index e3ce7e727d..cb8f943d97 100644
--- a/ext/objspace/objspace_dump.c
+++ b/ext/objspace/objspace_dump.c
@@ -43,7 +43,6 @@ dump_append(struct dump_config *dc, const char *format, ...)
if (dc->stream) {
vfprintf(dc->stream, format, vl);
- fflush(dc->stream);
}
else if (dc->string)
rb_str_vcatf(dc->string, format, vl);
@@ -174,8 +173,6 @@ dump_object(VALUE obj, struct dump_config *dc)
case T_STRING:
if (STR_EMBED_P(obj))
dump_append(dc, ", \"embedded\":true");
- if (STR_ASSOC_P(obj))
- dump_append(dc, ", \"associated\":true");
if (is_broken_string(obj))
dump_append(dc, ", \"broken\":true");
if (FL_TEST(obj, RSTRING_FSTR))
@@ -184,7 +181,7 @@ dump_object(VALUE obj, struct dump_config *dc)
dump_append(dc, ", \"shared\":true");
else {
dump_append(dc, ", \"bytesize\":%ld", RSTRING_LEN(obj));
- if (!STR_EMBED_P(obj) && !STR_NOCAPA_P(obj) && (long)rb_str_capacity(obj) != RSTRING_LEN(obj))
+ if (!STR_EMBED_P(obj) && !STR_SHARED_P(obj) && (long)rb_str_capacity(obj) != RSTRING_LEN(obj))
dump_append(dc, ", \"capacity\":%ld", rb_str_capacity(obj));
if (is_ascii_string(obj)) {
@@ -247,8 +244,10 @@ dump_object(VALUE obj, struct dump_config *dc)
if ((ainfo = objspace_lookup_allocation_info(obj))) {
dump_append(dc, ", \"file\":\"%s\", \"line\":%lu", ainfo->path, ainfo->line);
- if (RTEST(ainfo->mid))
- dump_append(dc, ", \"method\":\"%s\"", rb_id2name(SYM2ID(ainfo->mid)));
+ if (RTEST(ainfo->mid)) {
+ VALUE m = rb_sym2str(ainfo->mid);
+ dump_append(dc, ", \"method\":\"%s\"", RSTRING_PTR(m));
+ }
dump_append(dc, ", \"generation\":%"PRIuSIZE, ainfo->generation);
}
diff --git a/ext/openssl/depend b/ext/openssl/depend
index 7991159f2e..23bebd8cc8 100644
--- a/ext/openssl/depend
+++ b/ext/openssl/depend
@@ -3,4 +3,4 @@ $(OBJS): $(HDRS) $(ruby_headers) \
$(hdrdir)/ruby/encoding.h \
$(hdrdir)/ruby/oniguruma.h \
$(hdrdir)/ruby/thread.h
-ossl.o: $(top_srcdir)/thread_native.h $(top_srcdir)/thread_$(THREAD_MODEL).h
+ossl.o: $(hdrdir)/ruby/thread_native.h
diff --git a/ext/openssl/lib/openssl/ssl.rb b/ext/openssl/lib/openssl/ssl.rb
index b91dce312a..fb1045381f 100644
--- a/ext/openssl/lib/openssl/ssl.rb
+++ b/ext/openssl/lib/openssl/ssl.rb
@@ -64,7 +64,6 @@ module OpenSSL
opts |= OpenSSL::SSL::OP_NO_COMPRESSION if defined?(OpenSSL::SSL::OP_NO_COMPRESSION)
opts |= OpenSSL::SSL::OP_NO_SSLv2 if defined?(OpenSSL::SSL::OP_NO_SSLv2)
opts |= OpenSSL::SSL::OP_NO_SSLv3 if defined?(OpenSSL::SSL::OP_NO_SSLv3)
- opts
}.call
}
@@ -143,7 +142,8 @@ module OpenSSL
case san.tag
when 2 # dNSName in GeneralName (RFC5280)
should_verify_common_name = false
- return true if verify_hostname(hostname, san.value)
+ reg = Regexp.escape(san.value).gsub(/\\\*/, "[^.]+")
+ return true if /\A#{reg}\z/i =~ hostname
when 7 # iPAddress in GeneralName (RFC5280)
should_verify_common_name = false
# follows GENERAL_NAME_print() in x509v3/v3_alt.c
@@ -158,7 +158,8 @@ module OpenSSL
if should_verify_common_name
cert.subject.to_a.each{|oid, value|
if oid == "CN"
- return true if verify_hostname(hostname, value)
+ reg = Regexp.escape(value).gsub(/\\\*/, "[^.]+")
+ return true if /\A#{reg}\z/i =~ hostname
end
}
end
@@ -166,67 +167,11 @@ module OpenSSL
end
module_function :verify_certificate_identity
- def verify_hostname(hostname, san) # :nodoc:
- # RFC 5280, IA5String is limited to the set of ASCII characters
- return false unless san.ascii_only?
- return false unless hostname.ascii_only?
-
- # See RFC 6125, section 6.4.1
- # Matching is case-insensitive.
- san_parts = san.downcase.split(".")
-
- # TODO: this behavior should probably be more strict
- return san == hostname if san_parts.size < 2
-
- # Matching is case-insensitive.
- host_parts = hostname.downcase.split(".")
-
- # RFC 6125, section 6.4.3, subitem 2.
- # If the wildcard character is the only character of the left-most
- # label in the presented identifier, the client SHOULD NOT compare
- # against anything but the left-most label of the reference
- # identifier (e.g., *.example.com would match foo.example.com but
- # not bar.foo.example.com or example.com).
- return false unless san_parts.size == host_parts.size
-
- # RFC 6125, section 6.4.3, subitem 1.
- # The client SHOULD NOT attempt to match a presented identifier in
- # which the wildcard character comprises a label other than the
- # left-most label (e.g., do not match bar.*.example.net).
- return false unless verify_wildcard(host_parts.shift, san_parts.shift)
-
- san_parts.join(".") == host_parts.join(".")
- end
- module_function :verify_hostname
-
- def verify_wildcard(domain_component, san_component) # :nodoc:
- parts = san_component.split("*", -1)
-
- return false if parts.size > 2
- return san_component == domain_component if parts.size == 1
-
- # RFC 6125, section 6.4.3, subitem 3.
- # The client SHOULD NOT attempt to match a presented identifier
- # where the wildcard character is embedded within an A-label or
- # U-label of an internationalized domain name.
- return false if domain_component.start_with?("xn--") && san_component != "*"
-
- parts[0].length + parts[1].length < domain_component.length &&
- domain_component.start_with?(parts[0]) &&
- domain_component.end_with?(parts[1])
- end
- module_function :verify_wildcard
-
class SSLSocket
include Buffering
include SocketForwarder
include Nonblock
- ##
- # Perform hostname verification after an SSL connection is established
- #
- # This method MUST be called after calling #connect to ensure that the
- # hostname of a remote peer has been verified.
def post_connection_check(hostname)
unless OpenSSL::SSL.verify_certificate_identity(peer_cert, hostname)
raise SSLError, "hostname \"#{hostname}\" does not match the server certificate"
@@ -289,8 +234,12 @@ module OpenSSL
ssl.sync_close = true
ssl.accept if @start_immediately
ssl
- rescue SSLError => ex
- sock.close
+ rescue Exception => ex
+ if ssl
+ ssl.close
+ else
+ sock.close
+ end
raise ex
end
end
diff --git a/ext/openssl/ossl.c b/ext/openssl/ossl.c
index 5104987c46..8b25c02990 100644
--- a/ext/openssl/ossl.c
+++ b/ext/openssl/ossl.c
@@ -18,11 +18,12 @@ int
string2hex(const unsigned char *buf, int buf_len, char **hexbuf, int *hexbuf_len)
{
static const char hex[]="0123456789abcdef";
- int i, len = 2 * buf_len;
+ int i, len;
- if (buf_len < 0 || len < buf_len) { /* PARANOIA? */
+ if (buf_len < 0 || buf_len > INT_MAX / 2) { /* PARANOIA? */
return -1;
}
+ len = 2 * buf_len;
if (!hexbuf) { /* if no buf, return calculated len */
if (hexbuf_len) {
*hexbuf_len = len;
@@ -466,7 +467,7 @@ ossl_fips_mode_set(VALUE self, VALUE enabled)
/**
* Stores locks needed for OpenSSL thread safety
*/
-#include "../../thread_native.h"
+#include "ruby/thread_native.h"
static rb_nativethread_lock_t *ossl_locks;
static void
@@ -747,27 +748,27 @@ static void Init_ossl_locks(void)
*
* First set up the cipher for encryption
*
- * encrypter = OpenSSL::Cipher.new 'AES-128-CBC'
- * encrypter.encrypt
- * encrypter.pkcs5_keyivgen pass_phrase, salt
+ * encryptor = OpenSSL::Cipher.new 'AES-128-CBC'
+ * encryptor.encrypt
+ * encryptor.pkcs5_keyivgen pass_phrase, salt
*
* Then pass the data you want to encrypt through
*
- * encrypted = encrypter.update 'top secret document'
- * encrypted << encrypter.final
+ * encrypted = encryptor.update 'top secret document'
+ * encrypted << encryptor.final
*
* === Decryption
*
* Use a new Cipher instance set up for decryption
*
- * decrypter = OpenSSL::Cipher.new 'AES-128-CBC'
- * decrypter.decrypt
- * decrypter.pkcs5_keyivgen pass_phrase, salt
+ * decryptor = OpenSSL::Cipher.new 'AES-128-CBC'
+ * decryptor.decrypt
+ * decryptor.pkcs5_keyivgen pass_phrase, salt
*
* Then pass the data you want to decrypt through
*
- * plain = decrypter.update encrypted
- * plain << decrypter.final
+ * plain = decryptor.update encrypted
+ * plain << decryptor.final
*
* == X509 Certificates
*
diff --git a/ext/openssl/ossl.h b/ext/openssl/ossl.h
index 83a927dabe..c843c06f5c 100644
--- a/ext/openssl/ossl.h
+++ b/ext/openssl/ossl.h
@@ -137,8 +137,8 @@ VALUE ossl_x509name_sk2ary(STACK_OF(X509_NAME) *names);
VALUE ossl_buf2str(char *buf, int len);
#define ossl_str_adjust(str, p) \
do{\
- int len = RSTRING_LENINT(str);\
- int newlen = rb_long2int((p) - (unsigned char*)RSTRING_PTR(str));\
+ long len = RSTRING_LEN(str);\
+ long newlen = (long)((p) - (unsigned char*)RSTRING_PTR(str));\
assert(newlen <= len);\
rb_str_set_len((str), newlen);\
}while(0)
diff --git a/ext/openssl/ossl_asn1.c b/ext/openssl/ossl_asn1.c
index efdfbfc8aa..65ae71e861 100644
--- a/ext/openssl/ossl_asn1.c
+++ b/ext/openssl/ossl_asn1.c
@@ -495,7 +495,7 @@ typedef struct {
VALUE *klass;
} ossl_asn1_info_t;
-static ossl_asn1_info_t ossl_asn1_info[] = {
+static const ossl_asn1_info_t ossl_asn1_info[] = {
{ "EOC", &cASN1EndOfContent, }, /* 0 */
{ "BOOLEAN", &cASN1Boolean, }, /* 1 */
{ "INTEGER", &cASN1Integer, }, /* 2 */
@@ -529,7 +529,7 @@ static ossl_asn1_info_t ossl_asn1_info[] = {
{ "BMPSTRING", &cASN1BMPString, }, /* 30 */
};
-int ossl_asn1_info_size = (sizeof(ossl_asn1_info)/sizeof(ossl_asn1_info[0]));
+enum {ossl_asn1_info_size = (sizeof(ossl_asn1_info)/sizeof(ossl_asn1_info[0]))};
static VALUE class_tag_map;
diff --git a/ext/openssl/ossl_bio.c b/ext/openssl/ossl_bio.c
index a11c08c1a3..e150de0ad9 100644
--- a/ext/openssl/ossl_bio.c
+++ b/ext/openssl/ossl_bio.c
@@ -18,7 +18,7 @@ ossl_obj2bio(VALUE obj)
{
BIO *bio;
- if (TYPE(obj) == T_FILE) {
+ if (RB_TYPE_P(obj, T_FILE)) {
rb_io_t *fptr;
FILE *fp;
int fd;
diff --git a/ext/openssl/ossl_bn.c b/ext/openssl/ossl_bn.c
index 05473635ae..bdaf077b5f 100644
--- a/ext/openssl/ossl_bn.c
+++ b/ext/openssl/ossl_bn.c
@@ -140,26 +140,24 @@ ossl_bn_initialize(int argc, VALUE *argv, VALUE self)
return self;
}
else if (RB_TYPE_P(str, T_BIGNUM)) {
- int i, j, len = RBIGNUM_LENINT(str);
- BDIGIT *ds = RBIGNUM_DIGITS(str);
+ size_t len = rb_absint_size(str, NULL);
+ unsigned char *bin;
VALUE buf;
- unsigned char *bin = (unsigned char*)ALLOCV_N(BDIGIT, buf, len);
-
- for (i = 0; len > i; i++) {
- BDIGIT v = ds[i];
- for (j = SIZEOF_BDIGITS - 1; 0 <= j; j--) {
- bin[(len-1-i)*SIZEOF_BDIGITS+j] = v&0xff;
- v >>= 8;
- }
- }
+ int sign;
+
+ if (INT_MAX < len) {
+ rb_raise(eBNError, "bignum too long");
+ }
+ bin = (unsigned char*)ALLOCV_N(unsigned char, buf, len);
+ sign = rb_integer_pack(str, bin, len, 1, 0, INTEGER_PACK_BIG_ENDIAN);
GetBN(self, bn);
- if (!BN_bin2bn(bin, (int)SIZEOF_BDIGITS*len, bn)) {
+ if (!BN_bin2bn(bin, (int)len, bn)) {
ALLOCV_END(buf);
ossl_raise(eBNError, NULL);
}
ALLOCV_END(buf);
- if (!RBIGNUM_SIGN(str)) BN_set_negative(bn, 1);
+ if (sign < 0) BN_set_negative(bn, 1);
return self;
}
if (RTEST(rb_obj_is_kind_of(str, cBN))) {
diff --git a/ext/openssl/ossl_cipher.c b/ext/openssl/ossl_cipher.c
index 0fa740e1cb..1cd185e69c 100644
--- a/ext/openssl/ossl_cipher.c
+++ b/ext/openssl/ossl_cipher.c
@@ -158,7 +158,7 @@ add_cipher_name_to_ary(const OBJ_NAME *name, VALUE ary)
#ifdef HAVE_OBJ_NAME_DO_ALL_SORTED
/*
* call-seq:
- * Cipher.ciphers -> array[string...]
+ * OpenSSL::Cipher.ciphers -> array[string...]
*
* Returns the names of all available ciphers in an array.
*/
@@ -183,7 +183,7 @@ ossl_s_ciphers(VALUE self)
* cipher.reset -> self
*
* Fully resets the internal state of the Cipher. By using this, the same
- * Cipher instance may be used several times for en- or decryption tasks.
+ * Cipher instance may be used several times for encryption or decryption tasks.
*
* Internally calls EVP_CipherInit_ex(ctx, NULL, NULL, NULL, NULL, -1).
*/
@@ -329,33 +329,6 @@ ossl_cipher_pkcs5_keyivgen(int argc, VALUE *argv, VALUE self)
return Qnil;
}
-static int
-ossl_cipher_update_long(EVP_CIPHER_CTX *ctx, unsigned char *out, long *out_len_ptr,
- const unsigned char *in, long in_len)
-{
- int out_part_len;
- long out_len = 0;
-#define UPDATE_LENGTH_LIMIT INT_MAX
-
-#if SIZEOF_LONG > UPDATE_LENGTH_LIMIT
- if (in_len > UPDATE_LENGTH_LIMIT) {
- const int in_part_len = (UPDATE_LENGTH_LIMIT / 2 + 1) & ~1;
- do {
- if (!EVP_CipherUpdate(ctx, out ? (out + out_len) : 0,
- &out_part_len, in, in_part_len))
- return 0;
- out_len += out_part_len;
- in += in_part_len;
- } while ((in_len -= in_part_len) > UPDATE_LENGTH_LIMIT);
- }
-#endif
- if (!EVP_CipherUpdate(ctx, out ? (out + out_len) : 0,
- &out_part_len, in, (int)in_len))
- return 0;
- if (out_len_ptr) *out_len_ptr = out_len += out_part_len;
- return 1;
-}
-
/*
* call-seq:
* cipher.update(data [, buffer]) -> string or buffer
@@ -374,21 +347,17 @@ ossl_cipher_update(int argc, VALUE *argv, VALUE self)
{
EVP_CIPHER_CTX *ctx;
unsigned char *in;
- long in_len, out_len;
+ int in_len, out_len;
VALUE data, str;
rb_scan_args(argc, argv, "11", &data, &str);
StringValue(data);
in = (unsigned char *)RSTRING_PTR(data);
- if ((in_len = RSTRING_LEN(data)) == 0)
+ if ((in_len = RSTRING_LENINT(data)) == 0)
ossl_raise(rb_eArgError, "data must not be empty");
GetCipher(self, ctx);
out_len = in_len+EVP_CIPHER_CTX_block_size(ctx);
- if (out_len <= 0) {
- ossl_raise(rb_eRangeError,
- "data too big to make output buffer: %ld bytes", in_len);
- }
if (NIL_P(str)) {
str = rb_str_new(0, out_len);
@@ -397,7 +366,7 @@ ossl_cipher_update(int argc, VALUE *argv, VALUE self)
rb_str_resize(str, out_len);
}
- if (!ossl_cipher_update_long(ctx, (unsigned char *)RSTRING_PTR(str), &out_len, in, in_len))
+ if (!EVP_CipherUpdate(ctx, (unsigned char *)RSTRING_PTR(str), &out_len, in, in_len))
ossl_raise(eCipherError, NULL);
assert(out_len < RSTRING_LEN(str));
rb_str_set_len(str, out_len);
@@ -537,16 +506,17 @@ ossl_cipher_set_auth_data(VALUE self, VALUE data)
{
EVP_CIPHER_CTX *ctx;
unsigned char *in;
- long in_len, out_len;
+ int in_len;
+ int out_len;
StringValue(data);
in = (unsigned char *) RSTRING_PTR(data);
- in_len = RSTRING_LEN(data);
+ in_len = RSTRING_LENINT(data);
GetCipher(self, ctx);
- if (!ossl_cipher_update_long(ctx, NULL, &out_len, in, in_len))
+ if (!EVP_CipherUpdate(ctx, NULL, &out_len, in, in_len))
ossl_raise(eCipherError, "couldn't set additional authenticated data");
return data;
diff --git a/ext/openssl/ossl_config.c b/ext/openssl/ossl_config.c
index 0f25a19e50..140f5c3ad0 100644
--- a/ext/openssl/ossl_config.c
+++ b/ext/openssl/ossl_config.c
@@ -17,7 +17,7 @@
VALUE cConfig;
/* Document-class: OpenSSL::ConfigError
*
- * General error for openssl library configuration files. Including formating,
+ * General error for openssl library configuration files. Including formatting,
* parsing errors, etc.
*/
VALUE eConfigError;
diff --git a/ext/openssl/ossl_digest.c b/ext/openssl/ossl_digest.c
index fdf13e98e5..7e5e7ff1ab 100644
--- a/ext/openssl/ossl_digest.c
+++ b/ext/openssl/ossl_digest.c
@@ -38,7 +38,7 @@ GetDigestPtr(VALUE obj)
const EVP_MD *md;
ASN1_OBJECT *oid = NULL;
- if (TYPE(obj) == T_STRING) {
+ if (RB_TYPE_P(obj, T_STRING)) {
const char *name = StringValueCStr(obj);
md = EVP_get_digestbyname(name);
diff --git a/ext/openssl/ossl_engine.c b/ext/openssl/ossl_engine.c
index da1a3c7a74..f99a30dfc3 100644
--- a/ext/openssl/ossl_engine.c
+++ b/ext/openssl/ossl_engine.c
@@ -523,18 +523,11 @@ ossl_engine_get_cmds(VALUE self)
static VALUE
ossl_engine_inspect(VALUE self)
{
- VALUE str;
- const char *cname = rb_class2name(rb_obj_class(self));
-
- str = rb_str_new2("#<");
- rb_str_cat2(str, cname);
- rb_str_cat2(str, " id=\"");
- rb_str_append(str, ossl_engine_get_id(self));
- rb_str_cat2(str, "\" name=\"");
- rb_str_append(str, ossl_engine_get_name(self));
- rb_str_cat2(str, "\">");
-
- return str;
+ ENGINE *e;
+
+ GetEngine(self, e);
+ return rb_sprintf("#<%"PRIsVALUE" id=\"%s\" name=\"%s\">",
+ rb_obj_class(self), ENGINE_get_id(e), ENGINE_get_name(e));
}
#define DefEngineConst(x) rb_define_const(cEngine, #x, INT2NUM(ENGINE_##x))
diff --git a/ext/openssl/ossl_hmac.c b/ext/openssl/ossl_hmac.c
index 0bba44d783..b1e853dde3 100644
--- a/ext/openssl/ossl_hmac.c
+++ b/ext/openssl/ossl_hmac.c
@@ -359,6 +359,6 @@ Init_ossl_hmac()
void
Init_ossl_hmac()
{
- rb_warning("HMAC will NOT be avaible: OpenSSL is compiled without HMAC.");
+ rb_warning("HMAC is not available: OpenSSL is compiled without HMAC.");
}
#endif /* NO_HMAC */
diff --git a/ext/openssl/ossl_ocsp.c b/ext/openssl/ossl_ocsp.c
index 4e2e8394a4..c959379324 100644
--- a/ext/openssl/ossl_ocsp.c
+++ b/ext/openssl/ossl_ocsp.c
@@ -99,6 +99,15 @@ ossl_ocspreq_alloc(VALUE klass)
return obj;
}
+/*
+ * call-seq:
+ * OpenSSL::OCSP::Request.new -> request
+ * OpenSSL::OCSP::Request.new(request_der) -> request
+ *
+ * Creates a new OpenSSL::OCSP::Request. The request may be created empty or
+ * from a +request_der+ string.
+ */
+
static VALUE
ossl_ocspreq_initialize(int argc, VALUE *argv, VALUE self)
{
@@ -121,6 +130,17 @@ ossl_ocspreq_initialize(int argc, VALUE *argv, VALUE self)
return self;
}
+/*
+ * call-seq:
+ * request.add_nonce(nonce = nil) -> request
+ *
+ * Adds a +nonce+ to the OCSP request. If no nonce is given a random one will
+ * be generated.
+ *
+ * The nonce is used to prevent replay attacks but some servers do not support
+ * it.
+ */
+
static VALUE
ossl_ocspreq_add_nonce(int argc, VALUE *argv, VALUE self)
{
@@ -143,18 +163,25 @@ ossl_ocspreq_add_nonce(int argc, VALUE *argv, VALUE self)
return self;
}
-/* Check nonce validity in a request and response.
- * Return value reflects result:
- * 1: nonces present and equal.
- * 2: nonces both absent.
- * 3: nonce present in response only.
- * 0: nonces both present and not equal.
- * -1: nonce in request only.
+/*
+ * call-seq:
+ * request.check_nonce(response) -> result
+ *
+ * Checks the nonce validity for this request and +response+.
+ *
+ * The return value is one of the following:
*
- * For most responders clients can check return > 0.
- * If responder doesn't handle nonces return != 0 may be
- * necessary. return == 0 is always an error.
+ * -1 :: nonce in request only.
+ * 0 :: nonces both present and not equal.
+ * 1 :: nonces present and equal.
+ * 2 :: nonces both absent.
+ * 3 :: nonce present in response only.
+ *
+ * For most responses, clients can check +result+ > 0. If a responder doesn't
+ * handle nonces <code>result.nonzero?</code> may be necessary. A result of
+ * <code>0</code> is always an error.
*/
+
static VALUE
ossl_ocspreq_check_nonce(VALUE self, VALUE basic_resp)
{
@@ -169,6 +196,13 @@ ossl_ocspreq_check_nonce(VALUE self, VALUE basic_resp)
return INT2NUM(res);
}
+/*
+ * call-seq:
+ * request.add_certid(certificate_id) -> request
+ *
+ * Adds +certificate_id+ to the request.
+ */
+
static VALUE
ossl_ocspreq_add_certid(VALUE self, VALUE certid)
{
@@ -183,6 +217,13 @@ ossl_ocspreq_add_certid(VALUE self, VALUE certid)
return self;
}
+/*
+ * call-seq:
+ * request.certid -> [certificate_id, ...]
+ *
+ * Returns all certificate IDs in this request.
+ */
+
static VALUE
ossl_ocspreq_get_certid(VALUE self)
{
@@ -206,6 +247,17 @@ ossl_ocspreq_get_certid(VALUE self)
return ary;
}
+/*
+ * call-seq:
+ * request.sign(signer_cert, signer_key) -> self
+ * request.sign(signer_cert, signer_key, certificates) -> self
+ * request.sign(signer_cert, signer_key, certificates, flags) -> self
+ *
+ * Signs this OCSP request using +signer_cert+ and +signer_key+.
+ * +certificates+ is an optional Array of certificates that may be included in
+ * the request.
+ */
+
static VALUE
ossl_ocspreq_sign(int argc, VALUE *argv, VALUE self)
{
@@ -234,6 +286,14 @@ ossl_ocspreq_sign(int argc, VALUE *argv, VALUE self)
return self;
}
+/*
+ * call-seq:
+ * request.verify(certificates, store) -> true or false
+ * request.verify(certificates, store, flags) -> true or false
+ *
+ * Verifies this request using the given +certificates+ and X509 +store+.
+ */
+
static VALUE
ossl_ocspreq_verify(int argc, VALUE *argv, VALUE self)
{
@@ -255,6 +315,10 @@ ossl_ocspreq_verify(int argc, VALUE *argv, VALUE self)
return result ? Qtrue : Qfalse;
}
+/*
+ * Returns this request as a DER-encoded string
+ */
+
static VALUE
ossl_ocspreq_to_der(VALUE self)
{
@@ -278,6 +342,13 @@ ossl_ocspreq_to_der(VALUE self)
/*
* OCSP::Response
*/
+
+/* call-seq:
+ * OpenSSL::OCSP::Response.create(status, basic_response = nil) -> response
+ *
+ * Creates an OpenSSL::OCSP::Response from +status+ and +basic_response+.
+ */
+
static VALUE
ossl_ocspres_s_create(VALUE klass, VALUE status, VALUE basic_resp)
{
@@ -308,6 +379,15 @@ ossl_ocspres_alloc(VALUE klass)
return obj;
}
+/*
+ * call-seq:
+ * OpenSSL::OCSP::Response.new -> response
+ * OpenSSL::OCSP::Response.new(response_der) -> response
+ *
+ * Creates a new OpenSSL::OCSP::Response. The response may be created empty or
+ * from a +response_der+ string.
+ */
+
static VALUE
ossl_ocspres_initialize(int argc, VALUE *argv, VALUE self)
{
@@ -330,6 +410,13 @@ ossl_ocspres_initialize(int argc, VALUE *argv, VALUE self)
return self;
}
+/*
+ * call-seq:
+ * response.status -> Integer
+ *
+ * Returns the status of the response.
+ */
+
static VALUE
ossl_ocspres_status(VALUE self)
{
@@ -342,6 +429,13 @@ ossl_ocspres_status(VALUE self)
return INT2NUM(st);
}
+/*
+ * call-seq:
+ * response.status_string -> String
+ *
+ * Returns a status string for the response.
+ */
+
static VALUE
ossl_ocspres_status_string(VALUE self)
{
@@ -354,6 +448,13 @@ ossl_ocspres_status_string(VALUE self)
return rb_str_new2(OCSP_response_status_str(st));
}
+/*
+ * call-seq:
+ * response.basic
+ *
+ * Returns a BasicResponse for this response
+ */
+
static VALUE
ossl_ocspres_get_basic(VALUE self)
{
@@ -369,6 +470,13 @@ ossl_ocspres_get_basic(VALUE self)
return ret;
}
+/*
+ * call-seq:
+ * response.to_der -> String
+ *
+ * Returns this response as a DER-encoded string.
+ */
+
static VALUE
ossl_ocspres_to_der(VALUE self)
{
@@ -405,12 +513,27 @@ ossl_ocspbres_alloc(VALUE klass)
return obj;
}
+/*
+ * call-seq:
+ * OpenSSL::OCSP::BasicResponse.new(*) -> basic_response
+ *
+ * Creates a new BasicResponse and ignores all arguments.
+ */
+
static VALUE
ossl_ocspbres_initialize(int argc, VALUE *argv, VALUE self)
{
return self;
}
+/*
+ * call-seq:
+ * basic_response.copy_nonce(request) -> Integer
+ *
+ * Copies the nonce from +request+ into this response. Returns 1 on success
+ * and 0 on failure.
+ */
+
static VALUE
ossl_ocspbres_copy_nonce(VALUE self, VALUE request)
{
@@ -425,6 +548,14 @@ ossl_ocspbres_copy_nonce(VALUE self, VALUE request)
return INT2NUM(ret);
}
+/*
+ * call-seq:
+ * basic_response.add_nonce(nonce = nil)
+ *
+ * Adds +nonce+ to this response. If no nonce was provided a random nonce
+ * will be added.
+ */
+
static VALUE
ossl_ocspbres_add_nonce(int argc, VALUE *argv, VALUE self)
{
@@ -447,6 +578,22 @@ ossl_ocspbres_add_nonce(int argc, VALUE *argv, VALUE self)
return self;
}
+/*
+ * call-seq:
+ * basic_response.add_status(certificate_id, status, reason, revocation_time, this_update, next_update, extensions) -> basic_response
+ *
+ * Adds a validation +status+ (0 for revoked, 1 for success) to this
+ * response for +certificate_id+. +reason+ describes the reason for the
+ * revocation, if any.
+ *
+ * The +revocation_time+, +this_update+ and +next_update+ are times for the
+ * certificate's revocation time, the time of this status and the next update
+ * time for a new status, respectively.
+ *
+ * +extensions+ may be an Array of OpenSSL::X509::Extension that will
+ * be added to this response or nil.
+ */
+
static VALUE
ossl_ocspbres_add_status(VALUE self, VALUE cid, VALUE status,
VALUE reason, VALUE revtime,
@@ -515,6 +662,16 @@ ossl_ocspbres_add_status(VALUE self, VALUE cid, VALUE status,
return self;
}
+/*
+ * call-seq:
+ * basic_response.status -> statuses
+ *
+ * Returns an Array of statuses for this response. Each status contains a
+ * CertificateId, the status (0 for success, 1 for revoked), the reason for
+ * the status, the revocation time, the time of this update, the time for the
+ * next update and a list of OpenSSL::X509::Extensions.
+ */
+
static VALUE
ossl_ocspbres_get_status(VALUE self)
{
@@ -560,6 +717,16 @@ ossl_ocspbres_get_status(VALUE self)
return ret;
}
+/*
+ * call-seq:
+ * basic_response.sign(signer_cert, signer_key) -> self
+ * basic_response.sign(signer_cert, signer_key, certificates) -> self
+ * basic_response.sign(signer_cert, signer_key, certificates, flags) -> self
+ *
+ * Signs this response using the +signer_cert+ and +signer_key+. Additional
+ * +certificates+ may be added to the signature along with a set of +flags+.
+ */
+
static VALUE
ossl_ocspbres_sign(int argc, VALUE *argv, VALUE self)
{
@@ -590,6 +757,14 @@ ossl_ocspbres_sign(int argc, VALUE *argv, VALUE self)
return self;
}
+/*
+ * call-seq:
+ * basic_response.verify(certificates, store) -> true or false
+ * basic_response.verify(certificates, store, flags) -> true or false
+ *
+ * Verifies the signature of the response using the given +certificates+,
+ * +store+ and +flags+.
+ */
static VALUE
ossl_ocspbres_verify(int argc, VALUE *argv, VALUE self)
{
@@ -627,6 +802,15 @@ ossl_ocspcid_alloc(VALUE klass)
return obj;
}
+/*
+ * call-seq:
+ * OpenSSL::OCSP::CertificateId.new(subject, issuer, digest = nil) -> certificate_id
+ *
+ * Creates a new OpenSSL::OCSP::CertificateId for the given +subject+ and
+ * +issuer+ X509 certificates. The +digest+ is used to compute the
+ * certificate ID and must be an OpenSSL::Digest instance.
+ */
+
static VALUE
ossl_ocspcid_initialize(int argc, VALUE *argv, VALUE self)
{
@@ -657,6 +841,13 @@ ossl_ocspcid_initialize(int argc, VALUE *argv, VALUE self)
return self;
}
+/*
+ * call-seq:
+ * certificate_id.cmp(other) -> true or false
+ *
+ * Compares this certificate id with +other+ and returns true if they are the
+ * same.
+ */
static VALUE
ossl_ocspcid_cmp(VALUE self, VALUE other)
{
@@ -670,6 +861,14 @@ ossl_ocspcid_cmp(VALUE self, VALUE other)
return (result == 0) ? Qtrue : Qfalse;
}
+/*
+ * call-seq:
+ * certificate_id.cmp_issuer(other) -> true or false
+ *
+ * Compares this certificate id's issuer with +other+ and returns true if
+ * they are the same.
+ */
+
static VALUE
ossl_ocspcid_cmp_issuer(VALUE self, VALUE other)
{
@@ -683,6 +882,13 @@ ossl_ocspcid_cmp_issuer(VALUE self, VALUE other)
return (result == 0) ? Qtrue : Qfalse;
}
+/*
+ * call-seq:
+ * certificate_id.get_serial -> Integer
+ *
+ * Returns the serial number of the issuing certificate.
+ */
+
static VALUE
ossl_ocspcid_get_serial(VALUE self)
{
@@ -696,10 +902,130 @@ ossl_ocspcid_get_serial(VALUE self)
void
Init_ossl_ocsp()
{
+ /*
+ * OpenSSL::OCSP implements Online Certificate Status Protocol requests
+ * and responses.
+ *
+ * Creating and sending an OCSP request requires a subject certificate
+ * that contains an OCSP URL in an authorityInfoAccess extension and the
+ * issuer certificate for the subject certificate. First, load the issuer
+ * and subject certificates:
+ *
+ * subject = OpenSSL::X509::Certificate.new subject_pem
+ * issuer = OpenSSL::X509::Certificate.new issuer_pem
+ *
+ * To create the request we need to create a certificate ID for the
+ * subject certificate so the CA knows which certificate we are asking
+ * about:
+ *
+ * digest = OpenSSL::Digest::SHA1.new
+ * certificate_id =
+ * OpenSSL::OCSP::CertificateId.new subject, issuer, digest
+ *
+ * Then create a request and add the certificate ID to it:
+ *
+ * request = OpenSSL::OCSP::Request.new
+ * request.add_certid certificate_id
+ *
+ * Adding a nonce to the request protects against replay attacks but not
+ * all CA process the nonce.
+ *
+ * request.add_nonce
+ *
+ * To submit the request to the CA for verification we need to extract the
+ * OCSP URI from the subject certificate:
+ *
+ * authority_info_access = subject.extensions.find do |extension|
+ * extension.oid == 'authorityInfoAccess'
+ * end
+ *
+ * descriptions = authority_info_access.value.split "\n"
+ * ocsp = descriptions.find do |description|
+ * description.start_with? 'OCSP'
+ * end
+ *
+ * require 'uri'
+ *
+ * ocsp_uri = URI ocsp[/URI:(.*)/, 1]
+ *
+ * To submit the request we'll POST the request to the OCSP URI (per RFC
+ * 2560). Note that we only handle HTTP requests and don't handle any
+ * redirects in this example, so this is insufficient for serious use.
+ *
+ * require 'net/http'
+ *
+ * http_response =
+ * Net::HTTP.start ocsp_uri.hostname, ocsp.port do |http|
+ * http.post ocsp_uri.path, request.to_der,
+ * 'content-type' => 'application/ocsp-request'
+ * end
+ *
+ * response = OpenSSL::OCSP::Response.new http_response.body
+ * response_basic = response.basic
+ *
+ * First we check if the response has a valid signature. Without a valid
+ * signature we cannot trust it. If you get a failure here you may be
+ * missing a system certificate store or may be missing the intermediate
+ * certificates.
+ *
+ * store = OpenSSL::X509::Store.new
+ * store.set_default_paths
+ *
+ * unless response.verify [], store then
+ * raise 'response is not signed by a trusted certificate'
+ * end
+ *
+ * The response contains the status information (success/fail). We can
+ * display the status as a string:
+ *
+ * puts response.status_string #=> successful
+ *
+ * Next we need to know the response details to determine if the response
+ * matches our request. First we check the nonce. Again, not all CAs
+ * support a nonce. See Request#check_nonce for the meanings of the
+ * return values.
+ *
+ * p request.check_nonce basic_response #=> value from -1 to 3
+ *
+ * Then extract the status information from the basic response. (You can
+ * check multiple certificates in a request, but for this example we only
+ * submitted one.)
+ *
+ * response_certificate_id, status, reason, revocation_time,
+ * this_update, next_update, extensions = basic_response.status
+ *
+ * Then check the various fields.
+ *
+ * unless response_certificate_id == certificate_id then
+ * raise 'certificate id mismatch'
+ * end
+ *
+ * now = Time.now
+ *
+ * if this_update > now then
+ * raise 'update date is in the future'
+ * end
+ *
+ * if now > next_update then
+ * raise 'next update time has passed'
+ * end
+ */
+
mOCSP = rb_define_module_under(mOSSL, "OCSP");
+ /*
+ * OCSP error class.
+ */
+
eOCSPError = rb_define_class_under(mOCSP, "OCSPError", eOSSLError);
+ /*
+ * An OpenSSL::OCSP::Request contains the certificate information for
+ * determining if a certificate has been revoked or not. A Request can be
+ * created for a certificate or from a DER-encoded request created
+ * elsewhere.
+ */
+
cOCSPReq = rb_define_class_under(mOCSP, "Request", rb_cObject);
rb_define_alloc_func(cOCSPReq, ossl_ocspreq_alloc);
rb_define_method(cOCSPReq, "initialize", ossl_ocspreq_initialize, -1);
@@ -711,6 +1037,11 @@ Init_ossl_ocsp()
rb_define_method(cOCSPReq, "verify", ossl_ocspreq_verify, -1);
rb_define_method(cOCSPReq, "to_der", ossl_ocspreq_to_der, 0);
+ /*
+ * An OpenSSL::OCSP::Response contains the status of a certificate check
+ * which is created from an OpenSSL::OCSP::Request.
+ */
+
cOCSPRes = rb_define_class_under(mOCSP, "Response", rb_cObject);
rb_define_singleton_method(cOCSPRes, "create", ossl_ocspres_s_create, 2);
rb_define_alloc_func(cOCSPRes, ossl_ocspres_alloc);
@@ -720,6 +1051,12 @@ Init_ossl_ocsp()
rb_define_method(cOCSPRes, "basic", ossl_ocspres_get_basic, 0);
rb_define_method(cOCSPRes, "to_der", ossl_ocspres_to_der, 0);
+ /*
+ * An OpenSSL::OCSP::BasicResponse contains the status of a certificate
+ * check which is created from an OpenSSL::OCSP::Request. A
+ * BasicResponse is more detailed than a Response.
+ */
+
cOCSPBasicRes = rb_define_class_under(mOCSP, "BasicResponse", rb_cObject);
rb_define_alloc_func(cOCSPBasicRes, ossl_ocspbres_alloc);
rb_define_method(cOCSPBasicRes, "initialize", ossl_ocspbres_initialize, -1);
@@ -730,6 +1067,11 @@ Init_ossl_ocsp()
rb_define_method(cOCSPBasicRes, "sign", ossl_ocspbres_sign, -1);
rb_define_method(cOCSPBasicRes, "verify", ossl_ocspbres_verify, -1);
+ /*
+ * An OpenSSL::OCSP::CertificateId identifies a certificate to the CA so
+ * that a status check can be performed.
+ */
+
cOCSPCertId = rb_define_class_under(mOCSP, "CertificateId", rb_cObject);
rb_define_alloc_func(cOCSPCertId, ossl_ocspcid_alloc);
rb_define_method(cOCSPCertId, "initialize", ossl_ocspcid_initialize, -1);
@@ -737,45 +1079,105 @@ Init_ossl_ocsp()
rb_define_method(cOCSPCertId, "cmp_issuer", ossl_ocspcid_cmp_issuer, 1);
rb_define_method(cOCSPCertId, "serial", ossl_ocspcid_get_serial, 0);
-#define DefOCSPConst(x) rb_define_const(mOCSP, #x, INT2NUM(OCSP_##x))
-
- DefOCSPConst(RESPONSE_STATUS_SUCCESSFUL);
- DefOCSPConst(RESPONSE_STATUS_MALFORMEDREQUEST);
- DefOCSPConst(RESPONSE_STATUS_INTERNALERROR);
- DefOCSPConst(RESPONSE_STATUS_TRYLATER);
- DefOCSPConst(RESPONSE_STATUS_SIGREQUIRED);
- DefOCSPConst(RESPONSE_STATUS_UNAUTHORIZED);
-
- DefOCSPConst(REVOKED_STATUS_NOSTATUS);
- DefOCSPConst(REVOKED_STATUS_UNSPECIFIED);
- DefOCSPConst(REVOKED_STATUS_KEYCOMPROMISE);
- DefOCSPConst(REVOKED_STATUS_CACOMPROMISE);
- DefOCSPConst(REVOKED_STATUS_AFFILIATIONCHANGED);
- DefOCSPConst(REVOKED_STATUS_SUPERSEDED);
- DefOCSPConst(REVOKED_STATUS_CESSATIONOFOPERATION);
- DefOCSPConst(REVOKED_STATUS_CERTIFICATEHOLD);
- DefOCSPConst(REVOKED_STATUS_REMOVEFROMCRL);
-
- DefOCSPConst(NOCERTS);
- DefOCSPConst(NOINTERN);
- DefOCSPConst(NOSIGS);
- DefOCSPConst(NOCHAIN);
- DefOCSPConst(NOVERIFY);
- DefOCSPConst(NOEXPLICIT);
- DefOCSPConst(NOCASIGN);
- DefOCSPConst(NODELEGATED);
- DefOCSPConst(NOCHECKS);
- DefOCSPConst(TRUSTOTHER);
- DefOCSPConst(RESPID_KEY);
- DefOCSPConst(NOTIME);
-
-#define DefOCSPVConst(x) rb_define_const(mOCSP, "V_" #x, INT2NUM(V_OCSP_##x))
-
- DefOCSPVConst(CERTSTATUS_GOOD);
- DefOCSPVConst(CERTSTATUS_REVOKED);
- DefOCSPVConst(CERTSTATUS_UNKNOWN);
- DefOCSPVConst(RESPID_NAME);
- DefOCSPVConst(RESPID_KEY);
+ /* Internal error in issuer */
+ rb_define_const(mOCSP, "RESPONSE_STATUS_INTERNALERROR", INT2NUM(OCSP_RESPONSE_STATUS_INTERNALERROR));
+
+ /* Illegal confirmation request */
+ rb_define_const(mOCSP, "RESPONSE_STATUS_MALFORMEDREQUEST", INT2NUM(OCSP_RESPONSE_STATUS_MALFORMEDREQUEST));
+
+ /* The certificate was revoked for an unknown reason */
+ rb_define_const(mOCSP, "REVOKED_STATUS_NOSTATUS", INT2NUM(OCSP_REVOKED_STATUS_NOSTATUS));
+
+ /* You must sign the request and resubmit */
+ rb_define_const(mOCSP, "RESPONSE_STATUS_SIGREQUIRED", INT2NUM(OCSP_RESPONSE_STATUS_SIGREQUIRED));
+
+ /* Response has valid confirmations */
+ rb_define_const(mOCSP, "RESPONSE_STATUS_SUCCESSFUL", INT2NUM(OCSP_RESPONSE_STATUS_SUCCESSFUL));
+
+ /* Try again later */
+ rb_define_const(mOCSP, "RESPONSE_STATUS_TRYLATER", INT2NUM(OCSP_RESPONSE_STATUS_TRYLATER));
+
+ /* The certificate subject's name or other information changed */
+ rb_define_const(mOCSP, "REVOKED_STATUS_AFFILIATIONCHANGED", INT2NUM(OCSP_REVOKED_STATUS_AFFILIATIONCHANGED));
+
+ /* This CA certificate was revoked due to a key compromise */
+ rb_define_const(mOCSP, "REVOKED_STATUS_CACOMPROMISE", INT2NUM(OCSP_REVOKED_STATUS_CACOMPROMISE));
+
+ /* The certificate is on hold */
+ rb_define_const(mOCSP, "REVOKED_STATUS_CERTIFICATEHOLD", INT2NUM(OCSP_REVOKED_STATUS_CERTIFICATEHOLD));
+
+ /* The certificate is no longer needed */
+ rb_define_const(mOCSP, "REVOKED_STATUS_CESSATIONOFOPERATION", INT2NUM(OCSP_REVOKED_STATUS_CESSATIONOFOPERATION));
+
+ /* The certificate was revoked due to a key compromise */
+ rb_define_const(mOCSP, "REVOKED_STATUS_KEYCOMPROMISE", INT2NUM(OCSP_REVOKED_STATUS_KEYCOMPROMISE));
+
+ /* The certificate was previously on hold and should now be removed from
+ * the CRL */
+ rb_define_const(mOCSP, "REVOKED_STATUS_REMOVEFROMCRL", INT2NUM(OCSP_REVOKED_STATUS_REMOVEFROMCRL));
+
+ /* The certificate was superseded by a new certificate */
+ rb_define_const(mOCSP, "REVOKED_STATUS_SUPERSEDED", INT2NUM(OCSP_REVOKED_STATUS_SUPERSEDED));
+
+ /* Your request is unauthorized. */
+ rb_define_const(mOCSP, "RESPONSE_STATUS_UNAUTHORIZED", INT2NUM(OCSP_RESPONSE_STATUS_UNAUTHORIZED));
+
+ /* The certificate was revoked for an unspecified reason */
+ rb_define_const(mOCSP, "REVOKED_STATUS_UNSPECIFIED", INT2NUM(OCSP_REVOKED_STATUS_UNSPECIFIED));
+
+ /* Do not include certificates in the response */
+ rb_define_const(mOCSP, "NOCERTS", INT2NUM(OCSP_NOCERTS));
+
+ /* Do not search certificates contained in the response for a signer */
+ rb_define_const(mOCSP, "NOINTERN", INT2NUM(OCSP_NOINTERN));
+
+ /* Do not check the signature on the response */
+ rb_define_const(mOCSP, "NOSIGS", INT2NUM(OCSP_NOSIGS));
+
+ /* Do not verify the certificate chain on the response */
+ rb_define_const(mOCSP, "NOCHAIN", INT2NUM(OCSP_NOCHAIN));
+
+ /* Do not verify the response at all */
+ rb_define_const(mOCSP, "NOVERIFY", INT2NUM(OCSP_NOVERIFY));
+
+ /* Do not check trust */
+ rb_define_const(mOCSP, "NOEXPLICIT", INT2NUM(OCSP_NOEXPLICIT));
+
+ /* (This flag is not used by OpenSSL 1.0.1g) */
+ rb_define_const(mOCSP, "NOCASIGN", INT2NUM(OCSP_NOCASIGN));
+
+ /* (This flag is not used by OpenSSL 1.0.1g) */
+ rb_define_const(mOCSP, "NODELEGATED", INT2NUM(OCSP_NODELEGATED));
+
+ /* Do not make additional signing certificate checks */
+ rb_define_const(mOCSP, "NOCHECKS", INT2NUM(OCSP_NOCHECKS));
+
+ /* Do not verify additional certificates */
+ rb_define_const(mOCSP, "TRUSTOTHER", INT2NUM(OCSP_TRUSTOTHER));
+
+ /* Identify the response by signing the certificate key ID */
+ rb_define_const(mOCSP, "RESPID_KEY", INT2NUM(OCSP_RESPID_KEY));
+
+ /* Do not include producedAt time in response */
+ rb_define_const(mOCSP, "NOTIME", INT2NUM(OCSP_NOTIME));
+
+ /* Indicates the certificate is not revoked but does not necessarily mean
+ * the certificate was issued or that this response is within the
+ * certificate's validity interval */
+ rb_define_const(mOCSP, "V_CERTSTATUS_GOOD", INT2NUM(V_OCSP_CERTSTATUS_GOOD));
+ /* Indicates the certificate has been revoked either permanently or
+ * temporarily (on hold). */
+ rb_define_const(mOCSP, "V_CERTSTATUS_REVOKED", INT2NUM(V_OCSP_CERTSTATUS_REVOKED));
+
+ /* Indicates the responder does not know about the certificate being
+ * requested. */
+ rb_define_const(mOCSP, "V_CERTSTATUS_UNKNOWN", INT2NUM(V_OCSP_CERTSTATUS_UNKNOWN));
+
+ /* The responder ID is based on the key name. */
+ rb_define_const(mOCSP, "V_RESPID_NAME", INT2NUM(V_OCSP_RESPID_NAME));
+
+ /* The responder ID is based on the public key. */
+ rb_define_const(mOCSP, "V_RESPID_KEY", INT2NUM(V_OCSP_RESPID_KEY));
}
#else /* ! OSSL_OCSP_ENABLED */
diff --git a/ext/openssl/ossl_pkcs7.c b/ext/openssl/ossl_pkcs7.c
index 553a580923..bd5dc78947 100644
--- a/ext/openssl/ossl_pkcs7.c
+++ b/ext/openssl/ossl_pkcs7.c
@@ -362,9 +362,10 @@ ossl_pkcs7_sym2typeid(VALUE sym)
{
int i, ret = Qnil;
const char *s;
+ size_t l;
- static struct {
- const char *name;
+ static const struct {
+ char name[20];
int nid;
} p7_type_tab[] = {
{ "signed", NID_pkcs7_signed },
@@ -373,14 +374,15 @@ ossl_pkcs7_sym2typeid(VALUE sym)
{ "enveloped", NID_pkcs7_enveloped },
{ "encrypted", NID_pkcs7_encrypted },
{ "digest", NID_pkcs7_digest },
- { NULL, 0 },
};
- if(TYPE(sym) == T_SYMBOL) s = rb_id2name(SYM2ID(sym));
- else s = StringValuePtr(sym);
- for(i = 0; i < numberof(p7_type_tab); i++){
- if(p7_type_tab[i].name == NULL)
+ if (RB_TYPE_P(sym, T_SYMBOL)) sym = rb_sym2str(sym);
+ else StringValue(sym);
+ RSTRING_GETMEM(sym, s, l);
+ for(i = 0; ; i++){
+ if(i == numberof(p7_type_tab))
ossl_raise(ePKCS7Error, "unknown type \"%s\"", s);
+ if(strlen(p7_type_tab[i].name) != l) continue;
if(strcmp(p7_type_tab[i].name, s) == 0){
ret = p7_type_tab[i].nid;
break;
diff --git a/ext/openssl/ossl_ssl.c b/ext/openssl/ossl_ssl.c
index 206470cbfe..d37e51c857 100644
--- a/ext/openssl/ossl_ssl.c
+++ b/ext/openssl/ossl_ssl.c
@@ -108,7 +108,7 @@ static VALUE sym_exception;
/*
* SSLContext class
*/
-struct {
+static const struct {
const char *name;
SSL_METHOD *(*func)(void);
} ossl_ssl_method_tab[] = {
@@ -190,7 +190,7 @@ ossl_sslctx_set_ssl_version(VALUE self, VALUE ssl_method)
int i;
SSL_CTX *ctx;
- if(TYPE(ssl_method) == T_SYMBOL)
+ if (RB_TYPE_P(ssl_method, T_SYMBOL))
s = rb_id2name(SYM2ID(ssl_method));
else
s = StringValuePtr(ssl_method);
@@ -716,7 +716,7 @@ ossl_sslctx_setup(VALUE self)
val = ossl_sslctx_get_client_ca(self);
if(!NIL_P(val)){
- if(TYPE(val) == T_ARRAY){
+ if (RB_TYPE_P(val, T_ARRAY)) {
for(i = 0; i < RARRAY_LEN(val); i++){
client_ca = GetX509CertPtr(RARRAY_PTR(val)[i]);
if (!SSL_CTX_add_client_CA(ctx, client_ca)){
@@ -882,11 +882,11 @@ ossl_sslctx_set_ciphers(VALUE self, VALUE v)
rb_check_frozen(self);
if (NIL_P(v))
return v;
- else if (TYPE(v) == T_ARRAY) {
+ else if (RB_TYPE_P(v, T_ARRAY)) {
str = rb_str_new(0, 0);
for (i = 0; i < RARRAY_LEN(v); i++) {
elem = rb_ary_entry(v, i);
- if (TYPE(elem) == T_ARRAY) elem = rb_ary_entry(elem, 0);
+ if (RB_TYPE_P(elem, T_ARRAY)) elem = rb_ary_entry(elem, 0);
elem = rb_String(elem);
rb_str_append(str, elem);
if (i < RARRAY_LEN(v)-1) rb_str_cat2(str, ":");
@@ -1431,7 +1431,11 @@ ossl_ssl_read_internal(int argc, VALUE *argv, VALUE self, int nonblock)
else {
ID meth = nonblock ? rb_intern("read_nonblock") : rb_intern("sysread");
rb_warning("SSL session is not started yet.");
- return rb_funcall(ossl_ssl_get_io(self), meth, 2, len, str);
+ if (nonblock) {
+ return rb_funcall(ossl_ssl_get_io(self), meth, 3, len, str, opts);
+ } else {
+ return rb_funcall(ossl_ssl_get_io(self), meth, 2, len, str);
+ }
}
end:
@@ -1562,18 +1566,22 @@ static VALUE
ossl_ssl_close(VALUE self)
{
SSL *ssl;
+ VALUE io;
- ossl_ssl_data_get_struct(self, ssl);
+ /* ossl_ssl_data_get_struct() is not usable here because it may return
+ * from this function; */
- if (ssl) {
- VALUE io = ossl_ssl_get_io(self);
- if (!RTEST(rb_funcall(io, rb_intern("closed?"), 0))) {
- ossl_ssl_shutdown(ssl);
- SSL_free(ssl);
- DATA_PTR(self) = NULL;
- if (RTEST(ossl_ssl_get_sync_close(self)))
- rb_funcall(io, rb_intern("close"), 0);
- }
+ Data_Get_Struct(self, SSL, ssl);
+
+ io = ossl_ssl_get_io(self);
+ if (!RTEST(rb_funcall(io, rb_intern("closed?"), 0))) {
+ if (ssl) {
+ ossl_ssl_shutdown(ssl);
+ SSL_free(ssl);
+ }
+ DATA_PTR(self) = NULL;
+ if (RTEST(ossl_ssl_get_sync_close(self)))
+ rb_funcall(io, rb_intern("close"), 0);
}
return Qnil;
@@ -2019,7 +2027,7 @@ Init_ossl_ssl()
rb_attr(cSSLContext, rb_intern("session_get_cb"), 1, 1, Qfalse);
/*
- * A callback invoked when a new session was negotiatied.
+ * A callback invoked when a new session was negotiated.
*
* The callback is invoked with an SSLSocket. If false is returned the
* session will be removed from the internal cache.
diff --git a/ext/openssl/ossl_x509cert.c b/ext/openssl/ossl_x509cert.c
index 84cedc763a..85bbc0d081 100644
--- a/ext/openssl/ossl_x509cert.c
+++ b/ext/openssl/ossl_x509cert.c
@@ -693,35 +693,15 @@ ossl_x509_add_extension(VALUE self, VALUE extension)
static VALUE
ossl_x509_inspect(VALUE self)
{
- VALUE str;
- const char *cname = rb_class2name(rb_obj_class(self));
-
- str = rb_str_new2("#<");
- rb_str_cat2(str, cname);
- rb_str_cat2(str, " ");
-
- rb_str_cat2(str, "subject=");
- rb_str_append(str, rb_inspect(ossl_x509_get_subject(self)));
- rb_str_cat2(str, ", ");
-
- rb_str_cat2(str, "issuer=");
- rb_str_append(str, rb_inspect(ossl_x509_get_issuer(self)));
- rb_str_cat2(str, ", ");
-
- rb_str_cat2(str, "serial=");
- rb_str_append(str, rb_inspect(ossl_x509_get_serial(self)));
- rb_str_cat2(str, ", ");
-
- rb_str_cat2(str, "not_before=");
- rb_str_append(str, rb_inspect(ossl_x509_get_not_before(self)));
- rb_str_cat2(str, ", ");
-
- rb_str_cat2(str, "not_after=");
- rb_str_append(str, rb_inspect(ossl_x509_get_not_after(self)));
-
- str = rb_str_cat2(str, ">");
-
- return str;
+ return rb_sprintf("#<%"PRIsVALUE": subject=%+"PRIsVALUE", "
+ "issuer=%+"PRIsVALUE", serial=%+"PRIsVALUE", "
+ "not_before=%+"PRIsVALUE", not_after=%+"PRIsVALUE">",
+ rb_obj_class(self),
+ ossl_x509_get_subject(self),
+ ossl_x509_get_issuer(self),
+ ossl_x509_get_serial(self),
+ ossl_x509_get_not_before(self),
+ ossl_x509_get_not_after(self));
}
/*
diff --git a/ext/openssl/ossl_x509name.c b/ext/openssl/ossl_x509name.c
index 6de79d45e9..be70dc1b12 100644
--- a/ext/openssl/ossl_x509name.c
+++ b/ext/openssl/ossl_x509name.c
@@ -183,13 +183,14 @@ VALUE ossl_x509name_add_entry(int argc, VALUE *argv, VALUE self)
{
X509_NAME *name;
VALUE oid, value, type;
+ const char *oid_name;
rb_scan_args(argc, argv, "21", &oid, &value, &type);
- StringValue(oid);
+ oid_name = StringValueCStr(oid);
StringValue(value);
if(NIL_P(type)) type = rb_aref(OBJECT_TYPE_TEMPLATE, oid);
GetX509Name(self, name);
- if (!X509_NAME_add_entry_by_txt(name, RSTRING_PTR(oid), NUM2INT(type),
+ if (!X509_NAME_add_entry_by_txt(name, oid_name, NUM2INT(type),
(const unsigned char *)RSTRING_PTR(value), RSTRING_LENINT(value), -1, 0)) {
ossl_raise(eX509NameError, NULL);
}
diff --git a/ext/pathname/extconf.rb b/ext/pathname/extconf.rb
index 6720903e88..037f10065d 100644
--- a/ext/pathname/extconf.rb
+++ b/ext/pathname/extconf.rb
@@ -1,2 +1,3 @@
require 'mkmf'
+have_struct_member("struct stat", "st_birthtimespec", "sys/stat.h")
create_makefile('pathname')
diff --git a/ext/pathname/lib/pathname.rb b/ext/pathname/lib/pathname.rb
index 8bce81ea10..82541e9b15 100644
--- a/ext/pathname/lib/pathname.rb
+++ b/ext/pathname/lib/pathname.rb
@@ -327,12 +327,17 @@ class Pathname
# p2 = p1 + "bin/ruby" # Pathname:/usr/bin/ruby
# p3 = p1 + "/etc/passwd" # Pathname:/etc/passwd
#
+ # # / is aliased to +.
+ # p4 = p1 / "bin/ruby" # Pathname:/usr/bin/ruby
+ # p5 = p1 / "/etc/passwd" # Pathname:/etc/passwd
+ #
# This method doesn't access the file system; it is pure string manipulation.
#
def +(other)
other = Pathname.new(other) unless Pathname === other
Pathname.new(plus(@path, other.to_s))
end
+ alias / +
def plus(path1, path2) # -> path # :nodoc:
prefix2 = path2
@@ -387,7 +392,7 @@ class Pathname
# #=> true
#
def join(*args)
- args.unshift self
+ return self if args.empty?
result = args.pop
result = Pathname.new(result) unless Pathname === result
return result if result.absolute?
@@ -396,7 +401,7 @@ class Pathname
result = arg + result
return result if result.absolute?
}
- result
+ self + result
end
#
@@ -537,13 +542,13 @@ class Pathname # * Find *
#
# See Find.find
#
- def find # :yield: pathname
- return to_enum(__method__) unless block_given?
+ def find(ignore_error: true) # :yield: pathname
+ return to_enum(__method__, ignore_error: ignore_error) unless block_given?
require 'find'
if @path == '.'
- Find.find(@path) {|f| yield self.class.new(f.sub(%r{\A\./}, '')) }
+ Find.find(@path, ignore_error: ignore_error) {|f| yield self.class.new(f.sub(%r{\A\./}, '')) }
else
- Find.find(@path) {|f| yield self.class.new(f) }
+ Find.find(@path, ignore_error: ignore_error) {|f| yield self.class.new(f) }
end
end
end
diff --git a/ext/pathname/pathname.c b/ext/pathname/pathname.c
index 3db97fcf3d..7c24598759 100644
--- a/ext/pathname/pathname.c
+++ b/ext/pathname/pathname.c
@@ -440,6 +440,25 @@ path_atime(VALUE self)
return rb_funcall(rb_cFile, rb_intern("atime"), 1, get_strpath(self));
}
+#if defined(HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC) || defined(_WIN32)
+/*
+ * call-seq:
+ * pathname.birthtime -> time
+ *
+ * Returns the birth time for the file.
+ * If the platform doesn't have birthtime, returns <i>ctime</i>.
+ *
+ * See File.birthtime.
+ */
+static VALUE
+path_birthtime(VALUE self)
+{
+ return rb_funcall(rb_cFile, rb_intern("birthtime"), 1, get_strpath(self));
+}
+#else
+# define path_birthtime rb_f_notimplement
+#endif
+
/*
* call-seq:
* pathname.ctime -> time
@@ -1288,6 +1307,7 @@ path_f_pathname(VALUE self, VALUE str)
*
* These methods are a facade for File:
* - #atime
+ * - #birthtime
* - #ctime
* - #mtime
* - #chmod(mode)
@@ -1380,6 +1400,7 @@ Init_pathname()
rb_define_method(rb_cPathname, "binwrite", path_binwrite, -1);
rb_define_method(rb_cPathname, "sysopen", path_sysopen, -1);
rb_define_method(rb_cPathname, "atime", path_atime, 0);
+ rb_define_method(rb_cPathname, "birthtime", path_birthtime, 0);
rb_define_method(rb_cPathname, "ctime", path_ctime, 0);
rb_define_method(rb_cPathname, "mtime", path_mtime, 0);
rb_define_method(rb_cPathname, "chmod", path_chmod, 1);
diff --git a/ext/psych/lib/psych.rb b/ext/psych/lib/psych.rb
index 329514a930..40fcf610e2 100644
--- a/ext/psych/lib/psych.rb
+++ b/ext/psych/lib/psych.rb
@@ -72,7 +72,7 @@ require 'psych/class_loader'
# ==== Exception handling
#
# begin
-# # The second argument chnages only the exception contents
+# # The second argument changes only the exception contents
# Psych.parse("--- `", "file.txt")
# rescue Psych::SyntaxError => ex
# ex.file # => 'file.txt'
@@ -136,7 +136,7 @@ require 'psych/class_loader'
# ==== Exception handling
#
# begin
-# # The second argument chnages only the exception contents
+# # The second argument changes only the exception contents
# Psych.parse("--- `", "file.txt")
# rescue Psych::SyntaxError => ex
# ex.file # => 'file.txt'
@@ -217,7 +217,7 @@ require 'psych/class_loader'
module Psych
# The version is Psych you're using
- VERSION = '2.0.5'
+ VERSION = '2.0.6'
# The version of libyaml Psych is using
LIBYAML_VERSION = Psych.libyaml_version.join '.'
diff --git a/ext/psych/lib/psych/nodes/sequence.rb b/ext/psych/lib/psych/nodes/sequence.rb
index e4b833d330..7e907fe2c8 100644
--- a/ext/psych/lib/psych/nodes/sequence.rb
+++ b/ext/psych/lib/psych/nodes/sequence.rb
@@ -56,7 +56,7 @@ module Psych
# Is this sequence started implicitly?
attr_accessor :implicit
- # The sequece style used
+ # The sequence style used
attr_accessor :style
###
diff --git a/ext/psych/lib/psych/scalar_scanner.rb b/ext/psych/lib/psych/scalar_scanner.rb
index 3fc9edd25d..93007902a7 100644
--- a/ext/psych/lib/psych/scalar_scanner.rb
+++ b/ext/psych/lib/psych/scalar_scanner.rb
@@ -37,7 +37,7 @@ module Psych
case string
# Check for a String type, being careful not to get caught by hash keys, hex values, and
# special floats (e.g., -.inf).
- when /^[^\d\.:-]?[A-Za-z_\s!@#\$%\^&\*\(\)\{\}\<\>\|\/\\~;=]+/
+ when /^[^\d\.:-]?[A-Za-z_\s!@#\$%\^&\*\(\)\{\}\<\>\|\/\\~;=]+/, /\n/
if string.length > 5
@string_cache[string] = true
return string
diff --git a/ext/psych/lib/psych/visitors/to_ruby.rb b/ext/psych/lib/psych/visitors/to_ruby.rb
index 5c3baa5b68..e74d5d4bc5 100644
--- a/ext/psych/lib/psych/visitors/to_ruby.rb
+++ b/ext/psych/lib/psych/visitors/to_ruby.rb
@@ -183,9 +183,11 @@ module Psych
klass = class_loader.struct
members = o.children.map { |c| accept c }
h = Hash[*members]
- klass.new(*h.map { |k,v|
+ s = klass.new(*h.map { |k,v|
class_loader.symbolize k
}).new(*h.map { |k,v| v })
+ register(o, s)
+ s
end
when /^!ruby\/object:?(.*)?$/
@@ -199,6 +201,8 @@ module Psych
class_loader.rational
h = Hash[*o.children.map { |c| accept c }]
register o, Rational(h['numerator'], h['denominator'])
+ elsif name == 'Hash'
+ revive_hash(register(o, {}), o)
else
obj = revive((resolve_class(name) || class_loader.object), o)
obj
@@ -301,9 +305,9 @@ module Psych
key = accept(k)
val = accept(v)
- if key == '<<'
+ if key == '<<' && k.tag != "tag:yaml.org,2002:str"
case v
- when Nodes::Alias
+ when Nodes::Alias, Nodes::Mapping
begin
hash.merge! val
rescue TypeError
diff --git a/ext/psych/lib/psych/visitors/yaml_tree.rb b/ext/psych/lib/psych/visitors/yaml_tree.rb
index ff0fcd204c..3f2427b8d0 100644
--- a/ext/psych/lib/psych/visitors/yaml_tree.rb
+++ b/ext/psych/lib/psych/visitors/yaml_tree.rb
@@ -16,10 +16,12 @@ module Psych
def initialize
@obj_to_id = {}
@obj_to_node = {}
+ @targets = []
@counter = 0
end
def register target, node
+ @targets << target
@obj_to_node[target.object_id] = node
end
@@ -209,6 +211,25 @@ module Psych
@emitter.end_mapping
end
+ def visit_NameError o
+ tag = ['!ruby/exception', o.class.name].join ':'
+
+ @emitter.start_mapping nil, tag, false, Nodes::Mapping::BLOCK
+
+ {
+ 'message' => o.message.to_s,
+ 'backtrace' => private_iv_get(o, 'backtrace'),
+ }.each do |k,v|
+ next unless v
+ @emitter.scalar k, nil, nil, true, false, Nodes::Scalar::ANY
+ accept v
+ end
+
+ dump_ivars o
+
+ @emitter.end_mapping
+ end
+
def visit_Regexp o
register o, @emitter.scalar(o.inspect, nil, '!ruby/regexp', false, false, Nodes::Scalar::ANY)
end
@@ -289,6 +310,11 @@ module Psych
quote = false
elsif o =~ /\n/
style = Nodes::Scalar::LITERAL
+ elsif o == '<<'
+ style = Nodes::Scalar::SINGLE_QUOTED
+ tag = 'tag:yaml.org,2002:str'
+ plain = false
+ quote = false
elsif o =~ /^\W[^"]*$/
style = Nodes::Scalar::DOUBLE_QUOTED
else
@@ -378,7 +404,11 @@ module Psych
end
def visit_Symbol o
- @emitter.scalar ":#{o}", nil, nil, true, false, Nodes::Scalar::ANY
+ if o.empty?
+ @emitter.scalar "", nil, '!ruby/symbol', false, false, Nodes::Scalar::ANY
+ else
+ @emitter.scalar ":#{o}", nil, nil, true, false, Nodes::Scalar::ANY
+ end
end
private
diff --git a/ext/psych/psych.gemspec b/ext/psych/psych.gemspec
index 6d53aef122..de83d6b3d2 100644
--- a/ext/psych/psych.gemspec
+++ b/ext/psych/psych.gemspec
@@ -2,22 +2,22 @@
Gem::Specification.new do |s|
s.name = "psych"
- s.version = "2.0.5"
+ s.version = "2.0.6"
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
s.require_paths = ["lib"]
s.authors = ["Aaron Patterson"]
- s.date = "2014-03-27"
+ s.date = "2014-09-14"
s.description = "Psych is a YAML parser and emitter. Psych leverages libyaml[http://pyyaml.org/wiki/LibYAML]\nfor its YAML parsing and emitting capabilities. In addition to wrapping\nlibyaml, Psych also knows how to serialize and de-serialize most Ruby objects\nto and from the YAML format."
s.email = ["aaron@tenderlovemaking.com"]
s.extensions = ["ext/psych/extconf.rb"]
- s.files = [".autotest", ".travis.yml", "CHANGELOG.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "ext/psych/depend", "ext/psych/extconf.rb", "ext/psych/psych.c", "ext/psych/psych.h", "ext/psych/psych_emitter.c", "ext/psych/psych_emitter.h", "ext/psych/psych_parser.c", "ext/psych/psych_parser.h", "ext/psych/psych_to_ruby.c", "ext/psych/psych_to_ruby.h", "ext/psych/psych_yaml_tree.c", "ext/psych/psych_yaml_tree.h", "ext/psych/yaml/LICENSE", "ext/psych/yaml/api.c", "ext/psych/yaml/config.h", "ext/psych/yaml/dumper.c", "ext/psych/yaml/emitter.c", "ext/psych/yaml/loader.c", "ext/psych/yaml/parser.c", "ext/psych/yaml/reader.c", "ext/psych/yaml/scanner.c", "ext/psych/yaml/writer.c", "ext/psych/yaml/yaml.h", "ext/psych/yaml/yaml_private.h", "lib/psych.rb", "lib/psych/class_loader.rb", "lib/psych/coder.rb", "lib/psych/core_ext.rb", "lib/psych/deprecated.rb", "lib/psych/exception.rb", "lib/psych/handler.rb", "lib/psych/handlers/document_stream.rb", "lib/psych/handlers/recorder.rb", "lib/psych/json/ruby_events.rb", "lib/psych/json/stream.rb", "lib/psych/json/tree_builder.rb", "lib/psych/json/yaml_events.rb", "lib/psych/nodes.rb", "lib/psych/nodes/alias.rb", "lib/psych/nodes/document.rb", "lib/psych/nodes/mapping.rb", "lib/psych/nodes/node.rb", "lib/psych/nodes/scalar.rb", "lib/psych/nodes/sequence.rb", "lib/psych/nodes/stream.rb", "lib/psych/omap.rb", "lib/psych/parser.rb", "lib/psych/scalar_scanner.rb", "lib/psych/set.rb", "lib/psych/stream.rb", "lib/psych/streaming.rb", "lib/psych/syntax_error.rb", "lib/psych/tree_builder.rb", "lib/psych/visitors.rb", "lib/psych/visitors/depth_first.rb", "lib/psych/visitors/emitter.rb", "lib/psych/visitors/json_tree.rb", "lib/psych/visitors/to_ruby.rb", "lib/psych/visitors/visitor.rb", "lib/psych/visitors/yaml_tree.rb", "lib/psych/y.rb", "test/psych/handlers/test_recorder.rb", "test/psych/helper.rb", "test/psych/json/test_stream.rb", "test/psych/nodes/test_enumerable.rb", "test/psych/test_alias_and_anchor.rb", "test/psych/test_array.rb", "test/psych/test_boolean.rb", "test/psych/test_class.rb", "test/psych/test_coder.rb", "test/psych/test_date_time.rb", "test/psych/test_deprecated.rb", "test/psych/test_document.rb", "test/psych/test_emitter.rb", "test/psych/test_encoding.rb", "test/psych/test_engine_manager.rb", "test/psych/test_exception.rb", "test/psych/test_hash.rb", "test/psych/test_json_tree.rb", "test/psych/test_merge_keys.rb", "test/psych/test_nil.rb", "test/psych/test_null.rb", "test/psych/test_numeric.rb", "test/psych/test_object.rb", "test/psych/test_object_references.rb", "test/psych/test_omap.rb", "test/psych/test_parser.rb", "test/psych/test_psych.rb", "test/psych/test_safe_load.rb", "test/psych/test_scalar.rb", "test/psych/test_scalar_scanner.rb", "test/psych/test_serialize_subclasses.rb", "test/psych/test_set.rb", "test/psych/test_stream.rb", "test/psych/test_string.rb", "test/psych/test_struct.rb", "test/psych/test_symbol.rb", "test/psych/test_tainted.rb", "test/psych/test_to_yaml_properties.rb", "test/psych/test_tree_builder.rb", "test/psych/test_yaml.rb", "test/psych/test_yamldbm.rb", "test/psych/test_yamlstore.rb", "test/psych/visitors/test_depth_first.rb", "test/psych/visitors/test_emitter.rb", "test/psych/visitors/test_to_ruby.rb", "test/psych/visitors/test_yaml_tree.rb", ".gemtest"]
+ s.extra_rdoc_files = ["CHANGELOG.rdoc", "README.rdoc"]
+ s.files = [".autotest", ".travis.yml", "CHANGELOG.rdoc", "Manifest.txt", "README.rdoc", "Rakefile", "ext/psych/depend", "ext/psych/extconf.rb", "ext/psych/psych.c", "ext/psych/psych.h", "ext/psych/psych_emitter.c", "ext/psych/psych_emitter.h", "ext/psych/psych_parser.c", "ext/psych/psych_parser.h", "ext/psych/psych_to_ruby.c", "ext/psych/psych_to_ruby.h", "ext/psych/psych_yaml_tree.c", "ext/psych/psych_yaml_tree.h", "ext/psych/yaml/LICENSE", "ext/psych/yaml/api.c", "ext/psych/yaml/config.h", "ext/psych/yaml/dumper.c", "ext/psych/yaml/emitter.c", "ext/psych/yaml/loader.c", "ext/psych/yaml/parser.c", "ext/psych/yaml/reader.c", "ext/psych/yaml/scanner.c", "ext/psych/yaml/writer.c", "ext/psych/yaml/yaml.h", "ext/psych/yaml/yaml_private.h", "lib/psych.rb", "lib/psych/class_loader.rb", "lib/psych/coder.rb", "lib/psych/core_ext.rb", "lib/psych/deprecated.rb", "lib/psych/exception.rb", "lib/psych/handler.rb", "lib/psych/handlers/document_stream.rb", "lib/psych/handlers/recorder.rb", "lib/psych/json/ruby_events.rb", "lib/psych/json/stream.rb", "lib/psych/json/tree_builder.rb", "lib/psych/json/yaml_events.rb", "lib/psych/nodes.rb", "lib/psych/nodes/alias.rb", "lib/psych/nodes/document.rb", "lib/psych/nodes/mapping.rb", "lib/psych/nodes/node.rb", "lib/psych/nodes/scalar.rb", "lib/psych/nodes/sequence.rb", "lib/psych/nodes/stream.rb", "lib/psych/omap.rb", "lib/psych/parser.rb", "lib/psych/scalar_scanner.rb", "lib/psych/set.rb", "lib/psych/stream.rb", "lib/psych/streaming.rb", "lib/psych/syntax_error.rb", "lib/psych/tree_builder.rb", "lib/psych/visitors.rb", "lib/psych/visitors/depth_first.rb", "lib/psych/visitors/emitter.rb", "lib/psych/visitors/json_tree.rb", "lib/psych/visitors/to_ruby.rb", "lib/psych/visitors/visitor.rb", "lib/psych/visitors/yaml_tree.rb", "lib/psych/y.rb", "test/psych/handlers/test_recorder.rb", "test/psych/helper.rb", "test/psych/json/test_stream.rb", "test/psych/nodes/test_enumerable.rb", "test/psych/test_alias_and_anchor.rb", "test/psych/test_array.rb", "test/psych/test_boolean.rb", "test/psych/test_class.rb", "test/psych/test_coder.rb", "test/psych/test_date_time.rb", "test/psych/test_deprecated.rb", "test/psych/test_document.rb", "test/psych/test_emitter.rb", "test/psych/test_encoding.rb", "test/psych/test_exception.rb", "test/psych/test_hash.rb", "test/psych/test_json_tree.rb", "test/psych/test_merge_keys.rb", "test/psych/test_nil.rb", "test/psych/test_null.rb", "test/psych/test_numeric.rb", "test/psych/test_object.rb", "test/psych/test_object_references.rb", "test/psych/test_omap.rb", "test/psych/test_parser.rb", "test/psych/test_psych.rb", "test/psych/test_safe_load.rb", "test/psych/test_scalar.rb", "test/psych/test_scalar_scanner.rb", "test/psych/test_serialize_subclasses.rb", "test/psych/test_set.rb", "test/psych/test_stream.rb", "test/psych/test_string.rb", "test/psych/test_struct.rb", "test/psych/test_symbol.rb", "test/psych/test_tainted.rb", "test/psych/test_to_yaml_properties.rb", "test/psych/test_tree_builder.rb", "test/psych/test_yaml.rb", "test/psych/test_yamldbm.rb", "test/psych/test_yamlstore.rb", "test/psych/visitors/test_depth_first.rb", "test/psych/visitors/test_emitter.rb", "test/psych/visitors/test_to_ruby.rb", "test/psych/visitors/test_yaml_tree.rb"]
s.homepage = "http://github.com/tenderlove/psych"
s.licenses = ["MIT"]
s.rdoc_options = ["--main", "README.rdoc"]
s.required_ruby_version = Gem::Requirement.new(">= 1.9.2")
- s.rubyforge_project = "psych"
s.rubygems_version = "2.2.2"
s.summary = "Psych is a YAML parser and emitter"
- s.test_files = ["test/psych/handlers/test_recorder.rb", "test/psych/json/test_stream.rb", "test/psych/nodes/test_enumerable.rb", "test/psych/test_alias_and_anchor.rb", "test/psych/test_array.rb", "test/psych/test_boolean.rb", "test/psych/test_class.rb", "test/psych/test_coder.rb", "test/psych/test_date_time.rb", "test/psych/test_deprecated.rb", "test/psych/test_document.rb", "test/psych/test_emitter.rb", "test/psych/test_encoding.rb", "test/psych/test_engine_manager.rb", "test/psych/test_exception.rb", "test/psych/test_hash.rb", "test/psych/test_json_tree.rb", "test/psych/test_merge_keys.rb", "test/psych/test_nil.rb", "test/psych/test_null.rb", "test/psych/test_numeric.rb", "test/psych/test_object.rb", "test/psych/test_object_references.rb", "test/psych/test_omap.rb", "test/psych/test_parser.rb", "test/psych/test_psych.rb", "test/psych/test_safe_load.rb", "test/psych/test_scalar.rb", "test/psych/test_scalar_scanner.rb", "test/psych/test_serialize_subclasses.rb", "test/psych/test_set.rb", "test/psych/test_stream.rb", "test/psych/test_string.rb", "test/psych/test_struct.rb", "test/psych/test_symbol.rb", "test/psych/test_tainted.rb", "test/psych/test_to_yaml_properties.rb", "test/psych/test_tree_builder.rb", "test/psych/test_yaml.rb", "test/psych/test_yamldbm.rb", "test/psych/test_yamlstore.rb", "test/psych/visitors/test_depth_first.rb", "test/psych/visitors/test_emitter.rb", "test/psych/visitors/test_to_ruby.rb", "test/psych/visitors/test_yaml_tree.rb"]
+ s.test_files = ["test/psych/handlers/test_recorder.rb", "test/psych/json/test_stream.rb", "test/psych/nodes/test_enumerable.rb", "test/psych/test_alias_and_anchor.rb", "test/psych/test_array.rb", "test/psych/test_boolean.rb", "test/psych/test_class.rb", "test/psych/test_coder.rb", "test/psych/test_date_time.rb", "test/psych/test_deprecated.rb", "test/psych/test_document.rb", "test/psych/test_emitter.rb", "test/psych/test_encoding.rb", "test/psych/test_exception.rb", "test/psych/test_hash.rb", "test/psych/test_json_tree.rb", "test/psych/test_merge_keys.rb", "test/psych/test_nil.rb", "test/psych/test_null.rb", "test/psych/test_numeric.rb", "test/psych/test_object.rb", "test/psych/test_object_references.rb", "test/psych/test_omap.rb", "test/psych/test_parser.rb", "test/psych/test_psych.rb", "test/psych/test_safe_load.rb", "test/psych/test_scalar.rb", "test/psych/test_scalar_scanner.rb", "test/psych/test_serialize_subclasses.rb", "test/psych/test_set.rb", "test/psych/test_stream.rb", "test/psych/test_string.rb", "test/psych/test_struct.rb", "test/psych/test_symbol.rb", "test/psych/test_tainted.rb", "test/psych/test_to_yaml_properties.rb", "test/psych/test_tree_builder.rb", "test/psych/test_yaml.rb", "test/psych/test_yamldbm.rb", "test/psych/test_yamlstore.rb", "test/psych/visitors/test_depth_first.rb", "test/psych/visitors/test_emitter.rb", "test/psych/visitors/test_to_ruby.rb", "test/psych/visitors/test_yaml_tree.rb"]
end
diff --git a/ext/psych/yaml/scanner.c b/ext/psych/yaml/scanner.c
index af05766f5c..08ad8edb45 100644
--- a/ext/psych/yaml/scanner.c
+++ b/ext/psych/yaml/scanner.c
@@ -70,7 +70,7 @@
* %TAG !yaml! tag:yaml.org,2002:
* ---
*
- * The correspoding sequence of tokens:
+ * The corresponding sequence of tokens:
*
* STREAM-START(utf-8)
* VERSION-DIRECTIVE(1,1)
diff --git a/ext/pty/pty.c b/ext/pty/pty.c
index f54bbb52e5..ec255cf202 100644
--- a/ext/pty/pty.c
+++ b/ext/pty/pty.c
@@ -538,6 +538,11 @@ pty_open(VALUE klass)
static VALUE
pty_detach_process(struct pty_info *info)
{
+#ifdef WNOHANG
+ int st;
+ if (rb_waitpid(info->child_pid, &st, WNOHANG) <= 0)
+ return Qnil;
+#endif
rb_detach_process(info->child_pid);
return Qnil;
}
diff --git a/ext/rbconfig/sizeof/extconf.rb b/ext/rbconfig/sizeof/extconf.rb
index 619b4256f8..ac66b6ac26 100644
--- a/ext/rbconfig/sizeof/extconf.rb
+++ b/ext/rbconfig/sizeof/extconf.rb
@@ -1,2 +1,3 @@
$srcs = %w[sizes.c]
+$distcleanfiles.concat($srcs)
create_makefile('rbconfig/sizeof')
diff --git a/ext/readline/depend b/ext/readline/depend
index ef0414d9b2..5780d8d42a 100644
--- a/ext/readline/depend
+++ b/ext/readline/depend
@@ -1,4 +1,5 @@
readline.o: readline.c $(HDRS) $(ruby_headers) \
+ $(top_srcdir)/internal.h \
$(hdrdir)/ruby/io.h \
$(hdrdir)/ruby/encoding.h \
$(hdrdir)/ruby/oniguruma.h \
diff --git a/ext/readline/extconf.rb b/ext/readline/extconf.rb
index 8c3bffc26e..c79370bf4c 100644
--- a/ext/readline/extconf.rb
+++ b/ext/readline/extconf.rb
@@ -99,7 +99,11 @@ readline.have_func("rl_redisplay")
readline.have_func("rl_insert_text")
readline.have_func("rl_delete_text")
unless readline.have_type("rl_hook_func_t*")
+ # rl_hook_func_t is available since readline-4.2 (2001).
+ # Function is removed at readline-6.3 (2014).
+ # However, editline (NetBSD 6.1.3, 2014) doesn't have rl_hook_func_t.
$defs << "-Drl_hook_func_t=Function"
end
+$INCFLAGS << " -I$(top_srcdir)"
create_makefile("readline")
diff --git a/ext/readline/readline.c b/ext/readline/readline.c
index da3b10939c..5ceaaf780b 100644
--- a/ext/readline/readline.c
+++ b/ext/readline/readline.c
@@ -36,6 +36,7 @@
#include "ruby/ruby.h"
#include "ruby/io.h"
#include "ruby/thread.h"
+#include "internal.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
@@ -688,12 +689,7 @@ readline_s_delete_text(int argc, VALUE *argv, VALUE self)
char *p, *ptr = rl_line_buffer;
long beg = 0, len = strlen(rl_line_buffer);
struct RString fakestr;
- VALUE str = (VALUE)&fakestr;
-
- fakestr.basic.flags = T_STRING | RSTRING_NOEMBED;
- fakestr.as.heap.ptr = ptr;
- fakestr.as.heap.len = len;
- rb_enc_associate(str, rb_locale_encoding());
+ VALUE str = rb_setup_fake_str(&fakestr, ptr, len, rb_locale_encoding());
OBJ_FREEZE(str);
if (argc == 2) {
beg = NUM2LONG(argv[0]);
diff --git a/ext/sdbm/_sdbm.c b/ext/sdbm/_sdbm.c
index d810befbce..847eb2aaf6 100644
--- a/ext/sdbm/_sdbm.c
+++ b/ext/sdbm/_sdbm.c
@@ -7,7 +7,8 @@
* core routines
*/
-#include "ruby/ruby.h"
+#include "ruby/config.h"
+#include "ruby/defines.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
@@ -802,7 +803,7 @@ delpair(char *pag, datum key)
}
#else
#ifdef MEMMOVE
- memmove(dst-m, src-m, m);
+ memmove(dst, src, m);
#else
while (m--)
*--dst = *--src;
diff --git a/ext/sdbm/init.c b/ext/sdbm/init.c
index 0f26bb89ed..92901181a5 100644
--- a/ext/sdbm/init.c
+++ b/ext/sdbm/init.c
@@ -77,16 +77,16 @@ closed_sdbm()
rb_raise(rb_eDBMError, "closed SDBM file");
}
-#define GetDBM(obj, dbmp) {\
+#define GetDBM(obj, dbmp) do {\
Data_Get_Struct((obj), struct dbmdata, (dbmp));\
if ((dbmp) == 0) closed_sdbm();\
if ((dbmp)->di_dbm == 0) closed_sdbm();\
-}
+} while (0)
-#define GetDBM2(obj, data, dbm) {\
- GetDBM((obj), (data));\
- (dbm) = dbmp->di_dbm;\
-}
+#define GetDBM2(obj, dbmp, dbm) do {\
+ GetDBM((obj), (dbmp));\
+ (dbm) = (dbmp)->di_dbm;\
+} while (0)
static void
free_sdbm(struct dbmdata *dbmp)
diff --git a/ext/socket/ancdata.c b/ext/socket/ancdata.c
index bbbf985e28..218085d5ce 100644
--- a/ext/socket/ancdata.c
+++ b/ext/socket/ancdata.c
@@ -2,6 +2,8 @@
#include <time.h>
+int rsock_cmsg_cloexec_state = -1; /* <0: unknown, 0: ignored, >0: working */
+
#if defined(HAVE_STRUCT_MSGHDR_MSG_CONTROL)
static VALUE rb_cAncillaryData;
@@ -1415,7 +1417,7 @@ discard_cmsg(struct cmsghdr *cmh, char *msg_end, int msg_peek_p)
int *end = (int *)((char *)cmh + cmh->cmsg_len);
while ((char *)fdp + sizeof(int) <= (char *)end &&
(char *)fdp + sizeof(int) <= msg_end) {
- rb_fd_fix_cloexec(*fdp);
+ rb_update_max_fd(*fdp);
close(*fdp);
fdp++;
}
@@ -1458,7 +1460,11 @@ make_io_for_unix_rights(VALUE ctl, struct cmsghdr *cmh, char *msg_end)
VALUE io;
if (fstat(fd, &stbuf) == -1)
rb_raise(rb_eSocket, "invalid fd in SCM_RIGHTS");
- rb_fd_fix_cloexec(fd);
+ rb_update_max_fd(fd);
+ if (rsock_cmsg_cloexec_state < 0)
+ rsock_cmsg_cloexec_state = rsock_detect_cloexec(fd);
+ if (rsock_cmsg_cloexec_state == 0 || fd <= 2)
+ rb_maygvl_fd_fix_cloexec(fd);
if (S_ISSOCK(stbuf.st_mode))
io = rsock_init_sock(rb_obj_alloc(rb_cSocket), fd);
else
diff --git a/ext/socket/basicsocket.c b/ext/socket/basicsocket.c
index bce085b632..088234aa85 100644
--- a/ext/socket/basicsocket.c
+++ b/ext/socket/basicsocket.c
@@ -563,7 +563,7 @@ rsock_bsock_send(int argc, VALUE *argv, VALUE sock)
GetOpenFile(sock, fptr);
arg.fd = fptr->fd;
arg.flags = NUM2INT(flags);
- while (rb_thread_fd_writable(arg.fd),
+ while (rsock_maybe_fd_writable(arg.fd),
(n = (int)BLOCKING_REGION_FD(func, &arg)) < 0) {
if (rb_io_wait_writable(arg.fd)) {
continue;
diff --git a/ext/socket/extconf.rb b/ext/socket/extconf.rb
index 6c61324e38..c4523da24d 100644
--- a/ext/socket/extconf.rb
+++ b/ext/socket/extconf.rb
@@ -309,6 +309,7 @@ end
xti.h
netinet/in_systm.h
netinet/tcp.h
+ netinet/tcp_fsm.h
netinet/udp.h
arpa/inet.h
netpacket/packet.h
@@ -370,6 +371,62 @@ have_msg_control = nil
have_msg_control = have_struct_member('struct msghdr', 'msg_control', headers) unless $mswin or $mingw
have_struct_member('struct msghdr', 'msg_accrights', headers)
+if have_type("struct tcp_info", headers)
+ have_const("TCP_ESTABLISHED", headers)
+ have_const("TCP_SYN_SENT", headers)
+ have_const("TCP_SYN_RECV", headers)
+ have_const("TCP_FIN_WAIT1", headers)
+ have_const("TCP_FIN_WAIT2", headers)
+ have_const("TCP_TIME_WAIT", headers)
+ have_const("TCP_CLOSE", headers)
+ have_const("TCP_CLOSE_WAIT", headers)
+ have_const("TCP_LAST_ACK", headers)
+ have_const("TCP_LISTEN", headers)
+ have_const("TCP_CLOSING", headers)
+ have_struct_member('struct tcp_info', 'tcpi_state', headers)
+ have_struct_member('struct tcp_info', 'tcpi_ca_state', headers)
+ have_struct_member('struct tcp_info', 'tcpi_retransmits', headers)
+ have_struct_member('struct tcp_info', 'tcpi_probes', headers)
+ have_struct_member('struct tcp_info', 'tcpi_backoff', headers)
+ have_struct_member('struct tcp_info', 'tcpi_options', headers)
+ have_struct_member('struct tcp_info', 'tcpi_snd_wscale', headers)
+ have_struct_member('struct tcp_info', 'tcpi_rcv_wscale', headers)
+ have_struct_member('struct tcp_info', 'tcpi_rto', headers)
+ have_struct_member('struct tcp_info', 'tcpi_ato', headers)
+ have_struct_member('struct tcp_info', 'tcpi_snd_mss', headers)
+ have_struct_member('struct tcp_info', 'tcpi_rcv_mss', headers)
+ have_struct_member('struct tcp_info', 'tcpi_unacked', headers)
+ have_struct_member('struct tcp_info', 'tcpi_sacked', headers)
+ have_struct_member('struct tcp_info', 'tcpi_lost', headers)
+ have_struct_member('struct tcp_info', 'tcpi_retrans', headers)
+ have_struct_member('struct tcp_info', 'tcpi_fackets', headers)
+ have_struct_member('struct tcp_info', 'tcpi_last_data_sent', headers)
+ have_struct_member('struct tcp_info', 'tcpi_last_ack_sent', headers)
+ have_struct_member('struct tcp_info', 'tcpi_last_data_recv', headers)
+ have_struct_member('struct tcp_info', 'tcpi_last_ack_recv', headers)
+ have_struct_member('struct tcp_info', 'tcpi_pmtu', headers)
+ have_struct_member('struct tcp_info', 'tcpi_rcv_ssthresh', headers)
+ have_struct_member('struct tcp_info', 'tcpi_rtt', headers)
+ have_struct_member('struct tcp_info', 'tcpi_rttvar', headers)
+ have_struct_member('struct tcp_info', 'tcpi_snd_ssthresh', headers)
+ have_struct_member('struct tcp_info', 'tcpi_snd_cwnd', headers)
+ have_struct_member('struct tcp_info', 'tcpi_advmss', headers)
+ have_struct_member('struct tcp_info', 'tcpi_reordering', headers)
+ have_struct_member('struct tcp_info', 'tcpi_rcv_rtt', headers)
+ have_struct_member('struct tcp_info', 'tcpi_rcv_space', headers)
+ have_struct_member('struct tcp_info', 'tcpi_total_retrans', headers)
+
+ # FreeBSD extension
+ have_struct_member('struct tcp_info', 'tcpi_snd_wnd', headers)
+ have_struct_member('struct tcp_info', 'tcpi_snd_bwnd', headers)
+ have_struct_member('struct tcp_info', 'tcpi_snd_nxt', headers)
+ have_struct_member('struct tcp_info', 'tcpi_rcv_nxt', headers)
+ have_struct_member('struct tcp_info', 'tcpi_toe_tid', headers)
+ have_struct_member('struct tcp_info', 'tcpi_snd_rexmitpack', headers)
+ have_struct_member('struct tcp_info', 'tcpi_rcv_ooopack', headers)
+ have_struct_member('struct tcp_info', 'tcpi_snd_zerowin', headers)
+end
+
case RUBY_PLATFORM
when /mswin(32|64)|mingw/
test_func = "WSACleanup"
diff --git a/ext/socket/getaddrinfo.c b/ext/socket/getaddrinfo.c
index 68f610e807..a17d12b705 100644
--- a/ext/socket/getaddrinfo.c
+++ b/ext/socket/getaddrinfo.c
@@ -593,7 +593,6 @@ get_addr(const char *hostname, int af, struct addrinfo **res, struct addrinfo *p
} else
hp = getipnodebyname(hostname, af, AI_ADDRCONFIG, &h_error);
#else
- if (strlen(hostname) >= NI_MAXHOST) ERR(EAI_NODATA);
hp = gethostbyname((char*)hostname);
h_error = h_errno;
#endif
diff --git a/ext/socket/ifaddr.c b/ext/socket/ifaddr.c
index 16cd47be5a..15395d7088 100644
--- a/ext/socket/ifaddr.c
+++ b/ext/socket/ifaddr.c
@@ -74,7 +74,6 @@ static const rb_data_type_t ifaddr_type = {
{ifaddr_mark, ifaddr_free, ifaddr_memsize,},
};
-#define IS_IFADDRS(obj) rb_typeddata_is_kind_of((obj), &ifaddr_type)
static inline rb_ifaddr_t *
check_ifaddr(VALUE self)
{
@@ -293,6 +292,9 @@ ifaddr_inspect_flags(ifa_flags_t flags, VALUE result)
#ifdef IFF_ALLMULTI
INSPECT_BIT(IFF_ALLMULTI, "ALLMULTI")
#endif
+#ifdef IFF_SIMPLEX
+ INSPECT_BIT(IFF_SIMPLEX, "SIMPLEX")
+#endif
#ifdef IFF_MASTER
INSPECT_BIT(IFF_MASTER, "MASTER")
#endif
diff --git a/ext/socket/init.c b/ext/socket/init.c
index d3b875c78d..f6cd2bce7b 100644
--- a/ext/socket/init.c
+++ b/ext/socket/init.c
@@ -135,7 +135,7 @@ rsock_s_recvfrom(VALUE sock, int argc, VALUE *argv, enum sock_recv_type from)
rb_obj_hide(str);
while (rb_io_check_closed(fptr),
- rb_thread_wait_fd(arg.fd),
+ rsock_maybe_wait_fd(arg.fd),
(slen = BLOCKING_REGION_FD(recvfrom_blocking, &arg)) < 0) {
if (!rb_io_wait_readable(fptr->fd)) {
rb_sys_fail("recvfrom(2)");
@@ -249,37 +249,78 @@ rsock_s_recvfrom_nonblock(VALUE sock, int argc, VALUE *argv, enum sock_recv_type
return rb_assoc_new(str, addr);
}
+/* returns true if SOCK_CLOEXEC is supported */
+int rsock_detect_cloexec(int fd)
+{
+#ifdef SOCK_CLOEXEC
+ int flags = fcntl(fd, F_GETFD);
+
+ if (flags == -1)
+ rb_bug("rsock_detect_cloexec: fcntl(%d, F_GETFD) failed: %s", fd, strerror(errno));
+
+ if (flags & FD_CLOEXEC)
+ return 1;
+#endif
+ return 0;
+}
+
+#ifdef SOCK_CLOEXEC
static int
rsock_socket0(int domain, int type, int proto)
{
int ret;
+ static int cloexec_state = -1; /* <0: unknown, 0: ignored, >0: working */
-#ifdef SOCK_CLOEXEC
- static int try_sock_cloexec = 1;
- if (try_sock_cloexec) {
+ if (cloexec_state > 0) { /* common path, if SOCK_CLOEXEC is defined */
+ ret = socket(domain, type|SOCK_CLOEXEC, proto);
+ if (ret >= 0) {
+ if (ret <= 2)
+ goto fix_cloexec;
+ goto update_max_fd;
+ }
+ }
+ else if (cloexec_state < 0) { /* usually runs once only for detection */
ret = socket(domain, type|SOCK_CLOEXEC, proto);
- if (ret == -1 && errno == EINVAL) {
+ if (ret >= 0) {
+ cloexec_state = rsock_detect_cloexec(ret);
+ if (cloexec_state == 0 || ret <= 2)
+ goto fix_cloexec;
+ goto update_max_fd;
+ }
+ else if (ret == -1 && errno == EINVAL) {
/* SOCK_CLOEXEC is available since Linux 2.6.27. Linux 2.6.18 fails with EINVAL */
ret = socket(domain, type, proto);
if (ret != -1) {
- try_sock_cloexec = 0;
+ cloexec_state = 0;
+ /* fall through to fix_cloexec */
}
}
}
- else {
+ else { /* cloexec_state == 0 */
ret = socket(domain, type, proto);
}
-#else
- ret = socket(domain, type, proto);
-#endif
if (ret == -1)
return -1;
+fix_cloexec:
+ rb_maygvl_fd_fix_cloexec(ret);
+update_max_fd:
+ rb_update_max_fd(ret);
+ return ret;
+}
+#else /* !SOCK_CLOEXEC */
+static int
+rsock_socket0(int domain, int type, int proto)
+{
+ int ret = socket(domain, type, proto);
+
+ if (ret == -1)
+ return -1;
rb_fd_fix_cloexec(ret);
return ret;
-
}
+#endif /* !SOCK_CLOEXEC */
int
rsock_socket(int domain, int type, int proto)
@@ -308,7 +349,7 @@ wait_connectable(int fd)
for (;;) {
/*
- * Stevens book says, succuessful finish turn on RB_WAITFD_OUT and
+ * Stevens book says, successful finish turn on RB_WAITFD_OUT and
* failure finish turn on both RB_WAITFD_IN and RB_WAITFD_OUT.
*/
revents = rb_wait_for_single_fd(fd, RB_WAITFD_IN|RB_WAITFD_OUT, NULL);
@@ -579,7 +620,7 @@ rsock_s_accept(VALUE klass, int fd, struct sockaddr *sockaddr, socklen_t *len)
arg.sockaddr = sockaddr;
arg.len = len;
retry:
- rb_thread_wait_fd(fd);
+ rsock_maybe_wait_fd(fd);
fd2 = (int)BLOCKING_REGION_FD(accept_blocking, &arg);
if (fd2 < 0) {
switch (errno) {
diff --git a/ext/socket/mkconstants.rb b/ext/socket/mkconstants.rb
index d12b2a24e3..59fcb17682 100644
--- a/ext/socket/mkconstants.rb
+++ b/ext/socket/mkconstants.rb
@@ -540,6 +540,7 @@ IP_FREEBIND nil Allow binding to nonexistent IP addresses
IP_IPSEC_POLICY nil IPsec security policy
IP_XFRM_POLICY
IP_PASSSEC nil Retrieve security context with datagram
+IP_TRANSPARENT nil Transparent proxy
IP_PMTUDISC_DONT nil Never send DF frames
IP_PMTUDISC_WANT nil Use per-route hints
IP_PMTUDISC_DO nil Always send DF frames
@@ -568,6 +569,8 @@ SO_DONTROUTE nil Use interface addresses
SO_BROADCAST nil Permit sending of broadcast messages
SO_SNDBUF nil Send buffer size
SO_RCVBUF nil Receive buffer size
+SO_SNDBUFFORCE nil Send buffer size without wmem_max limit (Linux 2.6.14)
+SO_RCVBUFFORCE nil Receive buffer size without rmem_max limit (Linux 2.6.14)
SO_KEEPALIVE nil Keep connections alive
SO_OOBINLINE nil Leave received out-of-band data in-line
SO_NO_CHECK nil Disable checksums
@@ -594,6 +597,7 @@ SO_SECURITY_ENCRYPTION_NETWORK
SO_BINDTODEVICE nil Only send packets from the given interface
SO_ATTACH_FILTER nil Attach an accept filter
SO_DETACH_FILTER nil Detach an accept filter
+SO_GET_FILTER nil Obtain filter set by SO_ATTACH_FILTER (Linux 3.8)
SO_PEERNAME nil Name of the connecting user
SO_TIMESTAMP nil Receive timestamp with datagrams (timeval)
SO_TIMESTAMPNS nil Receive nanosecond timestamp with datagrams (timespec)
@@ -601,6 +605,21 @@ SO_BINTIME nil Receive timestamp with datagrams (bintime)
SO_RECVUCRED nil Receive user credentials with datagram
SO_MAC_EXEMPT nil Mandatory Access Control exemption for unlabeled peers
SO_ALLZONES nil Bypass zone boundaries
+SO_PEERSEC nil Obtain the security credentials (Linux 2.6.2)
+SO_PASSSEC nil Toggle security context passing (Linux 2.6.18)
+SO_MARK nil Set the mark for mark-based routing (Linux 2.6.25)
+SO_TIMESTAMPING nil Time stamping of incoming and outgoing packets (Linux 2.6.30)
+SO_PROTOCOL nil Protocol given for socket() (Linux 2.6.32)
+SO_DOMAIN nil Domain given for socket() (Linux 2.6.32)
+SO_RXQ_OVFL nil Toggle cmsg for number of packets dropped (Linux 2.6.33)
+SO_WIFI_STATUS nil Toggle cmsg for wifi status (Linux 3.3)
+SO_PEEK_OFF nil Set the peek offset (Linux 3.4)
+SO_NOFCS nil Set netns of a socket (Linux 3.4)
+SO_LOCK_FILTER nil Lock the filter attached to a socket (Linux 3.9)
+SO_SELECT_ERR_QUEUE nil Make select() detect socket error queue with errorfds (Linux 3.10)
+SO_BUSY_POLL nil Set the threshold in microseconds for low latency polling (Linux 3.11)
+SO_MAX_PACING_RATE nil Cap the rate computed by transport layer. [bytes per second] (Linux 3.13)
+SO_BPF_EXTENSIONS nil Query supported BPF extensions (Linux 3.14)
SOPRI_INTERACTIVE nil Interactive socket priority
SOPRI_NORMAL nil Normal socket priority
@@ -610,22 +629,32 @@ IPX_TYPE
TCP_NODELAY nil Don't delay sending to coalesce packets
TCP_MAXSEG nil Set maximum segment size
-TCP_CORK nil Don't send partial frames
-TCP_DEFER_ACCEPT nil Don't notify a listening socket until data is ready
-TCP_INFO nil Retrieve information about this socket
-TCP_KEEPCNT nil Maximum number of keepalive probes allowed before dropping a connection
-TCP_KEEPIDLE nil Idle time before keepalive probes are sent
-TCP_KEEPINTVL nil Time between keepalive probes
-TCP_LINGER2 nil Lifetime of orphaned FIN_WAIT2 sockets
-TCP_MD5SIG nil Use MD5 digests (RFC2385)
+TCP_CORK nil Don't send partial frames (Linux 2.2, glibc 2.2)
+TCP_DEFER_ACCEPT nil Don't notify a listening socket until data is ready (Linux 2.4, glibc 2.2)
+TCP_INFO nil Retrieve information about this socket (Linux 2.4, glibc 2.2)
+TCP_KEEPCNT nil Maximum number of keepalive probes allowed before dropping a connection (Linux 2.4, glibc 2.2)
+TCP_KEEPIDLE nil Idle time before keepalive probes are sent (Linux 2.4, glibc 2.2)
+TCP_KEEPINTVL nil Time between keepalive probes (Linux 2.4, glibc 2.2)
+TCP_LINGER2 nil Lifetime of orphaned FIN_WAIT2 sockets (Linux 2.4, glibc 2.2)
+TCP_MD5SIG nil Use MD5 digests (RFC2385, Linux 2.6.20, glibc 2.7)
TCP_NOOPT nil Don't use TCP options
TCP_NOPUSH nil Don't push the last block of write
-TCP_QUICKACK nil Enable quickack mode
-TCP_SYNCNT nil Number of SYN retransmits before a connection is dropped
-TCP_WINDOW_CLAMP nil Clamp the size of the advertised window
-TCP_FASTOPEN nil Reduce step of the handshake process
-
-UDP_CORK nil Don't send partial frames
+TCP_QUICKACK nil Enable quickack mode (Linux 2.4.4, glibc 2.3)
+TCP_SYNCNT nil Number of SYN retransmits before a connection is dropped (Linux 2.4, glibc 2.2)
+TCP_WINDOW_CLAMP nil Clamp the size of the advertised window (Linux 2.4, glibc 2.2)
+TCP_FASTOPEN nil Reduce step of the handshake process (Linux 3.7, glibc 2.18)
+TCP_CONGESTION nil TCP congestion control algorithm (Linux 2.6.13, glibc 2.6)
+TCP_COOKIE_TRANSACTIONS nil TCP Cookie Transactions (Linux 2.6.33, glibc 2.18)
+TCP_QUEUE_SEQ nil Sequence of a queue for repair mode (Linux 3.5, glibc 2.18)
+TCP_REPAIR nil Repair mode (Linux 3.5, glibc 2.18)
+TCP_REPAIR_OPTIONS nil Options for repair mode (Linux 3.5, glibc 2.18)
+TCP_REPAIR_QUEUE nil Queue for repair mode (Linux 3.5, glibc 2.18)
+TCP_THIN_DUPACK nil Duplicated acknowledgments handling for thin-streams (Linux 2.6.34, glibc 2.18)
+TCP_THIN_LINEAR_TIMEOUTS nil Linear timeouts for thin-streams (Linux 2.6.34, glibc 2.18)
+TCP_TIMESTAMP nil TCP timestamp (Linux 3.9, glibc 2.18)
+TCP_USER_TIMEOUT nil Max timeout before a TCP connection is aborted (Linux 2.6.37, glibc 2.18)
+
+UDP_CORK nil Don't send partial frames (Linux 2.5.44, glibc 2.11)
EAI_ADDRFAMILY nil Address family for hostname not supported
EAI_AGAIN nil Temporary failure in name resolution
@@ -704,10 +733,12 @@ SOMAXCONN 5 Maximum connection requests that may be queued for a socket
SCM_RIGHTS nil Access rights
SCM_TIMESTAMP nil Timestamp (timeval)
SCM_TIMESTAMPNS nil Timespec (timespec)
+SCM_TIMESTAMPING nil Timestamp (timespec list) (Linux 2.6.30)
SCM_BINTIME nil Timestamp (bintime)
SCM_CREDENTIALS nil The sender's credentials
SCM_CREDS nil Process credentials
SCM_UCRED nil User credentials
+SCM_WIFI_STATUS nil Wifi status (Linux 3.3)
LOCAL_PEERCRED nil Retrieve peer credentials
LOCAL_CREDS nil Pass credentials to receiver
diff --git a/ext/socket/option.c b/ext/socket/option.c
index 28bdc07db6..a4a2a37c0f 100644
--- a/ext/socket/option.c
+++ b/ext/socket/option.c
@@ -2,6 +2,45 @@
VALUE rb_cSockOpt;
+#define pack_var(v) rb_str_new((const char *)&(v), sizeof(v))
+
+#define CAT(x,y) x##y
+#define XCAT(x,y) CAT(x,y)
+
+#if defined(__linux__) || \
+ defined(__GNU__) /* GNU/Hurd */ || \
+ defined(__FreeBSD__) || \
+ defined(__DragonFly__) || \
+ defined(__APPLE__) || \
+ defined(_WIN32) || \
+ defined(__CYGWIN__)
+# define TYPE_IP_MULTICAST_LOOP int
+# define TYPE_IP_MULTICAST_TTL int
+#else
+/* The original IP multicast implementation by Steve Deering
+ * NetBSD
+ * OpenBSD
+ * SunOS
+ */
+# define TYPE_IP_MULTICAST_LOOP byte
+# define TYPE_IP_MULTICAST_TTL byte
+# define USE_INSPECT_BYTE 1
+#endif
+
+static VALUE
+sockopt_pack_byte(VALUE value)
+{
+ char i = NUM2CHR(rb_to_int(value));
+ return pack_var(i);
+}
+
+static VALUE
+sockopt_pack_int(VALUE value)
+{
+ int i = NUM2INT(rb_to_int(value));
+ return pack_var(i);
+}
+
static VALUE
constant_to_sym(int constant, ID (*intern_const)(int))
{
@@ -148,8 +187,6 @@ sockopt_data(VALUE self)
*
* Creates a new Socket::Option object which contains a byte as data.
*
- * The size and endian is dependent on the platform.
- *
* p Socket::Option.byte(:INET, :SOCKET, :KEEPALIVE, 1)
* #=> #<Socket::Option: INET SOCKET KEEPALIVE 1>
*/
@@ -159,8 +196,7 @@ sockopt_s_byte(VALUE klass, VALUE vfamily, VALUE vlevel, VALUE voptname, VALUE v
int family = rsock_family_arg(vfamily);
int level = rsock_level_arg(family, vlevel);
int optname = rsock_optname_arg(family, level, voptname);
- unsigned char i = (unsigned char)NUM2CHR(vint);
- return rsock_sockopt_new(family, level, optname, rb_str_new((char*)&i, sizeof(i)));
+ return rsock_sockopt_new(family, level, optname, sockopt_pack_byte(vint));
}
/*
@@ -169,8 +205,6 @@ sockopt_s_byte(VALUE klass, VALUE vfamily, VALUE vlevel, VALUE voptname, VALUE v
*
* Returns the data in _sockopt_ as an byte.
*
- * The size and endian is dependent on the platform.
- *
* sockopt = Socket::Option.byte(:INET, :SOCKET, :KEEPALIVE, 1)
* p sockopt.byte => 1
*/
@@ -203,8 +237,7 @@ sockopt_s_int(VALUE klass, VALUE vfamily, VALUE vlevel, VALUE voptname, VALUE vi
int family = rsock_family_arg(vfamily);
int level = rsock_level_arg(family, vlevel);
int optname = rsock_optname_arg(family, level, voptname);
- int i = NUM2INT(vint);
- return rsock_sockopt_new(family, level, optname, rb_str_new((char*)&i, sizeof(i)));
+ return rsock_sockopt_new(family, level, optname, sockopt_pack_int(vint));
}
/*
@@ -252,7 +285,7 @@ sockopt_s_bool(VALUE klass, VALUE vfamily, VALUE vlevel, VALUE voptname, VALUE v
int level = rsock_level_arg(family, vlevel);
int optname = rsock_optname_arg(family, level, voptname);
int i = RTEST(vbool) ? 1 : 0;
- return rsock_sockopt_new(family, level, optname, rb_str_new((char*)&i, sizeof(i)));
+ return rsock_sockopt_new(family, level, optname, pack_var(i));
}
/*
@@ -302,7 +335,7 @@ sockopt_s_linger(VALUE klass, VALUE vonoff, VALUE vsecs)
else
l.l_onoff = RTEST(vonoff) ? 1 : 0;
l.l_linger = NUM2INT(vsecs);
- return rsock_sockopt_new(AF_UNSPEC, SOL_SOCKET, SO_LINGER, rb_str_new((char*)&l, sizeof(l)));
+ return rsock_sockopt_new(AF_UNSPEC, SOL_SOCKET, SO_LINGER, pack_var(l));
}
/*
@@ -356,14 +389,10 @@ sockopt_linger(VALUE self)
static VALUE
sockopt_s_ipv4_multicast_loop(VALUE klass, VALUE value)
{
+
#if defined(IPPROTO_IP) && defined(IP_MULTICAST_LOOP)
-# if defined(__NetBSD__) || defined(__OpenBSD__)
- unsigned char i = NUM2CHR(rb_to_int(value));
-# else
- int i = NUM2INT(rb_to_int(value));
-# endif
- return rsock_sockopt_new(AF_INET, IPPROTO_IP, IP_MULTICAST_LOOP,
- rb_str_new((char*)&i, sizeof(i)));
+ VALUE o = XCAT(sockopt_pack_,TYPE_IP_MULTICAST_LOOP)(value);
+ return rsock_sockopt_new(AF_INET, IPPROTO_IP, IP_MULTICAST_LOOP, o);
#else
# error IPPROTO_IP or IP_MULTICAST_LOOP is not implemented
#endif
@@ -387,22 +416,15 @@ sockopt_ipv4_multicast_loop(VALUE self)
#if defined(IPPROTO_IP) && defined(IP_MULTICAST_LOOP)
if (family == AF_INET && level == IPPROTO_IP && optname == IP_MULTICAST_LOOP) {
-# if defined(__NetBSD__) || defined(__OpenBSD__)
- return sockopt_byte(self);
-# else
- return sockopt_int(self);
-# endif
+ return XCAT(sockopt_,TYPE_IP_MULTICAST_LOOP)(self);
}
#endif
rb_raise(rb_eTypeError, "ipv4_multicast_loop socket option expected");
UNREACHABLE;
}
-#if defined(__NetBSD__) || defined(__OpenBSD__)
-# define inspect_ipv4_multicast_loop(a,b,c,d) inspect_byte(a,b,c,d)
-#else
-# define inspect_ipv4_multicast_loop(a,b,c,d) inspect_int(a,b,c,d)
-#endif
+#define inspect_ipv4_multicast_loop(a,b,c,d) \
+ XCAT(inspect_,TYPE_IP_MULTICAST_LOOP)(a,b,c,d)
/*
* call-seq:
@@ -420,13 +442,8 @@ static VALUE
sockopt_s_ipv4_multicast_ttl(VALUE klass, VALUE value)
{
#if defined(IPPROTO_IP) && defined(IP_MULTICAST_TTL)
-# if defined(__NetBSD__) || defined(__OpenBSD__)
- unsigned char i = NUM2CHR(rb_to_int(value));
-# else
- int i = NUM2INT(rb_to_int(value));
-# endif
- return rsock_sockopt_new(AF_INET, IPPROTO_IP, IP_MULTICAST_TTL,
- rb_str_new((char*)&i, sizeof(i)));
+ VALUE o = XCAT(sockopt_pack_,TYPE_IP_MULTICAST_TTL)(value);
+ return rsock_sockopt_new(AF_INET, IPPROTO_IP, IP_MULTICAST_TTL, o);
#else
# error IPPROTO_IP or IP_MULTICAST_TTL is not implemented
#endif
@@ -450,22 +467,15 @@ sockopt_ipv4_multicast_ttl(VALUE self)
#if defined(IPPROTO_IP) && defined(IP_MULTICAST_TTL)
if (family == AF_INET && level == IPPROTO_IP && optname == IP_MULTICAST_TTL) {
-# if defined(__NetBSD__) || defined(__OpenBSD__)
- return sockopt_byte(self);
-# else
- return sockopt_int(self);
-# endif
+ return XCAT(sockopt_,TYPE_IP_MULTICAST_TTL)(self);
}
#endif
rb_raise(rb_eTypeError, "ipv4_multicast_ttl socket option expected");
UNREACHABLE;
}
-#if defined(__NetBSD__) || defined(__OpenBSD__)
-# define inspect_ipv4_multicast_ttl(a,b,c,d) inspect_byte(a,b,c,d)
-#else
-# define inspect_ipv4_multicast_ttl(a,b,c,d) inspect_int(a,b,c,d)
-#endif
+#define inspect_ipv4_multicast_ttl(a,b,c,d) \
+ XCAT(inspect_,TYPE_IP_MULTICAST_TTL)(a,b,c,d)
static int
inspect_int(int level, int optname, VALUE data, VALUE ret)
@@ -481,7 +491,7 @@ inspect_int(int level, int optname, VALUE data, VALUE ret)
}
}
-#if defined(__NetBSD__) || defined(__OpenBSD__)
+#ifdef USE_INSPECT_BYTE
static int
inspect_byte(int level, int optname, VALUE data, VALUE ret)
{
@@ -591,6 +601,15 @@ inspect_timeval_as_interval(int level, int optname, VALUE data, VALUE ret)
* (MULTICAST 1.2 Release)
* http://www.kohala.com/start/mcast.api.txt
*
+ * There are 2 socket options which takes a u_char (unsigned char).
+ *
+ * IP_MULTICAST_TTL
+ * IP_MULTICAST_LOOP
+ *
+ * However Linux and FreeBSD setsockname accepts int argument
+ * as well as u_char.
+ * Their getsockname returns int.
+ *
* There are 3 socket options which takes a struct.
*
* IP_MULTICAST_IF: struct in_addr
@@ -789,6 +808,328 @@ inspect_ipv6_mreq(int level, int optname, VALUE data, VALUE ret)
}
#endif
+#if defined(IPPROTO_TCP) && defined(TCP_INFO) && defined(HAVE_TYPE_STRUCT_TCP_INFO)
+
+#ifdef __FreeBSD__
+# ifndef HAVE_CONST_TCP_ESTABLISHED
+# define TCP_ESTABLISHED TCPS_ESTABLISHED
+# endif
+# ifndef HAVE_CONST_TCP_SYN_SENT
+# define TCP_SYN_SENT TCPS_SYN_SENT
+# endif
+# ifndef HAVE_CONST_TCP_SYN_RECV
+# define TCP_SYN_RECV TCPS_SYN_RECEIVED
+# endif
+# ifndef HAVE_CONST_TCP_FIN_WAIT1
+# define TCP_FIN_WAIT1 TCPS_FIN_WAIT_1
+# endif
+# ifndef HAVE_CONST_TCP_FIN_WAIT2
+# define TCP_FIN_WAIT2 TCPS_FIN_WAIT_2
+# endif
+# ifndef HAVE_CONST_TCP_TIME_WAIT
+# define TCP_TIME_WAIT TCPS_TIME_WAIT
+# endif
+# ifndef HAVE_CONST_TCP_CLOSE
+# define TCP_CLOSE TCPS_CLOSED
+# endif
+# ifndef HAVE_CONST_TCP_CLOSE_WAIT
+# define TCP_CLOSE_WAIT TCPS_CLOSE_WAIT
+# endif
+# ifndef HAVE_CONST_TCP_LAST_ACK
+# define TCP_LAST_ACK TCPS_LAST_ACK
+# endif
+# ifndef HAVE_CONST_TCP_LISTEN
+# define TCP_LISTEN TCPS_LISTEN
+# endif
+# ifndef HAVE_CONST_TCP_CLOSING
+# define TCP_CLOSING TCPS_CLOSING
+# endif
+#endif
+
+#if defined(HAVE_CONST_TCP_ESTABLISHED) && !defined(TCP_ESTABLISHED)
+# define TCP_ESTABLISHED TCP_ESTABLISHED
+#endif
+#if defined(HAVE_CONST_TCP_SYN_SENT) && !defined(TCP_SYN_SENT)
+# define TCP_SYN_SENT TCP_SYN_SENT
+#endif
+#if defined(HAVE_CONST_TCP_SYN_RECV) && !defined(TCP_SYN_RECV)
+# define TCP_SYN_RECV TCP_SYN_RECV
+#endif
+#if defined(HAVE_CONST_TCP_FIN_WAIT1) && !defined(TCP_FIN_WAIT1)
+# define TCP_FIN_WAIT1 TCP_FIN_WAIT1
+#endif
+#if defined(HAVE_CONST_TCP_FIN_WAIT2) && !defined(TCP_FIN_WAIT2)
+# define TCP_FIN_WAIT2 TCP_FIN_WAIT2
+#endif
+#if defined(HAVE_CONST_TCP_TIME_WAIT) && !defined(TCP_TIME_WAIT)
+# define TCP_TIME_WAIT TCP_TIME_WAIT
+#endif
+#if defined(HAVE_CONST_TCP_CLOSE) && !defined(TCP_CLOSE)
+# define TCP_CLOSE TCP_CLOSE
+#endif
+#if defined(HAVE_CONST_TCP_CLOSE_WAIT) && !defined(TCP_CLOSE_WAIT)
+# define TCP_CLOSE_WAIT TCP_CLOSE_WAIT
+#endif
+#if defined(HAVE_CONST_TCP_LAST_ACK) && !defined(TCP_LAST_ACK)
+# define TCP_LAST_ACK TCP_LAST_ACK
+#endif
+#if defined(HAVE_CONST_TCP_LISTEN) && !defined(TCP_LISTEN)
+# define TCP_LISTEN TCP_LISTEN
+#endif
+#if defined(HAVE_CONST_TCP_CLOSING) && !defined(TCP_CLOSING)
+# define TCP_CLOSING TCP_CLOSING
+#endif
+
+static void
+inspect_tcpi_options(VALUE ret, u_int8_t options)
+{
+ int sep = '=';
+
+ rb_str_cat2(ret, " options");
+#define INSPECT_TCPI_OPTION(optval, name) \
+ if (options & (optval)) { \
+ options &= ~(u_int8_t)(optval); \
+ rb_str_catf(ret, "%c%s", sep, name); \
+ sep = ','; \
+ }
+#ifdef TCPI_OPT_TIMESTAMPS /* GNU/Linux, FreeBSD */
+ INSPECT_TCPI_OPTION(TCPI_OPT_TIMESTAMPS, "TIMESTAMPS");
+#endif
+#ifdef TCPI_OPT_SACK /* GNU/Linux, FreeBSD */
+ INSPECT_TCPI_OPTION(TCPI_OPT_SACK, "SACK");
+#endif
+#ifdef TCPI_OPT_WSCALE /* GNU/Linux, FreeBSD */
+ INSPECT_TCPI_OPTION(TCPI_OPT_WSCALE, "WSCALE");
+#endif
+#ifdef TCPI_OPT_ECN /* GNU/Linux, FreeBSD */
+ INSPECT_TCPI_OPTION(TCPI_OPT_ECN, "ECN");
+#endif
+#ifdef TCPI_OPT_ECN_SEEN /* GNU/Linux */
+ INSPECT_TCPI_OPTION(TCPI_OPT_ECN_SEEN, "ECN_SEEN");
+#endif
+#ifdef TCPI_OPT_SYN_DATA /* GNU/Linux */
+ INSPECT_TCPI_OPTION(TCPI_OPT_SYN_DATA, "SYN_DATA");
+#endif
+#ifdef TCPI_OPT_TOE /* FreeBSD */
+ INSPECT_TCPI_OPTION(TCPI_OPT_TOE, "TOE");
+#endif
+#undef INSPECT_TCPI_OPTION
+
+ if (options || sep == '=') {
+ rb_str_catf(ret, "%c%u", sep, options);
+ }
+}
+
+static void
+inspect_tcpi_usec(VALUE ret, const char *prefix, u_int32_t t)
+{
+ rb_str_catf(ret, "%s%u.%06us", prefix, t / 1000000, t % 1000000);
+}
+
+#ifdef __linux__
+static void
+inspect_tcpi_msec(VALUE ret, const char *prefix, u_int32_t t)
+{
+ rb_str_catf(ret, "%s%u.%03us", prefix, t / 1000, t % 1000);
+}
+#endif
+
+#ifdef __FreeBSD__
+# define inspect_tcpi_rto(ret, t) inspect_tcpi_usec(ret, " rto=", t)
+# define inspect_tcpi_last_data_recv(ret, t) inspect_tcpi_usec(ret, " last_data_recv=", t)
+# define inspect_tcpi_rtt(ret, t) inspect_tcpi_usec(ret, " rtt=", t)
+# define inspect_tcpi_rttvar(ret, t) inspect_tcpi_usec(ret, " rttvar=", t)
+#else
+# define inspect_tcpi_rto(ret, t) inspect_tcpi_usec(ret, " rto=", t)
+# define inspect_tcpi_ato(ret, t) inspect_tcpi_usec(ret, " ato=", t)
+# define inspect_tcpi_last_data_sent(ret, t) inspect_tcpi_msec(ret, " last_data_sent=", t)
+# define inspect_tcpi_last_data_recv(ret, t) inspect_tcpi_msec(ret, " last_data_recv=", t)
+# define inspect_tcpi_last_ack_sent(ret, t) inspect_tcpi_msec(ret, " last_ack_sent=", t)
+# define inspect_tcpi_last_ack_recv(ret, t) inspect_tcpi_msec(ret, " last_ack_recv=", t)
+# define inspect_tcpi_rtt(ret, t) inspect_tcpi_usec(ret, " rtt=", t)
+# define inspect_tcpi_rttvar(ret, t) inspect_tcpi_usec(ret, " rttvar=", t)
+# define inspect_tcpi_rcv_rtt(ret, t) inspect_tcpi_usec(ret, " rcv_rtt=", t)
+#endif
+
+static int
+inspect_tcp_info(int level, int optname, VALUE data, VALUE ret)
+{
+ size_t actual_size = RSTRING_LEN(data);
+ if (sizeof(struct tcp_info) <= actual_size) {
+ struct tcp_info s;
+ memcpy((char*)&s, RSTRING_PTR(data), sizeof(s));
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_STATE
+ switch (s.tcpi_state) {
+# ifdef TCP_ESTABLISHED
+ case TCP_ESTABLISHED: rb_str_cat_cstr(ret, " state=ESTABLISHED"); break;
+# endif
+# ifdef TCP_SYN_SENT
+ case TCP_SYN_SENT: rb_str_cat_cstr(ret, " state=SYN_SENT"); break;
+# endif
+# ifdef TCP_SYN_RECV
+ case TCP_SYN_RECV: rb_str_cat_cstr(ret, " state=SYN_RECV"); break;
+# endif
+# ifdef TCP_FIN_WAIT1
+ case TCP_FIN_WAIT1: rb_str_cat_cstr(ret, " state=FIN_WAIT1"); break;
+# endif
+# ifdef TCP_FIN_WAIT2
+ case TCP_FIN_WAIT2: rb_str_cat_cstr(ret, " state=FIN_WAIT2"); break;
+# endif
+# ifdef TCP_TIME_WAIT
+ case TCP_TIME_WAIT: rb_str_cat_cstr(ret, " state=TIME_WAIT"); break;
+# endif
+# ifdef TCP_CLOSE
+ case TCP_CLOSE: rb_str_cat_cstr(ret, " state=CLOSED"); break; /* RFC 793 uses "CLOSED", not "CLOSE" */
+# endif
+# ifdef TCP_CLOSE_WAIT
+ case TCP_CLOSE_WAIT: rb_str_cat_cstr(ret, " state=CLOSE_WAIT"); break;
+# endif
+# ifdef TCP_LAST_ACK
+ case TCP_LAST_ACK: rb_str_cat_cstr(ret, " state=LAST_ACK"); break;
+# endif
+# ifdef TCP_LISTEN
+ case TCP_LISTEN: rb_str_cat_cstr(ret, " state=LISTEN"); break;
+# endif
+# ifdef TCP_CLOSING
+ case TCP_CLOSING: rb_str_cat_cstr(ret, " state=CLOSING"); break;
+# endif
+ default: rb_str_catf(ret, " state=%u", s.tcpi_state); break;
+ }
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_CA_STATE
+ switch (s.tcpi_ca_state) {
+ case TCP_CA_Open: rb_str_cat_cstr(ret, " ca_state=Open"); break;
+ case TCP_CA_Disorder: rb_str_cat_cstr(ret, " ca_state=Disorder"); break;
+ case TCP_CA_CWR: rb_str_cat_cstr(ret, " ca_state=CWR"); break;
+ case TCP_CA_Recovery: rb_str_cat_cstr(ret, " ca_state=Recovery"); break;
+ case TCP_CA_Loss: rb_str_cat_cstr(ret, " ca_state=Loss"); break;
+ default: rb_str_catf(ret, " ca_state=%u", s.tcpi_ca_state); break;
+ }
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RETRANSMITS
+ rb_str_catf(ret, " retransmits=%u", s.tcpi_retransmits);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_PROBES
+ rb_str_catf(ret, " probes=%u", s.tcpi_probes);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_BACKOFF
+ rb_str_catf(ret, " backoff=%u", s.tcpi_backoff);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_OPTIONS
+ inspect_tcpi_options(ret, s.tcpi_options);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SND_WSCALE
+ rb_str_catf(ret, " snd_wscale=%u", s.tcpi_snd_wscale);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RCV_WSCALE
+ rb_str_catf(ret, " rcv_wscale=%u", s.tcpi_rcv_wscale);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RTO
+ inspect_tcpi_rto(ret, s.tcpi_rto);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_ATO
+ inspect_tcpi_ato(ret, s.tcpi_ato);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SND_MSS
+ rb_str_catf(ret, " snd_mss=%u", s.tcpi_snd_mss);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RCV_MSS
+ rb_str_catf(ret, " rcv_mss=%u", s.tcpi_rcv_mss);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_UNACKED
+ rb_str_catf(ret, " unacked=%u", s.tcpi_unacked);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SACKED
+ rb_str_catf(ret, " sacked=%u", s.tcpi_sacked);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_LOST
+ rb_str_catf(ret, " lost=%u", s.tcpi_lost);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RETRANS
+ rb_str_catf(ret, " retrans=%u", s.tcpi_retrans);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_FACKETS
+ rb_str_catf(ret, " fackets=%u", s.tcpi_fackets);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_LAST_DATA_SENT
+ inspect_tcpi_last_data_sent(ret, s.tcpi_last_data_sent);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_LAST_ACK_SENT
+ inspect_tcpi_last_ack_sent(ret, s.tcpi_last_ack_sent);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_LAST_DATA_RECV
+ inspect_tcpi_last_data_recv(ret, s.tcpi_last_data_recv);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_LAST_ACK_RECV
+ inspect_tcpi_last_ack_recv(ret, s.tcpi_last_ack_recv);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_PMTU
+ rb_str_catf(ret, " pmtu=%u", s.tcpi_pmtu);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RCV_SSTHRESH
+ rb_str_catf(ret, " rcv_ssthresh=%u", s.tcpi_rcv_ssthresh);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RTT
+ inspect_tcpi_rtt(ret, s.tcpi_rtt);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RTTVAR
+ inspect_tcpi_rttvar(ret, s.tcpi_rttvar);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SND_SSTHRESH
+ rb_str_catf(ret, " snd_ssthresh=%u", s.tcpi_snd_ssthresh);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SND_CWND
+ rb_str_catf(ret, " snd_cwnd=%u", s.tcpi_snd_cwnd);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_ADVMSS
+ rb_str_catf(ret, " advmss=%u", s.tcpi_advmss);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_REORDERING
+ rb_str_catf(ret, " reordering=%u", s.tcpi_reordering);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RCV_RTT
+ inspect_tcpi_rcv_rtt(ret, s.tcpi_rcv_rtt);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RCV_SPACE
+ rb_str_catf(ret, " rcv_space=%u", s.tcpi_rcv_space);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_TOTAL_RETRANS
+ rb_str_catf(ret, " total_retrans=%u", s.tcpi_total_retrans);
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SND_WND
+ rb_str_catf(ret, " snd_wnd=%u", s.tcpi_snd_wnd); /* FreeBSD */
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SND_BWND
+ rb_str_catf(ret, " snd_bwnd=%u", s.tcpi_snd_bwnd); /* FreeBSD */
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SND_NXT
+ rb_str_catf(ret, " snd_nxt=%u", s.tcpi_snd_nxt); /* FreeBSD */
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RCV_NXT
+ rb_str_catf(ret, " rcv_nxt=%u", s.tcpi_rcv_nxt); /* FreeBSD */
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_TOE_TID
+ rb_str_catf(ret, " toe_tid=%u", s.tcpi_toe_tid); /* FreeBSD */
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SND_REXMITPACK
+ rb_str_catf(ret, " snd_rexmitpack=%u", s.tcpi_snd_rexmitpack); /* FreeBSD */
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_RCV_OOOPACK
+ rb_str_catf(ret, " rcv_ooopack=%u", s.tcpi_rcv_ooopack); /* FreeBSD */
+#endif
+#ifdef HAVE_STRUCT_TCP_INFO_TCPI_SND_ZEROWIN
+ rb_str_catf(ret, " snd_zerowin=%u", s.tcpi_snd_zerowin); /* FreeBSD */
+#endif
+ if (sizeof(struct tcp_info) < actual_size)
+ rb_str_catf(ret, " (%u bytes too long)", (unsigned)(actual_size - sizeof(struct tcp_info)));
+ return 1;
+ }
+ else {
+ return 0;
+ }
+}
+#endif
+
#if defined(SOL_SOCKET) && defined(SO_PEERCRED) /* GNU/Linux, OpenBSD */
#if defined(__OpenBSD__)
#define RUBY_SOCK_PEERCRED struct sockpeercred
@@ -1036,6 +1377,9 @@ sockopt_inspect(VALUE self)
# if defined(TCP_NODELAY) /* POSIX */
case TCP_NODELAY: inspected = inspect_int(level, optname, data, ret); break;
# endif
+# if defined(TCP_INFO) && defined(HAVE_TYPE_STRUCT_TCP_INFO) /* Linux, FreeBSD */
+ case TCP_INFO: inspected = inspect_tcp_info(level, optname, data, ret); break;
+# endif
}
break;
# endif
diff --git a/ext/socket/raddrinfo.c b/ext/socket/raddrinfo.c
index e4cb9c379f..ceed9c3ac1 100644
--- a/ext/socket/raddrinfo.c
+++ b/ext/socket/raddrinfo.c
@@ -1,6 +1,6 @@
/************************************************
- ainfo.c -
+ raddrinfo.c -
created at: Thu Mar 31 12:21:29 JST 1994
@@ -617,8 +617,7 @@ make_hostent_internal(struct hostent_arg *arg)
}
rb_ary_push(ary, rb_str_new2(hostp));
- if (addr->ai_canonname && strlen(addr->ai_canonname) < NI_MAXHOST &&
- (h = gethostbyname(addr->ai_canonname))) {
+ if (addr->ai_canonname && (h = gethostbyname(addr->ai_canonname))) {
names = rb_ary_new();
if (h->h_aliases != NULL) {
for (pch = h->h_aliases; *pch; pch++) {
@@ -719,8 +718,7 @@ get_addrinfo(VALUE self)
static rb_addrinfo_t *
alloc_addrinfo()
{
- rb_addrinfo_t *rai = ALLOC(rb_addrinfo_t);
- memset(rai, 0, sizeof(rb_addrinfo_t));
+ rb_addrinfo_t *rai = ZALLOC(rb_addrinfo_t);
rai->inspectname = Qnil;
rai->canonname = Qnil;
return rai;
diff --git a/ext/socket/rubysocket.h b/ext/socket/rubysocket.h
index a4893d9698..8beffd2e76 100644
--- a/ext/socket/rubysocket.h
+++ b/ext/socket/rubysocket.h
@@ -39,6 +39,9 @@
# ifdef HAVE_NETINET_TCP_H
# include <netinet/tcp.h>
# endif
+# ifdef HAVE_NETINET_TCP_FSM_H
+# include <netinet/tcp_fsm.h>
+# endif
# ifdef HAVE_NETINET_UDP_H
# include <netinet/udp.h>
# endif
@@ -226,6 +229,7 @@ typedef union {
#define INET_SOCKS 2
extern int rsock_do_not_reverse_lookup;
+extern int rsock_cmsg_cloexec_state;
#define FMODE_NOREVLOOKUP 0x100
extern VALUE rb_cBasicSocket;
@@ -255,7 +259,6 @@ int Rconnect();
#include "constdefs.h"
-#define BLOCKING_REGION(func, arg) (long)rb_thread_blocking_region((func), (arg), RUBY_UBF_IO, 0)
#define BLOCKING_REGION_FD(func, arg) (long)rb_thread_io_blocking_region((func), (arg), (arg)->fd)
#define SockAddrStringValue(v) rsock_sockaddr_string_value(&(v))
@@ -310,6 +313,7 @@ socklen_t rsock_unix_sockaddr_len(VALUE path);
#endif
int rsock_socket(int domain, int type, int proto);
+int rsock_detect_cloexec(int fd);
VALUE rsock_init_sock(VALUE sock, int fd);
VALUE rsock_sock_s_socketpair(int argc, VALUE *argv, VALUE klass);
VALUE rsock_init_inetsock(VALUE sock, VALUE remote_host, VALUE remote_serv, VALUE local_host, VALUE local_serv, int type);
@@ -392,4 +396,20 @@ NORETURN(void rsock_sys_fail_sockaddr(const char *, struct sockaddr *addr, sockl
NORETURN(void rsock_sys_fail_raddrinfo(const char *, VALUE rai));
NORETURN(void rsock_sys_fail_raddrinfo_or_sockaddr(const char *, VALUE addr, VALUE rai));
+/*
+ * It is safe on Linux to attempt using a socket without waiting on it in
+ * all cases. For some syscalls (e.g. accept/accept4), blocking on the
+ * syscall instead of relying on select/poll allows the kernel to use
+ * "wake-one" behavior and avoid the thundering herd problem.
+ * This is likely safe on all other *nix-like systems, so this whitelist
+ * can be expanded by interested parties.
+ */
+#if defined(__linux__)
+static inline int rsock_maybe_fd_writable(int fd) { return 1; }
+static inline void rsock_maybe_wait_fd(int fd) { }
+#else /* some systems (mswin/mingw) need these. ref: r36946 */
+# define rsock_maybe_fd_writable(fd) rb_thread_fd_writable((fd))
+# define rsock_maybe_wait_fd(fd) rb_thread_wait_fd((fd))
+#endif
+
#endif
diff --git a/ext/socket/socket.c b/ext/socket/socket.c
index 8bfccbd559..f27383d61c 100644
--- a/ext/socket/socket.c
+++ b/ext/socket/socket.c
@@ -23,10 +23,8 @@ rsock_syserr_fail_host_port(int err, const char *mesg, VALUE host, VALUE port)
{
VALUE message;
- port = rb_String(port);
-
- message = rb_sprintf("%s for \"%s\" port %s",
- mesg, StringValueCStr(host), StringValueCStr(port));
+ message = rb_sprintf("%s for %+"PRIsVALUE" port % "PRIsVALUE"",
+ mesg, host, port);
rb_syserr_fail_str(err, message);
}
@@ -43,15 +41,7 @@ rsock_syserr_fail_path(int err, const char *mesg, VALUE path)
VALUE message;
if (RB_TYPE_P(path, T_STRING)) {
- if (memchr(RSTRING_PTR(path), '\0', RSTRING_LEN(path))) {
- path = rb_str_inspect(path);
- message = rb_sprintf("%s for %s", mesg,
- StringValueCStr(path));
- }
- else {
- message = rb_sprintf("%s for \"%s\"", mesg,
- StringValueCStr(path));
- }
+ message = rb_sprintf("%s for % "PRIsVALUE"", mesg, path);
rb_syserr_fail_str(err, message);
}
else {
@@ -87,7 +77,7 @@ rsock_syserr_fail_raddrinfo(int err, const char *mesg, VALUE rai)
VALUE str, message;
str = rsock_addrinfo_inspect_sockaddr(rai);
- message = rb_sprintf("%s for %s", mesg, StringValueCStr(str));
+ message = rb_sprintf("%s for %"PRIsVALUE"", mesg, str);
rb_syserr_fail_str(err, message);
}
@@ -178,16 +168,29 @@ pair_yield(VALUE pair)
#if defined HAVE_SOCKETPAIR
+#ifdef SOCK_CLOEXEC
static int
rsock_socketpair0(int domain, int type, int protocol, int sv[2])
{
int ret;
+ static int cloexec_state = -1; /* <0: unknown, 0: ignored, >0: working */
-#ifdef SOCK_CLOEXEC
- static int try_sock_cloexec = 1;
- if (try_sock_cloexec) {
+ if (cloexec_state > 0) { /* common path, if SOCK_CLOEXEC is defined */
ret = socketpair(domain, type|SOCK_CLOEXEC, protocol, sv);
- if (ret == -1 && errno == EINVAL) {
+ if (ret == 0 && (sv[0] <= 2 || sv[1] <= 2)) {
+ goto fix_cloexec; /* highly unlikely */
+ }
+ goto update_max_fd;
+ }
+ else if (cloexec_state < 0) { /* usually runs once only for detection */
+ ret = socketpair(domain, type|SOCK_CLOEXEC, protocol, sv);
+ if (ret == 0) {
+ cloexec_state = rsock_detect_cloexec(sv[0]);
+ if ((cloexec_state == 0) || (sv[0] <= 2 || sv[1] <= 2))
+ goto fix_cloexec;
+ goto update_max_fd;
+ }
+ else if (ret == -1 && errno == EINVAL) {
/* SOCK_CLOEXEC is available since Linux 2.6.27. Linux 2.6.18 fails with EINVAL */
ret = socketpair(domain, type, protocol, sv);
if (ret != -1) {
@@ -195,26 +198,41 @@ rsock_socketpair0(int domain, int type, int protocol, int sv[2])
* So disable SOCK_CLOEXEC only if socketpair() succeeds without SOCK_CLOEXEC.
* Ex. Socket.pair(:UNIX, 0xff) fails with EINVAL.
*/
- try_sock_cloexec = 0;
+ cloexec_state = 0;
}
}
}
- else {
+ else { /* cloexec_state == 0 */
ret = socketpair(domain, type, protocol, sv);
}
-#else
- ret = socketpair(domain, type, protocol, sv);
-#endif
-
if (ret == -1) {
return -1;
}
+fix_cloexec:
+ rb_maygvl_fd_fix_cloexec(sv[0]);
+ rb_maygvl_fd_fix_cloexec(sv[1]);
+
+update_max_fd:
+ rb_update_max_fd(sv[0]);
+ rb_update_max_fd(sv[1]);
+
+ return ret;
+}
+#else /* !SOCK_CLOEXEC */
+static int
+rsock_socketpair0(int domain, int type, int protocol, int sv[2])
+{
+ int ret = socketpair(domain, type, protocol, sv);
+
+ if (ret == -1)
+ return -1;
+
rb_fd_fix_cloexec(sv[0]);
rb_fd_fix_cloexec(sv[1]);
-
return ret;
}
+#endif /* !SOCK_CLOEXEC */
static int
rsock_socketpair(int domain, int type, int protocol, int sv[2])
@@ -277,8 +295,6 @@ rsock_sock_s_socketpair(int argc, VALUE *argv, VALUE klass)
if (ret < 0) {
rb_sys_fail("socketpair(2)");
}
- rb_fd_fix_cloexec(sp[0]);
- rb_fd_fix_cloexec(sp[1]);
s1 = rsock_init_sock(rb_obj_alloc(klass), sp[0]);
s2 = rsock_init_sock(rb_obj_alloc(klass), sp[1]);
@@ -1007,10 +1023,15 @@ sock_sysaccept(VALUE sock)
static VALUE
sock_gethostname(VALUE obj)
{
-#ifndef HOST_NAME_MAX
-# define HOST_NAME_MAX 1024
+#if defined(NI_MAXHOST)
+# define RUBY_MAX_HOST_NAME_LEN NI_MAXHOST
+#elif defined(HOST_NAME_MAX)
+# define RUBY_MAX_HOST_NAME_LEN HOST_NAME_MAX
+#else
+# define RUBY_MAX_HOST_NAME_LEN 1024
#endif
- char buf[HOST_NAME_MAX+1];
+
+ char buf[RUBY_MAX_HOST_NAME_LEN+1];
rb_secure(3);
if (gethostname(buf, (int)sizeof buf - 1) < 0)
@@ -2022,7 +2043,7 @@ Init_socket()
*
* === What's a socket?
*
- * Sockets are endpoints of a bidirectionnal communication channel.
+ * Sockets are endpoints of a bidirectional communication channel.
* Sockets can communicate within a process, between processes on the same
* machine or between different machines. There are many types of socket:
* TCPSocket, UDPSocket or UNIXSocket for example.
@@ -2047,7 +2068,7 @@ Init_socket()
*
* *hostname:*
* The identifier of a network interface:
- * * a string (hostname, IPv4 or IPv6 adress or +broadcast+
+ * * a string (hostname, IPv4 or IPv6 address or +broadcast+
* which specifies a broadcast address)
* * a zero-length string which specifies INADDR_ANY
* * an integer (interpreted as binary address in host byte order).
diff --git a/ext/socket/udpsocket.c b/ext/socket/udpsocket.c
index 761b11a298..eb605cafc1 100644
--- a/ext/socket/udpsocket.c
+++ b/ext/socket/udpsocket.c
@@ -177,7 +177,7 @@ udp_send(int argc, VALUE *argv, VALUE sock)
retry:
arg.to = res->ai_addr;
arg.tolen = res->ai_addrlen;
- rb_thread_fd_writable(arg.fd);
+ rsock_maybe_fd_writable(arg.fd);
n = (int)BLOCKING_REGION_FD(rsock_sendto_blocking, &arg);
if (n >= 0) {
rb_freeaddrinfo(res0);
diff --git a/ext/socket/unixsocket.c b/ext/socket/unixsocket.c
index 1742496e84..0a1b65a5b9 100644
--- a/ext/socket/unixsocket.c
+++ b/ext/socket/unixsocket.c
@@ -34,10 +34,6 @@ rsock_init_unixsock(VALUE sock, VALUE path, int server)
rb_io_t *fptr;
SafeStringValue(path);
- fd = rsock_socket(AF_UNIX, SOCK_STREAM, 0);
- if (fd < 0) {
- rsock_sys_fail_path("socket(2)", path);
- }
INIT_SOCKADDR_UN(&sockaddr, sizeof(struct sockaddr_un));
if (sizeof(sockaddr.sun_path) < (size_t)RSTRING_LEN(path)) {
@@ -47,6 +43,11 @@ rsock_init_unixsock(VALUE sock, VALUE path, int server)
memcpy(sockaddr.sun_path, RSTRING_PTR(path), RSTRING_LEN(path));
sockaddrlen = rsock_unix_sockaddr_len(path);
+ fd = rsock_socket(AF_UNIX, SOCK_STREAM, 0);
+ if (fd < 0) {
+ rsock_sys_fail_path("socket(2)", path);
+ }
+
if (server) {
status = bind(fd, (struct sockaddr*)&sockaddr, sockaddrlen);
}
@@ -389,7 +390,13 @@ unix_recv_io(int argc, VALUE *argv, VALUE sock)
#if FD_PASSING_BY_MSG_CONTROL
memcpy(&fd, CMSG_DATA(&cmsg.hdr), sizeof(int));
#endif
- rb_fd_fix_cloexec(fd);
+
+ rb_update_max_fd(fd);
+
+ if (rsock_cmsg_cloexec_state < 0)
+ rsock_cmsg_cloexec_state = rsock_detect_cloexec(fd);
+ if (rsock_cmsg_cloexec_state == 0 || fd <= 2)
+ rb_maygvl_fd_fix_cloexec(fd);
if (klass == Qnil)
return INT2FIX(fd);
diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c
index 55563c3a69..2964adab40 100644
--- a/ext/stringio/stringio.c
+++ b/ext/stringio/stringio.c
@@ -1169,13 +1169,12 @@ strio_write(VALUE self, VALUE str)
struct StringIO *ptr = writable(self);
long len, olen;
rb_encoding *enc, *enc2;
- rb_encoding *const ascii8bit = rb_ascii8bit_encoding();
if (!RB_TYPE_P(str, T_STRING))
str = rb_obj_as_string(str);
enc = rb_enc_get(ptr->string);
enc2 = rb_enc_get(str);
- if (enc != enc2 && enc != ascii8bit) {
+ if (enc != enc2 && enc != rb_ascii8bit_encoding()) {
str = rb_str_conv_enc(str, enc2, enc);
}
len = RSTRING_LEN(str);
@@ -1186,7 +1185,7 @@ strio_write(VALUE self, VALUE str)
ptr->pos = olen;
}
if (ptr->pos == olen) {
- if (enc == ascii8bit || enc2 == ascii8bit) {
+ if (enc2 == rb_ascii8bit_encoding()) {
rb_enc_str_buf_cat(ptr->string, RSTRING_PTR(str), len, enc);
OBJ_INFECT(ptr->string, str);
}
@@ -1500,6 +1499,16 @@ strio_set_encoding(int argc, VALUE *argv, VALUE self)
/*
* Pseudo I/O on String object.
+ *
+ * Commonly used to simulate `$stdio` or `$stderr`
+ *
+ * === Examples
+ *
+ * require 'stringio'
+ *
+ * io = StringIO.new
+ * io.puts "Hello World"
+ * io.string #=> "Hello World"
*/
void
Init_stringio()
diff --git a/ext/strscan/strscan.c b/ext/strscan/strscan.c
index ec983e1f50..7f93324dee 100644
--- a/ext/strscan/strscan.c
+++ b/ext/strscan/strscan.c
@@ -199,8 +199,7 @@ strscan_s_allocate(VALUE klass)
{
struct strscanner *p;
- p = ALLOC(struct strscanner);
- MEMZERO(p, struct strscanner, 1);
+ p = ZALLOC(struct strscanner);
CLEAR_MATCH_STATUS(p);
onig_region_init(&(p->regs));
p->str = Qnil;
@@ -977,7 +976,7 @@ strscan_matched_size(VALUE self)
}
static int
-name_to_backref_number(struct re_registers *regs, VALUE regexp, const char* name, const char* name_end)
+name_to_backref_number(struct re_registers *regs, VALUE regexp, const char* name, const char* name_end, rb_encoding *enc)
{
int num;
@@ -987,9 +986,8 @@ name_to_backref_number(struct re_registers *regs, VALUE regexp, const char* name
return num;
}
else {
- VALUE s = rb_str_new(name, (long )(name_end - name));
- rb_raise(rb_eIndexError, "undefined group name reference: %s",
- StringValuePtr(s));
+ rb_enc_raise(enc, rb_eIndexError, "undefined group name reference: %.*s",
+ rb_long2int(name_end - name), name);
}
UNREACHABLE;
@@ -1033,13 +1031,11 @@ strscan_aref(VALUE self, VALUE idx)
switch (TYPE(idx)) {
case T_SYMBOL:
- name = rb_id2name(SYM2ID(idx));
- goto name_to_backref;
- break;
+ idx = rb_sym2str(idx);
+ /* fall through */
case T_STRING:
- name = StringValuePtr(idx);
- name_to_backref:
- i = name_to_backref_number(&(p->regs), p->regex, name, name + strlen(name));
+ RSTRING_GETMEM(idx, name, i);
+ i = name_to_backref_number(&(p->regs), p->regex, name, name + i, rb_enc_get(idx));
break;
default:
i = NUM2LONG(idx);
@@ -1138,7 +1134,6 @@ strscan_restsize(VALUE self)
}
#define INSPECT_LENGTH 5
-#define BUFSIZE 256
/*
* Returns a string that represents the StringScanner object, showing:
diff --git a/ext/syslog/syslog.c b/ext/syslog/syslog.c
index 482a0a2eee..8ef722e1c0 100644
--- a/ext/syslog/syslog.c
+++ b/ext/syslog/syslog.c
@@ -327,10 +327,10 @@ static VALUE mSyslog_inspect(VALUE self)
Check_Type(self, T_MODULE);
if (!syslog_opened)
- return rb_sprintf("<#%s: opened=false>", rb_class2name(self));
+ return rb_sprintf("<#%"PRIsVALUE": opened=false>", self);
- return rb_sprintf("<#%s: opened=true, ident=\"%s\", options=%d, facility=%d, mask=%d>",
- rb_class2name(self),
+ return rb_sprintf("<#%"PRIsVALUE": opened=true, ident=\"%s\", options=%d, facility=%d, mask=%d>",
+ self,
syslog_ident,
syslog_options,
syslog_facility,
diff --git a/ext/thread/thread.c b/ext/thread/thread.c
index c54396b927..c14443b06c 100644
--- a/ext/thread/thread.c
+++ b/ext/thread/thread.c
@@ -272,14 +272,14 @@ queue_sleep(VALUE arg)
}
static VALUE
-queue_do_pop(VALUE self, VALUE should_block)
+queue_do_pop(VALUE self, int should_block)
{
struct waiting_delete args;
args.waiting = GET_QUEUE_WAITERS(self);
args.th = rb_thread_current();
while (queue_length(self) == 0) {
- if (!(int)should_block) {
+ if (!should_block) {
rb_raise(rb_eThreadError, "queue empty");
}
rb_ary_push(args.waiting, args.th);
@@ -289,18 +289,13 @@ queue_do_pop(VALUE self, VALUE should_block)
return rb_ary_shift(GET_QUEUE_QUE(self));
}
-static VALUE
-queue_pop_should_block(int argc, VALUE *argv)
-{
- VALUE should_block = Qtrue;
- switch (argc) {
- case 0:
- break;
- case 1:
- should_block = RTEST(argv[0]) ? Qfalse : Qtrue;
- break;
- default:
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 1)", argc);
+static int
+queue_pop_should_block(int argc, const VALUE *argv)
+{
+ int should_block = 1;
+ rb_check_arity(argc, 0, 1);
+ if (argc > 0) {
+ should_block = !RTEST(argv[0]);
}
return should_block;
}
@@ -322,7 +317,7 @@ queue_pop_should_block(int argc, VALUE *argv)
static VALUE
rb_queue_pop(int argc, VALUE *argv, VALUE self)
{
- VALUE should_block = queue_pop_should_block(argc, argv);
+ int should_block = queue_pop_should_block(argc, argv);
return queue_do_pop(self, should_block);
}
@@ -453,34 +448,51 @@ rb_szqueue_max_set(VALUE self, VALUE vmax)
return vmax;
}
+static int
+szqueue_push_should_block(int argc, const VALUE *argv)
+{
+ int should_block = 1;
+ rb_check_arity(argc, 1, 2);
+ if (argc > 1) {
+ should_block = !RTEST(argv[1]);
+ }
+ return should_block;
+}
+
/*
* Document-method: SizedQueue#push
* call-seq:
- * push(object)
- * enq(object)
+ * push(object, non_block=false)
+ * enq(object, non_block=false)
* <<(object)
*
* Pushes +object+ to the queue.
*
- * If there is no space left in the queue, waits until space becomes available.
+ * If there is no space left in the queue, waits until space becomes
+ * available, unless +non_block+ is true. If +non_block+ is true, the
+ * thread isn't suspended, and an exception is raised.
*/
static VALUE
-rb_szqueue_push(VALUE self, VALUE obj)
+rb_szqueue_push(int argc, VALUE *argv, VALUE self)
{
struct waiting_delete args;
+ int should_block = szqueue_push_should_block(argc, argv);
args.waiting = GET_SZQUEUE_WAITERS(self);
args.th = rb_thread_current();
while (queue_length(self) >= GET_SZQUEUE_ULONGMAX(self)) {
+ if (!should_block) {
+ rb_raise(rb_eThreadError, "queue full");
+ }
rb_ary_push(args.waiting, args.th);
rb_ensure((VALUE (*)())rb_thread_sleep_deadly, (VALUE)0, queue_delete_from_waiting, (VALUE)&args);
}
- return queue_do_push(self, obj);
+ return queue_do_push(self, argv[0]);
}
static VALUE
-szqueue_do_pop(VALUE self, VALUE should_block)
+szqueue_do_pop(VALUE self, int should_block)
{
VALUE retval = queue_do_pop(self, should_block);
@@ -508,7 +520,7 @@ szqueue_do_pop(VALUE self, VALUE should_block)
static VALUE
rb_szqueue_pop(int argc, VALUE *argv, VALUE self)
{
- VALUE should_block = queue_pop_should_block(argc, argv);
+ int should_block = queue_pop_should_block(argc, argv);
return szqueue_do_pop(self, should_block);
}
@@ -544,6 +556,7 @@ rb_szqueue_num_waiting(VALUE self)
#define UNDER_THREAD 1
#endif
+/* :nodoc: */
static VALUE
undumpable(VALUE obj)
{
@@ -589,15 +602,15 @@ Init_thread(void)
id_sleep = rb_intern("sleep");
rb_define_method(rb_cConditionVariable, "initialize", rb_condvar_initialize, 0);
- rb_define_method(rb_cConditionVariable, "marshal_dump", undumpable, 0);
rb_undef_method(rb_cConditionVariable, "initialize_copy");
+ rb_define_method(rb_cConditionVariable, "marshal_dump", undumpable, 0);
rb_define_method(rb_cConditionVariable, "wait", rb_condvar_wait, -1);
rb_define_method(rb_cConditionVariable, "signal", rb_condvar_signal, 0);
rb_define_method(rb_cConditionVariable, "broadcast", rb_condvar_broadcast, 0);
rb_define_method(rb_cQueue, "initialize", rb_queue_initialize, 0);
- rb_define_method(rb_cQueue, "marshal_dump", undumpable, 0);
rb_undef_method(rb_cQueue, "initialize_copy");
+ rb_define_method(rb_cQueue, "marshal_dump", undumpable, 0);
rb_define_method(rb_cQueue, "push", rb_queue_push, 1);
rb_define_method(rb_cQueue, "pop", rb_queue_pop, -1);
rb_define_method(rb_cQueue, "empty?", rb_queue_empty_p, 0);
@@ -619,7 +632,7 @@ Init_thread(void)
rb_define_method(rb_cSizedQueue, "initialize", rb_szqueue_initialize, 1);
rb_define_method(rb_cSizedQueue, "max", rb_szqueue_max_get, 0);
rb_define_method(rb_cSizedQueue, "max=", rb_szqueue_max_set, 1);
- rb_define_method(rb_cSizedQueue, "push", rb_szqueue_push, 1);
+ rb_define_method(rb_cSizedQueue, "push", rb_szqueue_push, -1);
rb_define_method(rb_cSizedQueue, "pop", rb_szqueue_pop, -1);
rb_define_method(rb_cSizedQueue, "clear", rb_szqueue_clear, 0);
rb_define_method(rb_cSizedQueue, "num_waiting", rb_szqueue_num_waiting, 0);
diff --git a/ext/tk/README.tcltklib b/ext/tk/README.tcltklib
index 1367189690..da343a4f3e 100644
--- a/ext/tk/README.tcltklib
+++ b/ext/tk/README.tcltklib
@@ -30,7 +30,7 @@ some or all of the following options.
--with-tcltkversion=<version>
--with-tcltkversion=<tclversion>,<tkversion>
- force version of Tcl/Tk libaray
+ force version of Tcl/Tk library
(e.g. libtcl8.4g.so & libtk8.4g.so ==> --with-tcltkversion=8.4g
libtcl8.4.so & libtk8.4g.so ==> --with-tcltkversion=8.4,8.4g)
diff --git a/ext/tk/extconf.rb b/ext/tk/extconf.rb
index 6e2ddb79e6..99a7367782 100644
--- a/ext/tk/extconf.rb
+++ b/ext/tk/extconf.rb
@@ -623,7 +623,7 @@ def libcheck_for_tclConfig(tcldir, tkdir, tclconf, tkconf)
$INCFLAGS << " -I" << File.join(File.dirname(File.dirname(file)),"include") if is_win32?
else
tcllibs = append_library($libs, libname)
- tcllibs = "-L#{tcldir.quote} -Wl,-R#{tcldir.quote} " + tcllibs
+ tcllibs = "#{libpathflag([tcldir])} #{tcllibs}"
# FIX ME: avoid pathname trouble (fail to find) on MinGW.
$INCFLAGS << " -I" << File.join(File.dirname(tcldir),"include") if is_win32?
@@ -665,7 +665,7 @@ def libcheck_for_tclConfig(tcldir, tkdir, tclconf, tkconf)
else
tklibs = append_library("", libname)
#tklibs = append_library("", $1)
- tklibs = "-L#{tkdir.quote} -Wl,-R#{tkdir.quote} " + tklibs
+ tklibs = "#{libpathflag([tkdir])} #{tklibs}"
# FIX ME: avoid pathname trouble (fail to find) on MinGW.
$INCFLAGS << " -I" << File.join(File.dirname(tcldir),"include") if is_win32?
@@ -1137,7 +1137,7 @@ def find_tcl(tcllib, stubs, version, *opt_paths)
if tcllib
print(".")
if have_library(tcllib, func, ["tcl.h"])
- return [true, path, lib_w_sufx, nil, *inc]
+ return [true, path, tcllib, nil, *inc]
end
else
sufx_list = ['', 't', 'g', 's', 'x']
@@ -1161,7 +1161,7 @@ def find_tcl(tcllib, stubs, version, *opt_paths)
tcllibs = libs_param + " -DSTATIC_BUILD " + fname.quote
else
tcllibs = append_library($libs, lib_w_sufx)
- tcllibs = "-L#{path.quote} -Wl,-R#{path.quote} " + tcllibs
+ tcllibs = "#{libpathflag([path])} #{tcllibs}"
end
if try_func(func, tcllibs, ["tcl.h"])
return [true, path, nil, tcllibs, *inc]
@@ -1277,7 +1277,7 @@ def find_tk(tklib, stubs, version, *opt_paths)
if tklib
print(".")
if have_library(tklib, func, ["tcl.h", "tk.h"])
- return [true, path, lib_w_sufx, nil, *inc]
+ return [true, path, tklib, nil, *inc]
end
else
sufx_list = ['', 't', 'g', 's', 'x']
@@ -1300,7 +1300,7 @@ def find_tk(tklib, stubs, version, *opt_paths)
tklibs = libs_param + " -DSTATIC_BUILD " + fname.quote
else
tklibs = append_library($libs, lib_w_sufx)
- tklibs = "-L#{path.quote} -Wl,-R#{path.quote} " + tklibs
+ tklibs = "#{libpathflag([path])} #{tklibs}"
end
if try_func(func, tklibs, ["tcl.h", "tk.h"])
return [true, path, nil, tklibs, *inc]
@@ -2003,7 +2003,7 @@ $defs += collect_tcltk_defs(TclConfig_Info['TCL_DEFS'], TkConfig_Info['TK_DEFS']
# MacOS X Frameworks?
if TkLib_Config["tcltk-framework"]
puts("Use MacOS X Frameworks.")
- ($LDFLAGS ||= "") << " -L#{TkLib_Config["tcl-build-dir"].quote} -Wl,-R#{TkLib_Config["tcl-build-dir"].quote}" if TkLib_Config["tcl-build-dir"]
+ ($LDFLAGS ||= "") << " " << libpathflag([TkLib_Config["tcl-build-dir"]]) if TkLib_Config["tcl-build-dir"]
libs = ''
if tcl_cfg_dir
@@ -2029,7 +2029,7 @@ if TkLib_Config["tcltk-framework"]
end
end
- libs << " -L#{TkLib_Config["tk-build-dir"].quote} -Wl,-R#{TkLib_Config["tk-build-dir"].quote}" if TkLib_Config["tk-build-dir"]
+ libs << " " << libpathflag([TkLib_Config["tk-build-dir"]]) if TkLib_Config["tk-build-dir"]
if tk_cfg_dir
TkConfig_Info['TK_LIBS'] ||= ""
diff --git a/ext/tk/lib/multi-tk.rb b/ext/tk/lib/multi-tk.rb
index 68bd849670..bb6e69aab6 100644
--- a/ext/tk/lib/multi-tk.rb
+++ b/ext/tk/lib/multi-tk.rb
@@ -148,7 +148,7 @@ class MultiTkIp
end
def delete(idx, &blk)
- # if gets an entry, is permited to delete
+ # if gets an entry, is permitted to delete
if self[idx]
@tbl.delete(idx)
elsif blk
diff --git a/ext/tk/lib/tcltk.rb b/ext/tk/lib/tcltk.rb
index 48ec1df09a..f8fbdfbe6d 100644
--- a/ext/tk/lib/tcltk.rb
+++ b/ext/tk/lib/tcltk.rb
@@ -325,7 +325,7 @@ class TclTkCallback < TclTkObject
TclTk._addcallback(self)
end
- # to_eval(): retuens string representation for @ip._eval_args
+ # to_eval(): returns string representation for @ip._eval_args
def to_eval()
if @arg
# bind replaces %s before calling ruby_fmt, so %%s is used
@@ -349,7 +349,7 @@ class TclTkImage < TclTkCommand
# initialize(interp, t, *args):
# generating image is done by TclTkImage.new()
- # destrying is done by image delete (inconsistent, sigh)
+ # destroying is done by image delete (inconsistent, sigh)
# interp: interpreter(TclTkInterpreter)
# t: image type (photo, bitmap, etc.)
# *args: command argument
diff --git a/ext/tk/lib/tkextlib/tcllib/plotchart.rb b/ext/tk/lib/tkextlib/tcllib/plotchart.rb
index cd52a0ed4b..d2f3a0da3a 100644
--- a/ext/tk/lib/tkextlib/tcllib/plotchart.rb
+++ b/ext/tk/lib/tkextlib/tcllib/plotchart.rb
@@ -142,7 +142,7 @@ module Tk::Tcllib::Plotchart
end
def self.pixel_to_coords(w, x, y)
- list(tk_call_without_enc('::Plotchart::pixelToCoords', w.path, x, y))
+ list(tk_call_without_enc('::Plotchart::coordsToPixel', w.path, x, y))
end
def self.determine_scale(*args) # (xmin, xmax, inverted=false)
@@ -311,7 +311,7 @@ module Tk::Tcllib::Plotchart
end
def pixel_to_coords(x, y)
- list(tk_call_without_enc('::Plotchart::pixelToCoords', @path, x, y))
+ list(tk_call_without_enc('::Plotchart::coordsToPixel', @path, x, y))
end
def determine_scale(xmax, ymax)
@@ -519,7 +519,7 @@ module Tk::Tcllib::Plotchart
class Histogram < XYPlot
TkCommandNames = [
'canvas'.freeze,
- '::Plotchart::createHistgram'.freeze
+ '::Plotchart::createHistogram'.freeze
].freeze
end
diff --git a/ext/tk/lib/tkextlib/tkDND/tkdnd.rb b/ext/tk/lib/tkextlib/tkDND/tkdnd.rb
index 97cdfc7f1c..38e05ce775 100644
--- a/ext/tk/lib/tkextlib/tkDND/tkdnd.rb
+++ b/ext/tk/lib/tkextlib/tkDND/tkdnd.rb
@@ -158,7 +158,7 @@ module Tk
cmd = Proc.new
end
- args = [None] if args.empty
+ args = [TkComm::None] if args.empty?
tk_call('dnd', 'bindsource', @path, type, cmd, *args)
self
diff --git a/ext/tk/stubs.c b/ext/tk/stubs.c
index 7398a79ae3..6c82c7a7bb 100644
--- a/ext/tk/stubs.c
+++ b/ext/tk/stubs.c
@@ -83,8 +83,8 @@ _nativethread_consistency_check(ip)
# define DL_SYM GetProcAddress
# define TCL_INDEX 4
# define TK_INDEX 3
-# define TCL_NAME "tcl89%s"
-# define TK_NAME "tk89%s"
+# define TCL_NAME "tcl89"
+# define TK_NAME "tk89"
# undef DLEXT
# define DLEXT ".dll"
#elif defined HAVE_DLOPEN
@@ -94,8 +94,8 @@ _nativethread_consistency_check(ip)
# define DL_SYM dlsym
# define TCL_INDEX 8
# define TK_INDEX 7
-# define TCL_NAME "libtcl8.9%s"
-# define TK_NAME "libtk8.9%s"
+# define TCL_NAME "libtcl8.9"
+# define TK_NAME "libtk8.9"
# ifdef __APPLE__
# undef DLEXT
# define DLEXT ".dylib"
@@ -116,7 +116,6 @@ ruby_open_tcl_dll(appname)
void (*p_Tcl_FindExecutable)(const char *);
int n;
char *ruby_tcl_dll = 0;
- char tcl_name[20];
if (tcl_dll) return TCLTK_STUBS_OK;
@@ -127,7 +126,7 @@ ruby_open_tcl_dll(appname)
if (ruby_tcl_dll) {
tcl_dll = (DL_HANDLE)DL_OPEN(ruby_tcl_dll);
} else {
- snprintf(tcl_name, sizeof tcl_name, TCL_NAME, DLEXT);
+ char tcl_name[] = TCL_NAME DLEXT;
/* examine from 8.9 to 8.1 */
for (n = '9'; n > '0'; n--) {
tcl_name[TCL_INDEX] = n;
@@ -162,7 +161,6 @@ ruby_open_tk_dll()
{
int n;
char *ruby_tk_dll = 0;
- char tk_name[20];
if (!tcl_dll) {
/* int ret = ruby_open_tcl_dll(RSTRING_PTR(rb_argv0)); */
@@ -176,7 +174,7 @@ ruby_open_tk_dll()
if (ruby_tk_dll) {
tk_dll = (DL_HANDLE)DL_OPEN(ruby_tk_dll);
} else {
- snprintf(tk_name, sizeof tk_name, TK_NAME, DLEXT);
+ char tk_name[] = TK_NAME DLEXT;
/* examine from 8.9 to 8.1 */
for (n = '9'; n > '0'; n--) {
tk_name[TK_INDEX] = n;
diff --git a/ext/tk/tcltklib.c b/ext/tk/tcltklib.c
index 237462fc3b..c67b0207c5 100644
--- a/ext/tk/tcltklib.c
+++ b/ext/tk/tcltklib.c
@@ -1375,7 +1375,7 @@ tcltkip_init_tk(interp)
}
-/* treat excetiopn on Tcl side */
+/* treat exception on Tcl side */
static VALUE rbtk_pending_exception;
static int rbtk_eventloop_depth = 0;
static int rbtk_internal_eventloop_handler = 0;
@@ -2079,9 +2079,9 @@ eventloop_sleep(dummy)
#endif
#endif
- DUMP2("eventloop_sleep: rb_thread_wait_for() at thread : %lx", rb_thread_current());
+ DUMP2("eventloop_sleep: rb_thread_wait_for() at thread : %"PRIxVALUE, rb_thread_current());
rb_thread_wait_for(t);
- DUMP2("eventloop_sleep: finish at thread : %lx", rb_thread_current());
+ DUMP2("eventloop_sleep: finish at thread : %"PRIxVALUE, rb_thread_current());
#ifdef HAVE_NATIVETHREAD
#ifndef RUBY_USE_NATIVE_THREAD
@@ -2498,8 +2498,8 @@ lib_eventloop_core(check_root, update_flag, check_var, interp)
}
} else {
- DUMP2("sleep eventloop %lx", current);
- DUMP2("eventloop thread is %lx", eventloop_thread);
+ DUMP2("sleep eventloop %"PRIxVALUE, current);
+ DUMP2("eventloop thread is %"PRIxVALUE, eventloop_thread);
/* rb_thread_stop(); */
rb_thread_sleep_forever();
}
@@ -2620,10 +2620,10 @@ lib_eventloop_ensure(args)
Tcl_DeleteEventSource(rbtk_EventSetupProc, rbtk_EventCheckProc, (ClientData)args);
- DUMP2("eventloop_ensure: current-thread : %lx", current_evloop);
- DUMP2("eventloop_ensure: eventloop-thread : %lx", eventloop_thread);
+ DUMP2("eventloop_ensure: current-thread : %"PRIxVALUE, current_evloop);
+ DUMP2("eventloop_ensure: eventloop-thread : %"PRIxVALUE, eventloop_thread);
if (eventloop_thread != current_evloop) {
- DUMP2("finish eventloop %lx (NOT current eventloop)", current_evloop);
+ DUMP2("finish eventloop %"PRIxVALUE" (NOT current eventloop)", current_evloop);
rb_thread_critical = ptr->thr_crit_bup;
@@ -2634,12 +2634,12 @@ lib_eventloop_ensure(args)
}
while((eventloop_thread = rb_ary_pop(eventloop_stack))) {
- DUMP2("eventloop-ensure: new eventloop-thread -> %lx",
+ DUMP2("eventloop-ensure: new eventloop-thread -> %"PRIxVALUE,
eventloop_thread);
if (eventloop_thread == current_evloop) {
rbtk_eventloop_depth--;
- DUMP2("eventloop %lx : back from recursive call", current_evloop);
+ DUMP2("eventloop %"PRIxVALUE" : back from recursive call", current_evloop);
break;
}
@@ -2651,7 +2651,7 @@ lib_eventloop_ensure(args)
}
if (RTEST(rb_thread_alive_p(eventloop_thread))) {
- DUMP2("eventloop-enshure: wake up parent %lx", eventloop_thread);
+ DUMP2("eventloop-enshure: wake up parent %"PRIxVALUE, eventloop_thread);
rb_thread_wakeup(eventloop_thread);
break;
@@ -2669,7 +2669,7 @@ lib_eventloop_ensure(args)
xfree(ptr);
/* ckfree((char*)ptr);*/
- DUMP2("finish current eventloop %lx", current_evloop);
+ DUMP2("finish current eventloop %"PRIxVALUE, current_evloop);
return Qnil;
}
@@ -2692,14 +2692,14 @@ lib_eventloop_launcher(check_root, update_flag, check_var, interp)
#endif
if (parent_evloop == eventloop_thread) {
- DUMP2("eventloop: recursive call on %lx", parent_evloop);
+ DUMP2("eventloop: recursive call on %"PRIxVALUE, parent_evloop);
rbtk_eventloop_depth++;
}
if (!NIL_P(parent_evloop) && parent_evloop != eventloop_thread) {
- DUMP2("wait for stop of parent_evloop %lx", parent_evloop);
+ DUMP2("wait for stop of parent_evloop %"PRIxVALUE, parent_evloop);
while(!RTEST(rb_funcall(parent_evloop, ID_stop_p, 0))) {
- DUMP2("parent_evloop %lx doesn't stop", parent_evloop);
+ DUMP2("parent_evloop %"PRIxVALUE" doesn't stop", parent_evloop);
rb_thread_run(parent_evloop);
}
DUMP1("succeed to stop parent");
@@ -2707,7 +2707,7 @@ lib_eventloop_launcher(check_root, update_flag, check_var, interp)
rb_ary_push(eventloop_stack, parent_evloop);
- DUMP3("tcltklib: eventloop-thread : %lx -> %lx\n",
+ DUMP3("tcltklib: eventloop-thread : %"PRIxVALUE" -> %"PRIxVALUE"\n",
parent_evloop, eventloop_thread);
args->check_root = check_root;
@@ -2813,11 +2813,11 @@ lib_watchdog_core(check_rootwidget)
if (NIL_P(eventloop_thread)
|| (loop_counter == prev_val && chance >= EVLOOP_WAKEUP_CHANCE)) {
/* start new eventloop thread */
- DUMP2("eventloop thread %lx is sleeping or dead",
+ DUMP2("eventloop thread %"PRIxVALUE" is sleeping or dead",
eventloop_thread);
evloop = rb_thread_create(watchdog_evloop_launcher,
(void*)&check_rootwidget);
- DUMP2("create new eventloop thread %lx", evloop);
+ DUMP2("create new eventloop thread %"PRIxVALUE, evloop);
loop_counter = -1;
chance = 0;
rb_thread_run(evloop);
@@ -3110,7 +3110,7 @@ ip_set_exc_message(interp, exc)
}
if (NIL_P(enc)) {
encoding = (Tcl_Encoding)NULL;
- } else if (TYPE(enc) == T_STRING) {
+ } else if (RB_TYPE_P(enc, T_STRING)) {
/* encoding = Tcl_GetEncoding(interp, RSTRING_PTR(enc)); */
encoding = Tcl_GetEncoding((Tcl_Interp*)NULL, RSTRING_PTR(enc));
} else {
@@ -3320,7 +3320,7 @@ tcl_protect_core(interp, proc, data) /* should not raise exception */
if (rb_obj_is_kind_of(exc, eLocalJumpError)) {
VALUE reason = rb_ivar_get(exc, ID_at_reason);
- if (TYPE(reason) == T_SYMBOL) {
+ if (RB_TYPE_P(reason, T_SYMBOL)) {
if (SYM2ID(reason) == ID_return)
return TCL_RETURN;
@@ -3473,7 +3473,7 @@ ip_ruby_cmd_core(arg)
thr_crit_bup = rb_thread_critical;
rb_thread_critical = Qfalse;
ret = rb_apply(arg->receiver, arg->method, arg->args);
- DUMP2("rb_apply return:%lx", ret);
+ DUMP2("rb_apply return:%"PRIxVALUE, ret);
rb_thread_critical = thr_crit_bup;
DUMP1("finish ip_ruby_cmd_core");
@@ -3783,7 +3783,7 @@ ip_RubyExitCommand(clientData, interp, argc, argv)
#endif
if (argc < 1 || argc > 2) {
- /* arguemnt error */
+ /* argument error */
Tcl_AppendResult(interp,
"wrong number of arguments: should be \"",
cmd, " ?returnCode?\"", (char *)NULL);
@@ -5087,8 +5087,8 @@ ip_rb_threadTkWaitCommand(clientData, interp, objc, objv)
if (rb_thread_alone() || eventloop_thread == current_thread) {
#if TCL_MAJOR_VERSION >= 8
DUMP1("call ip_rbTkWaitObjCmd");
- DUMP2("eventloop_thread %lx", eventloop_thread);
- DUMP2("current_thread %lx", current_thread);
+ DUMP2("eventloop_thread %"PRIxVALUE, eventloop_thread);
+ DUMP2("current_thread %"PRIxVALUE, current_thread);
return ip_rbTkWaitObjCmd(clientData, interp, objc, objv);
#else /* TCL_MAJOR_VERSION < 8 */
DUMP1("call rb_VwaitCommand");
@@ -5805,7 +5805,7 @@ ip_free(ptr)
{
int thr_crit_bup;
- DUMP2("free Tcl Interp %lx", (unsigned long)ptr->ip);
+ DUMP2("free Tcl Interp %p", ptr->ip);
if (ptr) {
thr_crit_bup = rb_thread_critical;
rb_thread_critical = Qtrue;
@@ -5814,10 +5814,10 @@ ip_free(ptr)
&& !Tcl_InterpDeleted(ptr->ip)
&& Tcl_GetMaster(ptr->ip) != (Tcl_Interp*)NULL
&& !Tcl_InterpDeleted(Tcl_GetMaster(ptr->ip)) ) {
- DUMP2("parent IP(%lx) is not deleted",
- (unsigned long)Tcl_GetMaster(ptr->ip));
- DUMP2("slave IP(%lx) should not be deleted",
- (unsigned long)ptr->ip);
+ DUMP2("parent IP(%p) is not deleted",
+ Tcl_GetMaster(ptr->ip));
+ DUMP2("slave IP(%p) should not be deleted",
+ ptr->ip);
xfree(ptr);
/* ckfree((char*)ptr); */
rb_thread_critical = thr_crit_bup;
@@ -6245,7 +6245,7 @@ ip_init(argc, argv, self)
/* FIX ME (2010/06/28) */
/* Don't use ::chan command for Mk4tcl + tclvfs-1.4 on Tcl8.5. */
/* It fails to access VFS files because of vfs::zstream. */
- /* So, force to use ::rechan by temporaly hiding ::chan. */
+ /* So, force to use ::rechan by temporarily hiding ::chan. */
/*************************************************************************/
Tcl_Eval(ptr->ip, "catch {rename ::chan ::_tmp_chan}");
if (Tcl_Init(ptr->ip) == TCL_ERROR) {
@@ -6627,7 +6627,7 @@ ip_make_safe_core(interp, argc, argv)
if (Tcl_MakeSafe(ptr->ip) == TCL_ERROR) {
/* return rb_exc_new2(rb_eRuntimeError,
Tcl_GetStringResult(ptr->ip)); */
- return create_ip_exc(interp, rb_eRuntimeError,
+ return create_ip_exc(interp, rb_eRuntimeError, "%s",
Tcl_GetStringResult(ptr->ip));
}
@@ -6981,8 +6981,8 @@ call_queue_handler(evPtr, flags)
struct tcltkip *ptr;
DUMP2("do_call_queue_handler : evPtr = %p", evPtr);
- DUMP2("call_queue_handler thread : %lx", rb_thread_current());
- DUMP2("added by thread : %lx", thread);
+ DUMP2("call_queue_handler thread : %"PRIxVALUE, rb_thread_current());
+ DUMP2("added by thread : %"PRIxVALUE, thread);
if (*(q->done)) {
DUMP1("processed by another event-loop");
@@ -7019,8 +7019,8 @@ call_queue_handler(evPtr, flags)
rb_gc_force_recycle(q_dat);
q_dat = (VALUE)NULL;
} else {
- DUMP2("call function (for caller thread:%lx)", thread);
- DUMP2("call function (current thread:%lx)", rb_thread_current());
+ DUMP2("call function (for caller thread:%"PRIxVALUE")", thread);
+ DUMP2("call function (current thread:%"PRIxVALUE")", rb_thread_current());
ret = (q->func)(q->interp, q->argc, q->argv);
}
@@ -7042,8 +7042,8 @@ call_queue_handler(evPtr, flags)
/* back to caller */
if (RTEST(rb_thread_alive_p(thread))) {
- DUMP2("back to caller (caller thread:%lx)", thread);
- DUMP2(" (current thread:%lx)", rb_thread_current());
+ DUMP2("back to caller (caller thread:%"PRIxVALUE")", thread);
+ DUMP2(" (current thread:%"PRIxVALUE")", rb_thread_current());
#if CONTROL_BY_STATUS_OF_RB_THREAD_WAITING_FOR_VALUE
have_rb_thread_waiting_for_value = 1;
rb_thread_wakeup(thread);
@@ -7055,8 +7055,8 @@ call_queue_handler(evPtr, flags)
rb_thread_schedule();
#endif
} else {
- DUMP2("caller is dead (caller thread:%lx)", thread);
- DUMP2(" (current thread:%lx)", rb_thread_current());
+ DUMP2("caller is dead (caller thread:%"PRIxVALUE")", thread);
+ DUMP2(" (current thread:%"PRIxVALUE")", rb_thread_current());
}
/* end of handler : remove it */
@@ -7106,9 +7106,9 @@ tk_funcall(func, argc, argv, obj)
&& (NIL_P(eventloop_thread) || current == eventloop_thread)
) {
if (NIL_P(eventloop_thread)) {
- DUMP2("tk_funcall from thread:%lx but no eventloop", current);
+ DUMP2("tk_funcall from thread:%"PRIxVALUE" but no eventloop", current);
} else {
- DUMP2("tk_funcall from current eventloop %lx", current);
+ DUMP2("tk_funcall from current eventloop %"PRIxVALUE, current);
}
result = (func)(ip_obj, argc, argv);
if (rb_obj_is_kind_of(result, rb_eException)) {
@@ -7117,7 +7117,7 @@ tk_funcall(func, argc, argv, obj)
return result;
}
- DUMP2("tk_funcall from thread %lx (NOT current eventloop)", current);
+ DUMP2("tk_funcall from thread %"PRIxVALUE" (NOT current eventloop)", current);
thr_crit_bup = rb_thread_critical;
rb_thread_critical = Qtrue;
@@ -7192,20 +7192,20 @@ tk_funcall(func, argc, argv, obj)
t.tv_sec = 0;
t.tv_usec = (long)((EVENT_HANDLER_TIMEOUT)*1000.0);
- DUMP2("callq wait for handler (current thread:%lx)", current);
+ DUMP2("callq wait for handler (current thread:%"PRIxVALUE")", current);
while(*alloc_done >= 0) {
- DUMP2("*** callq wait for handler (current thread:%lx)", current);
+ DUMP2("*** callq wait for handler (current thread:%"PRIxVALUE")", current);
/* rb_thread_stop(); */
/* rb_thread_sleep_forever(); */
rb_thread_wait_for(t);
- DUMP2("*** callq wakeup (current thread:%lx)", current);
- DUMP2("*** (eventloop thread:%lx)", eventloop_thread);
+ DUMP2("*** callq wakeup (current thread:%"PRIxVALUE")", current);
+ DUMP2("*** (eventloop thread:%"PRIxVALUE")", eventloop_thread);
if (NIL_P(eventloop_thread)) {
DUMP1("*** callq lost eventloop thread");
break;
}
}
- DUMP2("back from handler (current thread:%lx)", current);
+ DUMP2("back from handler (current thread:%"PRIxVALUE")", current);
/* get result & free allocated memory */
ret = RARRAY_PTR(result)[0];
@@ -7468,8 +7468,8 @@ eval_queue_handler(evPtr, flags)
struct tcltkip *ptr;
DUMP2("do_eval_queue_handler : evPtr = %p", evPtr);
- DUMP2("eval_queue_thread : %lx", rb_thread_current());
- DUMP2("added by thread : %lx", thread);
+ DUMP2("eval_queue_thread : %"PRIxVALUE, rb_thread_current());
+ DUMP2("added by thread : %"PRIxVALUE, thread);
if (*(q->done)) {
DUMP1("processed by another event-loop");
@@ -7533,8 +7533,8 @@ eval_queue_handler(evPtr, flags)
/* back to caller */
if (RTEST(rb_thread_alive_p(thread))) {
- DUMP2("back to caller (caller thread:%lx)", thread);
- DUMP2(" (current thread:%lx)", rb_thread_current());
+ DUMP2("back to caller (caller thread:%"PRIxVALUE")", thread);
+ DUMP2(" (current thread:%"PRIxVALUE")", rb_thread_current());
#if CONTROL_BY_STATUS_OF_RB_THREAD_WAITING_FOR_VALUE
have_rb_thread_waiting_for_value = 1;
rb_thread_wakeup(thread);
@@ -7546,8 +7546,8 @@ eval_queue_handler(evPtr, flags)
rb_thread_schedule();
#endif
} else {
- DUMP2("caller is dead (caller thread:%lx)", thread);
- DUMP2(" (current thread:%lx)", rb_thread_current());
+ DUMP2("caller is dead (caller thread:%"PRIxVALUE")", thread);
+ DUMP2(" (current thread:%"PRIxVALUE")", rb_thread_current());
}
/* end of handler : remove it */
@@ -7585,7 +7585,7 @@ ip_eval(self, str)
#else
DUMP2("status: Tcl_GetCurrentThread %p", Tcl_GetCurrentThread());
#endif
- DUMP2("status: eventloopt_thread %lx", eventloop_thread);
+ DUMP2("status: eventloopt_thread %"PRIxVALUE, eventloop_thread);
if (
#ifdef RUBY_USE_NATIVE_THREAD
@@ -7595,9 +7595,9 @@ ip_eval(self, str)
(NIL_P(eventloop_thread) || current == eventloop_thread)
) {
if (NIL_P(eventloop_thread)) {
- DUMP2("eval from thread:%lx but no eventloop", current);
+ DUMP2("eval from thread:%"PRIxVALUE" but no eventloop", current);
} else {
- DUMP2("eval from current eventloop %lx", current);
+ DUMP2("eval from current eventloop %"PRIxVALUE, current);
}
result = ip_eval_real(self, RSTRING_PTR(str), RSTRING_LENINT(str));
if (rb_obj_is_kind_of(result, rb_eException)) {
@@ -7606,7 +7606,7 @@ ip_eval(self, str)
return result;
}
- DUMP2("eval from thread %lx (NOT current eventloop)", current);
+ DUMP2("eval from thread %"PRIxVALUE" (NOT current eventloop)", current);
thr_crit_bup = rb_thread_critical;
rb_thread_critical = Qtrue;
@@ -7676,20 +7676,20 @@ ip_eval(self, str)
t.tv_sec = 0;
t.tv_usec = (long)((EVENT_HANDLER_TIMEOUT)*1000.0);
- DUMP2("evq wait for handler (current thread:%lx)", current);
+ DUMP2("evq wait for handler (current thread:%"PRIxVALUE")", current);
while(*alloc_done >= 0) {
- DUMP2("*** evq wait for handler (current thread:%lx)", current);
+ DUMP2("*** evq wait for handler (current thread:%"PRIxVALUE")", current);
/* rb_thread_stop(); */
/* rb_thread_sleep_forever(); */
rb_thread_wait_for(t);
- DUMP2("*** evq wakeup (current thread:%lx)", current);
- DUMP2("*** (eventloop thread:%lx)", eventloop_thread);
+ DUMP2("*** evq wakeup (current thread:%"PRIxVALUE")", current);
+ DUMP2("*** (eventloop thread:%"PRIxVALUE")", eventloop_thread);
if (NIL_P(eventloop_thread)) {
DUMP1("*** evq lost eventloop thread");
break;
}
}
- DUMP2("back from handler (current thread:%lx)", current);
+ DUMP2("back from handler (current thread:%"PRIxVALUE")", current);
/* get result & free allocated memory */
ret = RARRAY_PTR(result)[0];
@@ -7949,7 +7949,7 @@ lib_toUTF8_core(ip_obj, src, encodename)
rb_thread_critical = Qtrue;
if (NIL_P(encodename)) {
- if (TYPE(str) == T_STRING) {
+ if (RB_TYPE_P(str, T_STRING)) {
volatile VALUE enc;
#ifdef HAVE_RUBY_ENCODING_H
@@ -8127,7 +8127,7 @@ lib_fromUTF8_core(ip_obj, src, encodename)
if (NIL_P(encodename)) {
volatile VALUE enc;
- if (TYPE(str) == T_STRING) {
+ if (RB_TYPE_P(str, T_STRING)) {
enc = rb_attr_get(str, ID_at_enc);
if (!NIL_P(enc)) {
StringValue(enc);
@@ -8904,7 +8904,7 @@ ip_invoke_real(argc, argv, interp)
char **av = (char **)NULL;
#endif
- DUMP2("invoke_real called by thread:%lx", rb_thread_current());
+ DUMP2("invoke_real called by thread:%"PRIxVALUE, rb_thread_current());
/* get the data struct */
ptr = get_ip(interp);
@@ -8953,8 +8953,8 @@ invoke_queue_handler(evPtr, flags)
struct tcltkip *ptr;
DUMP2("do_invoke_queue_handler : evPtr = %p", evPtr);
- DUMP2("invoke queue_thread : %lx", rb_thread_current());
- DUMP2("added by thread : %lx", thread);
+ DUMP2("invoke queue_thread : %"PRIxVALUE, rb_thread_current());
+ DUMP2("added by thread : %"PRIxVALUE, thread);
if (*(q->done)) {
DUMP1("processed by another event-loop");
@@ -8991,8 +8991,8 @@ invoke_queue_handler(evPtr, flags)
rb_gc_force_recycle(q_dat);
q_dat = (VALUE)NULL;
} else {
- DUMP2("call invoke_real (for caller thread:%lx)", thread);
- DUMP2("call invoke_real (current thread:%lx)", rb_thread_current());
+ DUMP2("call invoke_real (for caller thread:%"PRIxVALUE")", thread);
+ DUMP2("call invoke_real (current thread:%"PRIxVALUE")", rb_thread_current());
ret = ip_invoke_core(q->interp, q->argc, q->argv);
}
@@ -9013,8 +9013,8 @@ invoke_queue_handler(evPtr, flags)
/* back to caller */
if (RTEST(rb_thread_alive_p(thread))) {
- DUMP2("back to caller (caller thread:%lx)", thread);
- DUMP2(" (current thread:%lx)", rb_thread_current());
+ DUMP2("back to caller (caller thread:%"PRIxVALUE")", thread);
+ DUMP2(" (current thread:%"PRIxVALUE")", rb_thread_current());
#if CONTROL_BY_STATUS_OF_RB_THREAD_WAITING_FOR_VALUE
have_rb_thread_waiting_for_value = 1;
rb_thread_wakeup(thread);
@@ -9026,8 +9026,8 @@ invoke_queue_handler(evPtr, flags)
rb_thread_schedule();
#endif
} else {
- DUMP2("caller is dead (caller thread:%lx)", thread);
- DUMP2(" (current thread:%lx)", rb_thread_current());
+ DUMP2("caller is dead (caller thread:%"PRIxVALUE")", thread);
+ DUMP2(" (current thread:%"PRIxVALUE")", rb_thread_current());
}
/* end of handler : remove it */
@@ -9070,7 +9070,7 @@ ip_invoke_with_position(argc, argv, obj, position)
#else
DUMP2("status: Tcl_GetCurrentThread %p", Tcl_GetCurrentThread());
#endif
- DUMP2("status: eventloopt_thread %lx", eventloop_thread);
+ DUMP2("status: eventloopt_thread %"PRIxVALUE, eventloop_thread);
if (
#ifdef RUBY_USE_NATIVE_THREAD
@@ -9080,9 +9080,9 @@ ip_invoke_with_position(argc, argv, obj, position)
(NIL_P(eventloop_thread) || current == eventloop_thread)
) {
if (NIL_P(eventloop_thread)) {
- DUMP2("invoke from thread:%lx but no eventloop", current);
+ DUMP2("invoke from thread:%"PRIxVALUE" but no eventloop", current);
} else {
- DUMP2("invoke from current eventloop %lx", current);
+ DUMP2("invoke from current eventloop %"PRIxVALUE, current);
}
result = ip_invoke_real(argc, argv, ip_obj);
if (rb_obj_is_kind_of(result, rb_eException)) {
@@ -9091,7 +9091,7 @@ ip_invoke_with_position(argc, argv, obj, position)
return result;
}
- DUMP2("invoke from thread %lx (NOT current eventloop)", current);
+ DUMP2("invoke from thread %"PRIxVALUE" (NOT current eventloop)", current);
thr_crit_bup = rb_thread_critical;
rb_thread_critical = Qtrue;
@@ -9155,19 +9155,19 @@ ip_invoke_with_position(argc, argv, obj, position)
t.tv_sec = 0;
t.tv_usec = (long)((EVENT_HANDLER_TIMEOUT)*1000.0);
- DUMP2("ivq wait for handler (current thread:%lx)", current);
+ DUMP2("ivq wait for handler (current thread:%"PRIxVALUE")", current);
while(*alloc_done >= 0) {
/* rb_thread_stop(); */
/* rb_thread_sleep_forever(); */
rb_thread_wait_for(t);
- DUMP2("*** ivq wakeup (current thread:%lx)", current);
- DUMP2("*** (eventloop thread:%lx)", eventloop_thread);
+ DUMP2("*** ivq wakeup (current thread:%"PRIxVALUE")", current);
+ DUMP2("*** (eventloop thread:%"PRIxVALUE")", eventloop_thread);
if (NIL_P(eventloop_thread)) {
DUMP1("*** ivq lost eventloop thread");
break;
}
}
- DUMP2("back from handler (current thread:%lx)", current);
+ DUMP2("back from handler (current thread:%"PRIxVALUE")", current);
/* get result & free allocated memory */
ret = RARRAY_PTR(result)[0];
@@ -9292,7 +9292,7 @@ ip_get_variable2_core(interp, argc, argv)
volatile VALUE exc;
/* exc = rb_exc_new2(rb_eRuntimeError,
Tcl_GetStringResult(ptr->ip)); */
- exc = create_ip_exc(interp, rb_eRuntimeError,
+ exc = create_ip_exc(interp, rb_eRuntimeError, "%s",
Tcl_GetStringResult(ptr->ip));
/* Tcl_Release(ptr->ip); */
rbtk_release_ip(ptr);
@@ -9431,7 +9431,7 @@ ip_set_variable2_core(interp, argc, argv)
volatile VALUE exc;
/* exc = rb_exc_new2(rb_eRuntimeError,
Tcl_GetStringResult(ptr->ip)); */
- exc = create_ip_exc(interp, rb_eRuntimeError,
+ exc = create_ip_exc(interp, rb_eRuntimeError, "%s",
Tcl_GetStringResult(ptr->ip));
/* Tcl_Release(ptr->ip); */
rbtk_release_ip(ptr);
@@ -9551,7 +9551,7 @@ ip_unset_variable2_core(interp, argc, argv)
if (FIX2INT(flag) & TCL_LEAVE_ERR_MSG) {
/* return rb_exc_new2(rb_eRuntimeError,
Tcl_GetStringResult(ptr->ip)); */
- return create_ip_exc(interp, rb_eRuntimeError,
+ return create_ip_exc(interp, rb_eRuntimeError, "%s",
Tcl_GetStringResult(ptr->ip));
}
return Qfalse;
@@ -11013,7 +11013,7 @@ Init_tcltklib()
/* --------------------------------------------------------------- */
#ifdef HAVE_NATIVETHREAD
- /* if ruby->nativethread-supprt and tcltklib->doen't,
+ /* if ruby->nativethread-support and tcltklib->doesn't,
the following will cause link-error. */
ruby_native_thread_p();
#endif
diff --git a/ext/tk/tkutil/extconf.rb b/ext/tk/tkutil/extconf.rb
index 57de973c0a..9ffde75657 100644
--- a/ext/tk/tkutil/extconf.rb
+++ b/ext/tk/tkutil/extconf.rb
@@ -1,11 +1,4 @@
begin
- has_tk = compiled?('tk')
-rescue NoMethodError
- # Probably, called manually (NOT from 'extmk.rb'). Force to make Makefile.
- has_tk = true
-end
-
-if has_tk
require 'mkmf'
have_func("rb_obj_instance_exec", "ruby.h")
diff --git a/ext/tk/tkutil/tkutil.c b/ext/tk/tkutil/tkutil.c
index fd8972645a..cb387c5bd4 100644
--- a/ext/tk/tkutil/tkutil.c
+++ b/ext/tk/tkutil/tkutil.c
@@ -312,7 +312,7 @@ ary2list(ary, enc_flag, self)
if (NIL_P(enc_flag)) {
dst_enc = sys_enc;
req_chk_flag = 1;
- } else if (TYPE(enc_flag) == T_TRUE || TYPE(enc_flag) == T_FALSE) {
+ } else if (enc_flag == Qtrue || enc_flag == Qfalse) {
dst_enc = enc_flag;
req_chk_flag = 0;
} else {
@@ -323,7 +323,7 @@ ary2list(ary, enc_flag, self)
/* size = RARRAY_LEN(ary); */
size = 0;
for(idx = 0; idx < RARRAY_LEN(ary); idx++) {
- if (TYPE(RARRAY_PTR(ary)[idx]) == T_HASH) {
+ if (RB_TYPE_P(RARRAY_PTR(ary)[idx], T_HASH)) {
size += 2 * RHASH_SIZE(RARRAY_PTR(ary)[idx]);
} else {
size++;
@@ -433,7 +433,7 @@ ary2list(ary, enc_flag, self)
RARRAY_PTR(dst)[idx] = str_val;
}
val = rb_apply(cTclTkLib, ID_merge_tklist, dst);
- if (TYPE(dst_enc) == T_STRING) {
+ if (RB_TYPE_P(dst_enc, T_STRING)) {
val = rb_funcall(cTclTkLib, ID_fromUTF8, 2, val, dst_enc);
rb_ivar_set(val, ID_at_enc, dst_enc);
} else {
@@ -466,7 +466,7 @@ ary2list2(ary, enc_flag, self)
if (NIL_P(enc_flag)) {
dst_enc = sys_enc;
req_chk_flag = 1;
- } else if (TYPE(enc_flag) == T_TRUE || TYPE(enc_flag) == T_FALSE) {
+ } else if (enc_flag == Qtrue || enc_flag == Qfalse) {
dst_enc = enc_flag;
req_chk_flag = 0;
} else {
@@ -527,7 +527,7 @@ ary2list2(ary, enc_flag, self)
RARRAY_PTR(dst)[idx] = str_val;
}
val = rb_apply(cTclTkLib, ID_merge_tklist, dst);
- if (TYPE(dst_enc) == T_STRING) {
+ if (RB_TYPE_P(dst_enc, T_STRING)) {
val = rb_funcall(cTclTkLib, ID_fromUTF8, 2, val, dst_enc);
rb_ivar_set(val, ID_at_enc, dst_enc);
} else {
@@ -561,7 +561,7 @@ assoc2kv(assoc, ary, self)
for(i = 0; i < len; i++) {
pair = RARRAY_PTR(assoc)[i];
- if (TYPE(pair) != T_ARRAY) {
+ if (!RB_TYPE_P(pair, T_ARRAY)) {
rb_ary_push(dst, key2keyname(pair));
continue;
}
@@ -609,7 +609,7 @@ assoc2kv_enc(assoc, ary, self)
for(i = 0; i < len; i++) {
pair = RARRAY_PTR(assoc)[i];
- if (TYPE(pair) != T_ARRAY) {
+ if (!RB_TYPE_P(pair, T_ARRAY)) {
rb_ary_push(dst, key2keyname(pair));
continue;
}
@@ -831,15 +831,15 @@ get_eval_string_core(obj, enc_flag, self)
if (RTEST(enc_flag)) {
if (rb_obj_respond_to(self, ID_toUTF8, Qtrue)) {
return rb_funcall(self, ID_toUTF8, 1,
- rb_str_new2(rb_id2name(SYM2ID(obj))));
+ rb_str_dup(rb_sym2str(obj)));
} else {
- return fromDefaultEnc_toUTF8(rb_str_new2(rb_id2name(SYM2ID(obj))), self);
+ return fromDefaultEnc_toUTF8(rb_sym2str(obj), self);
}
} else {
#ifdef HAVE_RB_SYM_TO_S
return rb_sym_to_s(obj);
#else
- return rb_str_new2(rb_id2name(SYM2ID(obj)));
+ return rb_sym2str(obj);
#endif
}
@@ -950,7 +950,7 @@ tk_conv_args(argc, argv, self)
old_gc = rb_gc_disable();
for(size = 0, idx = 2; idx < argc; idx++) {
- if (TYPE(argv[idx]) == T_HASH) {
+ if (RB_TYPE_P(argv[idx], T_HASH)) {
size += 2 * RHASH_SIZE(argv[idx]);
} else {
size++;
@@ -959,7 +959,7 @@ tk_conv_args(argc, argv, self)
/* dst = rb_ary_new2(argc - 2); */
dst = rb_ary_new2(size);
for(idx = 2; idx < argc; idx++) {
- if (TYPE(argv[idx]) == T_HASH) {
+ if (RB_TYPE_P(argv[idx], T_HASH)) {
if (RTEST(argv[1])) {
hash2kv_enc(argv[idx], dst, self);
} else {
@@ -984,7 +984,7 @@ tcl2rb_bool(self, value)
VALUE self;
VALUE value;
{
- if (TYPE(value) == T_FIXNUM) {
+ if (RB_TYPE_P(value, T_FIXNUM)) {
if (NUM2INT(value) == 0) {
return Qfalse;
} else {
@@ -992,7 +992,7 @@ tcl2rb_bool(self, value)
}
}
- if (TYPE(value) == T_TRUE || TYPE(value) == T_FALSE) {
+ if (value == Qtrue || value == Qfalse) {
return value;
}
@@ -1281,7 +1281,7 @@ cbsubst_def_attr_aliases(self, tbl)
{
struct cbsubst_info *inf;
- if (TYPE(tbl) != T_HASH) {
+ if (!RB_TYPE_P(tbl, T_HASH)) {
rb_raise(rb_eArgError, "expected a Hash");
}
@@ -1306,15 +1306,15 @@ cbsubst_sym_to_subst(self, sym)
ID id;
volatile VALUE ret;
- if (TYPE(sym) != T_SYMBOL) return sym;
+ if (!RB_TYPE_P(sym, T_SYMBOL)) return sym;
Data_Get_Struct(rb_const_get(self, ID_SUBST_INFO),
struct cbsubst_info, inf);
if (!NIL_P(ret = rb_hash_aref(inf->aliases, sym))) {
- str = rb_id2str(SYM2ID(ret));
+ str = rb_sym2str(ret);
} else {
- str = rb_id2str(SYM2ID(sym));
+ str = rb_sym2str(sym);
}
id = rb_intern_str(rb_sprintf("@%"PRIsVALUE, str));
@@ -1370,26 +1370,30 @@ cbsubst_get_subst_arg(argc, argv, self)
switch(TYPE(argv[i])) {
case T_STRING:
str = argv[i];
- arg_sym = ID2SYM(rb_intern_str(argv[i]));
+ arg_sym = rb_check_symbol(&str);
+ if (NIL_P(arg_sym)) goto not_found;
break;
case T_SYMBOL:
arg_sym = argv[i];
- str = rb_id2str(SYM2ID(arg_sym));
+ str = rb_sym2str(arg_sym);
break;
default:
rb_raise(rb_eArgError, "arg #%d is not a String or a Symbol", i);
}
if (!NIL_P(ret = rb_hash_aref(inf->aliases, arg_sym))) {
- str = rb_id2str(SYM2ID(ret));
+ str = rb_sym2str(ret);
}
- id = rb_intern_str(rb_sprintf("@%"PRIsVALUE, str));
+ ret = rb_sprintf("@%"PRIsVALUE, str);
+ id = rb_check_id(&ret);
+ if (!id) goto not_found;
for(idx = 0; idx < CBSUBST_TBL_MAX; idx++) {
if (inf->ivar[idx] == id) break;
}
if (idx >= CBSUBST_TBL_MAX) {
+ not_found:
rb_raise(rb_eArgError, "cannot find attribute :%"PRIsVALUE, str);
}
@@ -1556,14 +1560,14 @@ cbsubst_table_setup(argc, argv, self)
len = RARRAY_LEN(key_inf);
for(idx = 0; idx < len; idx++) {
inf = RARRAY_PTR(key_inf)[idx];
- if (TYPE(inf) != T_ARRAY) continue;
+ if (!RB_TYPE_P(inf, T_ARRAY)) continue;
- if (TYPE(RARRAY_PTR(inf)[0]) == T_STRING) {
+ if (RB_TYPE_P(RARRAY_PTR(inf)[0], T_STRING)) {
chr = *(RSTRING_PTR(RARRAY_PTR(inf)[0]));
} else {
chr = NUM2CHR(RARRAY_PTR(inf)[0]);
}
- if (TYPE(RARRAY_PTR(inf)[1]) == T_STRING) {
+ if (RB_TYPE_P(RARRAY_PTR(inf)[1], T_STRING)) {
subst_inf->type[chr] = *(RSTRING_PTR(RARRAY_PTR(inf)[1]));
} else {
subst_inf->type[chr] = NUM2CHR(RARRAY_PTR(inf)[1]);
@@ -1587,7 +1591,7 @@ cbsubst_table_setup(argc, argv, self)
len = RARRAY_LEN(longkey_inf);
for(idx = 0; idx < len; idx++) {
inf = RARRAY_PTR(longkey_inf)[idx];
- if (TYPE(inf) != T_ARRAY) continue;
+ if (!RB_TYPE_P(inf, T_ARRAY)) continue;
chr = (unsigned char)(0x80 + idx);
subst_inf->keylen[chr] = RSTRING_LEN(RARRAY_PTR(inf)[0]);
@@ -1602,7 +1606,7 @@ cbsubst_table_setup(argc, argv, self)
subst_inf->key[chr][RSTRING_LEN(RARRAY_PTR(inf)[0])] = '\0';
}
#endif
- if (TYPE(RARRAY_PTR(inf)[1]) == T_STRING) {
+ if (RB_TYPE_P(RARRAY_PTR(inf)[1], T_STRING)) {
subst_inf->type[chr] = *(RSTRING_PTR(RARRAY_PTR(inf)[1]));
} else {
subst_inf->type[chr] = NUM2CHR(RARRAY_PTR(inf)[1]);
@@ -1624,9 +1628,9 @@ cbsubst_table_setup(argc, argv, self)
len = RARRAY_LEN(proc_inf);
for(idx = 0; idx < len; idx++) {
inf = RARRAY_PTR(proc_inf)[idx];
- if (TYPE(inf) != T_ARRAY) continue;
+ if (!RB_TYPE_P(inf, T_ARRAY)) continue;
rb_hash_aset(subst_inf->proc,
- ((TYPE(RARRAY_PTR(inf)[0]) == T_STRING)?
+ (RB_TYPE_P(RARRAY_PTR(inf)[0], T_STRING)?
INT2FIX(*(RSTRING_PTR(RARRAY_PTR(inf)[0]))) :
RARRAY_PTR(inf)[0]),
RARRAY_PTR(inf)[1]);
diff --git a/ext/win32ole/depend b/ext/win32ole/depend
index 3b1d7e9a97..c8445ad5fa 100644
--- a/ext/win32ole/depend
+++ b/ext/win32ole/depend
@@ -1 +1,12 @@
-win32ole.o : win32ole.c $(hdrdir)/ruby.h $(hdrdir)/config.h $(hdrdir)/defines.h
+WIN32OLE_HEADERS = $(HDRS) $(ruby_headers)
+win32ole.o : win32ole.c $(WIN32OLE_HEADERS)
+win32ole_variant_m.o : win32ole_variant_m.c $(WIN32OLE_HEADERS)
+win32ole_typelib.o : win32ole_typelib.c $(WIN32OLE_HEADERS)
+win32ole_type.o : win32ole_type.c $(WIN32OLE_HEADERS)
+win32ole_variable.o : win32ole_variable.c $(WIN32OLE_HEADERS)
+win32ole_method.o : win32ole_method.c $(WIN32OLE_HEADERS)
+win32ole_param.o : win32ole_param.c $(WIN32OLE_HEADERS)
+win32ole_variant.o : win32ole_variant.c $(WIN32OLE_HEADERS)
+win32ole_event.o : win32ole_event.c $(WIN32OLE_HEADERS)
+win32ole_record.o : win32ole_record.c $(WIN32OLE_HEADERS)
+win32ole_error.o : win32ole_error.c $(WIN32OLE_HEADERS)
diff --git a/ext/win32ole/sample/excel2.rb b/ext/win32ole/sample/excel2.rb
index dbe4178051..95af61ceb6 100644
--- a/ext/win32ole/sample/excel2.rb
+++ b/ext/win32ole/sample/excel2.rb
@@ -4,11 +4,9 @@ require 'win32ole'
ChartTypeVal = -4100;
# Creates OLE object to Excel
-#excel = WIN32OLE.new("excel.application.5")
excel = WIN32OLE.new("excel.application")
# Create and rotate the chart
-
excel.visible = TRUE;
excel.Workbooks.Add();
excel.Range("a1").value = 3;
@@ -18,13 +16,12 @@ excel.Range("a1:a3").Select();
excelchart = excel.Charts.Add();
excelchart.type = ChartTypeVal;
-i = 30
+i = 0
i.step(180, 10) do |rot|
-# excelchart['Rotation'] = rot;
excelchart.rotation=rot;
+ sleep 0.1
end
# Done, bye
excel.ActiveWorkbook.Close(0);
excel.Quit();
-
diff --git a/ext/win32ole/win32ole.c b/ext/win32ole/win32ole.c
index 57da91c67a..a99bff2257 100644
--- a/ext/win32ole/win32ole.c
+++ b/ext/win32ole/win32ole.c
@@ -15,87 +15,7 @@
modified for win32ole (ruby) by Masaki.Suketa <masaki.suketa@nifty.ne.jp>
*/
-#include "ruby/ruby.h"
-#include "ruby/st.h"
-#include "ruby/encoding.h"
-
-#define GNUC_OLDER_3_4_4 \
- ((__GNUC__ < 3) || \
- ((__GNUC__ <= 3) && (__GNUC_MINOR__ < 4)) || \
- ((__GNUC__ <= 3) && (__GNUC_MINOR__ <= 4) && (__GNUC_PATCHLEVEL__ <= 4)))
-
-#if (defined(__GNUC__)) && (GNUC_OLDER_3_4_4)
-#ifndef NONAMELESSUNION
-#define NONAMELESSUNION 1
-#endif
-#endif
-
-#include <ctype.h>
-
-#include <windows.h>
-#include <ocidl.h>
-#include <olectl.h>
-#include <ole2.h>
-#if defined(HAVE_TYPE_IMULTILANGUAGE2) || defined(HAVE_TYPE_IMULTILANGUAGE)
-#include <mlang.h>
-#endif
-#include <stdlib.h>
-#include <math.h>
-#ifdef HAVE_STDARG_PROTOTYPES
-#include <stdarg.h>
-#define va_init_list(a,b) va_start(a,b)
-#else
-#include <varargs.h>
-#define va_init_list(a,b) va_start(a)
-#endif
-#include <objidl.h>
-
-#define DOUT fprintf(stderr,"[%d]\n",__LINE__)
-#define DOUTS(x) fprintf(stderr,"[%d]:" #x "=%s\n",__LINE__,x)
-#define DOUTMSG(x) fprintf(stderr, "[%d]:" #x "\n",__LINE__)
-#define DOUTI(x) fprintf(stderr, "[%ld]:" #x "=%d\n",__LINE__,x)
-#define DOUTD(x) fprintf(stderr, "[%d]:" #x "=%f\n",__LINE__,x)
-
-#if (defined(__GNUC__)) && (GNUC_OLDER_3_4_4)
-#define V_UNION1(X, Y) ((X)->u.Y)
-#else
-#define V_UNION1(X, Y) ((X)->Y)
-#endif
-
-#if (defined(__GNUC__)) && (GNUC_OLDER_3_4_4)
-#undef V_UNION
-#define V_UNION(X,Y) ((X)->n1.n2.n3.Y)
-
-#undef V_VT
-#define V_VT(X) ((X)->n1.n2.vt)
-
-#undef V_BOOL
-#define V_BOOL(X) V_UNION(X,boolVal)
-#endif
-
-#ifndef V_I1REF
-#define V_I1REF(X) V_UNION(X, pcVal)
-#endif
-
-#ifndef V_UI2REF
-#define V_UI2REF(X) V_UNION(X, puiVal)
-#endif
-
-#ifndef V_INT
-#define V_INT(X) V_UNION(X, intVal)
-#endif
-
-#ifndef V_INTREF
-#define V_INTREF(X) V_UNION(X, pintVal)
-#endif
-
-#ifndef V_UINT
-#define V_UINT(X) V_UNION(X, uintVal)
-#endif
-
-#ifndef V_UINTREF
-#define V_UINTREF(X) V_UNION(X, puintVal)
-#endif
+#include "win32ole.h"
/*
* unfortunately IID_IMultiLanguage2 is not included in any libXXX.a
@@ -106,44 +26,7 @@
const IID IID_IMultiLanguage2 = {0xDCCFC164, 0x2B38, 0x11d2, {0xB7, 0xEC, 0x00, 0xC0, 0x4F, 0x8F, 0x5D, 0x9A}};
#endif
-#define OLE_RELEASE(X) (X) ? ((X)->lpVtbl->Release(X)) : 0
-
-#define OLE_ADDREF(X) (X) ? ((X)->lpVtbl->AddRef(X)) : 0
-
-#define OLE_GET_TYPEATTR(X, Y) ((X)->lpVtbl->GetTypeAttr((X), (Y)))
-#define OLE_RELEASE_TYPEATTR(X, Y) ((X)->lpVtbl->ReleaseTypeAttr((X), (Y)))
-
-#define OLE_FREE(x) {\
- if(g_ole_initialized == TRUE) {\
- if(x) {\
- OLE_RELEASE(x);\
- (x) = 0;\
- }\
- }\
-}
-
-#define OLEData_Get_Struct(obj, pole) {\
- Data_Get_Struct(obj, struct oledata, pole);\
- if(!pole->pDispatch) {\
- rb_raise(rb_eRuntimeError, "failed to get Dispatch Interface");\
- }\
-}
-
-#ifdef HAVE_LONG_LONG
-#define I8_2_NUM LL2NUM
-#define UI8_2_NUM ULL2NUM
-#define NUM2I8 NUM2LL
-#define NUM2UI8 NUM2ULL
-#else
-#define I8_2_NUM INT2NUM
-#define UI8_2_NUM UINT2NUM
-#define NUM2I8 NUM2INT
-#define NUM2UI8 NUM2UINT
-#endif
-
-#define WC2VSTR(x) ole_wc2vstr((x), TRUE)
-
-#define WIN32OLE_VERSION "1.5.5"
+#define WIN32OLE_VERSION "1.8.2"
typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX)
(REFCLSID, IUnknown*, DWORD, COSERVERINFO*, DWORD, MULTI_QI*);
@@ -151,69 +34,8 @@ typedef HRESULT (STDAPICALLTYPE FNCOCREATEINSTANCEEX)
typedef HWND (WINAPI FNHTMLHELP)(HWND hwndCaller, LPCSTR pszFile,
UINT uCommand, DWORD dwData);
typedef BOOL (FNENUMSYSEMCODEPAGES) (CODEPAGE_ENUMPROC, DWORD);
-typedef struct {
- struct IEventSinkVtbl * lpVtbl;
-} IEventSink, *PEVENTSINK;
-
-typedef struct IEventSinkVtbl IEventSinkVtbl;
-
-struct IEventSinkVtbl {
- STDMETHOD(QueryInterface)(
- PEVENTSINK,
- REFIID,
- LPVOID *);
- STDMETHOD_(ULONG, AddRef)(PEVENTSINK);
- STDMETHOD_(ULONG, Release)(PEVENTSINK);
-
- STDMETHOD(GetTypeInfoCount)(
- PEVENTSINK,
- UINT *);
- STDMETHOD(GetTypeInfo)(
- PEVENTSINK,
- UINT,
- LCID,
- ITypeInfo **);
- STDMETHOD(GetIDsOfNames)(
- PEVENTSINK,
- REFIID,
- OLECHAR **,
- UINT,
- LCID,
- DISPID *);
- STDMETHOD(Invoke)(
- PEVENTSINK,
- DISPID,
- REFIID,
- LCID,
- WORD,
- DISPPARAMS *,
- VARIANT *,
- EXCEPINFO *,
- UINT *);
-};
-
-typedef struct tagIEVENTSINKOBJ {
- IEventSinkVtbl *lpVtbl;
- DWORD m_cRef;
- IID m_iid;
- int m_event_id;
- ITypeInfo *pTypeInfo;
-}IEVENTSINKOBJ, *PIEVENTSINKOBJ;
-
VALUE cWIN32OLE;
-VALUE cWIN32OLE_TYPELIB;
-VALUE cWIN32OLE_TYPE;
-VALUE cWIN32OLE_VARIABLE;
-VALUE cWIN32OLE_METHOD;
-VALUE cWIN32OLE_PARAM;
-VALUE cWIN32OLE_EVENT;
-VALUE cWIN32OLE_VARIANT;
-VALUE eWIN32OLERuntimeError;
-VALUE mWIN32OLE_VARIANT;
-VALUE cWIN32OLE_PROPERTY;
-
-static VALUE ary_ole_event;
-static ID id_events;
+
#if defined(RB_THREAD_SPECIFIC) && (defined(__CYGWIN__) || defined(__MINGW32__))
static RB_THREAD_SPECIFIC BOOL g_ole_initialized;
# define g_ole_initialized_init() ((void)0)
@@ -224,6 +46,7 @@ static volatile DWORD g_ole_initialized_key = TLS_OUT_OF_INDEXES;
# define g_ole_initialized_init() (g_ole_initialized_key = TlsAlloc())
# define g_ole_initialized_set(val) TlsSetValue(g_ole_initialized_key, (void*)(val))
#endif
+
static BOOL g_uninitialize_hooked = FALSE;
static BOOL g_cp_installed = FALSE;
static BOOL g_lcid_installed = FALSE;
@@ -233,7 +56,6 @@ static FNCOCREATEINSTANCEEX *gCoCreateInstanceEx = NULL;
static VALUE com_hash;
static IDispatchVtbl com_vtbl;
static UINT cWIN32OLE_cp = CP_ACP;
-static LCID cWIN32OLE_lcid = LOCALE_SYSTEM_DEFAULT;
static rb_encoding *cWIN32OLE_enc;
static UINT g_cp_to_check = CP_ACP;
static char g_lcid_to_check[8 + 1];
@@ -251,52 +73,11 @@ static IMultiLanguage *pIMultiLanguage = NULL;
#define pIMultiLanguage NULL /* dummy */
#endif
-struct oledata {
- IDispatch *pDispatch;
-};
-
-struct oletypelibdata {
- ITypeLib *pTypeLib;
-};
-
-struct oletypedata {
- ITypeInfo *pTypeInfo;
-};
-
-struct olemethoddata {
- ITypeInfo *pOwnerTypeInfo;
- ITypeInfo *pTypeInfo;
- UINT index;
-};
-
-struct olevariabledata {
- ITypeInfo *pTypeInfo;
- UINT index;
-};
-
-struct oleparamdata {
- ITypeInfo *pTypeInfo;
- UINT method_index;
- UINT index;
-};
-
-struct oleeventdata {
- DWORD dwCookie;
- IConnectionPoint *pConnectionPoint;
- long event_id;
-};
-
struct oleparam {
DISPPARAMS dp;
OLECHAR** pNamedArgs;
};
-struct olevariantdata {
- VARIANT realvar;
- VARIANT var;
-};
-
-
static HRESULT ( STDMETHODCALLTYPE QueryInterface )(IDispatch __RPC_FAR *, REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject);
static ULONG ( STDMETHODCALLTYPE AddRef )(IDispatch __RPC_FAR * This);
static ULONG ( STDMETHODCALLTYPE Release )(IDispatch __RPC_FAR * This);
@@ -314,58 +95,27 @@ NORETURN(static void failed_load_conv51932(void));
static void load_conv_function51932(void);
#endif
static UINT ole_init_cp(void);
-static char *ole_wc2mb(LPWSTR pw);
-static VALUE ole_hresult2msg(HRESULT hr);
static void ole_freeexceptinfo(EXCEPINFO *pExInfo);
static VALUE ole_excepinfo2msg(EXCEPINFO *pExInfo);
-static void ole_raise(HRESULT hr, VALUE ecs, const char *fmt, ...);
-static void ole_initialize(void);
-static void ole_msg_loop(void);
static void ole_free(struct oledata *pole);
-static void oletypelib_free(struct oletypelibdata *poletypelib);
-static void oletype_free(struct oletypedata *poletype);
-static void olemethod_free(struct olemethoddata *polemethod);
-static void olevariable_free(struct olevariabledata *polevar);
-static void oleparam_free(struct oleparamdata *pole);
-static LPWSTR ole_vstr2wc(VALUE vstr);
static LPWSTR ole_mb2wc(char *pm, int len);
-static VALUE ole_wc2vstr(LPWSTR pw, BOOL isfree);
-static VALUE ole_ary_m_entry(VALUE val, long *pid);
+static VALUE ole_ary_m_entry(VALUE val, LONG *pid);
+static VALUE is_all_index_under(LONG *pid, long *pub, long dim);
static void * get_ptr_of_variant(VARIANT *pvar);
-static VALUE is_all_index_under(long *pid, long *pub, long dim);
-static void ole_set_safe_array(long n, SAFEARRAY *psa, long *pid, long *pub, VALUE val, long dim, VARTYPE vt);
+static void ole_set_safe_array(long n, SAFEARRAY *psa, LONG *pid, long *pub, VALUE val, long dim, VARTYPE vt);
static long dimension(VALUE val);
static long ary_len_of_dim(VALUE ary, long dim);
-static HRESULT ole_val_ary2variant_ary(VALUE val, VARIANT *var, VARTYPE vt);
-static void ole_val2variant(VALUE val, VARIANT *var);
-static void ole_val2variant_ex(VALUE val, VARIANT *var, VARTYPE vt);
-static void ole_val2ptr_variant(VALUE val, VARIANT *var);
-static void ole_set_byref(VARIANT *realvar, VARIANT *var, VARTYPE vt);
-static void ole_val2olevariantdata(VALUE val, VARTYPE vt, struct olevariantdata *pvar);
-static void ole_val2variant2(VALUE val, VARIANT *var);
-static VALUE make_inspect(const char *class_name, VALUE detail);
-static VALUE default_inspect(VALUE self, const char *class_name);
static VALUE ole_set_member(VALUE self, IDispatch *dispatch);
static VALUE fole_s_allocate(VALUE klass);
static VALUE create_win32ole_object(VALUE klass, IDispatch *pDispatch, int argc, VALUE *argv);
-static VALUE ary_new_dim(VALUE myary, long *pid, long *plb, long dim);
-static void ary_store_dim(VALUE myary, long *pid, long *plb, long dim, VALUE val);
-static VALUE ole_variant2val(VARIANT *pvar);
-static LONG reg_open_key(HKEY hkey, const char *name, HKEY *phkey);
-static LONG reg_open_vkey(HKEY hkey, VALUE key, HKEY *phkey);
-static VALUE reg_enum_key(HKEY hkey, DWORD i);
-static VALUE reg_get_val(HKEY hkey, const char *subkey);
-static VALUE reg_get_typelib_file_path(HKEY hkey);
-static VALUE typelib_file_from_clsid(VALUE ole);
-static VALUE typelib_file_from_typelib(VALUE ole);
-static VALUE typelib_file(VALUE ole);
+static VALUE ary_new_dim(VALUE myary, LONG *pid, LONG *plb, LONG dim);
+static void ary_store_dim(VALUE myary, LONG *pid, LONG *plb, LONG dim, VALUE val);
static void ole_const_load(ITypeLib *pTypeLib, VALUE klass, VALUE self);
static HRESULT clsid_from_remote(VALUE host, VALUE com, CLSID *pclsid);
static VALUE ole_create_dcom(VALUE self, VALUE ole, VALUE host, VALUE others);
static VALUE ole_bind_obj(VALUE moniker, int argc, VALUE *argv, VALUE self);
static VALUE fole_s_connect(int argc, VALUE *argv, VALUE self);
static VALUE fole_s_const_load(int argc, VALUE *argv, VALUE self);
-static VALUE ole_types_from_typelib(ITypeLib *pTypeLib, VALUE classes);
static ULONG reference_count(struct oledata * pole);
static VALUE fole_s_reference_count(VALUE self, VALUE obj);
static VALUE fole_s_free(VALUE self, VALUE obj);
@@ -383,7 +133,7 @@ static VALUE fole_s_create_guid(VALUE self);
static VALUE fole_s_ole_initialize(VALUE self);
static VALUE fole_s_ole_uninitialize(VALUE self);
static VALUE fole_initialize(int argc, VALUE *argv, VALUE self);
-static VALUE hash2named_arg(RB_BLOCK_CALL_FUNC_ARGLIST(pair, op));
+static int hash2named_arg(VALUE key, VALUE val, VALUE pop);
static VALUE set_argv(VARIANTARG* realargs, unsigned int beg, unsigned int end);
static VALUE ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket);
static VALUE fole_invoke(int argc, VALUE *argv, VALUE self);
@@ -400,201 +150,21 @@ static VALUE ole_each_sub(VALUE pEnumV);
static VALUE ole_ienum_free(VALUE pEnumV);
static VALUE fole_each(VALUE self);
static VALUE fole_missing(int argc, VALUE *argv, VALUE self);
-static VALUE ole_method_sub(VALUE self, ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE name);
-static VALUE olemethod_from_typeinfo(VALUE self, ITypeInfo *pTypeInfo, VALUE name);
-static VALUE ole_methods_sub(ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE methods, int mask);
-static VALUE ole_methods_from_typeinfo(ITypeInfo *pTypeInfo, int mask);
static HRESULT typeinfo_from_ole(struct oledata *pole, ITypeInfo **ppti);
static VALUE ole_methods(VALUE self, int mask);
static VALUE fole_methods(VALUE self);
static VALUE fole_get_methods(VALUE self);
static VALUE fole_put_methods(VALUE self);
static VALUE fole_func_methods(VALUE self);
-static VALUE ole_type_from_itypeinfo(ITypeInfo *pTypeInfo);
static VALUE fole_type(VALUE self);
-static VALUE ole_typelib_from_itypeinfo(ITypeInfo *pTypeInfo);
static VALUE fole_typelib(VALUE self);
static VALUE fole_query_interface(VALUE self, VALUE str_iid);
static VALUE fole_respond_to(VALUE self, VALUE method);
-static HRESULT ole_docinfo_from_type(ITypeInfo *pTypeInfo, BSTR *name, BSTR *helpstr, DWORD *helpcontext, BSTR *helpfile);
static VALUE ole_usertype2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails);
static VALUE ole_ptrtype2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails);
-static VALUE ole_typedesc2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails);
static VALUE fole_method_help(VALUE self, VALUE cmdname);
static VALUE fole_activex_initialize(VALUE self);
-static VALUE foletype_s_ole_classes(VALUE self, VALUE typelib);
-static VALUE foletype_s_typelibs(VALUE self);
-static VALUE foletype_s_progids(VALUE self);
-static VALUE foletype_s_allocate(VALUE klass);
-static VALUE oletype_set_member(VALUE self, ITypeInfo *pTypeInfo, VALUE name);
-static VALUE oleclass_from_typelib(VALUE self, ITypeLib *pTypeLib, VALUE oleclass);
-static VALUE oletypelib_set_member(VALUE self, ITypeLib *pTypeLib);
-static ITypeLib * oletypelib_get_typelib(VALUE self);
-static void oletypelib_get_libattr(ITypeLib *pTypeLib, TLIBATTR **ppTLibAttr);
-static VALUE foletypelib_s_typelibs(VALUE self);
-static VALUE make_version_str(VALUE major, VALUE minor);
-static VALUE oletypelib_search_registry2(VALUE self, VALUE args);
-static VALUE oletypelib_search_registry(VALUE self, VALUE typelib);
-static VALUE foletypelib_s_allocate(VALUE klass);
-static VALUE foletypelib_initialize(VALUE self, VALUE args);
-static VALUE foletypelib_guid(VALUE self);
-static VALUE foletypelib_name(VALUE self);
-static VALUE foletypelib_version(VALUE self);
-static VALUE foletypelib_major_version(VALUE self);
-static VALUE foletypelib_minor_version(VALUE self);
-static VALUE oletypelib_path(VALUE guid, VALUE version);
-static HRESULT oletypelib_from_guid(VALUE guid, VALUE version, ITypeLib **ppTypeLib);
-static VALUE foletypelib_path(VALUE self);
-static VALUE foletypelib_visible(VALUE self);
-static VALUE foletypelib_library_name(VALUE self);
-static VALUE foletypelib_ole_types(VALUE self);
-static VALUE foletypelib_inspect(VALUE self);
-static VALUE foletype_initialize(VALUE self, VALUE typelib, VALUE oleclass);
-static VALUE foletype_name(VALUE self);
-static VALUE ole_ole_type(ITypeInfo *pTypeInfo);
-static VALUE foletype_ole_type(VALUE self);
-static VALUE ole_type_guid(ITypeInfo *pTypeInfo);
-static VALUE foletype_guid(VALUE self);
-static VALUE ole_type_progid(ITypeInfo *pTypeInfo);
-static VALUE foletype_progid(VALUE self);
-static VALUE ole_type_visible(ITypeInfo *pTypeInfo);
-static VALUE foletype_visible(VALUE self);
-static VALUE ole_type_major_version(ITypeInfo *pTypeInfo);
-static VALUE foletype_major_version(VALUE self);
-static VALUE ole_type_minor_version(ITypeInfo *pTypeInfo);
-static VALUE foletype_minor_version(VALUE self);
-static VALUE ole_type_typekind(ITypeInfo *pTypeInfo);
-static VALUE foletype_typekind(VALUE self);
-static VALUE ole_type_helpstring(ITypeInfo *pTypeInfo);
-static VALUE foletype_helpstring(VALUE self);
-static VALUE ole_type_src_type(ITypeInfo *pTypeInfo);
-static VALUE foletype_src_type(VALUE self);
-static VALUE ole_type_helpfile(ITypeInfo *pTypeInfo);
-static VALUE foletype_helpfile(VALUE self);
-static VALUE ole_type_helpcontext(ITypeInfo *pTypeInfo);
-static VALUE foletype_helpcontext(VALUE self);
-static VALUE foletype_ole_typelib(VALUE self);
-static VALUE ole_type_impl_ole_types(ITypeInfo *pTypeInfo, int implflags);
-static VALUE foletype_impl_ole_types(VALUE self);
-static VALUE foletype_source_ole_types(VALUE self);
-static VALUE foletype_default_event_sources(VALUE self);
-static VALUE foletype_default_ole_types(VALUE self);
-static VALUE foletype_inspect(VALUE self);
-static VALUE ole_variables(ITypeInfo *pTypeInfo);
-static VALUE foletype_variables(VALUE self);
-static VALUE foletype_methods(VALUE self);
-static VALUE folevariable_name(VALUE self);
-static VALUE ole_variable_ole_type(ITypeInfo *pTypeInfo, UINT var_index);
-static VALUE folevariable_ole_type(VALUE self);
-static VALUE ole_variable_ole_type_detail(ITypeInfo *pTypeInfo, UINT var_index);
-static VALUE folevariable_ole_type_detail(VALUE self);
-static VALUE ole_variable_value(ITypeInfo *pTypeInfo, UINT var_index);
-static VALUE folevariable_value(VALUE self);
-static VALUE ole_variable_visible(ITypeInfo *pTypeInfo, UINT var_index);
-static VALUE folevariable_visible(VALUE self);
-static VALUE ole_variable_kind(ITypeInfo *pTypeInfo, UINT var_index);
-static VALUE folevariable_variable_kind(VALUE self);
-static VALUE ole_variable_varkind(ITypeInfo *pTypeInfo, UINT var_index);
-static VALUE folevariable_varkind(VALUE self);
-static VALUE folevariable_inspect(VALUE self);
-static VALUE olemethod_set_member(VALUE self, ITypeInfo *pTypeInfo, ITypeInfo *pOwnerTypeInfo, int index, VALUE name);
-static VALUE folemethod_s_allocate(VALUE klass);
-static VALUE folemethod_initialize(VALUE self, VALUE oletype, VALUE method);
-static VALUE folemethod_name(VALUE self);
-static VALUE ole_method_return_type(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_return_type(VALUE self);
-static VALUE ole_method_return_vtype(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_return_vtype(VALUE self);
-static VALUE ole_method_return_type_detail(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_return_type_detail(VALUE self);
-static VALUE ole_method_invkind(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE ole_method_invoke_kind(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_invkind(VALUE self);
-static VALUE folemethod_invoke_kind(VALUE self);
-static VALUE ole_method_visible(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_visible(VALUE self);
-static VALUE ole_method_event(ITypeInfo *pTypeInfo, UINT method_index, VALUE method_name);
-static VALUE folemethod_event(VALUE self);
-static VALUE folemethod_event_interface(VALUE self);
-static HRESULT ole_method_docinfo_from_type(ITypeInfo *pTypeInfo, UINT method_index, BSTR *name, BSTR *helpstr, DWORD *helpcontext, BSTR *helpfile);
-static VALUE ole_method_helpstring(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_helpstring(VALUE self);
-static VALUE ole_method_helpfile(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_helpfile(VALUE self);
-static VALUE ole_method_helpcontext(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_helpcontext(VALUE self);
-static VALUE ole_method_dispid(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_dispid(VALUE self);
-static VALUE ole_method_offset_vtbl(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_offset_vtbl(VALUE self);
-static VALUE ole_method_size_params(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_size_params(VALUE self);
-static VALUE ole_method_size_opt_params(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_size_opt_params(VALUE self);
-static VALUE ole_method_params(ITypeInfo *pTypeInfo, UINT method_index);
-static VALUE folemethod_params(VALUE self);
-static VALUE folemethod_inspect(VALUE self);
-static VALUE foleparam_s_allocate(VALUE klass);
-static VALUE oleparam_ole_param_from_index(VALUE self, ITypeInfo *pTypeInfo, UINT method_index, int param_index);
-static VALUE oleparam_ole_param(VALUE self, VALUE olemethod, int n);
-static VALUE foleparam_initialize(VALUE self, VALUE olemethod, VALUE n);
-static VALUE foleparam_name(VALUE self);
-static VALUE ole_param_ole_type(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
-static VALUE foleparam_ole_type(VALUE self);
-static VALUE ole_param_ole_type_detail(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
-static VALUE foleparam_ole_type_detail(VALUE self);
-static VALUE ole_param_flag_mask(ITypeInfo *pTypeInfo, UINT method_index, UINT index, USHORT mask);
-static VALUE foleparam_input(VALUE self);
-static VALUE foleparam_output(VALUE self);
-static VALUE foleparam_optional(VALUE self);
-static VALUE foleparam_retval(VALUE self);
-static VALUE ole_param_default(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
-static VALUE foleparam_default(VALUE self);
-static VALUE foleparam_inspect(VALUE self);
-static long ole_search_event_at(VALUE ary, VALUE ev);
-static VALUE ole_search_event(VALUE ary, VALUE ev, BOOL *is_default);
-static VALUE ole_search_handler_method(VALUE handler, VALUE ev, BOOL *is_default_handler);
-static void ole_delete_event(VALUE ary, VALUE ev);
-static void hash2ptr_dispparams(VALUE hash, ITypeInfo *pTypeInfo, DISPID dispid, DISPPARAMS *pdispparams);
-static VALUE hash2result(VALUE hash);
-static void ary2ptr_dispparams(VALUE ary, DISPPARAMS *pdispparams);
-static VALUE exec_callback(VALUE arg);
-static VALUE rescue_callback(VALUE arg);
-static HRESULT find_iid(VALUE ole, char *pitf, IID *piid, ITypeInfo **ppTypeInfo);
-static HRESULT find_coclass(ITypeInfo *pTypeInfo, TYPEATTR *pTypeAttr, ITypeInfo **pTypeInfo2, TYPEATTR **pTypeAttr2);
-static HRESULT find_default_source_from_typeinfo(ITypeInfo *pTypeInfo, TYPEATTR *pTypeAttr, ITypeInfo **ppTypeInfo);
-static HRESULT find_default_source(VALUE ole, IID *piid, ITypeInfo **ppTypeInfo);
-static void ole_event_free(struct oleeventdata *poleev);
-static VALUE fev_s_allocate(VALUE klass);
-static VALUE ev_advise(int argc, VALUE *argv, VALUE self);
-static VALUE fev_initialize(int argc, VALUE *argv, VALUE self);
-static VALUE fev_s_msg_loop(VALUE klass);
-static void add_event_call_back(VALUE obj, VALUE event, VALUE data);
-static VALUE ev_on_event(int argc, VALUE *argv, VALUE self, VALUE is_ary_arg);
-static VALUE fev_on_event(int argc, VALUE *argv, VALUE self);
-static VALUE fev_on_event_with_outargs(int argc, VALUE *argv, VALUE self);
-static VALUE fev_off_event(int argc, VALUE *argv, VALUE self);
-static VALUE fev_unadvise(VALUE self);
-static VALUE fev_set_handler(VALUE self, VALUE val);
-static VALUE fev_get_handler(VALUE self);
-static VALUE evs_push(VALUE ev);
-static VALUE evs_delete(long i);
-static VALUE evs_entry(long i);
-static VALUE evs_length(void);
-static void olevariant_free(struct olevariantdata *pvar);
-static VALUE folevariant_s_allocate(VALUE klass);
-static VALUE folevariant_s_array(VALUE klass, VALUE dims, VALUE vvt);
-static void check_type_val2variant(VALUE val);
-static VALUE folevariant_initialize(VALUE self, VALUE args);
-static long *ary2safe_array_index(int ary_size, VALUE *ary, SAFEARRAY *psa);
-static void unlock_safe_array(SAFEARRAY *psa);
-static SAFEARRAY *get_locked_safe_array(VALUE val);
-static VALUE folevariant_ary_aref(int argc, VALUE *argv, VALUE self);
-static VOID * val2variant_ptr(VALUE val, VARIANT *var, VARTYPE vt);
-static VALUE folevariant_ary_aset(int argc, VALUE *argv, VALUE self);
-static VALUE folevariant_value(VALUE self);
-static VALUE folevariant_vartype(VALUE self);
-static VALUE folevariant_set_value(VALUE self, VALUE val);
+
static void init_enc2cp(void);
static void free_enc2cp(void);
@@ -804,6 +374,12 @@ static /* [local] */ HRESULT ( STDMETHODCALLTYPE Invoke )(
return S_OK;
}
+BOOL
+ole_initialized()
+{
+ return g_ole_initialized;
+}
+
static IDispatch*
val2dispatch(VALUE val)
{
@@ -829,7 +405,9 @@ static double
rbtime2vtdate(VALUE tmobj)
{
SYSTEMTIME st;
- double t = 0;
+ double t;
+ double nsec;
+
memset(&st, 0, sizeof(SYSTEMTIME));
st.wYear = FIX2INT(rb_funcall(tmobj, rb_intern("year"), 0));
st.wMonth = FIX2INT(rb_funcall(tmobj, rb_intern("month"), 0));
@@ -839,7 +417,17 @@ rbtime2vtdate(VALUE tmobj)
st.wSecond = FIX2INT(rb_funcall(tmobj, rb_intern("sec"), 0));
st.wMilliseconds = FIX2INT(rb_funcall(tmobj, rb_intern("nsec"), 0)) / 1000000;
SystemTimeToVariantTime(&st, &t);
- return t;
+
+ /*
+ * Unfortunately SystemTimeToVariantTime function always ignores the
+ * wMilliseconds of SYSTEMTIME struct.
+ * So, we need to calculate milliseconds by ourselves.
+ */
+ nsec = FIX2INT(rb_funcall(tmobj, rb_intern("nsec"), 0));
+ nsec /= 1000000.0;
+ nsec /= (24.0 * 3600.0);
+ nsec /= 1000;
+ return t + nsec;
}
static VALUE
@@ -847,8 +435,8 @@ vtdate2rbtime(double date)
{
SYSTEMTIME st;
VALUE v;
+ double msec;
VariantTimeToSystemTime(date, &st);
-
v = rb_funcall(rb_cTime, rb_intern("new"), 6,
INT2FIX(st.wYear),
INT2FIX(st.wMonth),
@@ -856,8 +444,21 @@ vtdate2rbtime(double date)
INT2FIX(st.wHour),
INT2FIX(st.wMinute),
INT2FIX(st.wSecond));
- if (st.wMilliseconds > 0) {
- return rb_funcall(v, rb_intern("+"), 1, rb_float_new((double)(st.wMilliseconds / 1000.0)));
+ /*
+ * Unfortunately VariantTimeToSystemTime always ignores the
+ * wMilliseconds of SYSTEMTIME struct(The wMilliseconds is 0).
+ * So, we need to calculate milliseconds by ourselves.
+ */
+ msec = fabs(date);
+ msec -= floor(date);
+ msec *= 24 * 60;
+ msec -= floor(msec);
+ msec *= 60;
+ msec -= st.wSecond;
+ msec = round(msec * 1000);
+ msec /= 1000;
+ if (msec != 0) {
+ return rb_funcall(v, rb_intern("+"), 1, rb_float_new(msec));
}
return v;
}
@@ -1109,52 +710,12 @@ ole_alloc_str(UINT size, void *arg)
return ALLOC_N(char, size + 1);
}
-static char *
+char *
ole_wc2mb(LPWSTR pw)
{
return ole_wc2mb_alloc(pw, ole_alloc_str, NULL);
}
-static VALUE
-ole_hresult2msg(HRESULT hr)
-{
- VALUE msg = Qnil;
- char *p_msg = NULL;
- char *term = NULL;
- DWORD dwCount;
-
- char strhr[100];
- sprintf(strhr, " HRESULT error code:0x%08x\n ", (unsigned)hr);
- msg = rb_str_new2(strhr);
- dwCount = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, hr,
- MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
- (LPTSTR)&p_msg, 0, NULL);
- if (dwCount == 0) {
- dwCount = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL, hr, cWIN32OLE_lcid,
- (LPTSTR)&p_msg, 0, NULL);
- }
- if (dwCount > 0) {
- term = p_msg + strlen(p_msg);
- while (p_msg < term) {
- term--;
- if (*term == '\r' || *term == '\n')
- *term = '\0';
- else break;
- }
- if (p_msg[0] != '\0') {
- rb_str_cat2(msg, p_msg);
- }
- }
- LocalFree(p_msg);
- return msg;
-}
-
static void
ole_freeexceptinfo(EXCEPINFO *pExInfo)
{
@@ -1180,7 +741,7 @@ ole_excepinfo2msg(EXCEPINFO *pExInfo)
pDescription = ole_wc2mb(pExInfo->bstrDescription);
}
if(pExInfo->wCode == 0) {
- sprintf(error_code, "\n OLE error code:%lX in ", pExInfo->scode);
+ sprintf(error_code, "\n OLE error code:%lX in ", (unsigned long)pExInfo->scode);
}
else{
sprintf(error_code, "\n OLE error code:%u in ", pExInfo->wCode);
@@ -1205,24 +766,6 @@ ole_excepinfo2msg(EXCEPINFO *pExInfo)
return error_msg;
}
-static void
-ole_raise(HRESULT hr, VALUE ecs, const char *fmt, ...)
-{
- va_list args;
- VALUE msg;
- VALUE err_msg;
- va_init_list(args, fmt);
- msg = rb_vsprintf(fmt, args);
- va_end(args);
-
- err_msg = ole_hresult2msg(hr);
- if(err_msg != Qnil) {
- rb_str_cat2(msg, "\n");
- rb_str_append(msg, err_msg);
- }
- rb_exc_raise(rb_exc_new_str(ecs, msg));
-}
-
void
ole_uninitialize(void)
{
@@ -1237,7 +780,7 @@ ole_uninitialize_hook(rb_event_flag_t evflag, VALUE data, VALUE self, ID mid, VA
ole_uninitialize();
}
-static void
+void
ole_initialize(void)
{
HRESULT hr;
@@ -1263,59 +806,13 @@ ole_initialize(void)
}
static void
-ole_msg_loop() {
- MSG msg;
- while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
- TranslateMessage(&msg);
- DispatchMessage(&msg);
- }
-}
-
-static void
ole_free(struct oledata *pole)
{
OLE_FREE(pole->pDispatch);
free(pole);
}
-static void
-oletypelib_free(struct oletypelibdata *poletypelib)
-{
- OLE_FREE(poletypelib->pTypeLib);
- free(poletypelib);
-}
-
-static void
-oletype_free(struct oletypedata *poletype)
-{
- OLE_FREE(poletype->pTypeInfo);
- free(poletype);
-}
-
-static void
-olemethod_free(struct olemethoddata *polemethod)
-{
- OLE_FREE(polemethod->pTypeInfo);
- OLE_FREE(polemethod->pOwnerTypeInfo);
- free(polemethod);
-}
-
-static void
-olevariable_free(struct olevariabledata *polevar)
-{
- OLE_FREE(polevar->pTypeInfo);
- free(polevar);
-}
-
-static void
-oleparam_free(struct oleparamdata *pole)
-{
- OLE_FREE(pole->pTypeInfo);
- free(pole);
-}
-
-
-static LPWSTR
+LPWSTR
ole_vstr2wc(VALUE vstr)
{
rb_encoding *enc;
@@ -1406,7 +903,7 @@ ole_alloc_vstr(UINT size, void *arg)
return RSTRING_PTR(str);
}
-static VALUE
+VALUE
ole_wc2vstr(LPWSTR pw, BOOL isfree)
{
VALUE vstr;
@@ -1418,18 +915,89 @@ ole_wc2vstr(LPWSTR pw, BOOL isfree)
}
static VALUE
-ole_ary_m_entry(VALUE val, long *pid)
+ole_ary_m_entry(VALUE val, LONG *pid)
{
VALUE obj = Qnil;
int i = 0;
obj = val;
- while(TYPE(obj) == T_ARRAY) {
+ while(RB_TYPE_P(obj, T_ARRAY)) {
obj = rb_ary_entry(obj, pid[i]);
i++;
}
return obj;
}
+static VALUE
+is_all_index_under(LONG *pid, long *pub, long dim)
+{
+ long i = 0;
+ for (i = 0; i < dim; i++) {
+ if (pid[i] > pub[i]) {
+ return Qfalse;
+ }
+ }
+ return Qtrue;
+}
+
+void
+ole_val2variant_ex(VALUE val, VARIANT *var, VARTYPE vt)
+{
+ if (val == Qnil) {
+ if (vt == VT_VARIANT) {
+ ole_val2variant2(val, var);
+ } else {
+ V_VT(var) = (vt & ~VT_BYREF);
+ if (V_VT(var) == VT_DISPATCH) {
+ V_DISPATCH(var) = NULL;
+ } else if (V_VT(var) == VT_UNKNOWN) {
+ V_UNKNOWN(var) = NULL;
+ }
+ }
+ return;
+ }
+#if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__)
+ switch(vt & ~VT_BYREF) {
+ case VT_I8:
+ V_VT(var) = VT_I8;
+ V_I8(var) = NUM2I8 (val);
+ break;
+ case VT_UI8:
+ V_VT(var) = VT_UI8;
+ V_UI8(var) = NUM2UI8(val);
+ break;
+ default:
+ ole_val2variant2(val, var);
+ break;
+ }
+#else /* (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__) */
+ ole_val2variant2(val, var);
+#endif
+}
+
+VOID *
+val2variant_ptr(VALUE val, VARIANT *var, VARTYPE vt)
+{
+ VOID *p = NULL;
+ HRESULT hr = S_OK;
+ ole_val2variant_ex(val, var, vt);
+ if ((vt & ~VT_BYREF) == VT_VARIANT) {
+ p = var;
+ } else {
+ if ( (vt & ~VT_BYREF) != V_VT(var)) {
+ hr = VariantChangeTypeEx(var, var,
+ cWIN32OLE_lcid, 0, (VARTYPE)(vt & ~VT_BYREF));
+ if (FAILED(hr)) {
+ ole_raise(hr, rb_eRuntimeError, "failed to change type");
+ }
+ }
+ p = get_ptr_of_variant(var);
+ }
+ if (p == NULL) {
+ rb_raise(rb_eRuntimeError, "failed to get pointer of variant");
+ }
+ return p;
+}
+
static void *
get_ptr_of_variant(VARIANT *pvar)
{
@@ -1499,20 +1067,8 @@ get_ptr_of_variant(VARIANT *pvar)
}
}
-static VALUE
-is_all_index_under(long *pid, long *pub, long dim)
-{
- long i = 0;
- for (i = 0; i < dim; i++) {
- if (pid[i] > pub[i]) {
- return Qfalse;
- }
- }
- return Qtrue;
-}
-
static void
-ole_set_safe_array(long n, SAFEARRAY *psa, long *pid, long *pub, VALUE val, long dim, VARTYPE vt)
+ole_set_safe_array(long n, SAFEARRAY *psa, LONG *pid, long *pub, VALUE val, long dim, VARTYPE vt)
{
VALUE val1;
HRESULT hr = S_OK;
@@ -1549,7 +1105,7 @@ dimension(VALUE val) {
long dim1 = 0;
long len = 0;
long i = 0;
- if (TYPE(val) == T_ARRAY) {
+ if (RB_TYPE_P(val, T_ARRAY)) {
len = RARRAY_LEN(val);
for (i = 0; i < len; i++) {
dim1 = dimension(rb_ary_entry(val, i));
@@ -1570,11 +1126,11 @@ ary_len_of_dim(VALUE ary, long dim) {
long i = 0;
VALUE val;
if (dim == 0) {
- if (TYPE(ary) == T_ARRAY) {
+ if (RB_TYPE_P(ary, T_ARRAY)) {
ary_len = RARRAY_LEN(ary);
}
} else {
- if (TYPE(ary) == T_ARRAY) {
+ if (RB_TYPE_P(ary, T_ARRAY)) {
len = RARRAY_LEN(ary);
for (i = 0; i < len; i++) {
val = rb_ary_entry(ary, i);
@@ -1588,7 +1144,7 @@ ary_len_of_dim(VALUE ary, long dim) {
return ary_len;
}
-static HRESULT
+HRESULT
ole_val_ary2variant_ary(VALUE val, VARIANT *var, VARTYPE vt)
{
long dim = 0;
@@ -1597,7 +1153,8 @@ ole_val_ary2variant_ary(VALUE val, VARIANT *var, VARTYPE vt)
SAFEARRAYBOUND *psab = NULL;
SAFEARRAY *psa = NULL;
- long *pub, *pid;
+ long *pub;
+ LONG *pid;
Check_Type(val, T_ARRAY);
@@ -1605,7 +1162,7 @@ ole_val_ary2variant_ary(VALUE val, VARIANT *var, VARTYPE vt)
psab = ALLOC_N(SAFEARRAYBOUND, dim);
pub = ALLOC_N(long, dim);
- pid = ALLOC_N(long, dim);
+ pid = ALLOC_N(LONG, dim);
if(!psab || !pub || !pid) {
if(pub) free(pub);
@@ -1649,7 +1206,7 @@ ole_val_ary2variant_ary(VALUE val, VARIANT *var, VARTYPE vt)
return hr;
}
-static void
+void
ole_val2variant(VALUE val, VARIANT *var)
{
struct oledata *pole;
@@ -1666,7 +1223,10 @@ ole_val2variant(VALUE val, VARIANT *var)
VariantCopy(var, &(pvar->var));
return;
}
-
+ if (rb_obj_is_kind_of(val, cWIN32OLE_RECORD)) {
+ ole_rec2variant(val, var);
+ return;
+ }
if (rb_obj_is_kind_of(val, rb_cTime)) {
V_VT(var) = VT_DATE;
V_DATE(var) = rbtime2vtdate(val);
@@ -1715,294 +1275,7 @@ ole_val2variant(VALUE val, VARIANT *var)
}
}
-static void
-ole_val2variant_ex(VALUE val, VARIANT *var, VARTYPE vt)
-{
- if (val == Qnil) {
- if (vt == VT_VARIANT) {
- ole_val2variant2(val, var);
- } else {
- V_VT(var) = (vt & ~VT_BYREF);
- if (V_VT(var) == VT_DISPATCH) {
- V_DISPATCH(var) = NULL;
- } else if (V_VT(var) == VT_UNKNOWN) {
- V_UNKNOWN(var) = NULL;
- }
- }
- return;
- }
-#if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__)
- switch(vt & ~VT_BYREF) {
- case VT_I8:
- V_VT(var) = VT_I8;
- V_I8(var) = NUM2I8 (val);
- break;
- case VT_UI8:
- V_VT(var) = VT_UI8;
- V_UI8(var) = NUM2UI8(val);
- break;
- default:
- ole_val2variant2(val, var);
- break;
- }
-#else /* (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__) */
- ole_val2variant2(val, var);
-#endif
-}
-
-static void
-ole_val2ptr_variant(VALUE val, VARIANT *var)
-{
- switch (TYPE(val)) {
- case T_STRING:
- if (V_VT(var) == (VT_BSTR | VT_BYREF)) {
- *V_BSTRREF(var) = ole_vstr2wc(val);
- }
- break;
- case T_FIXNUM:
- switch(V_VT(var)) {
- case (VT_UI1 | VT_BYREF) :
- *V_UI1REF(var) = NUM2CHR(val);
- break;
- case (VT_I2 | VT_BYREF) :
- *V_I2REF(var) = (short)NUM2INT(val);
- break;
- case (VT_I4 | VT_BYREF) :
- *V_I4REF(var) = NUM2INT(val);
- break;
- case (VT_R4 | VT_BYREF) :
- *V_R4REF(var) = (float)NUM2INT(val);
- break;
- case (VT_R8 | VT_BYREF) :
- *V_R8REF(var) = NUM2INT(val);
- break;
- default:
- break;
- }
- break;
- case T_FLOAT:
- switch(V_VT(var)) {
- case (VT_I2 | VT_BYREF) :
- *V_I2REF(var) = (short)NUM2INT(val);
- break;
- case (VT_I4 | VT_BYREF) :
- *V_I4REF(var) = NUM2INT(val);
- break;
- case (VT_R4 | VT_BYREF) :
- *V_R4REF(var) = (float)NUM2DBL(val);
- break;
- case (VT_R8 | VT_BYREF) :
- *V_R8REF(var) = NUM2DBL(val);
- break;
- default:
- break;
- }
- break;
- case T_BIGNUM:
- if (V_VT(var) == (VT_R8 | VT_BYREF)) {
- *V_R8REF(var) = rb_big2dbl(val);
- }
- break;
- case T_TRUE:
- if (V_VT(var) == (VT_BOOL | VT_BYREF)) {
- *V_BOOLREF(var) = VARIANT_TRUE;
- }
- break;
- case T_FALSE:
- if (V_VT(var) == (VT_BOOL | VT_BYREF)) {
- *V_BOOLREF(var) = VARIANT_FALSE;
- }
- break;
- default:
- break;
- }
-}
-
-static void
-ole_set_byref(VARIANT *realvar, VARIANT *var, VARTYPE vt)
-{
- V_VT(var) = vt;
- if (vt == (VT_VARIANT|VT_BYREF)) {
- V_VARIANTREF(var) = realvar;
- } else {
- if (V_VT(realvar) != (vt & ~VT_BYREF)) {
- rb_raise(eWIN32OLERuntimeError, "variant type mismatch");
- }
- switch(vt & ~VT_BYREF) {
- case VT_I1:
- V_I1REF(var) = &V_I1(realvar);
- break;
- case VT_UI1:
- V_UI1REF(var) = &V_UI1(realvar);
- break;
- case VT_I2:
- V_I2REF(var) = &V_I2(realvar);
- break;
- case VT_UI2:
- V_UI2REF(var) = &V_UI2(realvar);
- break;
- case VT_I4:
- V_I4REF(var) = &V_I4(realvar);
- break;
- case VT_UI4:
- V_UI4REF(var) = &V_UI4(realvar);
- break;
- case VT_R4:
- V_R4REF(var) = &V_R4(realvar);
- break;
- case VT_R8:
- V_R8REF(var) = &V_R8(realvar);
- break;
-
-#if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__)
-#ifdef V_I8REF
- case VT_I8:
- V_I8REF(var) = &V_I8(realvar);
- break;
-#endif
-#ifdef V_UI8REF
- case VT_UI8:
- V_UI8REF(var) = &V_UI8(realvar);
- break;
-#endif
-#endif
- case VT_INT:
- V_INTREF(var) = &V_INT(realvar);
- break;
-
- case VT_UINT:
- V_UINTREF(var) = &V_UINT(realvar);
- break;
-
- case VT_CY:
- V_CYREF(var) = &V_CY(realvar);
- break;
- case VT_DATE:
- V_DATEREF(var) = &V_DATE(realvar);
- break;
- case VT_BSTR:
- V_BSTRREF(var) = &V_BSTR(realvar);
- break;
- case VT_DISPATCH:
- V_DISPATCHREF(var) = &V_DISPATCH(realvar);
- break;
- case VT_ERROR:
- V_ERRORREF(var) = &V_ERROR(realvar);
- break;
- case VT_BOOL:
- V_BOOLREF(var) = &V_BOOL(realvar);
- break;
- case VT_UNKNOWN:
- V_UNKNOWNREF(var) = &V_UNKNOWN(realvar);
- break;
- case VT_ARRAY:
- V_ARRAYREF(var) = &V_ARRAY(realvar);
- break;
- default:
- rb_raise(eWIN32OLERuntimeError, "unknown type specified(setting BYREF):%d", vt);
- break;
- }
- }
-}
-
-static void
-ole_val2olevariantdata(VALUE val, VARTYPE vt, struct olevariantdata *pvar)
-{
- HRESULT hr = S_OK;
-
- if (((vt & ~VT_BYREF) == (VT_ARRAY | VT_UI1)) && TYPE(val) == T_STRING) {
- long len = RSTRING_LEN(val);
- void *pdest = NULL;
- SAFEARRAY *p = NULL;
- SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, len);
- if (!psa) {
- rb_raise(rb_eRuntimeError, "fail to SafeArrayCreateVector");
- }
- hr = SafeArrayAccessData(psa, &pdest);
- if (SUCCEEDED(hr)) {
- memcpy(pdest, RSTRING_PTR(val), len);
- SafeArrayUnaccessData(psa);
- V_VT(&(pvar->realvar)) = (vt & ~VT_BYREF);
- p = V_ARRAY(&(pvar->realvar));
- if (p != NULL) {
- SafeArrayDestroy(p);
- }
- V_ARRAY(&(pvar->realvar)) = psa;
- if (vt & VT_BYREF) {
- V_VT(&(pvar->var)) = vt;
- V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
- } else {
- hr = VariantCopy(&(pvar->var), &(pvar->realvar));
- }
- } else {
- if (psa)
- SafeArrayDestroy(psa);
- }
- } else if (vt & VT_ARRAY) {
- if (val == Qnil) {
- V_VT(&(pvar->var)) = vt;
- if (vt & VT_BYREF) {
- V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
- }
- } else {
- hr = ole_val_ary2variant_ary(val, &(pvar->realvar), (VARTYPE)(vt & ~VT_BYREF));
- if (SUCCEEDED(hr)) {
- if (vt & VT_BYREF) {
- V_VT(&(pvar->var)) = vt;
- V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
- } else {
- hr = VariantCopy(&(pvar->var), &(pvar->realvar));
- }
- }
- }
-#if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__)
- } else if ( (vt & ~VT_BYREF) == VT_I8 || (vt & ~VT_BYREF) == VT_UI8) {
- ole_val2variant_ex(val, &(pvar->realvar), (vt & ~VT_BYREF));
- ole_val2variant_ex(val, &(pvar->var), (vt & ~VT_BYREF));
- V_VT(&(pvar->var)) = vt;
- if (vt & VT_BYREF) {
- ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
- }
-#endif
- } else {
- if (val == Qnil) {
- V_VT(&(pvar->var)) = vt;
- if (vt == (VT_BYREF | VT_VARIANT)) {
- ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
- } else {
- V_VT(&(pvar->realvar)) = vt & ~VT_BYREF;
- if (vt & VT_BYREF) {
- ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
- }
- }
- } else {
- ole_val2variant_ex(val, &(pvar->realvar), (VARTYPE)(vt & ~VT_BYREF));
- if (vt == (VT_BYREF | VT_VARIANT)) {
- ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
- } else if (vt & VT_BYREF) {
- if ( (vt & ~VT_BYREF) != V_VT(&(pvar->realvar))) {
- hr = VariantChangeTypeEx(&(pvar->realvar), &(pvar->realvar),
- cWIN32OLE_lcid, 0, (VARTYPE)(vt & ~VT_BYREF));
- }
- if (SUCCEEDED(hr)) {
- ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
- }
- } else {
- if (vt == V_VT(&(pvar->realvar))) {
- hr = VariantCopy(&(pvar->var), &(pvar->realvar));
- } else {
- hr = VariantChangeTypeEx(&(pvar->var), &(pvar->realvar),
- cWIN32OLE_lcid, 0, vt);
- }
- }
- }
- }
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "failed to change type");
- }
-}
-
-static void
+void
ole_val2variant2(VALUE val, VARIANT *var)
{
g_nil_to = VT_EMPTY;
@@ -2010,7 +1283,7 @@ ole_val2variant2(VALUE val, VARIANT *var)
g_nil_to = VT_ERROR;
}
-static VALUE
+VALUE
make_inspect(const char *class_name, VALUE detail)
{
VALUE str;
@@ -2022,7 +1295,7 @@ make_inspect(const char *class_name, VALUE detail)
return str;
}
-static VALUE
+VALUE
default_inspect(VALUE self, const char *class_name)
{
VALUE detail = rb_funcall(self, rb_intern("to_s"), 0);
@@ -2063,7 +1336,7 @@ create_win32ole_object(VALUE klass, IDispatch *pDispatch, int argc, VALUE *argv)
}
static VALUE
-ary_new_dim(VALUE myary, long *pid, long *plb, long dim) {
+ary_new_dim(VALUE myary, LONG *pid, LONG *plb, LONG dim) {
long i;
VALUE obj = Qnil;
VALUE pobj = Qnil;
@@ -2089,24 +1362,28 @@ ary_new_dim(VALUE myary, long *pid, long *plb, long dim) {
}
static void
-ary_store_dim(VALUE myary, long *pid, long *plb, long dim, VALUE val) {
+ary_store_dim(VALUE myary, LONG *pid, LONG *plb, LONG dim, VALUE val) {
long id = pid[dim - 1] - plb[dim - 1];
VALUE obj = ary_new_dim(myary, pid, plb, dim);
rb_ary_store(obj, id, val);
}
-static VALUE
+VALUE
ole_variant2val(VARIANT *pvar)
{
VALUE obj = Qnil;
+ VARTYPE vt = V_VT(pvar);
HRESULT hr;
- while ( V_VT(pvar) == (VT_BYREF | VT_VARIANT) )
+ while ( vt == (VT_BYREF | VT_VARIANT) ) {
pvar = V_VARIANTREF(pvar);
+ vt = V_VT(pvar);
+ }
if(V_ISARRAY(pvar)) {
+ VARTYPE vt_base = vt & VT_TYPEMASK;
SAFEARRAY *psa = V_ISBYREF(pvar) ? *V_ARRAYREF(pvar) : V_ARRAY(pvar);
UINT i = 0;
- long *pid, *plb, *pub;
+ LONG *pid, *plb, *pub;
VARIANT variant;
VALUE val;
UINT dim = 0;
@@ -2114,12 +1391,9 @@ ole_variant2val(VARIANT *pvar)
return obj;
}
dim = SafeArrayGetDim(psa);
- VariantInit(&variant);
- V_VT(&variant) = (V_VT(pvar) & ~VT_ARRAY) | VT_BYREF;
-
- pid = ALLOC_N(long, dim);
- plb = ALLOC_N(long, dim);
- pub = ALLOC_N(long, dim);
+ pid = ALLOC_N(LONG, dim);
+ plb = ALLOC_N(LONG, dim);
+ pub = ALLOC_N(LONG, dim);
if(!pid || !plb || !pub) {
if(pid) free(pid);
@@ -2137,9 +1411,20 @@ ole_variant2val(VARIANT *pvar)
if (SUCCEEDED(hr)) {
obj = rb_ary_new();
i = 0;
+ VariantInit(&variant);
+ V_VT(&variant) = vt_base | VT_BYREF;
+ if (vt_base == VT_RECORD) {
+ hr = SafeArrayGetRecordInfo(psa, &V_RECORDINFO(&variant));
+ if (SUCCEEDED(hr)) {
+ V_VT(&variant) = VT_RECORD;
+ }
+ }
while (i < dim) {
ary_new_dim(obj, pid, plb, dim);
- hr = SafeArrayPtrOfIndex(psa, pid, &V_BYREF(&variant));
+ if (vt_base == VT_RECORD)
+ hr = SafeArrayPtrOfIndex(psa, pid, &V_RECORD(&variant));
+ else
+ hr = SafeArrayPtrOfIndex(psa, pid, &V_BYREF(&variant));
if (SUCCEEDED(hr)) {
val = ole_variant2val(&variant);
ary_store_dim(obj, pid, plb, dim, val);
@@ -2332,6 +1617,15 @@ ole_variant2val(VARIANT *pvar)
obj = vtdate2rbtime(date);
break;
}
+
+ case VT_RECORD:
+ {
+ IRecordInfo *pri = V_RECORDINFO(pvar);
+ void *prec = V_RECORD(pvar);
+ obj = create_win32ole_record(pri, prec);
+ break;
+ }
+
case VT_CY:
default:
{
@@ -2350,19 +1644,19 @@ ole_variant2val(VARIANT *pvar)
return obj;
}
-static LONG
+LONG
reg_open_key(HKEY hkey, const char *name, HKEY *phkey)
{
return RegOpenKeyEx(hkey, name, 0, KEY_READ, phkey);
}
-static LONG
+LONG
reg_open_vkey(HKEY hkey, VALUE key, HKEY *phkey)
{
return reg_open_key(hkey, StringValuePtr(key), phkey);
}
-static VALUE
+VALUE
reg_enum_key(HKEY hkey, DWORD i)
{
char buf[BUFSIZ + 1];
@@ -2377,7 +1671,7 @@ reg_enum_key(HKEY hkey, DWORD i)
return Qnil;
}
-static VALUE
+VALUE
reg_get_val(HKEY hkey, const char *subkey)
{
char *pbuf;
@@ -2405,7 +1699,7 @@ reg_get_val(HKEY hkey, const char *subkey)
return val;
}
-static VALUE
+VALUE
reg_get_val2(HKEY hkey, const char *subkey)
{
HKEY hsubkey;
@@ -2422,118 +1716,6 @@ reg_get_val2(HKEY hkey, const char *subkey)
return val;
}
-static VALUE
-reg_get_typelib_file_path(HKEY hkey)
-{
- VALUE path = Qnil;
- path = reg_get_val2(hkey, "win64");
- if (path != Qnil) {
- return path;
- }
- path = reg_get_val2(hkey, "win32");
- if (path != Qnil) {
- return path;
- }
- path = reg_get_val2(hkey, "win16");
- return path;
-}
-
-static VALUE
-typelib_file_from_clsid(VALUE ole)
-{
- HKEY hroot, hclsid;
- LONG err;
- VALUE typelib;
- char path[MAX_PATH + 1];
-
- err = reg_open_key(HKEY_CLASSES_ROOT, "CLSID", &hroot);
- if (err != ERROR_SUCCESS) {
- return Qnil;
- }
- err = reg_open_key(hroot, StringValuePtr(ole), &hclsid);
- if (err != ERROR_SUCCESS) {
- RegCloseKey(hroot);
- return Qnil;
- }
- typelib = reg_get_val2(hclsid, "InprocServer32");
- RegCloseKey(hroot);
- RegCloseKey(hclsid);
- if (typelib != Qnil) {
- ExpandEnvironmentStrings(StringValuePtr(typelib), path, sizeof(path));
- path[MAX_PATH] = '\0';
- typelib = rb_str_new2(path);
- }
- return typelib;
-}
-
-static VALUE
-typelib_file_from_typelib(VALUE ole)
-{
- HKEY htypelib, hclsid, hversion, hlang;
- double fver;
- DWORD i, j, k;
- LONG err;
- BOOL found = FALSE;
- VALUE typelib;
- VALUE file = Qnil;
- VALUE clsid;
- VALUE ver;
- VALUE lang;
-
- err = reg_open_key(HKEY_CLASSES_ROOT, "TypeLib", &htypelib);
- if(err != ERROR_SUCCESS) {
- return Qnil;
- }
- for(i = 0; !found; i++) {
- clsid = reg_enum_key(htypelib, i);
- if (clsid == Qnil)
- break;
- err = reg_open_vkey(htypelib, clsid, &hclsid);
- if (err != ERROR_SUCCESS)
- continue;
- fver = 0;
- for(j = 0; !found; j++) {
- ver = reg_enum_key(hclsid, j);
- if (ver == Qnil)
- break;
- err = reg_open_vkey(hclsid, ver, &hversion);
- if (err != ERROR_SUCCESS || fver > atof(StringValuePtr(ver)))
- continue;
- fver = atof(StringValuePtr(ver));
- typelib = reg_get_val(hversion, NULL);
- if (typelib == Qnil)
- continue;
- if (rb_str_cmp(typelib, ole) == 0) {
- for(k = 0; !found; k++) {
- lang = reg_enum_key(hversion, k);
- if (lang == Qnil)
- break;
- err = reg_open_vkey(hversion, lang, &hlang);
- if (err == ERROR_SUCCESS) {
- if ((file = reg_get_typelib_file_path(hlang)) != Qnil)
- found = TRUE;
- RegCloseKey(hlang);
- }
- }
- }
- RegCloseKey(hversion);
- }
- RegCloseKey(hclsid);
- }
- RegCloseKey(htypelib);
- return file;
-}
-
-static VALUE
-typelib_file(VALUE ole)
-{
- VALUE file = typelib_file_from_clsid(ole);
- if (file != Qnil) {
- return file;
- }
- return typelib_file_from_typelib(ole);
-}
-
static void
ole_const_load(ITypeLib *pTypeLib, VALUE klass, VALUE self)
{
@@ -2750,10 +1932,10 @@ fole_s_connect(int argc, VALUE *argv, VALUE self)
ole_initialize();
rb_scan_args(argc, argv, "1*", &svr_name, &others);
- SafeStringValue(svr_name);
+ StringValue(svr_name);
if (rb_safe_level() > 0 && OBJ_TAINTED(svr_name)) {
- rb_raise(rb_eSecurityError, "Insecure Object Connection - %s",
- StringValuePtr(svr_name));
+ rb_raise(rb_eSecurityError, "insecure connection - `%s'",
+ StringValuePtr(svr_name));
}
/* get CLSID from OLE server name */
@@ -2797,7 +1979,7 @@ fole_s_connect(int argc, VALUE *argv, VALUE self)
* so constant variable name of WIN32OLE object is capitalized.
* For example, the 'xlTop' constant of Excel is changed to 'XlTop'
* in WIN32OLE.
- * If the first letter of constant variabl is not [A-Z], then
+ * If the first letter of constant variable is not [A-Z], then
* the constant is defined as CONSTANTS hash element.
*
* module EXCEL_CONST
@@ -2830,9 +2012,9 @@ fole_s_const_load(int argc, VALUE *argv, VALUE self)
LCID lcid = cWIN32OLE_lcid;
rb_scan_args(argc, argv, "11", &ole, &klass);
- if (TYPE(klass) != T_CLASS &&
- TYPE(klass) != T_MODULE &&
- TYPE(klass) != T_NIL) {
+ if (!RB_TYPE_P(klass, T_CLASS) &&
+ !RB_TYPE_P(klass, T_MODULE) &&
+ !RB_TYPE_P(klass, T_NIL)) {
rb_raise(rb_eTypeError, "2nd parameter must be Class or Module");
}
if (rb_obj_is_kind_of(ole, cWIN32OLE)) {
@@ -2848,7 +2030,7 @@ fole_s_const_load(int argc, VALUE *argv, VALUE self)
ole_raise(hr, rb_eRuntimeError, "failed to GetContainingTypeLib");
}
OLE_RELEASE(pTypeInfo);
- if(TYPE(klass) != T_NIL) {
+ if(!RB_TYPE_P(klass, T_NIL)) {
ole_const_load(pTypeLib, klass, self);
}
else {
@@ -2856,7 +2038,7 @@ fole_s_const_load(int argc, VALUE *argv, VALUE self)
}
OLE_RELEASE(pTypeLib);
}
- else if(TYPE(ole) == T_STRING) {
+ else if(RB_TYPE_P(ole, T_STRING)) {
file = typelib_file(ole);
if (file == Qnil) {
file = ole;
@@ -2866,7 +2048,7 @@ fole_s_const_load(int argc, VALUE *argv, VALUE self)
SysFreeString(pBuf);
if (FAILED(hr))
ole_raise(hr, eWIN32OLERuntimeError, "failed to LoadTypeLibEx");
- if(TYPE(klass) != T_NIL) {
+ if(!RB_TYPE_P(klass, T_NIL)) {
ole_const_load(pTypeLib, klass, self);
}
else {
@@ -2880,37 +2062,6 @@ fole_s_const_load(int argc, VALUE *argv, VALUE self)
return Qnil;
}
-static VALUE
-ole_types_from_typelib(ITypeLib *pTypeLib, VALUE classes)
-{
-
- long count;
- int i;
- HRESULT hr;
- BSTR bstr;
- ITypeInfo *pTypeInfo;
- VALUE type;
-
- count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
- for (i = 0; i < count; i++) {
- hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, i,
- &bstr, NULL, NULL, NULL);
- if (FAILED(hr))
- continue;
-
- hr = pTypeLib->lpVtbl->GetTypeInfo(pTypeLib, i, &pTypeInfo);
- if (FAILED(hr))
- continue;
-
- type = foletype_s_allocate(cWIN32OLE_TYPE);
- oletype_set_member(type, pTypeInfo, WC2VSTR(bstr));
-
- rb_ary_push(classes, type);
- OLE_RELEASE(pTypeInfo);
- }
- return classes;
-}
-
static ULONG
reference_count(struct oledata * pole)
{
@@ -3014,7 +2165,7 @@ fole_s_show_help(int argc, VALUE *argv, VALUE self)
} else {
helpfile = target;
}
- if (TYPE(helpfile) != T_STRING) {
+ if (!RB_TYPE_P(helpfile, T_STRING)) {
rb_raise(rb_eTypeError, "1st parameter must be (String|WIN32OLE_TYPE|WIN32OLE_METHOD)");
}
hwnd = ole_show_help(helpfile, helpcontext);
@@ -3085,7 +2236,7 @@ fole_s_set_code_page(VALUE self, VALUE vcp)
* WIN32OLE.locale -> locale id.
*
* Returns current locale id (lcid). The default locale is
- * LOCALE_SYSTEM_DEFAULT.
+ * WIN32OLE::LOCALE_SYSTEM_DEFAULT.
*
* lcid = WIN32OLE.locale
*/
@@ -3109,7 +2260,7 @@ static BOOL
lcid_installed(LCID lcid)
{
g_lcid_installed = FALSE;
- snprintf(g_lcid_to_check, sizeof(g_lcid_to_check), "%08lx", lcid);
+ snprintf(g_lcid_to_check, sizeof(g_lcid_to_check), "%08lx", (unsigned long)lcid);
EnumSystemLocales(installed_lcid_proc, LCID_INSTALLED);
return g_lcid_installed;
}
@@ -3171,7 +2322,7 @@ fole_s_create_guid(VALUE self)
/*
* WIN32OLE.ole_initialize and WIN32OLE.ole_uninitialize
* are used in win32ole.rb to fix the issue bug #2618 (ruby-core:27634).
- * You must not use thease method.
+ * You must not use these method.
*/
/* :nodoc */
@@ -3219,15 +2370,22 @@ fole_s_ole_uninitialize(VALUE self)
* excel.ActiveWorkbook.Close(0);
* excel.Quit();
*
- * Unfortunately, Win32OLE doesn't support the argument passed by
- * reference directly.
- * Instead, Win32OLE provides WIN32OLE::ARGV.
- * If you want to get the result value of argument passed by reference,
- * you can use WIN32OLE::ARGV.
+ * Unfortunately, Win32OLE doesn't support the argument passed by
+ * reference directly.
+ * Instead, Win32OLE provides WIN32OLE::ARGV or WIN32OLE_VARIANT object.
+ * If you want to get the result value of argument passed by reference,
+ * you can use WIN32OLE::ARGV or WIN32OLE_VARIANT.
*
* oleobj.method(arg1, arg2, refargv3)
* puts WIN32OLE::ARGV[2] # the value of refargv3 after called oleobj.method
*
+ * or
+ *
+ * refargv3 = WIN32OLE_VARIANT.new(XXX,
+ * WIN32OLE::VARIANT::VT_BYREF|WIN32OLE::VARIANT::VT_XXX)
+ * oleobj.method(arg1, arg2, refargv3)
+ * p refargv3.value # the value of refargv3 after called oleobj.method.
+ *
*/
/*
@@ -3257,16 +2415,16 @@ fole_initialize(int argc, VALUE *argv, VALUE self)
rb_call_super(0, 0);
rb_scan_args(argc, argv, "11*", &svr_name, &host, &others);
- SafeStringValue(svr_name);
+ StringValue(svr_name);
if (rb_safe_level() > 0 && OBJ_TAINTED(svr_name)) {
- rb_raise(rb_eSecurityError, "Insecure Object Creation - %s",
+ rb_raise(rb_eSecurityError, "insecure object creation - `%s'",
StringValuePtr(svr_name));
}
if (!NIL_P(host)) {
- SafeStringValue(host);
+ StringValue(host);
if (rb_safe_level() > 0 && OBJ_TAINTED(host)) {
- rb_raise(rb_eSecurityError, "Insecure Object Creation - %s",
- StringValuePtr(svr_name));
+ rb_raise(rb_eSecurityError, "insecure object creation - `%s'",
+ StringValuePtr(host));
}
return ole_create_dcom(self, svr_name, host, others);
}
@@ -3298,19 +2456,16 @@ fole_initialize(int argc, VALUE *argv, VALUE self)
return self;
}
-static VALUE
-hash2named_arg(RB_BLOCK_CALL_FUNC_ARGLIST(pair, op))
+static int
+hash2named_arg(VALUE key, VALUE val, VALUE pop)
{
- struct oleparam* pOp = (struct oleparam *)op;
+ struct oleparam* pOp = (struct oleparam *)pop;
unsigned int index, i;
- VALUE key, value;
index = pOp->dp.cNamedArgs;
-
/*---------------------------------------------
the data-type of key must be String or Symbol
-----------------------------------------------*/
- key = rb_ary_entry(pair, 0);
- if(TYPE(key) != T_STRING && TYPE(key) != T_SYMBOL) {
+ if(!RB_TYPE_P(key, T_STRING) && !RB_TYPE_P(key, T_SYMBOL)) {
/* clear name of dispatch parameters */
for(i = 1; i < index + 1; i++) {
SysFreeString(pOp->pNamedArgs[i]);
@@ -3322,19 +2477,18 @@ hash2named_arg(RB_BLOCK_CALL_FUNC_ARGLIST(pair, op))
/* raise an exception */
rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)");
}
- if (TYPE(key) == T_SYMBOL) {
+ if (RB_TYPE_P(key, T_SYMBOL)) {
key = rb_sym_to_s(key);
}
/* pNamedArgs[0] is <method name>, so "index + 1" */
pOp->pNamedArgs[index + 1] = ole_vstr2wc(key);
- value = rb_ary_entry(pair, 1);
VariantInit(&(pOp->dp.rgvarg[index]));
- ole_val2variant(value, &(pOp->dp.rgvarg[index]));
+ ole_val2variant(val, &(pOp->dp.rgvarg[index]));
pOp->dp.cNamedArgs += 1;
- return Qnil;
+ return ST_CONTINUE;
}
static VALUE
@@ -3346,7 +2500,9 @@ set_argv(VARIANTARG* realargs, unsigned int beg, unsigned int end)
rb_ary_clear(argv);
while (end-- > beg) {
rb_ary_push(argv, ole_variant2val(&realargs[end]));
- VariantClear(&realargs[end]);
+ if (V_VT(&realargs[end]) != VT_RECORD) {
+ VariantClear(&realargs[end]);
+ }
}
return argv;
}
@@ -3386,10 +2542,10 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket)
op.dp.cArgs = 0;
rb_scan_args(argc, argv, "1*", &cmd, &paramS);
- if(TYPE(cmd) != T_STRING && TYPE(cmd) != T_SYMBOL && !is_bracket) {
+ if(!RB_TYPE_P(cmd, T_STRING) && !RB_TYPE_P(cmd, T_SYMBOL) && !is_bracket) {
rb_raise(rb_eTypeError, "method is wrong type (expected String or Symbol)");
}
- if (TYPE(cmd) == T_SYMBOL) {
+ if (RB_TYPE_P(cmd, T_SYMBOL)) {
cmd = rb_sym_to_s(cmd);
}
OLEData_Get_Struct(self, pole);
@@ -3418,15 +2574,16 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket)
op.dp.cNamedArgs = 0;
/* if last arg is hash object */
- if(TYPE(param) == T_HASH) {
+ if(RB_TYPE_P(param, T_HASH)) {
/*------------------------------------------
hash object ==> named dispatch parameters
--------------------------------------------*/
- cNamedArgs = NUM2INT(rb_funcall(param, rb_intern("length"), 0));
+ cNamedArgs = rb_long2int(RHASH_SIZE(param));
op.dp.cArgs = cNamedArgs + argc - 2;
op.pNamedArgs = ALLOCA_N(OLECHAR*, cNamedArgs + 1);
op.dp.rgvarg = ALLOCA_N(VARIANTARG, op.dp.cArgs);
- rb_block_call(param, rb_intern("each"), 0, 0, hash2named_arg, (VALUE)&op);
+
+ rb_hash_foreach(param, hash2named_arg, (VALUE)&op);
pDispID = ALLOCA_N(DISPID, cNamedArgs + 1);
op.pNamedArgs[0] = ole_vstr2wc(cmd);
@@ -3487,7 +2644,6 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket)
op.dp.rgdispidNamedArgs = ALLOCA_N( DISPID, 1 );
op.dp.rgdispidNamedArgs[0] = DISPID_PROPERTYPUT;
}
-
hr = pole->pDispatch->lpVtbl->Invoke(pole->pDispatch, DispID,
&IID_NULL, lcid, wFlags, &op.dp,
&result, &excepinfo, &argErr);
@@ -3527,7 +2683,9 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket)
}
for(i = cNamedArgs; i < op.dp.cArgs; i++) {
n = op.dp.cArgs - i + cNamedArgs - 1;
- VariantClear(&op.dp.rgvarg[n]);
+ if (V_VT(&op.dp.rgvarg[n]) != VT_RECORD) {
+ VariantClear(&op.dp.rgvarg[n]);
+ }
}
}
@@ -3550,7 +2708,9 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket)
&excepinfo, &argErr);
for(i = cNamedArgs; i < op.dp.cArgs; i++) {
n = op.dp.cArgs - i + cNamedArgs - 1;
- VariantClear(&op.dp.rgvarg[n]);
+ if (V_VT(&op.dp.rgvarg[n]) != VT_RECORD) {
+ VariantClear(&op.dp.rgvarg[n]);
+ }
}
}
}
@@ -3563,6 +2723,9 @@ ole_invoke(int argc, VALUE *argv, VALUE self, USHORT wFlags, BOOL is_bracket)
param = rb_ary_entry(paramS, i-cNamedArgs);
if (rb_obj_is_kind_of(param, cWIN32OLE_VARIANT)) {
ole_val2variant(param, &realargs[n]);
+ } else if ( rb_obj_is_kind_of(param, cWIN32OLE_RECORD) &&
+ V_VT(&realargs[n]) == VT_RECORD ) {
+ olerecord_set_ivar(param, V_RECORDINFO(&realargs[n]), V_RECORD(&realargs[n]));
}
}
set_argv(realargs, cNamedArgs, op.dp.cArgs);
@@ -4119,141 +3282,6 @@ fole_missing(int argc, VALUE *argv, VALUE self)
}
}
-static VALUE
-ole_method_sub(VALUE self, ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE name)
-{
- HRESULT hr;
- TYPEATTR *pTypeAttr;
- BSTR bstr;
- FUNCDESC *pFuncDesc;
- WORD i;
- VALUE fname;
- VALUE method = Qnil;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
- }
- for(i = 0; i < pTypeAttr->cFuncs && method == Qnil; i++) {
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, i, &pFuncDesc);
- if (FAILED(hr))
- continue;
-
- hr = pTypeInfo->lpVtbl->GetDocumentation(pTypeInfo, pFuncDesc->memid,
- &bstr, NULL, NULL, NULL);
- if (FAILED(hr)) {
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- continue;
- }
- fname = WC2VSTR(bstr);
- if (strcasecmp(StringValuePtr(name), StringValuePtr(fname)) == 0) {
- olemethod_set_member(self, pTypeInfo, pOwnerTypeInfo, i, fname);
- method = self;
- }
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- pFuncDesc=NULL;
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return method;
-}
-
-static VALUE
-olemethod_from_typeinfo(VALUE self, ITypeInfo *pTypeInfo, VALUE name)
-{
- HRESULT hr;
- TYPEATTR *pTypeAttr;
- WORD i;
- HREFTYPE href;
- ITypeInfo *pRefTypeInfo;
- VALUE method = Qnil;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
- }
- method = ole_method_sub(self, 0, pTypeInfo, name);
- if (method != Qnil) {
- return method;
- }
- for(i=0; i < pTypeAttr->cImplTypes && method == Qnil; i++){
- hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo, i, &href);
- if(FAILED(hr))
- continue;
- hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo, href, &pRefTypeInfo);
- if (FAILED(hr))
- continue;
- method = ole_method_sub(self, pTypeInfo, pRefTypeInfo, name);
- OLE_RELEASE(pRefTypeInfo);
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return method;
-}
-
-static VALUE
-ole_methods_sub(ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE methods, int mask)
-{
- HRESULT hr;
- TYPEATTR *pTypeAttr;
- BSTR bstr;
- FUNCDESC *pFuncDesc;
- VALUE method;
- WORD i;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
- }
- for(i = 0; i < pTypeAttr->cFuncs; i++) {
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, i, &pFuncDesc);
- if (FAILED(hr))
- continue;
-
- hr = pTypeInfo->lpVtbl->GetDocumentation(pTypeInfo, pFuncDesc->memid,
- &bstr, NULL, NULL, NULL);
- if (FAILED(hr)) {
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- continue;
- }
- if(pFuncDesc->invkind & mask) {
- method = folemethod_s_allocate(cWIN32OLE_METHOD);
- olemethod_set_member(method, pTypeInfo, pOwnerTypeInfo,
- i, WC2VSTR(bstr));
- rb_ary_push(methods, method);
- }
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- pFuncDesc=NULL;
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
-
- return methods;
-}
-
-static VALUE
-ole_methods_from_typeinfo(ITypeInfo *pTypeInfo, int mask)
-{
- HRESULT hr;
- TYPEATTR *pTypeAttr;
- WORD i;
- HREFTYPE href;
- ITypeInfo *pRefTypeInfo;
- VALUE methods = rb_ary_new();
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
- }
-
- ole_methods_sub(0, pTypeInfo, methods, mask);
- for(i=0; i < pTypeAttr->cImplTypes; i++){
- hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo, i, &href);
- if(FAILED(hr))
- continue;
- hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo, href, &pRefTypeInfo);
- if (FAILED(hr))
- continue;
- ole_methods_sub(pTypeInfo, pRefTypeInfo, methods, mask);
- OLE_RELEASE(pRefTypeInfo);
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return methods;
-}
-
static HRESULT
typeinfo_from_ole(struct oledata *pole, ITypeInfo **ppti)
{
@@ -4380,30 +3408,6 @@ fole_func_methods(VALUE self)
return ole_methods( self, INVOKE_FUNC);
}
-static VALUE
-ole_type_from_itypeinfo(ITypeInfo *pTypeInfo)
-{
- ITypeLib *pTypeLib;
- VALUE type = Qnil;
- HRESULT hr;
- unsigned int index;
- BSTR bstr;
-
- hr = pTypeInfo->lpVtbl->GetContainingTypeLib( pTypeInfo, &pTypeLib, &index );
- if(FAILED(hr)) {
- return Qnil;
- }
- hr = pTypeLib->lpVtbl->GetDocumentation( pTypeLib, index,
- &bstr, NULL, NULL, NULL);
- OLE_RELEASE(pTypeLib);
- if (FAILED(hr)) {
- return Qnil;
- }
- type = foletype_s_allocate(cWIN32OLE_TYPE);
- oletype_set_member(type, pTypeInfo, WC2VSTR(bstr));
- return type;
-}
-
/*
* call-seq:
* WIN32OLE#ole_type
@@ -4436,23 +3440,6 @@ fole_type(VALUE self)
return type;
}
-static VALUE
-ole_typelib_from_itypeinfo(ITypeInfo *pTypeInfo)
-{
- HRESULT hr;
- ITypeLib *pTypeLib;
- unsigned int index;
- VALUE retval = Qnil;
-
- hr = pTypeInfo->lpVtbl->GetContainingTypeLib(pTypeInfo, &pTypeLib, &index);
- if(FAILED(hr)) {
- return Qnil;
- }
- retval = rb_funcall(cWIN32OLE_TYPELIB, rb_intern("allocate"), 0);
- oletypelib_set_member(retval, pTypeLib);
- return retval;
-}
-
/*
* call-seq:
* WIN32OLE#ole_typelib -> The WIN32OLE_TYPELIB object
@@ -4549,11 +3536,11 @@ fole_respond_to(VALUE self, VALUE method)
BSTR wcmdname;
DISPID DispID;
HRESULT hr;
- if(TYPE(method) != T_STRING && TYPE(method) != T_SYMBOL) {
- rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)");
+ if(!RB_TYPE_P(method, T_STRING) && !RB_TYPE_P(method, T_SYMBOL)) {
+ rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)");
}
- if (TYPE(method) == T_SYMBOL) {
- method = rb_sym_to_s(method);
+ if (RB_TYPE_P(method, T_SYMBOL)) {
+ method = rb_sym_to_s(method);
}
OLEData_Get_Struct(self, pole);
wcmdname = ole_vstr2wc(method);
@@ -4563,7 +3550,7 @@ fole_respond_to(VALUE self, VALUE method)
return SUCCEEDED(hr) ? Qtrue : Qfalse;
}
-static HRESULT
+HRESULT
ole_docinfo_from_type(ITypeInfo *pTypeInfo, BSTR *name, BSTR *helpstr, DWORD *helpcontext, BSTR *helpfile)
{
HRESULT hr;
@@ -4624,7 +3611,7 @@ ole_ptrtype2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails)
return type;
}
-static VALUE
+VALUE
ole_typedesc2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails)
{
VALUE str;
@@ -4729,6 +3716,9 @@ ole_typedesc2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails)
case VT_LPSTR:
typestr = rb_str_new2("LPSTR");
break;
+ case VT_RECORD:
+ typestr = rb_str_new2("RECORD");
+ break;
default:
typestr = rb_str_new2("Unknown Type ");
rb_str_concat(typestr, rb_fix2str(INT2FIX(pTypeDesc->vt), 10));
@@ -4756,15 +3746,16 @@ fole_method_help(VALUE self, VALUE cmdname)
ITypeInfo *pTypeInfo;
HRESULT hr;
struct oledata *pole;
- VALUE method, obj;
+ VALUE obj;
SafeStringValue(cmdname);
OLEData_Get_Struct(self, pole);
hr = typeinfo_from_ole(pole, &pTypeInfo);
if(FAILED(hr))
ole_raise(hr, rb_eRuntimeError, "failed to get ITypeInfo");
- method = folemethod_s_allocate(cWIN32OLE_METHOD);
- obj = olemethod_from_typeinfo(method, pTypeInfo, cmdname);
+
+ obj = create_win32ole_method(pTypeInfo, cmdname);
+
OLE_RELEASE(pTypeInfo);
if (obj == Qnil)
rb_raise(eWIN32OLERuntimeError, "not found %s",
@@ -4820,4284 +3811,23 @@ fole_activex_initialize(VALUE self)
return Qnil;
}
-/*
- * call-seq:
- * WIN32OLE_TYPE.ole_classes(typelib)
- *
- * Returns array of WIN32OLE_TYPE objects defined by the <i>typelib</i> type library.
- * This method will be OBSOLETE. Use WIN32OLE_TYPELIB.new(typelib).ole_classes instead.
- */
-static VALUE
-foletype_s_ole_classes(VALUE self, VALUE typelib)
-{
- VALUE obj;
-
- /*
- rb_warn("%s is obsolete; use %s instead.",
- "WIN32OLE_TYPE.ole_classes",
- "WIN32OLE_TYPELIB.new(typelib).ole_types");
- */
- obj = rb_funcall(cWIN32OLE_TYPELIB, rb_intern("new"), 1, typelib);
- return rb_funcall(obj, rb_intern("ole_types"), 0);
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE.typelibs
- *
- * Returns array of type libraries.
- * This method will be OBSOLETE. Use WIN32OLE_TYPELIB.typelibs.collect{|t| t.name} instead.
- *
- */
-static VALUE
-foletype_s_typelibs(VALUE self)
-{
- /*
- rb_warn("%s is obsolete. use %s instead.",
- "WIN32OLE_TYPE.typelibs",
- "WIN32OLE_TYPELIB.typelibs.collect{t|t.name}");
- */
- return rb_eval_string("WIN32OLE_TYPELIB.typelibs.collect{|t|t.name}");
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE.progids
- *
- * Returns array of ProgID.
- */
-static VALUE
-foletype_s_progids(VALUE self)
-{
- HKEY hclsids, hclsid;
- DWORD i;
- LONG err;
- VALUE clsid;
- VALUE v = rb_str_new2("");
- VALUE progids = rb_ary_new();
-
- err = reg_open_key(HKEY_CLASSES_ROOT, "CLSID", &hclsids);
- if(err != ERROR_SUCCESS) {
- return progids;
- }
- for(i = 0; ; i++) {
- clsid = reg_enum_key(hclsids, i);
- if (clsid == Qnil)
- break;
- err = reg_open_vkey(hclsids, clsid, &hclsid);
- if (err != ERROR_SUCCESS)
- continue;
- if ((v = reg_get_val2(hclsid, "ProgID")) != Qnil)
- rb_ary_push(progids, v);
- if ((v = reg_get_val2(hclsid, "VersionIndependentProgID")) != Qnil)
- rb_ary_push(progids, v);
- RegCloseKey(hclsid);
- }
- RegCloseKey(hclsids);
- return progids;
-}
-
-static VALUE
-foletype_s_allocate(VALUE klass)
-{
- struct oletypedata *poletype;
- VALUE obj;
- ole_initialize();
- obj = Data_Make_Struct(klass,struct oletypedata,0,oletype_free,poletype);
- poletype->pTypeInfo = NULL;
- return obj;
-}
-
-static VALUE
-oletype_set_member(VALUE self, ITypeInfo *pTypeInfo, VALUE name)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- rb_ivar_set(self, rb_intern("name"), name);
- ptype->pTypeInfo = pTypeInfo;
- if(pTypeInfo) OLE_ADDREF(pTypeInfo);
- return self;
-}
-
-static VALUE
-oleclass_from_typelib(VALUE self, ITypeLib *pTypeLib, VALUE oleclass)
-{
-
- long count;
- int i;
- HRESULT hr;
- BSTR bstr;
- VALUE typelib;
- ITypeInfo *pTypeInfo;
-
- VALUE found = Qfalse;
-
- count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
- for (i = 0; i < count && found == Qfalse; i++) {
- hr = pTypeLib->lpVtbl->GetTypeInfo(pTypeLib, i, &pTypeInfo);
- if (FAILED(hr))
- continue;
- hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, i,
- &bstr, NULL, NULL, NULL);
- if (FAILED(hr))
- continue;
- typelib = WC2VSTR(bstr);
- if (rb_str_cmp(oleclass, typelib) == 0) {
- oletype_set_member(self, pTypeInfo, typelib);
- found = Qtrue;
- }
- OLE_RELEASE(pTypeInfo);
- }
- return found;
-}
-
-/*
- * Document-class: WIN32OLE_TYPELIB
- *
- * <code>WIN32OLE_TYPELIB</code> objects represent OLE tyblib information.
- */
-
-static VALUE
-oletypelib_set_member(VALUE self, ITypeLib *pTypeLib)
-{
- struct oletypelibdata *ptlib;
- Data_Get_Struct(self, struct oletypelibdata, ptlib);
- ptlib->pTypeLib = pTypeLib;
- return self;
-}
-
-static ITypeLib *
-oletypelib_get_typelib(VALUE self)
-{
- struct oletypelibdata *ptlib;
- Data_Get_Struct(self, struct oletypelibdata, ptlib);
- return ptlib->pTypeLib;
-}
-
-static void
-oletypelib_get_libattr(ITypeLib *pTypeLib, TLIBATTR **ppTLibAttr)
+HRESULT
+typelib_from_val(VALUE obj, ITypeLib **pTypeLib)
{
- HRESULT hr;
- hr = pTypeLib->lpVtbl->GetLibAttr(pTypeLib, ppTLibAttr);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError,
- "failed to get library attribute(TLIBATTR) from ITypeLib");
- }
-}
-
-/*
- * call-seq:
- *
- * WIN32OLE_TYPELIB.typelibs
- *
- * Returns the array of WIN32OLE_TYPELIB object.
- *
- * tlibs = WIN32OLE_TYPELIB.typelibs
- *
- */
-static VALUE
-foletypelib_s_typelibs(VALUE self)
-{
- HKEY htypelib, hguid;
- DWORD i, j;
- LONG err;
- VALUE guid;
- VALUE version;
- VALUE name = Qnil;
- VALUE typelibs = rb_ary_new();
- VALUE typelib = Qnil;
- HRESULT hr;
- ITypeLib *pTypeLib;
-
- err = reg_open_key(HKEY_CLASSES_ROOT, "TypeLib", &htypelib);
- if(err != ERROR_SUCCESS) {
- return typelibs;
- }
- for(i = 0; ; i++) {
- guid = reg_enum_key(htypelib, i);
- if (guid == Qnil)
- break;
- err = reg_open_vkey(htypelib, guid, &hguid);
- if (err != ERROR_SUCCESS)
- continue;
- for(j = 0; ; j++) {
- version = reg_enum_key(hguid, j);
- if (version == Qnil)
- break;
- if ( (name = reg_get_val2(hguid, StringValuePtr(version))) != Qnil ) {
- hr = oletypelib_from_guid(guid, version, &pTypeLib);
- if (SUCCEEDED(hr)) {
- typelib = rb_funcall(cWIN32OLE_TYPELIB, rb_intern("allocate"), 0);
- oletypelib_set_member(typelib, pTypeLib);
- rb_ary_push(typelibs, typelib);
- }
- }
- }
- RegCloseKey(hguid);
- }
- RegCloseKey(htypelib);
- return typelibs;
-}
-
-static VALUE
-make_version_str(VALUE major, VALUE minor)
-{
- VALUE version_str = Qnil;
- VALUE minor_str = Qnil;
- if (major == Qnil) {
- return Qnil;
- }
- version_str = rb_String(major);
- if (minor != Qnil) {
- minor_str = rb_String(minor);
- rb_str_cat2(version_str, ".");
- rb_str_append(version_str, minor_str);
- }
- return version_str;
-}
-
-static VALUE
-oletypelib_search_registry2(VALUE self, VALUE args)
-{
- HKEY htypelib, hguid, hversion;
- double fver;
- DWORD j;
- LONG err;
- VALUE found = Qfalse;
- VALUE tlib;
- VALUE ver;
- VALUE version_str;
- VALUE version = Qnil;
- VALUE typelib = Qnil;
- HRESULT hr;
- ITypeLib *pTypeLib;
-
- VALUE guid = rb_ary_entry(args, 0);
- version_str = make_version_str(rb_ary_entry(args, 1), rb_ary_entry(args, 2));
-
- err = reg_open_key(HKEY_CLASSES_ROOT, "TypeLib", &htypelib);
- if(err != ERROR_SUCCESS) {
- return Qfalse;
- }
- err = reg_open_vkey(htypelib, guid, &hguid);
- if (err != ERROR_SUCCESS) {
- RegCloseKey(htypelib);
- return Qfalse;
- }
- if (version_str != Qnil) {
- err = reg_open_vkey(hguid, version_str, &hversion);
- if (err == ERROR_SUCCESS) {
- tlib = reg_get_val(hversion, NULL);
- if (tlib != Qnil) {
- typelib = tlib;
- version = version_str;
- }
- }
- RegCloseKey(hversion);
- } else {
- fver = 0.0;
- for(j = 0; ;j++) {
- ver = reg_enum_key(hguid, j);
- if (ver == Qnil)
- break;
- err = reg_open_vkey(hguid, ver, &hversion);
- if (err != ERROR_SUCCESS)
- continue;
- tlib = reg_get_val(hversion, NULL);
- if (tlib == Qnil) {
- RegCloseKey(hversion);
- continue;
- }
- if (fver < atof(StringValuePtr(ver))) {
- fver = atof(StringValuePtr(ver));
- version = ver;
- typelib = tlib;
- }
- RegCloseKey(hversion);
- }
- }
- RegCloseKey(hguid);
- RegCloseKey(htypelib);
- if (typelib != Qnil) {
- hr = oletypelib_from_guid(guid, version, &pTypeLib);
- if (SUCCEEDED(hr)) {
- found = Qtrue;
- oletypelib_set_member(self, pTypeLib);
- }
- }
- return found;
-}
-
-static VALUE
-oletypelib_search_registry(VALUE self, VALUE typelib)
-{
- HKEY htypelib, hguid, hversion;
- DWORD i, j;
- LONG err;
- VALUE found = Qfalse;
- VALUE tlib;
- VALUE guid;
- VALUE ver;
- HRESULT hr;
- ITypeLib *pTypeLib;
-
- err = reg_open_key(HKEY_CLASSES_ROOT, "TypeLib", &htypelib);
- if(err != ERROR_SUCCESS) {
- return Qfalse;
- }
- for(i = 0; !found; i++) {
- guid = reg_enum_key(htypelib, i);
- if (guid == Qnil)
- break;
- err = reg_open_vkey(htypelib, guid, &hguid);
- if (err != ERROR_SUCCESS)
- continue;
- for(j = 0; found == Qfalse; j++) {
- ver = reg_enum_key(hguid, j);
- if (ver == Qnil)
- break;
- err = reg_open_vkey(hguid, ver, &hversion);
- if (err != ERROR_SUCCESS)
- continue;
- tlib = reg_get_val(hversion, NULL);
- if (tlib == Qnil) {
- RegCloseKey(hversion);
- continue;
- }
- if (rb_str_cmp(typelib, tlib) == 0) {
- hr = oletypelib_from_guid(guid, ver, &pTypeLib);
- if (SUCCEEDED(hr)) {
- oletypelib_set_member(self, pTypeLib);
- found = Qtrue;
- }
- }
- RegCloseKey(hversion);
- }
- RegCloseKey(hguid);
- }
- RegCloseKey(htypelib);
- return found;
-}
-
-static VALUE
-foletypelib_s_allocate(VALUE klass)
-{
- struct oletypelibdata *poletypelib;
- VALUE obj;
- ole_initialize();
- obj = Data_Make_Struct(klass, struct oletypelibdata, 0, oletypelib_free, poletypelib);
- poletypelib->pTypeLib = NULL;
- return obj;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB.new(typelib [, version1, version2]) -> WIN32OLE_TYPELIB object
- *
- * Returns a new WIN32OLE_TYPELIB object.
- *
- * The first argument <i>typelib</i> specifies OLE type library name or GUID or
- * OLE library file.
- * The second argument is major version or version of the type library.
- * The third argument is minor version.
- * The second argument and third argument are optional.
- * If the first argument is type library name, then the second and third argument
- * are ignored.
- *
- * tlib1 = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * tlib2 = WIN32OLE_TYPELIB.new('{00020813-0000-0000-C000-000000000046}')
- * tlib3 = WIN32OLE_TYPELIB.new('{00020813-0000-0000-C000-000000000046}', 1.3)
- * tlib4 = WIN32OLE_TYPELIB.new('{00020813-0000-0000-C000-000000000046}', 1, 3)
- * tlib5 = WIN32OLE_TYPELIB.new("C:\\WINNT\\SYSTEM32\\SHELL32.DLL")
- * puts tlib1.name # -> 'Microsoft Excel 9.0 Object Library'
- * puts tlib2.name # -> 'Microsoft Excel 9.0 Object Library'
- * puts tlib3.name # -> 'Microsoft Excel 9.0 Object Library'
- * puts tlib4.name # -> 'Microsoft Excel 9.0 Object Library'
- * puts tlib5.name # -> 'Microsoft Shell Controls And Automation'
- *
- */
-static VALUE
-foletypelib_initialize(VALUE self, VALUE args)
-{
- VALUE found = Qfalse;
- VALUE typelib = Qnil;
- int len = 0;
- OLECHAR * pbuf;
- ITypeLib *pTypeLib;
- HRESULT hr = S_OK;
-
- len = RARRAY_LEN(args);
- if (len < 1 || len > 3) {
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", len);
- }
-
- typelib = rb_ary_entry(args, 0);
-
- SafeStringValue(typelib);
-
- found = oletypelib_search_registry(self, typelib);
- if (found == Qfalse) {
- found = oletypelib_search_registry2(self, args);
- }
- if (found == Qfalse) {
- pbuf = ole_vstr2wc(typelib);
- hr = LoadTypeLibEx(pbuf, REGKIND_NONE, &pTypeLib);
- SysFreeString(pbuf);
- if (SUCCEEDED(hr)) {
- found = Qtrue;
- oletypelib_set_member(self, pTypeLib);
- }
- }
-
- if (found == Qfalse) {
- rb_raise(eWIN32OLERuntimeError, "not found type library `%s`",
- StringValuePtr(typelib));
- }
- return self;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB#guid -> The guid string.
- *
- * Returns guid string which specifies type library.
- *
- * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * guid = tlib.guid # -> '{00020813-0000-0000-C000-000000000046}'
- */
-static VALUE
-foletypelib_guid(VALUE self)
-{
- ITypeLib *pTypeLib;
- OLECHAR bstr[80];
- VALUE guid = Qnil;
- int len;
- TLIBATTR *pTLibAttr;
-
- pTypeLib = oletypelib_get_typelib(self);
- oletypelib_get_libattr(pTypeLib, &pTLibAttr);
- len = StringFromGUID2(&pTLibAttr->guid, bstr, sizeof(bstr)/sizeof(OLECHAR));
- if (len > 3) {
- guid = ole_wc2vstr(bstr, FALSE);
- }
- pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
- return guid;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB#name -> The type library name
- *
- * Returns the type library name.
- *
- * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * name = tlib.name # -> 'Microsoft Excel 9.0 Object Library'
- */
-static VALUE
-foletypelib_name(VALUE self)
-{
- ITypeLib *pTypeLib;
- HRESULT hr;
- BSTR bstr;
- VALUE name;
- pTypeLib = oletypelib_get_typelib(self);
- hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, -1,
- NULL, &bstr, NULL, NULL);
-
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "failed to get name from ITypeLib");
- }
- name = WC2VSTR(bstr);
- return name;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB#version -> The type library version.
- *
- * Returns the type library version.
- *
- * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * puts tlib.version #-> 1.3
- */
-static VALUE
-foletypelib_version(VALUE self)
-{
- TLIBATTR *pTLibAttr;
- VALUE major;
- VALUE minor;
- ITypeLib *pTypeLib;
-
- pTypeLib = oletypelib_get_typelib(self);
- oletypelib_get_libattr(pTypeLib, &pTLibAttr);
- major = INT2NUM(pTLibAttr->wMajorVerNum);
- minor = INT2NUM(pTLibAttr->wMinorVerNum);
- pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
- return rb_Float(make_version_str(major, minor));
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB#major_version -> The type library major version.
- *
- * Returns the type library major version.
- *
- * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * puts tlib.major_version # -> 1
- */
-static VALUE
-foletypelib_major_version(VALUE self)
-{
- TLIBATTR *pTLibAttr;
- VALUE major;
- ITypeLib *pTypeLib;
- pTypeLib = oletypelib_get_typelib(self);
- oletypelib_get_libattr(pTypeLib, &pTLibAttr);
-
- major = INT2NUM(pTLibAttr->wMajorVerNum);
- pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
- return major;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB#minor_version -> The type library minor version.
- *
- * Returns the type library minor version.
- *
- * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * puts tlib.minor_version # -> 3
- */
-static VALUE
-foletypelib_minor_version(VALUE self)
-{
- TLIBATTR *pTLibAttr;
- VALUE minor;
- ITypeLib *pTypeLib;
- pTypeLib = oletypelib_get_typelib(self);
- oletypelib_get_libattr(pTypeLib, &pTLibAttr);
- minor = INT2NUM(pTLibAttr->wMinorVerNum);
- pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
- return minor;
-}
-
-static VALUE
-oletypelib_path(VALUE guid, VALUE version)
-{
- int k;
- LONG err;
- HKEY hkey;
- HKEY hlang;
- VALUE lang;
- VALUE path = Qnil;
-
- VALUE key = rb_str_new2("TypeLib\\");
- rb_str_concat(key, guid);
- rb_str_cat2(key, "\\");
- rb_str_concat(key, version);
-
- err = reg_open_vkey(HKEY_CLASSES_ROOT, key, &hkey);
- if (err != ERROR_SUCCESS) {
- return Qnil;
- }
- for(k = 0; path == Qnil; k++) {
- lang = reg_enum_key(hkey, k);
- if (lang == Qnil)
- break;
- err = reg_open_vkey(hkey, lang, &hlang);
- if (err == ERROR_SUCCESS) {
- path = reg_get_typelib_file_path(hlang);
- RegCloseKey(hlang);
- }
- }
- RegCloseKey(hkey);
- return path;
-}
-
-static HRESULT
-oletypelib_from_guid(VALUE guid, VALUE version, ITypeLib **ppTypeLib)
-{
- VALUE path;
- OLECHAR *pBuf;
- HRESULT hr;
- path = oletypelib_path(guid, version);
- if (path == Qnil) {
- return E_UNEXPECTED;
- }
- pBuf = ole_vstr2wc(path);
- hr = LoadTypeLibEx(pBuf, REGKIND_NONE, ppTypeLib);
- SysFreeString(pBuf);
- return hr;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB#path -> The type library file path.
- *
- * Returns the type library file path.
- *
- * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * puts tlib.path #-> 'C:\...\EXCEL9.OLB'
- */
-static VALUE
-foletypelib_path(VALUE self)
-{
- TLIBATTR *pTLibAttr;
- HRESULT hr = S_OK;
- BSTR bstr;
LCID lcid = cWIN32OLE_lcid;
- VALUE path;
- ITypeLib *pTypeLib;
-
- pTypeLib = oletypelib_get_typelib(self);
- oletypelib_get_libattr(pTypeLib, &pTLibAttr);
- hr = QueryPathOfRegTypeLib(&pTLibAttr->guid,
- pTLibAttr->wMajorVerNum,
- pTLibAttr->wMinorVerNum,
- lcid,
- &bstr);
- if (FAILED(hr)) {
- pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
- ole_raise(hr, eWIN32OLERuntimeError, "failed to QueryPathOfRegTypeTypeLib");
- }
-
- pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
- path = WC2VSTR(bstr);
- return path;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB#visible?
- *
- * Returns true if the type library information is not hidden.
- * If wLibFlags of TLIBATTR is 0 or LIBFLAG_FRESTRICTED or LIBFLAG_FHIDDEN,
- * the method returns false, otherwise, returns true.
- * If the method fails to access the TLIBATTR information, then
- * WIN32OLERuntimeError is raised.
- *
- * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * tlib.visible? # => true
- */
-static VALUE
-foletypelib_visible(VALUE self)
-{
- ITypeLib *pTypeLib = NULL;
- VALUE visible = Qtrue;
- TLIBATTR *pTLibAttr;
-
- pTypeLib = oletypelib_get_typelib(self);
- oletypelib_get_libattr(pTypeLib, &pTLibAttr);
-
- if ((pTLibAttr->wLibFlags == 0) ||
- (pTLibAttr->wLibFlags & LIBFLAG_FRESTRICTED) ||
- (pTLibAttr->wLibFlags & LIBFLAG_FHIDDEN)) {
- visible = Qfalse;
- }
- pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
- return visible;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB#library_name
- *
- * Returns library name.
- * If the method fails to access library name, WIN32OLERuntimeError is raised.
- *
- * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * tlib.library_name # => Excel
- */
-static VALUE
-foletypelib_library_name(VALUE self)
-{
- HRESULT hr;
- ITypeLib *pTypeLib = NULL;
- VALUE libname = Qnil;
- BSTR bstr;
-
- pTypeLib = oletypelib_get_typelib(self);
- hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, -1,
- &bstr, NULL, NULL, NULL);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "failed to get library name");
- }
- libname = WC2VSTR(bstr);
- return libname;
-}
-
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB#ole_types -> The array of WIN32OLE_TYPE object included the type library.
- *
- * Returns the type library file path.
- *
- * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * classes = tlib.ole_types.collect{|k| k.name} # -> ['AddIn', 'AddIns' ...]
- */
-static VALUE
-foletypelib_ole_types(VALUE self)
-{
- ITypeLib *pTypeLib = NULL;
- VALUE classes = rb_ary_new();
- pTypeLib = oletypelib_get_typelib(self);
- ole_types_from_typelib(pTypeLib, classes);
- return classes;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPELIB#inspect -> String
- *
- * Returns the type library name with class name.
- *
- * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
- * tlib.inspect # => "<#WIN32OLE_TYPELIB:Microsoft Excel 9.0 Object Library>"
- */
-static VALUE
-foletypelib_inspect(VALUE self)
-{
- return default_inspect(self, "WIN32OLE_TYPELIB");
-}
-
-/*
- * Document-class: WIN32OLE_TYPE
- *
- * <code>WIN32OLE_TYPE</code> objects represent OLE type libarary information.
- */
-
-/*
- * call-seq:
- * WIN32OLE_TYPE.new(typelib, ole_class) -> WIN32OLE_TYPE object
- *
- * Returns a new WIN32OLE_TYPE object.
- * The first argument <i>typelib</i> specifies OLE type library name.
- * The second argument specifies OLE class name.
- *
- * WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
- * # => WIN32OLE_TYPE object of Application class of Excel.
- */
-static VALUE
-foletype_initialize(VALUE self, VALUE typelib, VALUE oleclass)
-{
- VALUE file;
- OLECHAR * pbuf;
- ITypeLib *pTypeLib;
- HRESULT hr;
-
- SafeStringValue(oleclass);
- SafeStringValue(typelib);
- file = typelib_file(typelib);
- if (file == Qnil) {
- file = typelib;
- }
- pbuf = ole_vstr2wc(file);
- hr = LoadTypeLibEx(pbuf, REGKIND_NONE, &pTypeLib);
- if (FAILED(hr))
- ole_raise(hr, eWIN32OLERuntimeError, "failed to LoadTypeLibEx");
- SysFreeString(pbuf);
- if (oleclass_from_typelib(self, pTypeLib, oleclass) == Qfalse) {
- OLE_RELEASE(pTypeLib);
- rb_raise(eWIN32OLERuntimeError, "not found `%s` in `%s`",
- StringValuePtr(oleclass), StringValuePtr(typelib));
- }
- OLE_RELEASE(pTypeLib);
- return self;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#name #=> OLE type name
- *
- * Returns OLE type name.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
- * puts tobj.name # => Application
- */
-static VALUE
-foletype_name(VALUE self)
-{
- return rb_ivar_get(self, rb_intern("name"));
-}
-
-static VALUE
-ole_ole_type(ITypeInfo *pTypeInfo)
-{
- HRESULT hr;
- TYPEATTR *pTypeAttr;
- VALUE type = Qnil;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if(FAILED(hr)){
- return type;
- }
- switch(pTypeAttr->typekind) {
- case TKIND_ENUM:
- type = rb_str_new2("Enum");
- break;
- case TKIND_RECORD:
- type = rb_str_new2("Record");
- break;
- case TKIND_MODULE:
- type = rb_str_new2("Module");
- break;
- case TKIND_INTERFACE:
- type = rb_str_new2("Interface");
- break;
- case TKIND_DISPATCH:
- type = rb_str_new2("Dispatch");
- break;
- case TKIND_COCLASS:
- type = rb_str_new2("Class");
- break;
- case TKIND_ALIAS:
- type = rb_str_new2("Alias");
- break;
- case TKIND_UNION:
- type = rb_str_new2("Union");
- break;
- case TKIND_MAX:
- type = rb_str_new2("Max");
- break;
- default:
- type = Qnil;
- break;
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return type;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#ole_type #=> OLE type string.
- *
- * returns type of OLE class.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
- * puts tobj.ole_type # => Class
- */
-static VALUE
-foletype_ole_type(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_ole_type(ptype->pTypeInfo);
-}
-
-static VALUE
-ole_type_guid(ITypeInfo *pTypeInfo)
-{
- HRESULT hr;
- TYPEATTR *pTypeAttr;
- int len;
- OLECHAR bstr[80];
- VALUE guid = Qnil;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr))
- return guid;
- len = StringFromGUID2(&pTypeAttr->guid, bstr, sizeof(bstr)/sizeof(OLECHAR));
- if (len > 3) {
- guid = ole_wc2vstr(bstr, FALSE);
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return guid;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#guid #=> GUID
- *
- * Returns GUID.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
- * puts tobj.guid # => {00024500-0000-0000-C000-000000000046}
- */
-static VALUE
-foletype_guid(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_guid(ptype->pTypeInfo);
-}
-
-static VALUE
-ole_type_progid(ITypeInfo *pTypeInfo)
-{
- HRESULT hr;
- TYPEATTR *pTypeAttr;
- OLECHAR *pbuf;
- VALUE progid = Qnil;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr))
- return progid;
- hr = ProgIDFromCLSID(&pTypeAttr->guid, &pbuf);
- if (SUCCEEDED(hr)) {
- progid = ole_wc2vstr(pbuf, FALSE);
- CoTaskMemFree(pbuf);
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return progid;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#progid #=> ProgID
- *
- * Returns ProgID if it exists. If not found, then returns nil.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
- * puts tobj.progid # => Excel.Application.9
- */
-static VALUE
-foletype_progid(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_progid(ptype->pTypeInfo);
-}
-
-
-static VALUE
-ole_type_visible(ITypeInfo *pTypeInfo)
-{
- HRESULT hr;
- TYPEATTR *pTypeAttr;
- VALUE visible;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr))
- return Qtrue;
- if (pTypeAttr->wTypeFlags & (TYPEFLAG_FHIDDEN | TYPEFLAG_FRESTRICTED)) {
- visible = Qfalse;
- } else {
- visible = Qtrue;
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return visible;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#visible? #=> true or false
- *
- * Returns true if the OLE class is public.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
- * puts tobj.visible # => true
- */
-static VALUE
-foletype_visible(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_visible(ptype->pTypeInfo);
-}
-
-static VALUE
-ole_type_major_version(ITypeInfo *pTypeInfo)
-{
- VALUE ver;
- TYPEATTR *pTypeAttr;
- HRESULT hr;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr))
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
- ver = INT2FIX(pTypeAttr->wMajorVerNum);
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return ver;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#major_version
- *
- * Returns major version.
- * tobj = WIN32OLE_TYPE.new('Microsoft Word 10.0 Object Library', 'Documents')
- * puts tobj.major_version # => 8
- */
-static VALUE
-foletype_major_version(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_major_version(ptype->pTypeInfo);
-}
-
-static VALUE
-ole_type_minor_version(ITypeInfo *pTypeInfo)
-{
- VALUE ver;
- TYPEATTR *pTypeAttr;
- HRESULT hr;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr))
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
- ver = INT2FIX(pTypeAttr->wMinorVerNum);
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return ver;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#minor_version #=> OLE minor version
- *
- * Returns minor version.
- * tobj = WIN32OLE_TYPE.new('Microsoft Word 10.0 Object Library', 'Documents')
- * puts tobj.minor_version # => 2
- */
-static VALUE
-foletype_minor_version(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_minor_version(ptype->pTypeInfo);
-}
-
-static VALUE
-ole_type_typekind(ITypeInfo *pTypeInfo)
-{
- VALUE typekind;
- TYPEATTR *pTypeAttr;
- HRESULT hr;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr))
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
- typekind = INT2FIX(pTypeAttr->typekind);
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return typekind;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#typekind #=> number of type.
- *
- * Returns number which represents type.
- * tobj = WIN32OLE_TYPE.new('Microsoft Word 10.0 Object Library', 'Documents')
- * puts tobj.typekind # => 4
- *
- */
-static VALUE
-foletype_typekind(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_typekind(ptype->pTypeInfo);
-}
-
-static VALUE
-ole_type_helpstring(ITypeInfo *pTypeInfo)
-{
- HRESULT hr;
- BSTR bhelpstr;
- hr = ole_docinfo_from_type(pTypeInfo, NULL, &bhelpstr, NULL, NULL);
- if(FAILED(hr)) {
- return Qnil;
- }
- return WC2VSTR(bhelpstr);
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#helpstring #=> help string.
- *
- * Returns help string.
- * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', 'IWebBrowser')
- * puts tobj.helpstring # => Web Browser interface
- */
-static VALUE
-foletype_helpstring(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_helpstring(ptype->pTypeInfo);
-}
-
-static VALUE
-ole_type_src_type(ITypeInfo *pTypeInfo)
-{
- HRESULT hr;
- TYPEATTR *pTypeAttr;
- VALUE alias = Qnil;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr))
- return alias;
- if(pTypeAttr->typekind != TKIND_ALIAS) {
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return alias;
- }
- alias = ole_typedesc2val(pTypeInfo, &(pTypeAttr->tdescAlias), Qnil);
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return alias;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#src_type #=> OLE source class
- *
- * Returns source class when the OLE class is 'Alias'.
- * tobj = WIN32OLE_TYPE.new('Microsoft Office 9.0 Object Library', 'MsoRGBType')
- * puts tobj.src_type # => I4
- *
- */
-static VALUE
-foletype_src_type(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_src_type(ptype->pTypeInfo);
-}
-
-static VALUE
-ole_type_helpfile(ITypeInfo *pTypeInfo)
-{
- HRESULT hr;
- BSTR bhelpfile;
- hr = ole_docinfo_from_type(pTypeInfo, NULL, NULL, NULL, &bhelpfile);
- if(FAILED(hr)) {
- return Qnil;
- }
- return WC2VSTR(bhelpfile);
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#helpfile
- *
- * Returns helpfile path. If helpfile is not found, then returns nil.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Worksheet')
- * puts tobj.helpfile # => C:\...\VBAXL9.CHM
- *
- */
-static VALUE
-foletype_helpfile(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_helpfile(ptype->pTypeInfo);
-}
-
-static VALUE
-ole_type_helpcontext(ITypeInfo *pTypeInfo)
-{
- HRESULT hr;
- DWORD helpcontext;
- hr = ole_docinfo_from_type(pTypeInfo, NULL, NULL,
- &helpcontext, NULL);
- if(FAILED(hr))
- return Qnil;
- return INT2FIX(helpcontext);
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#helpcontext
- *
- * Returns helpcontext. If helpcontext is not found, then returns nil.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Worksheet')
- * puts tobj.helpfile # => 131185
- */
-static VALUE
-foletype_helpcontext(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_helpcontext(ptype->pTypeInfo);
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#ole_typelib
- *
- * Returns the WIN32OLE_TYPELIB object which is including the WIN32OLE_TYPE
- * object. If it is not found, then returns nil.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Worksheet')
- * puts tobj.ole_typelib # => 'Microsoft Excel 9.0 Object Library'
- */
-static VALUE
-foletype_ole_typelib(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_typelib_from_itypeinfo(ptype->pTypeInfo);
-}
-
-static VALUE
-ole_type_impl_ole_types(ITypeInfo *pTypeInfo, int implflags)
-{
- HRESULT hr;
- ITypeInfo *pRefTypeInfo;
- HREFTYPE href;
- WORD i;
- VALUE type;
- TYPEATTR *pTypeAttr;
- int flags;
-
- VALUE types = rb_ary_new();
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr)) {
- return types;
- }
- for (i = 0; i < pTypeAttr->cImplTypes; i++) {
- hr = pTypeInfo->lpVtbl->GetImplTypeFlags(pTypeInfo, i, &flags);
- if (FAILED(hr))
- continue;
-
- hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo, i, &href);
- if (FAILED(hr))
- continue;
- hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo, href, &pRefTypeInfo);
- if (FAILED(hr))
- continue;
-
- if ((flags & implflags) == implflags) {
- type = ole_type_from_itypeinfo(pRefTypeInfo);
- if (type != Qnil) {
- rb_ary_push(types, type);
- }
- }
-
- OLE_RELEASE(pRefTypeInfo);
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return types;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#implemented_ole_types
- *
- * Returns the array of WIN32OLE_TYPE object which is implemented by the WIN32OLE_TYPE
- * object.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Worksheet')
- * p tobj.implemented_ole_types # => [_Worksheet, DocEvents]
- */
-static VALUE
-foletype_impl_ole_types(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_impl_ole_types(ptype->pTypeInfo, 0);
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#source_ole_types
- *
- * Returns the array of WIN32OLE_TYPE object which is implemented by the WIN32OLE_TYPE
- * object and having IMPLTYPEFLAG_FSOURCE.
- * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', "InternetExplorer")
- * p tobj.source_ole_types
- * # => [#<WIN32OLE_TYPE:DWebBrowserEvents2>, #<WIN32OLE_TYPE:DWebBrowserEvents>]
- */
-static VALUE
-foletype_source_ole_types(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_impl_ole_types(ptype->pTypeInfo, IMPLTYPEFLAG_FSOURCE);
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#default_event_sources
- *
- * Returns the array of WIN32OLE_TYPE object which is implemented by the WIN32OLE_TYPE
- * object and having IMPLTYPEFLAG_FSOURCE and IMPLTYPEFLAG_FDEFAULT.
- * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', "InternetExplorer")
- * p tobj.default_event_sources # => [#<WIN32OLE_TYPE:DWebBrowserEvents2>]
- */
-static VALUE
-foletype_default_event_sources(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_impl_ole_types(ptype->pTypeInfo, IMPLTYPEFLAG_FSOURCE|IMPLTYPEFLAG_FDEFAULT);
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#default_ole_types
- *
- * Returns the array of WIN32OLE_TYPE object which is implemented by the WIN32OLE_TYPE
- * object and having IMPLTYPEFLAG_FDEFAULT.
- * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', "InternetExplorer")
- * p tobj.default_ole_types
- * # => [#<WIN32OLE_TYPE:IWebBrowser2>, #<WIN32OLE_TYPE:DWebBrowserEvents2>]
- */
-static VALUE
-foletype_default_ole_types(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_type_impl_ole_types(ptype->pTypeInfo, IMPLTYPEFLAG_FDEFAULT);
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#inspect -> String
- *
- * Returns the type name with class name.
- *
- * ie = WIN32OLE.new('InternetExplorer.Application')
- * ie.ole_type.inspect => #<WIN32OLE_TYPE:IWebBrowser2>
- */
-static VALUE
-foletype_inspect(VALUE self)
-{
- return default_inspect(self, "WIN32OLE_TYPE");
-}
-
-static VALUE
-ole_variables(ITypeInfo *pTypeInfo)
-{
- HRESULT hr;
- TYPEATTR *pTypeAttr;
- WORD i;
- UINT len;
- BSTR bstr;
- VARDESC *pVarDesc;
- struct olevariabledata *pvar;
- VALUE var;
- VALUE variables = rb_ary_new();
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
- }
-
- for(i = 0; i < pTypeAttr->cVars; i++) {
- hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, i, &pVarDesc);
- if(FAILED(hr))
- continue;
- len = 0;
- hr = pTypeInfo->lpVtbl->GetNames(pTypeInfo, pVarDesc->memid, &bstr,
- 1, &len);
- if(FAILED(hr) || len == 0 || !bstr)
- continue;
-
- var = Data_Make_Struct(cWIN32OLE_VARIABLE, struct olevariabledata,
- 0,olevariable_free,pvar);
- pvar->pTypeInfo = pTypeInfo;
- OLE_ADDREF(pTypeInfo);
- pvar->index = i;
- rb_ivar_set(var, rb_intern("name"), WC2VSTR(bstr));
- rb_ary_push(variables, var);
-
- pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
- pVarDesc = NULL;
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return variables;
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#variables
- *
- * Returns array of WIN32OLE_VARIABLE objects which represent variables
- * defined in OLE class.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
- * vars = tobj.variables
- * vars.each do |v|
- * puts "#{v.name} = #{v.value}"
- * end
- *
- * The result of above sample script is follows:
- * xlChart = -4109
- * xlDialogSheet = -4116
- * xlExcel4IntlMacroSheet = 4
- * xlExcel4MacroSheet = 3
- * xlWorksheet = -4167
- *
- */
-static VALUE
-foletype_variables(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_variables(ptype->pTypeInfo);
-}
-
-/*
- * call-seq:
- * WIN32OLE_TYPE#ole_methods # the array of WIN32OLE_METHOD objects.
- *
- * Returns array of WIN32OLE_METHOD objects which represent OLE method defined in
- * OLE type library.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Worksheet')
- * methods = tobj.ole_methods.collect{|m|
- * m.name
- * }
- * # => ['Activate', 'Copy', 'Delete',....]
- */
-static VALUE
-foletype_methods(VALUE self)
-{
- struct oletypedata *ptype;
- Data_Get_Struct(self, struct oletypedata, ptype);
- return ole_methods_from_typeinfo(ptype->pTypeInfo, INVOKE_FUNC | INVOKE_PROPERTYGET | INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF);
-}
-
-/*
- * Document-class: WIN32OLE_VARIABLE
- *
- * <code>WIN32OLE_VARIABLE</code> objects represent OLE variable information.
- */
-
-/*
- * call-seq:
- * WIN32OLE_VARIABLE#name
- *
- * Returns the name of variable.
- *
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
- * variables = tobj.variables
- * variables.each do |variable|
- * puts "#{variable.name}"
- * end
- *
- * The result of above script is following:
- * xlChart
- * xlDialogSheet
- * xlExcel4IntlMacroSheet
- * xlExcel4MacroSheet
- * xlWorksheet
- *
- */
-static VALUE
-folevariable_name(VALUE self)
-{
- return rb_ivar_get(self, rb_intern("name"));
-}
-
-static VALUE
-ole_variable_ole_type(ITypeInfo *pTypeInfo, UINT var_index)
-{
- VARDESC *pVarDesc;
- HRESULT hr;
- VALUE type;
- hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
- if (FAILED(hr))
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetVarDesc");
- type = ole_typedesc2val(pTypeInfo, &(pVarDesc->elemdescVar.tdesc), Qnil);
- pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
- return type;
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIABLE#ole_type
- *
- * Returns OLE type string.
- *
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
- * variables = tobj.variables
- * variables.each do |variable|
- * puts "#{variable.ole_type} #{variable.name}"
- * end
- *
- * The result of above script is following:
- * INT xlChart
- * INT xlDialogSheet
- * INT xlExcel4IntlMacroSheet
- * INT xlExcel4MacroSheet
- * INT xlWorksheet
- *
- */
-static VALUE
-folevariable_ole_type(VALUE self)
-{
- struct olevariabledata *pvar;
- Data_Get_Struct(self, struct olevariabledata, pvar);
- return ole_variable_ole_type(pvar->pTypeInfo, pvar->index);
-}
-
-static VALUE
-ole_variable_ole_type_detail(ITypeInfo *pTypeInfo, UINT var_index)
-{
- VARDESC *pVarDesc;
- HRESULT hr;
- VALUE type = rb_ary_new();
- hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
- if (FAILED(hr))
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetVarDesc");
- ole_typedesc2val(pTypeInfo, &(pVarDesc->elemdescVar.tdesc), type);
- pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
- return type;
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIABLE#ole_type_detail
- *
- * Returns detail information of type. The information is array of type.
- *
- * tobj = WIN32OLE_TYPE.new('DirectX 7 for Visual Basic Type Library', 'D3DCLIPSTATUS')
- * variable = tobj.variables.find {|variable| variable.name == 'lFlags'}
- * tdetail = variable.ole_type_detail
- * p tdetail # => ["USERDEFINED", "CONST_D3DCLIPSTATUSFLAGS"]
- *
- */
-static VALUE
-folevariable_ole_type_detail(VALUE self)
-{
- struct olevariabledata *pvar;
- Data_Get_Struct(self, struct olevariabledata, pvar);
- return ole_variable_ole_type_detail(pvar->pTypeInfo, pvar->index);
-}
-
-static VALUE
-ole_variable_value(ITypeInfo *pTypeInfo, UINT var_index)
-{
- VARDESC *pVarDesc;
- HRESULT hr;
- VALUE val = Qnil;
- hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
- if (FAILED(hr))
- return Qnil;
- if(pVarDesc->varkind == VAR_CONST)
- val = ole_variant2val(V_UNION1(pVarDesc, lpvarValue));
- pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
- return val;
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIABLE#value
- *
- * Returns value if value is exists. If the value does not exist,
- * this method returns nil.
- *
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
- * variables = tobj.variables
- * variables.each do |variable|
- * puts "#{variable.name} #{variable.value}"
- * end
- *
- * The result of above script is following:
- * xlChart = -4109
- * xlDialogSheet = -4116
- * xlExcel4IntlMacroSheet = 4
- * xlExcel4MacroSheet = 3
- * xlWorksheet = -4167
- *
- */
-static VALUE
-folevariable_value(VALUE self)
-{
- struct olevariabledata *pvar;
- Data_Get_Struct(self, struct olevariabledata, pvar);
- return ole_variable_value(pvar->pTypeInfo, pvar->index);
-}
-
-static VALUE
-ole_variable_visible(ITypeInfo *pTypeInfo, UINT var_index)
-{
- VARDESC *pVarDesc;
- HRESULT hr;
- VALUE visible = Qfalse;
- hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
- if (FAILED(hr))
- return visible;
- if (!(pVarDesc->wVarFlags & (VARFLAG_FHIDDEN |
- VARFLAG_FRESTRICTED |
- VARFLAG_FNONBROWSABLE))) {
- visible = Qtrue;
- }
- pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
- return visible;
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIABLE#visible?
- *
- * Returns true if the variable is public.
- *
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
- * variables = tobj.variables
- * variables.each do |variable|
- * puts "#{variable.name} #{variable.visible?}"
- * end
- *
- * The result of above script is following:
- * xlChart true
- * xlDialogSheet true
- * xlExcel4IntlMacroSheet true
- * xlExcel4MacroSheet true
- * xlWorksheet true
- *
- */
-static VALUE
-folevariable_visible(VALUE self)
-{
- struct olevariabledata *pvar;
- Data_Get_Struct(self, struct olevariabledata, pvar);
- return ole_variable_visible(pvar->pTypeInfo, pvar->index);
-}
-
-static VALUE
-ole_variable_kind(ITypeInfo *pTypeInfo, UINT var_index)
-{
- VARDESC *pVarDesc;
- HRESULT hr;
- VALUE kind = rb_str_new2("UNKNOWN");
- hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
- if (FAILED(hr))
- return kind;
- switch(pVarDesc->varkind) {
- case VAR_PERINSTANCE:
- kind = rb_str_new2("PERINSTANCE");
- break;
- case VAR_STATIC:
- kind = rb_str_new2("STATIC");
- break;
- case VAR_CONST:
- kind = rb_str_new2("CONSTANT");
- break;
- case VAR_DISPATCH:
- kind = rb_str_new2("DISPATCH");
- break;
- default:
- break;
- }
- pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
- return kind;
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIABLE#variable_kind
- *
- * Returns variable kind string.
- *
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
- * variables = tobj.variables
- * variables.each do |variable|
- * puts "#{variable.name} #{variable.variable_kind}"
- * end
- *
- * The result of above script is following:
- * xlChart CONSTANT
- * xlDialogSheet CONSTANT
- * xlExcel4IntlMacroSheet CONSTANT
- * xlExcel4MacroSheet CONSTANT
- * xlWorksheet CONSTANT
- */
-static VALUE
-folevariable_variable_kind(VALUE self)
-{
- struct olevariabledata *pvar;
- Data_Get_Struct(self, struct olevariabledata, pvar);
- return ole_variable_kind(pvar->pTypeInfo, pvar->index);
-}
-
-static VALUE
-ole_variable_varkind(ITypeInfo *pTypeInfo, UINT var_index)
-{
- VARDESC *pVarDesc;
- HRESULT hr;
- VALUE kind = Qnil;
- hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
- if (FAILED(hr))
- return kind;
- pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
- kind = INT2FIX(pVarDesc->varkind);
- return kind;
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIABLE#varkind
- *
- * Returns the number which represents variable kind.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
- * variables = tobj.variables
- * variables.each do |variable|
- * puts "#{variable.name} #{variable.varkind}"
- * end
- *
- * The result of above script is following:
- * xlChart 2
- * xlDialogSheet 2
- * xlExcel4IntlMacroSheet 2
- * xlExcel4MacroSheet 2
- * xlWorksheet 2
- */
-static VALUE
-folevariable_varkind(VALUE self)
-{
- struct olevariabledata *pvar;
- Data_Get_Struct(self, struct olevariabledata, pvar);
- return ole_variable_varkind(pvar->pTypeInfo, pvar->index);
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIABLE#inspect -> String
- *
- * Returns the OLE variable name and the value with class name.
- *
- */
-static VALUE
-folevariable_inspect(VALUE self)
-{
- VALUE detail = rb_funcall(self, rb_intern("to_s"), 0);
- rb_str_cat2(detail, "=");
- rb_str_concat(detail, rb_funcall(rb_funcall(self, rb_intern("value"), 0), rb_intern("inspect"), 0));
- return make_inspect("WIN32OLE_VARIABLE", detail);
-}
-
-/*
- * Document-class: WIN32OLE_METHOD
- *
- * <code>WIN32OLE_METHOD</code> objects represent OLE method information.
- */
-
-static VALUE
-olemethod_set_member(VALUE self, ITypeInfo *pTypeInfo, ITypeInfo *pOwnerTypeInfo, int index, VALUE name)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- pmethod->pTypeInfo = pTypeInfo;
- OLE_ADDREF(pTypeInfo);
- pmethod->pOwnerTypeInfo = pOwnerTypeInfo;
- if(pOwnerTypeInfo) OLE_ADDREF(pOwnerTypeInfo);
- pmethod->index = index;
- rb_ivar_set(self, rb_intern("name"), name);
- return self;
-}
-
-static VALUE
-folemethod_s_allocate(VALUE klass)
-{
- struct olemethoddata *pmethod;
- VALUE obj;
- obj = Data_Make_Struct(klass,
- struct olemethoddata,
- 0, olemethod_free, pmethod);
- pmethod->pTypeInfo = NULL;
- pmethod->pOwnerTypeInfo = NULL;
- pmethod->index = 0;
- return obj;
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD.new(ole_type, method) -> WIN32OLE_METHOD object
- *
- * Returns a new WIN32OLE_METHOD object which represents the information
- * about OLE method.
- * The first argument <i>ole_type</i> specifies WIN32OLE_TYPE object.
- * The second argument <i>method</i> specifies OLE method name defined OLE class
- * which represents WIN32OLE_TYPE object.
- *
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
- */
-static VALUE
-folemethod_initialize(VALUE self, VALUE oletype, VALUE method)
-{
- struct oletypedata *ptype;
- VALUE obj = Qnil;
- if (rb_obj_is_kind_of(oletype, cWIN32OLE_TYPE)) {
- SafeStringValue(method);
- Data_Get_Struct(oletype, struct oletypedata, ptype);
- obj = olemethod_from_typeinfo(self, ptype->pTypeInfo, method);
- if (obj == Qnil) {
- rb_raise(eWIN32OLERuntimeError, "not found %s",
- StringValuePtr(method));
- }
- }
- else {
- rb_raise(rb_eTypeError, "1st argument should be WIN32OLE_TYPE object");
- }
- return obj;
-}
-
-/*
- * call-seq
- * WIN32OLE_METHOD#name
- *
- * Returns the name of the method.
- *
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
- * puts method.name # => SaveAs
- *
- */
-static VALUE
-folemethod_name(VALUE self)
-{
- return rb_ivar_get(self, rb_intern("name"));
-}
-
-static VALUE
-ole_method_return_type(ITypeInfo *pTypeInfo, UINT method_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE type;
-
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetFuncDesc");
-
- type = ole_typedesc2val(pTypeInfo, &(pFuncDesc->elemdescFunc.tdesc), Qnil);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return type;
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#return_type
- *
- * Returns string of return value type of method.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
- * method = WIN32OLE_METHOD.new(tobj, 'Add')
- * puts method.return_type # => Workbook
- *
- */
-static VALUE
-folemethod_return_type(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_return_type(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_return_vtype(ITypeInfo *pTypeInfo, UINT method_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE vvt;
-
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetFuncDesc");
-
- vvt = INT2FIX(pFuncDesc->elemdescFunc.tdesc.vt);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return vvt;
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#return_vtype
- *
- * Returns number of return value type of method.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
- * method = WIN32OLE_METHOD.new(tobj, 'Add')
- * puts method.return_vtype # => 26
- *
- */
-static VALUE
-folemethod_return_vtype(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_return_vtype(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_return_type_detail(ITypeInfo *pTypeInfo, UINT method_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE type = rb_ary_new();
-
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- return type;
-
- ole_typedesc2val(pTypeInfo, &(pFuncDesc->elemdescFunc.tdesc), type);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return type;
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#return_type_detail
- *
- * Returns detail information of return value type of method.
- * The information is array.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
- * method = WIN32OLE_METHOD.new(tobj, 'Add')
- * p method.return_type_detail # => ["PTR", "USERDEFINED", "Workbook"]
- */
-static VALUE
-folemethod_return_type_detail(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_return_type_detail(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_invkind(ITypeInfo *pTypeInfo, UINT method_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE invkind;
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if(FAILED(hr))
- ole_raise(hr, eWIN32OLERuntimeError, "failed to GetFuncDesc");
- invkind = INT2FIX(pFuncDesc->invkind);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return invkind;
-}
-
-static VALUE
-ole_method_invoke_kind(ITypeInfo *pTypeInfo, UINT method_index)
-{
- VALUE type = rb_str_new2("UNKNOWN");
- VALUE invkind = ole_method_invkind(pTypeInfo, method_index);
- if((FIX2INT(invkind) & INVOKE_PROPERTYGET) &&
- (FIX2INT(invkind) & INVOKE_PROPERTYPUT) ) {
- type = rb_str_new2("PROPERTY");
- } else if(FIX2INT(invkind) & INVOKE_PROPERTYGET) {
- type = rb_str_new2("PROPERTYGET");
- } else if(FIX2INT(invkind) & INVOKE_PROPERTYPUT) {
- type = rb_str_new2("PROPERTYPUT");
- } else if(FIX2INT(invkind) & INVOKE_PROPERTYPUTREF) {
- type = rb_str_new2("PROPERTYPUTREF");
- } else if(FIX2INT(invkind) & INVOKE_FUNC) {
- type = rb_str_new2("FUNC");
- }
- return type;
-}
-
-/*
- * call-seq:
- * WIN32OLE_MTHOD#invkind
- *
- * Returns the method invoke kind.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
- * method = WIN32OLE_METHOD.new(tobj, 'Add')
- * puts method.invkind # => 1
- *
- */
-static VALUE
-folemethod_invkind(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_invkind(pmethod->pTypeInfo, pmethod->index);
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#invoke_kind
- *
- * Returns the method kind string. The string is "UNKNOWN" or "PROPERTY"
- * or "PROPERTY" or "PROPERTYGET" or "PROPERTYPUT" or "PROPERTYPPUTREF"
- * or "FUNC".
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
- * method = WIN32OLE_METHOD.new(tobj, 'Add')
- * puts method.invoke_kind # => "FUNC"
- */
-static VALUE
-folemethod_invoke_kind(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_invoke_kind(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_visible(ITypeInfo *pTypeInfo, UINT method_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE visible;
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if(FAILED(hr))
- return Qfalse;
- if (pFuncDesc->wFuncFlags & (FUNCFLAG_FRESTRICTED |
- FUNCFLAG_FHIDDEN |
- FUNCFLAG_FNONBROWSABLE)) {
- visible = Qfalse;
- } else {
- visible = Qtrue;
- }
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return visible;
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#visible?
- *
- * Returns true if the method is public.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
- * method = WIN32OLE_METHOD.new(tobj, 'Add')
- * puts method.visible? # => true
- */
-static VALUE
-folemethod_visible(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_visible(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_event(ITypeInfo *pTypeInfo, UINT method_index, VALUE method_name)
-{
- TYPEATTR *pTypeAttr;
- HRESULT hr;
- WORD i;
- int flags;
- HREFTYPE href;
- ITypeInfo *pRefTypeInfo;
- FUNCDESC *pFuncDesc;
- BSTR bstr;
- VALUE name;
- VALUE event = Qfalse;
-
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
- if (FAILED(hr))
- return event;
- if(pTypeAttr->typekind != TKIND_COCLASS) {
- pTypeInfo->lpVtbl->ReleaseTypeAttr(pTypeInfo, pTypeAttr);
- return event;
- }
- for (i = 0; i < pTypeAttr->cImplTypes; i++) {
- hr = pTypeInfo->lpVtbl->GetImplTypeFlags(pTypeInfo, i, &flags);
- if (FAILED(hr))
- continue;
-
- if (flags & IMPLTYPEFLAG_FSOURCE) {
- hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo,
- i, &href);
- if (FAILED(hr))
- continue;
- hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo,
- href, &pRefTypeInfo);
- if (FAILED(hr))
- continue;
- hr = pRefTypeInfo->lpVtbl->GetFuncDesc(pRefTypeInfo, method_index,
- &pFuncDesc);
- if (FAILED(hr)) {
- OLE_RELEASE(pRefTypeInfo);
- continue;
- }
-
- hr = pRefTypeInfo->lpVtbl->GetDocumentation(pRefTypeInfo,
- pFuncDesc->memid,
- &bstr, NULL, NULL, NULL);
- if (FAILED(hr)) {
- pRefTypeInfo->lpVtbl->ReleaseFuncDesc(pRefTypeInfo, pFuncDesc);
- OLE_RELEASE(pRefTypeInfo);
- continue;
- }
-
- name = WC2VSTR(bstr);
- pRefTypeInfo->lpVtbl->ReleaseFuncDesc(pRefTypeInfo, pFuncDesc);
- OLE_RELEASE(pRefTypeInfo);
- if (rb_str_cmp(method_name, name) == 0) {
- event = Qtrue;
- break;
- }
- }
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- return event;
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#event?
- *
- * Returns true if the method is event.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SheetActivate')
- * puts method.event? # => true
- *
- */
-static VALUE
-folemethod_event(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- if (!pmethod->pOwnerTypeInfo)
- return Qfalse;
- return ole_method_event(pmethod->pOwnerTypeInfo,
- pmethod->index,
- rb_ivar_get(self, rb_intern("name")));
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#event_interface
- *
- * Returns event interface name if the method is event.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SheetActivate')
- * puts method.event_interface # => WorkbookEvents
- */
-static VALUE
-folemethod_event_interface(VALUE self)
-{
- BSTR name;
- struct olemethoddata *pmethod;
- HRESULT hr;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- if(folemethod_event(self) == Qtrue) {
- hr = ole_docinfo_from_type(pmethod->pTypeInfo, &name, NULL, NULL, NULL);
- if(SUCCEEDED(hr))
- return WC2VSTR(name);
- }
- return Qnil;
-}
-
-static HRESULT
-ole_method_docinfo_from_type(
- ITypeInfo *pTypeInfo,
- UINT method_index,
- BSTR *name,
- BSTR *helpstr,
- DWORD *helpcontext,
- BSTR *helpfile
- )
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- return hr;
- hr = pTypeInfo->lpVtbl->GetDocumentation(pTypeInfo, pFuncDesc->memid,
- name, helpstr,
- helpcontext, helpfile);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return hr;
-}
-
-static VALUE
-ole_method_helpstring(ITypeInfo *pTypeInfo, UINT method_index)
-{
- HRESULT hr;
- BSTR bhelpstring;
- hr = ole_method_docinfo_from_type(pTypeInfo, method_index, NULL, &bhelpstring,
- NULL, NULL);
- if (FAILED(hr))
- return Qnil;
- return WC2VSTR(bhelpstring);
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#helpstring
- *
- * Returns help string of OLE method. If the help string is not found,
- * then the method returns nil.
- * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', 'IWebBrowser')
- * method = WIN32OLE_METHOD.new(tobj, 'Navigate')
- * puts method.helpstring # => Navigates to a URL or file.
- *
- */
-static VALUE
-folemethod_helpstring(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_helpstring(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_helpfile(ITypeInfo *pTypeInfo, UINT method_index)
-{
- HRESULT hr;
- BSTR bhelpfile;
- hr = ole_method_docinfo_from_type(pTypeInfo, method_index, NULL, NULL,
- NULL, &bhelpfile);
- if (FAILED(hr))
- return Qnil;
- return WC2VSTR(bhelpfile);
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#helpfile
- *
- * Returns help file. If help file is not found, then
- * the method returns nil.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
- * method = WIN32OLE_METHOD.new(tobj, 'Add')
- * puts method.helpfile # => C:\...\VBAXL9.CHM
- */
-static VALUE
-folemethod_helpfile(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
-
- return ole_method_helpfile(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_helpcontext(ITypeInfo *pTypeInfo, UINT method_index)
-{
- HRESULT hr;
- DWORD helpcontext = 0;
- hr = ole_method_docinfo_from_type(pTypeInfo, method_index, NULL, NULL,
- &helpcontext, NULL);
- if (FAILED(hr))
- return Qnil;
- return INT2FIX(helpcontext);
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#helpcontext
- *
- * Returns help context.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
- * method = WIN32OLE_METHOD.new(tobj, 'Add')
- * puts method.helpcontext # => 65717
- */
-static VALUE
-folemethod_helpcontext(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_helpcontext(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_dispid(ITypeInfo *pTypeInfo, UINT method_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE dispid = Qnil;
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- return dispid;
- dispid = INT2NUM(pFuncDesc->memid);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return dispid;
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#dispid
- *
- * Returns dispatch ID.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
- * method = WIN32OLE_METHOD.new(tobj, 'Add')
- * puts method.dispid # => 181
- */
-static VALUE
-folemethod_dispid(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_dispid(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_offset_vtbl(ITypeInfo *pTypeInfo, UINT method_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE offset_vtbl = Qnil;
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- return offset_vtbl;
- offset_vtbl = INT2FIX(pFuncDesc->oVft);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return offset_vtbl;
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#offset_vtbl
- *
- * Returns the offset ov VTBL.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
- * method = WIN32OLE_METHOD.new(tobj, 'Add')
- * puts method.offset_vtbl # => 40
- */
-static VALUE
-folemethod_offset_vtbl(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_offset_vtbl(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_size_params(ITypeInfo *pTypeInfo, UINT method_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE size_params = Qnil;
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- return size_params;
- size_params = INT2FIX(pFuncDesc->cParams);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return size_params;
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#size_params
- *
- * Returns the size of arguments of the method.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
- * puts method.size_params # => 11
- *
- */
-static VALUE
-folemethod_size_params(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_size_params(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_size_opt_params(ITypeInfo *pTypeInfo, UINT method_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE size_opt_params = Qnil;
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- return size_opt_params;
- size_opt_params = INT2FIX(pFuncDesc->cParamsOpt);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return size_opt_params;
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#size_opt_params
- *
- * Returns the size of optional parameters.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
- * puts method.size_opt_params # => 4
- */
-static VALUE
-folemethod_size_opt_params(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_size_opt_params(pmethod->pTypeInfo, pmethod->index);
-}
-
-static VALUE
-ole_method_params(ITypeInfo *pTypeInfo, UINT method_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- BSTR *bstrs;
- UINT len, i;
- struct oleparamdata *pparam;
- VALUE param;
- VALUE params = rb_ary_new();
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- return params;
-
- len = 0;
- bstrs = ALLOCA_N(BSTR, pFuncDesc->cParams + 1);
- hr = pTypeInfo->lpVtbl->GetNames(pTypeInfo, pFuncDesc->memid,
- bstrs, pFuncDesc->cParams + 1,
- &len);
- if (FAILED(hr)) {
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return params;
- }
- SysFreeString(bstrs[0]);
- if (pFuncDesc->cParams > 0) {
- for(i = 1; i < len; i++) {
- param = Data_Make_Struct(cWIN32OLE_PARAM, struct oleparamdata, 0,
- oleparam_free, pparam);
- pparam->pTypeInfo = pTypeInfo;
- OLE_ADDREF(pTypeInfo);
- pparam->method_index = method_index;
- pparam->index = i - 1;
- rb_ivar_set(param, rb_intern("name"), WC2VSTR(bstrs[i]));
- rb_ary_push(params, param);
- }
- }
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return params;
-}
-
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#params
- *
- * returns array of WIN32OLE_PARAM object corresponding with method parameters.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
- * p method.params # => [Filename, FileFormat, Password, WriteResPassword,
- * ReadOnlyRecommended, CreateBackup, AccessMode,
- * ConflictResolution, AddToMru, TextCodepage,
- * TextVisualLayout]
- */
-static VALUE
-folemethod_params(VALUE self)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(self, struct olemethoddata, pmethod);
- return ole_method_params(pmethod->pTypeInfo, pmethod->index);
-}
-
-/*
- * call-seq:
- * WIN32OLE_METHOD#inspect -> String
- *
- * Returns the method name with class name.
- *
- */
-static VALUE
-folemethod_inspect(VALUE self)
-{
- return default_inspect(self, "WIN32OLE_METHOD");
-}
-
-/*
- * Document-class: WIN32OLE_PARAM
- *
- * <code>WIN32OLE_PARAM</code> objects represent param information of
- * the OLE method.
- */
-static VALUE foleparam_s_allocate(VALUE klass)
-{
- struct oleparamdata *pparam;
- VALUE obj;
- obj = Data_Make_Struct(klass,
- struct oleparamdata,
- 0, oleparam_free, pparam);
- pparam->pTypeInfo = NULL;
- pparam->method_index = 0;
- pparam->index = 0;
- return obj;
-}
-
-static VALUE
-oleparam_ole_param_from_index(VALUE self, ITypeInfo *pTypeInfo, UINT method_index, int param_index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- BSTR *bstrs;
- UINT len;
- struct oleparamdata *pparam;
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- ole_raise(hr, rb_eRuntimeError, "fail to ITypeInfo::GetFuncDesc");
-
- len = 0;
- bstrs = ALLOCA_N(BSTR, pFuncDesc->cParams + 1);
- hr = pTypeInfo->lpVtbl->GetNames(pTypeInfo, pFuncDesc->memid,
- bstrs, pFuncDesc->cParams + 1,
- &len);
- if (FAILED(hr)) {
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- ole_raise(hr, rb_eRuntimeError, "fail to ITypeInfo::GetNames");
- }
- SysFreeString(bstrs[0]);
- if (param_index < 1 || len <= (UINT)param_index)
- {
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- rb_raise(rb_eIndexError, "index of param must be in 1..%d", len);
- }
-
- Data_Get_Struct(self, struct oleparamdata, pparam);
- pparam->pTypeInfo = pTypeInfo;
- OLE_ADDREF(pTypeInfo);
- pparam->method_index = method_index;
- pparam->index = param_index - 1;
- rb_ivar_set(self, rb_intern("name"), WC2VSTR(bstrs[param_index]));
-
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return self;
-}
-
-static VALUE oleparam_ole_param(VALUE self, VALUE olemethod, int n)
-{
- struct olemethoddata *pmethod;
- Data_Get_Struct(olemethod, struct olemethoddata, pmethod);
- return oleparam_ole_param_from_index(self, pmethod->pTypeInfo, pmethod->index, n);
-}
-
-static VALUE foleparam_initialize(VALUE self, VALUE olemethod, VALUE n)
-{
- int idx;
- if (!rb_obj_is_kind_of(olemethod, cWIN32OLE_METHOD)) {
- rb_raise(rb_eTypeError, "1st parameter must be WIN32OLE_METHOD object");
- }
- idx = FIX2INT(n);
- return oleparam_ole_param(self, olemethod, idx);
-}
-
-/*
- * call-seq:
- * WIN32OLE_PARAM#name
- *
- * Returns name.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
- * param1 = method.params[0]
- * puts param1.name # => Filename
- */
-static VALUE
-foleparam_name(VALUE self)
-{
- return rb_ivar_get(self, rb_intern("name"));
-}
-
-static VALUE
-ole_param_ole_type(ITypeInfo *pTypeInfo, UINT method_index, UINT index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE type = rb_str_new2("unknown type");
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- return type;
- type = ole_typedesc2val(pTypeInfo,
- &(pFuncDesc->lprgelemdescParam[index].tdesc), Qnil);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return type;
-}
-
-/*
- * call-seq:
- * WIN32OLE_PARAM#ole_type
- *
- * Returns OLE type of WIN32OLE_PARAM object(parameter of OLE method).
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
- * param1 = method.params[0]
- * puts param1.ole_type # => VARIANT
- */
-static VALUE
-foleparam_ole_type(VALUE self)
-{
- struct oleparamdata *pparam;
- Data_Get_Struct(self, struct oleparamdata, pparam);
- return ole_param_ole_type(pparam->pTypeInfo, pparam->method_index,
- pparam->index);
-}
-
-static VALUE
-ole_param_ole_type_detail(ITypeInfo *pTypeInfo, UINT method_index, UINT index)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE typedetail = rb_ary_new();
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- return typedetail;
- ole_typedesc2val(pTypeInfo,
- &(pFuncDesc->lprgelemdescParam[index].tdesc), typedetail);
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return typedetail;
-}
-
-/*
- * call-seq:
- * WIN32OLE_PARAM#ole_type_detail
- *
- * Returns detail information of type of argument.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'IWorksheetFunction')
- * method = WIN32OLE_METHOD.new(tobj, 'SumIf')
- * param1 = method.params[0]
- * p param1.ole_type_detail # => ["PTR", "USERDEFINED", "Range"]
- */
-static VALUE
-foleparam_ole_type_detail(VALUE self)
-{
- struct oleparamdata *pparam;
- Data_Get_Struct(self, struct oleparamdata, pparam);
- return ole_param_ole_type_detail(pparam->pTypeInfo, pparam->method_index,
- pparam->index);
-}
-
-static VALUE
-ole_param_flag_mask(ITypeInfo *pTypeInfo, UINT method_index, UINT index, USHORT mask)
-{
- FUNCDESC *pFuncDesc;
- HRESULT hr;
- VALUE ret = Qfalse;
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if(FAILED(hr))
- return ret;
- if (V_UNION1((&(pFuncDesc->lprgelemdescParam[index])), paramdesc).wParamFlags &mask)
- ret = Qtrue;
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return ret;
-}
-
-/*
- * call-seq:
- * WIN32OLE_PARAM#input?
- *
- * Returns true if the parameter is input.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
- * param1 = method.params[0]
- * puts param1.input? # => true
- */
-static VALUE foleparam_input(VALUE self)
-{
- struct oleparamdata *pparam;
- Data_Get_Struct(self, struct oleparamdata, pparam);
- return ole_param_flag_mask(pparam->pTypeInfo, pparam->method_index,
- pparam->index, PARAMFLAG_FIN);
-}
-
-/*
- * call-seq:
- * WIN32OLE#output?
- *
- * Returns true if argument is output.
- * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', 'DWebBrowserEvents')
- * method = WIN32OLE_METHOD.new(tobj, 'NewWindow')
- * method.params.each do |param|
- * puts "#{param.name} #{param.output?}"
- * end
- *
- * The result of above script is following:
- * URL false
- * Flags false
- * TargetFrameName false
- * PostData false
- * Headers false
- * Processed true
- */
-static VALUE foleparam_output(VALUE self)
-{
- struct oleparamdata *pparam;
- Data_Get_Struct(self, struct oleparamdata, pparam);
- return ole_param_flag_mask(pparam->pTypeInfo, pparam->method_index,
- pparam->index, PARAMFLAG_FOUT);
-}
-
-/*
- * call-seq:
- * WIN32OLE_PARAM#optional?
- *
- * Returns true if argument is optional.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
- * param1 = method.params[0]
- * puts "#{param1.name} #{param1.optional?}" # => Filename true
- */
-static VALUE foleparam_optional(VALUE self)
-{
- struct oleparamdata *pparam;
- Data_Get_Struct(self, struct oleparamdata, pparam);
- return ole_param_flag_mask(pparam->pTypeInfo, pparam->method_index,
- pparam->index, PARAMFLAG_FOPT);
-}
-
-/*
- * call-seq:
- * WIN32OLE_PARAM#retval?
- *
- * Returns true if argument is return value.
- * tobj = WIN32OLE_TYPE.new('DirectX 7 for Visual Basic Type Library',
- * 'DirectPlayLobbyConnection')
- * method = WIN32OLE_METHOD.new(tobj, 'GetPlayerShortName')
- * param = method.params[0]
- * puts "#{param.name} #{param.retval?}" # => name true
- */
-static VALUE foleparam_retval(VALUE self)
-{
- struct oleparamdata *pparam;
- Data_Get_Struct(self, struct oleparamdata, pparam);
- return ole_param_flag_mask(pparam->pTypeInfo, pparam->method_index,
- pparam->index, PARAMFLAG_FRETVAL);
-}
-
-static VALUE
-ole_param_default(ITypeInfo *pTypeInfo, UINT method_index, UINT index)
-{
- FUNCDESC *pFuncDesc;
- ELEMDESC *pElemDesc;
- PARAMDESCEX * pParamDescEx;
- HRESULT hr;
- USHORT wParamFlags;
- USHORT mask = PARAMFLAG_FOPT|PARAMFLAG_FHASDEFAULT;
- VALUE defval = Qnil;
- hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
- if (FAILED(hr))
- return defval;
- pElemDesc = &pFuncDesc->lprgelemdescParam[index];
- wParamFlags = V_UNION1(pElemDesc, paramdesc).wParamFlags;
- if ((wParamFlags & mask) == mask) {
- pParamDescEx = V_UNION1(pElemDesc, paramdesc).pparamdescex;
- defval = ole_variant2val(&pParamDescEx->varDefaultValue);
- }
- pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
- return defval;
-}
-
-/*
- * call-seq:
- * WIN32OLE_PARAM#default
- *
- * Returns default value. If the default value does not exist,
- * this method returns nil.
- * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
- * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
- * method.params.each do |param|
- * if param.default
- * puts "#{param.name} (= #{param.default})"
- * else
- * puts "#{param}"
- * end
- * end
- *
- * The above script result is following:
- * Filename
- * FileFormat
- * Password
- * WriteResPassword
- * ReadOnlyRecommended
- * CreateBackup
- * AccessMode (= 1)
- * ConflictResolution
- * AddToMru
- * TextCodepage
- * TextVisualLayout
- */
-static VALUE foleparam_default(VALUE self)
-{
- struct oleparamdata *pparam;
- Data_Get_Struct(self, struct oleparamdata, pparam);
- return ole_param_default(pparam->pTypeInfo, pparam->method_index,
- pparam->index);
-}
-
-/*
- * call-seq:
- * WIN32OLE_PARAM#inspect -> String
- *
- * Returns the parameter name with class name. If the parameter has default value,
- * then returns name=value string with class name.
- *
- */
-static VALUE
-foleparam_inspect(VALUE self)
-{
- VALUE detail = foleparam_name(self);
- VALUE defval = foleparam_default(self);
- if (defval != Qnil) {
- rb_str_cat2(detail, "=");
- rb_str_concat(detail, rb_funcall(defval, rb_intern("inspect"), 0));
- }
- return make_inspect("WIN32OLE_PARAM", detail);
-}
-
-/*
- * Document-class: WIN32OLE_EVENT
- *
- * <code>WIN32OLE_EVENT</code> objects controls OLE event.
- */
-
-static IEventSinkVtbl vtEventSink;
-static BOOL g_IsEventSinkVtblInitialized = FALSE;
-
-void EVENTSINK_Destructor(PIEVENTSINKOBJ);
-
-STDMETHODIMP
-EVENTSINK_QueryInterface(
- PEVENTSINK pEV,
- REFIID iid,
- LPVOID* ppv
- ) {
- if (IsEqualIID(iid, &IID_IUnknown) ||
- IsEqualIID(iid, &IID_IDispatch) ||
- IsEqualIID(iid, &((PIEVENTSINKOBJ)pEV)->m_iid)) {
- *ppv = pEV;
- }
- else {
- *ppv = NULL;
- return E_NOINTERFACE;
- }
- ((LPUNKNOWN)*ppv)->lpVtbl->AddRef((LPUNKNOWN)*ppv);
- return NOERROR;
-}
-
-STDMETHODIMP_(ULONG)
-EVENTSINK_AddRef(
- PEVENTSINK pEV
- ){
- PIEVENTSINKOBJ pEVObj = (PIEVENTSINKOBJ)pEV;
- return ++pEVObj->m_cRef;
-}
-
-STDMETHODIMP_(ULONG) EVENTSINK_Release(
- PEVENTSINK pEV
- ) {
- PIEVENTSINKOBJ pEVObj = (PIEVENTSINKOBJ)pEV;
- --pEVObj->m_cRef;
- if(pEVObj->m_cRef != 0)
- return pEVObj->m_cRef;
- EVENTSINK_Destructor(pEVObj);
- return 0;
-}
-
-STDMETHODIMP EVENTSINK_GetTypeInfoCount(
- PEVENTSINK pEV,
- UINT *pct
- ) {
- *pct = 0;
- return NOERROR;
-}
-
-STDMETHODIMP EVENTSINK_GetTypeInfo(
- PEVENTSINK pEV,
- UINT info,
- LCID lcid,
- ITypeInfo **pInfo
- ) {
- *pInfo = NULL;
- return DISP_E_BADINDEX;
-}
-
-STDMETHODIMP EVENTSINK_GetIDsOfNames(
- PEVENTSINK pEventSink,
- REFIID riid,
- OLECHAR **szNames,
- UINT cNames,
- LCID lcid,
- DISPID *pDispID
- ) {
- ITypeInfo *pTypeInfo;
- PIEVENTSINKOBJ pEV = (PIEVENTSINKOBJ)pEventSink;
- pTypeInfo = pEV->pTypeInfo;
- if (pTypeInfo) {
- return pTypeInfo->lpVtbl->GetIDsOfNames(pTypeInfo, szNames, cNames, pDispID);
- }
- return DISP_E_UNKNOWNNAME;
-}
-
-static long
-ole_search_event_at(VALUE ary, VALUE ev)
-{
- VALUE event;
- VALUE event_name;
- long i, len;
- long ret = -1;
- len = RARRAY_LEN(ary);
- for(i = 0; i < len; i++) {
- event = rb_ary_entry(ary, i);
- event_name = rb_ary_entry(event, 1);
- if(NIL_P(event_name) && NIL_P(ev)) {
- ret = i;
- break;
- }
- else if (TYPE(ev) == T_STRING &&
- TYPE(event_name) == T_STRING &&
- rb_str_cmp(ev, event_name) == 0) {
- ret = i;
- break;
- }
- }
- return ret;
-}
-
-static VALUE
-ole_search_event(VALUE ary, VALUE ev, BOOL *is_default)
-{
- VALUE event;
- VALUE def_event;
- VALUE event_name;
- int i, len;
- *is_default = FALSE;
- def_event = Qnil;
- len = RARRAY_LEN(ary);
- for(i = 0; i < len; i++) {
- event = rb_ary_entry(ary, i);
- event_name = rb_ary_entry(event, 1);
- if(NIL_P(event_name)) {
- *is_default = TRUE;
- def_event = event;
- }
- else if (rb_str_cmp(ev, event_name) == 0) {
- *is_default = FALSE;
- return event;
- }
- }
- return def_event;
-}
-static VALUE
-ole_search_handler_method(VALUE handler, VALUE ev, BOOL *is_default_handler)
-{
- VALUE mid;
-
- *is_default_handler = FALSE;
- mid = rb_to_id(rb_sprintf("on%s", StringValuePtr(ev)));
- if (rb_respond_to(handler, mid)) {
- return mid;
- }
- mid = rb_intern("method_missing");
- if (rb_respond_to(handler, mid)) {
- *is_default_handler = TRUE;
- return mid;
- }
- return Qnil;
-}
-
-static void
-ole_delete_event(VALUE ary, VALUE ev)
-{
- long at = -1;
- at = ole_search_event_at(ary, ev);
- if (at >= 0) {
- rb_ary_delete_at(ary, at);
- }
-}
-
-static void
-hash2ptr_dispparams(VALUE hash, ITypeInfo *pTypeInfo, DISPID dispid, DISPPARAMS *pdispparams)
-{
- BSTR *bstrs;
HRESULT hr;
- UINT len, i;
- VARIANT *pvar;
- VALUE val;
- VALUE key;
- len = 0;
- bstrs = ALLOCA_N(BSTR, pdispparams->cArgs + 1);
- hr = pTypeInfo->lpVtbl->GetNames(pTypeInfo, dispid,
- bstrs, pdispparams->cArgs + 1,
- &len);
- if (FAILED(hr))
- return;
-
- for (i = 0; i < len - 1; i++) {
- key = WC2VSTR(bstrs[i + 1]);
- val = rb_hash_aref(hash, INT2FIX(i));
- if (val == Qnil)
- val = rb_hash_aref(hash, key);
- if (val == Qnil)
- val = rb_hash_aref(hash, rb_str_intern(key));
- pvar = &pdispparams->rgvarg[pdispparams->cArgs-i-1];
- ole_val2ptr_variant(val, pvar);
- }
-}
-
-static VALUE
-hash2result(VALUE hash)
-{
- VALUE ret = Qnil;
- ret = rb_hash_aref(hash, rb_str_new2("return"));
- if (ret == Qnil)
- ret = rb_hash_aref(hash, rb_str_intern(rb_str_new2("return")));
- return ret;
-}
-
-static void
-ary2ptr_dispparams(VALUE ary, DISPPARAMS *pdispparams)
-{
- int i;
- VALUE v;
- VARIANT *pvar;
- for(i = 0; i < RARRAY_LEN(ary) && (unsigned int) i < pdispparams->cArgs; i++) {
- v = rb_ary_entry(ary, i);
- pvar = &pdispparams->rgvarg[pdispparams->cArgs-i-1];
- ole_val2ptr_variant(v, pvar);
- }
-}
-
-static VALUE
-exec_callback(VALUE arg)
-{
- VALUE *parg = (VALUE *)arg;
- VALUE handler = parg[0];
- VALUE mid = parg[1];
- VALUE args = parg[2];
- return rb_apply(handler, mid, args);
-}
-
-static VALUE
-rescue_callback(VALUE arg)
-{
-
- VALUE error;
- VALUE e = rb_errinfo();
- VALUE bt = rb_funcall(e, rb_intern("backtrace"), 0);
- VALUE msg = rb_funcall(e, rb_intern("message"), 0);
- bt = rb_ary_entry(bt, 0);
- error = rb_sprintf("%s: %s (%s)\n", StringValuePtr(bt), StringValuePtr(msg), rb_obj_classname(e));
- rb_write_error(StringValuePtr(error));
- rb_backtrace();
- ruby_finalize();
- exit(-1);
-
- return Qnil;
-}
-
-STDMETHODIMP EVENTSINK_Invoke(
- PEVENTSINK pEventSink,
- DISPID dispid,
- REFIID riid,
- LCID lcid,
- WORD wFlags,
- DISPPARAMS *pdispparams,
- VARIANT *pvarResult,
- EXCEPINFO *pexcepinfo,
- UINT *puArgErr
- ) {
-
- HRESULT hr;
- BSTR bstr;
- unsigned int count;
- unsigned int i;
- ITypeInfo *pTypeInfo;
- VARIANT *pvar;
- VALUE ary, obj, event, args, outargv, ev, result;
- VALUE handler = Qnil;
- VALUE arg[3];
- VALUE mid;
- VALUE is_outarg = Qfalse;
- BOOL is_default_handler = FALSE;
- int state;
-
- PIEVENTSINKOBJ pEV = (PIEVENTSINKOBJ)pEventSink;
- pTypeInfo = pEV->pTypeInfo;
- obj = evs_entry(pEV->m_event_id);
- if (!rb_obj_is_kind_of(obj, cWIN32OLE_EVENT)) {
- return NOERROR;
- }
-
- ary = rb_ivar_get(obj, id_events);
- if (NIL_P(ary) || TYPE(ary) != T_ARRAY) {
- return NOERROR;
- }
- hr = pTypeInfo->lpVtbl->GetNames(pTypeInfo, dispid,
- &bstr, 1, &count);
- if (FAILED(hr)) {
- return NOERROR;
- }
- ev = WC2VSTR(bstr);
- event = ole_search_event(ary, ev, &is_default_handler);
- if (TYPE(event) == T_ARRAY) {
- handler = rb_ary_entry(event, 0);
- mid = rb_intern("call");
- is_outarg = rb_ary_entry(event, 3);
- } else {
- handler = rb_ivar_get(obj, rb_intern("handler"));
- if (handler == Qnil) {
- return NOERROR;
- }
- mid = ole_search_handler_method(handler, ev, &is_default_handler);
- }
- if (handler == Qnil || mid == Qnil) {
- return NOERROR;
- }
-
- args = rb_ary_new();
- if (is_default_handler) {
- rb_ary_push(args, ev);
- }
-
- /* make argument of event handler */
- for (i = 0; i < pdispparams->cArgs; ++i) {
- pvar = &pdispparams->rgvarg[pdispparams->cArgs-i-1];
- rb_ary_push(args, ole_variant2val(pvar));
- }
- outargv = Qnil;
- if (is_outarg == Qtrue) {
- outargv = rb_ary_new();
- rb_ary_push(args, outargv);
- }
-
- /*
- * if exception raised in event callback,
- * then you receive cfp consistency error.
- * to avoid this error we use begin rescue end.
- * and the exception raised then error message print
- * and exit ruby process by Win32OLE itself.
- */
- arg[0] = handler;
- arg[1] = mid;
- arg[2] = args;
- result = rb_protect(exec_callback, (VALUE)arg, &state);
- if (state != 0) {
- rescue_callback(Qnil);
- }
- if(TYPE(result) == T_HASH) {
- hash2ptr_dispparams(result, pTypeInfo, dispid, pdispparams);
- result = hash2result(result);
- }else if (is_outarg == Qtrue && TYPE(outargv) == T_ARRAY) {
- ary2ptr_dispparams(outargv, pdispparams);
- }
-
- if (pvarResult) {
- VariantInit(pvarResult);
- ole_val2variant(result, pvarResult);
- }
-
- return NOERROR;
-}
-
-PIEVENTSINKOBJ
-EVENTSINK_Constructor() {
- PIEVENTSINKOBJ pEv;
- if (!g_IsEventSinkVtblInitialized) {
- vtEventSink.QueryInterface=EVENTSINK_QueryInterface;
- vtEventSink.AddRef = EVENTSINK_AddRef;
- vtEventSink.Release = EVENTSINK_Release;
- vtEventSink.Invoke = EVENTSINK_Invoke;
- vtEventSink.GetIDsOfNames = EVENTSINK_GetIDsOfNames;
- vtEventSink.GetTypeInfoCount = EVENTSINK_GetTypeInfoCount;
- vtEventSink.GetTypeInfo = EVENTSINK_GetTypeInfo;
-
- g_IsEventSinkVtblInitialized = TRUE;
- }
- pEv = ALLOC_N(IEVENTSINKOBJ, 1);
- if(pEv == NULL) return NULL;
- pEv->lpVtbl = &vtEventSink;
- pEv->m_cRef = 0;
- pEv->m_event_id = 0;
- pEv->pTypeInfo = NULL;
- return pEv;
-}
-
-void EVENTSINK_Destructor(
- PIEVENTSINKOBJ pEVObj
- ) {
- if(pEVObj != NULL) {
- OLE_RELEASE(pEVObj->pTypeInfo);
- free(pEVObj);
- pEVObj = NULL;
- }
-}
-
-static HRESULT
-find_iid(VALUE ole, char *pitf, IID *piid, ITypeInfo **ppTypeInfo)
-{
- HRESULT hr;
- IDispatch *pDispatch;
- ITypeInfo *pTypeInfo;
- ITypeLib *pTypeLib;
- TYPEATTR *pTypeAttr;
- HREFTYPE RefType;
- ITypeInfo *pImplTypeInfo;
- TYPEATTR *pImplTypeAttr;
-
struct oledata *pole;
unsigned int index;
- unsigned int count;
- int type;
- BSTR bstr;
- char *pstr;
-
- BOOL is_found = FALSE;
- LCID lcid = cWIN32OLE_lcid;
-
- OLEData_Get_Struct(ole, pole);
-
- pDispatch = pole->pDispatch;
-
- hr = pDispatch->lpVtbl->GetTypeInfo(pDispatch, 0, lcid, &pTypeInfo);
- if (FAILED(hr))
- return hr;
-
- hr = pTypeInfo->lpVtbl->GetContainingTypeLib(pTypeInfo,
- &pTypeLib,
- &index);
- OLE_RELEASE(pTypeInfo);
- if (FAILED(hr))
- return hr;
-
- if (!pitf) {
- hr = pTypeLib->lpVtbl->GetTypeInfoOfGuid(pTypeLib,
- piid,
- ppTypeInfo);
- OLE_RELEASE(pTypeLib);
- return hr;
- }
- count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
- for (index = 0; index < count; index++) {
- hr = pTypeLib->lpVtbl->GetTypeInfo(pTypeLib,
- index,
- &pTypeInfo);
- if (FAILED(hr))
- break;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
-
- if(FAILED(hr)) {
- OLE_RELEASE(pTypeInfo);
- break;
- }
- if(pTypeAttr->typekind == TKIND_COCLASS) {
- for (type = 0; type < pTypeAttr->cImplTypes; type++) {
- hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo,
- type,
- &RefType);
- if (FAILED(hr))
- break;
- hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo,
- RefType,
- &pImplTypeInfo);
- if (FAILED(hr))
- break;
-
- hr = pImplTypeInfo->lpVtbl->GetDocumentation(pImplTypeInfo,
- -1,
- &bstr,
- NULL, NULL, NULL);
- if (FAILED(hr)) {
- OLE_RELEASE(pImplTypeInfo);
- break;
- }
- pstr = ole_wc2mb(bstr);
- if (strcmp(pitf, pstr) == 0) {
- hr = pImplTypeInfo->lpVtbl->GetTypeAttr(pImplTypeInfo,
- &pImplTypeAttr);
- if (SUCCEEDED(hr)) {
- is_found = TRUE;
- *piid = pImplTypeAttr->guid;
- if (ppTypeInfo) {
- *ppTypeInfo = pImplTypeInfo;
- (*ppTypeInfo)->lpVtbl->AddRef((*ppTypeInfo));
- }
- pImplTypeInfo->lpVtbl->ReleaseTypeAttr(pImplTypeInfo,
- pImplTypeAttr);
- }
- }
- free(pstr);
- OLE_RELEASE(pImplTypeInfo);
- if (is_found || FAILED(hr))
- break;
- }
- }
-
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
- OLE_RELEASE(pTypeInfo);
- if (is_found || FAILED(hr))
- break;
- }
- OLE_RELEASE(pTypeLib);
- if(!is_found)
- return E_NOINTERFACE;
- return hr;
-}
-
-static HRESULT
-find_coclass(
- ITypeInfo *pTypeInfo,
- TYPEATTR *pTypeAttr,
- ITypeInfo **pCOTypeInfo,
- TYPEATTR **pCOTypeAttr)
-{
- HRESULT hr = E_NOINTERFACE;
- ITypeLib *pTypeLib;
- int count;
- BOOL found = FALSE;
- ITypeInfo *pTypeInfo2;
- TYPEATTR *pTypeAttr2;
- int flags;
- int i,j;
- HREFTYPE href;
- ITypeInfo *pRefTypeInfo;
- TYPEATTR *pRefTypeAttr;
-
- hr = pTypeInfo->lpVtbl->GetContainingTypeLib(pTypeInfo, &pTypeLib, NULL);
- if (FAILED(hr)) {
- return hr;
- }
- count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
- for (i = 0; i < count && !found; i++) {
- hr = pTypeLib->lpVtbl->GetTypeInfo(pTypeLib, i, &pTypeInfo2);
- if (FAILED(hr))
- continue;
- hr = OLE_GET_TYPEATTR(pTypeInfo2, &pTypeAttr2);
- if (FAILED(hr)) {
- OLE_RELEASE(pTypeInfo2);
- continue;
- }
- if (pTypeAttr2->typekind != TKIND_COCLASS) {
- OLE_RELEASE_TYPEATTR(pTypeInfo2, pTypeAttr2);
- OLE_RELEASE(pTypeInfo2);
- continue;
- }
- for (j = 0; j < pTypeAttr2->cImplTypes && !found; j++) {
- hr = pTypeInfo2->lpVtbl->GetImplTypeFlags(pTypeInfo2, j, &flags);
- if (FAILED(hr))
- continue;
- if (!(flags & IMPLTYPEFLAG_FDEFAULT))
- continue;
- hr = pTypeInfo2->lpVtbl->GetRefTypeOfImplType(pTypeInfo2, j, &href);
- if (FAILED(hr))
- continue;
- hr = pTypeInfo2->lpVtbl->GetRefTypeInfo(pTypeInfo2, href, &pRefTypeInfo);
- if (FAILED(hr))
- continue;
- hr = OLE_GET_TYPEATTR(pRefTypeInfo, &pRefTypeAttr);
- if (FAILED(hr)) {
- OLE_RELEASE(pRefTypeInfo);
- continue;
- }
- if (IsEqualGUID(&(pTypeAttr->guid), &(pRefTypeAttr->guid))) {
- found = TRUE;
- }
- }
- if (!found) {
- OLE_RELEASE_TYPEATTR(pTypeInfo2, pTypeAttr2);
- OLE_RELEASE(pTypeInfo2);
- }
- }
- OLE_RELEASE(pTypeLib);
- if (found) {
- *pCOTypeInfo = pTypeInfo2;
- *pCOTypeAttr = pTypeAttr2;
- hr = S_OK;
- } else {
- hr = E_NOINTERFACE;
- }
- return hr;
-}
-
-static HRESULT
-find_default_source_from_typeinfo(
- ITypeInfo *pTypeInfo,
- TYPEATTR *pTypeAttr,
- ITypeInfo **ppTypeInfo)
-{
- int i = 0;
- HRESULT hr = E_NOINTERFACE;
- int flags;
- HREFTYPE hRefType;
- /* Enumerate all implemented types of the COCLASS */
- for (i = 0; i < pTypeAttr->cImplTypes; i++) {
- hr = pTypeInfo->lpVtbl->GetImplTypeFlags(pTypeInfo, i, &flags);
- if (FAILED(hr))
- continue;
-
- /*
- looking for the [default] [source]
- we just hope that it is a dispinterface :-)
- */
- if ((flags & IMPLTYPEFLAG_FDEFAULT) &&
- (flags & IMPLTYPEFLAG_FSOURCE)) {
-
- hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo,
- i, &hRefType);
- if (FAILED(hr))
- continue;
- hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo,
- hRefType, ppTypeInfo);
- if (SUCCEEDED(hr))
- break;
- }
- }
- return hr;
-}
-
-static HRESULT
-find_default_source(VALUE ole, IID *piid, ITypeInfo **ppTypeInfo)
-{
- HRESULT hr;
- IProvideClassInfo2 *pProvideClassInfo2;
- IProvideClassInfo *pProvideClassInfo;
- void *p;
-
- IDispatch *pDispatch;
ITypeInfo *pTypeInfo;
- ITypeInfo *pTypeInfo2 = NULL;
- TYPEATTR *pTypeAttr;
- TYPEATTR *pTypeAttr2 = NULL;
-
- struct oledata *pole;
-
- OLEData_Get_Struct(ole, pole);
- pDispatch = pole->pDispatch;
- hr = pDispatch->lpVtbl->QueryInterface(pDispatch,
- &IID_IProvideClassInfo2,
- &p);
- if (SUCCEEDED(hr)) {
- pProvideClassInfo2 = p;
- hr = pProvideClassInfo2->lpVtbl->GetGUID(pProvideClassInfo2,
- GUIDKIND_DEFAULT_SOURCE_DISP_IID,
- piid);
- OLE_RELEASE(pProvideClassInfo2);
- if (SUCCEEDED(hr)) {
- hr = find_iid(ole, NULL, piid, ppTypeInfo);
- }
- }
- if (SUCCEEDED(hr)) {
- return hr;
- }
- hr = pDispatch->lpVtbl->QueryInterface(pDispatch,
- &IID_IProvideClassInfo,
- &p);
- if (SUCCEEDED(hr)) {
- pProvideClassInfo = p;
- hr = pProvideClassInfo->lpVtbl->GetClassInfo(pProvideClassInfo,
- &pTypeInfo);
- OLE_RELEASE(pProvideClassInfo);
- }
- if (FAILED(hr)) {
- hr = pDispatch->lpVtbl->GetTypeInfo(pDispatch, 0, cWIN32OLE_lcid, &pTypeInfo );
- }
- if (FAILED(hr))
- return hr;
- hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ OLEData_Get_Struct(obj, pole);
+ hr = pole->pDispatch->lpVtbl->GetTypeInfo(pole->pDispatch,
+ 0, lcid, &pTypeInfo);
if (FAILED(hr)) {
- OLE_RELEASE(pTypeInfo);
return hr;
}
-
- *ppTypeInfo = 0;
- hr = find_default_source_from_typeinfo(pTypeInfo, pTypeAttr, ppTypeInfo);
- if (!*ppTypeInfo) {
- hr = find_coclass(pTypeInfo, pTypeAttr, &pTypeInfo2, &pTypeAttr2);
- if (SUCCEEDED(hr)) {
- hr = find_default_source_from_typeinfo(pTypeInfo2, pTypeAttr2, ppTypeInfo);
- OLE_RELEASE_TYPEATTR(pTypeInfo2, pTypeAttr2);
- OLE_RELEASE(pTypeInfo2);
- }
- }
- OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ hr = pTypeInfo->lpVtbl->GetContainingTypeLib(pTypeInfo, pTypeLib, &index);
OLE_RELEASE(pTypeInfo);
- /* Now that would be a bad surprise, if we didn't find it, wouldn't it? */
- if (!*ppTypeInfo) {
- if (SUCCEEDED(hr))
- hr = E_UNEXPECTED;
- return hr;
- }
-
- /* Determine IID of default source interface */
- hr = (*ppTypeInfo)->lpVtbl->GetTypeAttr(*ppTypeInfo, &pTypeAttr);
- if (SUCCEEDED(hr)) {
- *piid = pTypeAttr->guid;
- (*ppTypeInfo)->lpVtbl->ReleaseTypeAttr(*ppTypeInfo, pTypeAttr);
- }
- else
- OLE_RELEASE(*ppTypeInfo);
-
return hr;
-
-}
-
-static void
-ole_event_free(struct oleeventdata *poleev)
-{
- if (poleev->pConnectionPoint) {
- poleev->pConnectionPoint->lpVtbl->Unadvise(poleev->pConnectionPoint, poleev->dwCookie);
- OLE_RELEASE(poleev->pConnectionPoint);
- poleev->pConnectionPoint = NULL;
- }
- free(poleev);
-}
-
-static VALUE
-fev_s_allocate(VALUE klass)
-{
- VALUE obj;
- struct oleeventdata *poleev;
- obj = Data_Make_Struct(klass,struct oleeventdata,0,ole_event_free,poleev);
- poleev->dwCookie = 0;
- poleev->pConnectionPoint = NULL;
- poleev->event_id = 0;
- return obj;
-}
-
-static VALUE
-ev_advise(int argc, VALUE *argv, VALUE self)
-{
-
- VALUE ole, itf;
- struct oledata *pole;
- char *pitf;
- HRESULT hr;
- IID iid;
- ITypeInfo *pTypeInfo = 0;
- IDispatch *pDispatch;
- IConnectionPointContainer *pContainer;
- IConnectionPoint *pConnectionPoint;
- IEVENTSINKOBJ *pIEV;
- DWORD dwCookie;
- struct oleeventdata *poleev;
- void *p;
-
- rb_scan_args(argc, argv, "11", &ole, &itf);
-
- if (!rb_obj_is_kind_of(ole, cWIN32OLE)) {
- rb_raise(rb_eTypeError, "1st parameter must be WIN32OLE object");
- }
-
- if(TYPE(itf) != T_NIL) {
- if (rb_safe_level() > 0 && OBJ_TAINTED(itf)) {
- rb_raise(rb_eSecurityError, "Insecure Event Creation - %s",
- StringValuePtr(itf));
- }
- SafeStringValue(itf);
- pitf = StringValuePtr(itf);
- hr = find_iid(ole, pitf, &iid, &pTypeInfo);
- }
- else {
- hr = find_default_source(ole, &iid, &pTypeInfo);
- }
- if (FAILED(hr)) {
- ole_raise(hr, rb_eRuntimeError, "interface not found");
- }
-
- OLEData_Get_Struct(ole, pole);
- pDispatch = pole->pDispatch;
- hr = pDispatch->lpVtbl->QueryInterface(pDispatch,
- &IID_IConnectionPointContainer,
- &p);
- if (FAILED(hr)) {
- OLE_RELEASE(pTypeInfo);
- ole_raise(hr, rb_eRuntimeError,
- "failed to query IConnectionPointContainer");
- }
- pContainer = p;
-
- hr = pContainer->lpVtbl->FindConnectionPoint(pContainer,
- &iid,
- &pConnectionPoint);
- OLE_RELEASE(pContainer);
- if (FAILED(hr)) {
- OLE_RELEASE(pTypeInfo);
- ole_raise(hr, rb_eRuntimeError, "failed to query IConnectionPoint");
- }
- pIEV = EVENTSINK_Constructor();
- pIEV->m_iid = iid;
- hr = pConnectionPoint->lpVtbl->Advise(pConnectionPoint,
- (IUnknown*)pIEV,
- &dwCookie);
- if (FAILED(hr)) {
- ole_raise(hr, rb_eRuntimeError, "Advise Error");
- }
-
- Data_Get_Struct(self, struct oleeventdata, poleev);
- pIEV->m_event_id
- = NUM2INT(evs_length());
- pIEV->pTypeInfo = pTypeInfo;
- poleev->dwCookie = dwCookie;
- poleev->pConnectionPoint = pConnectionPoint;
- poleev->event_id = pIEV->m_event_id;
-
- return self;
-}
-
-/*
- * call-seq:
- * WIN32OLE_EVENT.new(ole, event) #=> WIN32OLE_EVENT object.
- *
- * Returns OLE event object.
- * The first argument specifies WIN32OLE object.
- * The second argument specifies OLE event name.
- * ie = WIN32OLE.new('InternetExplorer.Application')
- * ev = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents')
- */
-static VALUE
-fev_initialize(int argc, VALUE *argv, VALUE self)
-{
- ev_advise(argc, argv, self);
- evs_push(self);
- rb_ivar_set(self, id_events, rb_ary_new());
- fev_set_handler(self, Qnil);
- return self;
-}
-
-/*
- * call-seq:
- * WIN32OLE_EVENT.message_loop
- *
- * Translates and dispatches Windows message.
- */
-static VALUE
-fev_s_msg_loop(VALUE klass)
-{
- ole_msg_loop();
- return Qnil;
-}
-
-
-static void
-add_event_call_back(VALUE obj, VALUE event, VALUE data)
-{
- VALUE events = rb_ivar_get(obj, id_events);
- if (NIL_P(events) || TYPE(events) != T_ARRAY) {
- events = rb_ary_new();
- rb_ivar_set(obj, id_events, events);
- }
- ole_delete_event(events, event);
- rb_ary_push(events, data);
-}
-
-static VALUE
-ev_on_event(int argc, VALUE *argv, VALUE self, VALUE is_ary_arg)
-{
- struct oleeventdata *poleev;
- VALUE event, args, data;
- Data_Get_Struct(self, struct oleeventdata, poleev);
- if (poleev->pConnectionPoint == NULL) {
- rb_raise(eWIN32OLERuntimeError, "IConnectionPoint not found. You must call advise at first.");
- }
- rb_scan_args(argc, argv, "01*", &event, &args);
- if(!NIL_P(event)) {
- if(TYPE(event) != T_STRING && TYPE(event) != T_SYMBOL) {
- rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)");
- }
- if (TYPE(event) == T_SYMBOL) {
- event = rb_sym_to_s(event);
- }
- }
- data = rb_ary_new3(4, rb_block_proc(), event, args, is_ary_arg);
- add_event_call_back(self, event, data);
- return Qnil;
-}
-
-/*
- * call-seq:
- * WIN32OLE_EVENT#on_event([event]){...}
- *
- * Defines the callback event.
- * If argument is omitted, this method defines the callback of all events.
- * If you want to modify reference argument in callback, return hash in
- * callback. If you want to return value to OLE server as result of callback
- * use `return' or :return.
- *
- * ie = WIN32OLE.new('InternetExplorer.Application')
- * ev = WIN32OLE_EVENT.new(ie)
- * ev.on_event("NavigateComplete") {|url| puts url}
- * ev.on_event() {|ev, *args| puts "#{ev} fired"}
- *
- * ev.on_event("BeforeNavigate2") {|*args|
- * ...
- * # set true to BeforeNavigate reference argument `Cancel'.
- * # Cancel is 7-th argument of BeforeNavigate,
- * # so you can use 6 as key of hash instead of 'Cancel'.
- * # The argument is counted from 0.
- * # The hash key of 0 means first argument.)
- * {:Cancel => true} # or {'Cancel' => true} or {6 => true}
- * }
- *
- * ev.on_event(...) {|*args|
- * {:return => 1, :xxx => yyy}
- * }
- */
-static VALUE
-fev_on_event(int argc, VALUE *argv, VALUE self)
-{
- return ev_on_event(argc, argv, self, Qfalse);
-}
-
-/*
- * call-seq:
- * WIN32OLE_EVENT#on_event_with_outargs([event]){...}
- *
- * Defines the callback of event.
- * If you want modify argument in callback,
- * you could use this method instead of WIN32OLE_EVENT#on_event.
- *
- * ie = WIN32OLE.new('InternetExplorer.Application')
- * ev = WIN32OLE_EVENT.new(ie)
- * ev.on_event_with_outargs('BeforeNavigate2') {|*args|
- * args.last[6] = true
- * }
- */
-static VALUE
-fev_on_event_with_outargs(int argc, VALUE *argv, VALUE self)
-{
- return ev_on_event(argc, argv, self, Qtrue);
-}
-
-/*
- * call-seq:
- * WIN32OLE_EVENT#off_event([event])
- *
- * removes the callback of event.
- *
- * ie = WIN32OLE.new('InternetExplorer.Application')
- * ev = WIN32OLE_EVENT.new(ie)
- * ev.on_event('BeforeNavigate2') {|*args|
- * args.last[6] = true
- * }
- * ...
- * ev.off_event('BeforeNavigate2')
- * ...
- */
-static VALUE
-fev_off_event(int argc, VALUE *argv, VALUE self)
-{
- VALUE event = Qnil;
- VALUE events;
-
- rb_scan_args(argc, argv, "01", &event);
- if(!NIL_P(event)) {
- if(TYPE(event) != T_STRING && TYPE(event) != T_SYMBOL) {
- rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)");
- }
- if (TYPE(event) == T_SYMBOL) {
- event = rb_sym_to_s(event);
- }
- }
- events = rb_ivar_get(self, id_events);
- if (NIL_P(events)) {
- return Qnil;
- }
- ole_delete_event(events, event);
- return Qnil;
-}
-
-/*
- * call-seq:
- * WIN32OLE_EVENT#unadvise -> nil
- *
- * disconnects OLE server. If this method called, then the WIN32OLE_EVENT object
- * does not receive the OLE server event any more.
- * This method is trial implementation.
- *
- * ie = WIN32OLE.new('InternetExplorer.Application')
- * ev = WIN32OLE_EVENT.new(ie)
- * ev.on_event() {...}
- * ...
- * ev.unadvise
- *
- */
-static VALUE
-fev_unadvise(VALUE self)
-{
- struct oleeventdata *poleev;
- Data_Get_Struct(self, struct oleeventdata, poleev);
- if (poleev->pConnectionPoint) {
- ole_msg_loop();
- evs_delete(poleev->event_id);
- poleev->pConnectionPoint->lpVtbl->Unadvise(poleev->pConnectionPoint, poleev->dwCookie);
- OLE_RELEASE(poleev->pConnectionPoint);
- poleev->pConnectionPoint = NULL;
- }
- return Qnil;
-}
-
-static VALUE
-evs_push(VALUE ev)
-{
- return rb_ary_push(ary_ole_event, ev);
-}
-
-static VALUE
-evs_delete(long i)
-{
- rb_ary_store(ary_ole_event, i, Qnil);
- return Qnil;
-}
-
-static VALUE
-evs_entry(long i)
-{
- return rb_ary_entry(ary_ole_event, i);
-}
-
-static VALUE
-evs_length(void)
-{
- return rb_funcall(ary_ole_event, rb_intern("length"), 0);
-}
-
-/*
- * call-seq:
- * WIN32OLE_EVENT#handler=
- *
- * sets event handler object. If handler object has onXXX
- * method according to XXX event, then onXXX method is called
- * when XXX event occurs.
- *
- * If handler object has method_missing and there is no
- * method according to the event, then method_missing
- * called and 1-st argument is event name.
- *
- * If handler object has onXXX method and there is block
- * defined by WIN32OLE_EVENT#on_event('XXX'){},
- * then block is executed but handler object method is not called
- * when XXX event occurs.
- *
- * class Handler
- * def onStatusTextChange(text)
- * puts "StatusTextChanged"
- * end
- * def onPropertyChange(prop)
- * puts "PropertyChanged"
- * end
- * def method_missing(ev, *arg)
- * puts "other event #{ev}"
- * end
- * end
- *
- * handler = Handler.new
- * ie = WIN32OLE.new('InternetExplorer.Application')
- * ev = WIN32OLE_EVENT.new(ie)
- * ev.on_event("StatusTextChange") {|*args|
- * puts "this block executed."
- * puts "handler.onStatusTextChange method is not called."
- * }
- * ev.handler = handler
- *
- */
-static VALUE
-fev_set_handler(VALUE self, VALUE val)
-{
- return rb_ivar_set(self, rb_intern("handler"), val);
-}
-
-/*
- * call-seq:
- * WIN32OLE_EVENT#handler
- *
- * returns handler object.
- *
- */
-static VALUE
-fev_get_handler(VALUE self)
-{
- return rb_ivar_get(self, rb_intern("handler"));
-}
-
-static void
-olevariant_free(struct olevariantdata *pvar)
-{
- VariantClear(&(pvar->realvar));
- VariantClear(&(pvar->var));
- free(pvar);
-}
-
-static VALUE
-folevariant_s_allocate(VALUE klass)
-{
- struct olevariantdata *pvar;
- VALUE obj;
- ole_initialize();
- obj = Data_Make_Struct(klass,struct olevariantdata,0,olevariant_free,pvar);
- VariantInit(&(pvar->var));
- VariantInit(&(pvar->realvar));
- return obj;
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIANT.array(ary, vt)
- *
- * Returns Ruby object wrapping OLE variant whose variant type is VT_ARRAY.
- * The first argument should be Array object which specifies dimensions
- * and each size of dimensions of OLE array.
- * The second argument specifies variant type of the element of OLE array.
- *
- * The following create 2 dimensions OLE array. The first dimensions size
- * is 3, and the second is 4.
- *
- * ole_ary = WIN32OLE_VARIANT.array([3,4], VT_I4)
- * ruby_ary = ole_ary.value # => [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
- *
- */
-static VALUE
-folevariant_s_array(VALUE klass, VALUE elems, VALUE vvt)
-{
- VALUE obj = Qnil;
- VARTYPE vt;
- struct olevariantdata *pvar;
- SAFEARRAYBOUND *psab = NULL;
- SAFEARRAY *psa = NULL;
- UINT dim = 0;
- UINT i = 0;
-
- ole_initialize();
-
- vt = NUM2UINT(vvt);
- vt = (vt | VT_ARRAY);
- Check_Type(elems, T_ARRAY);
- obj = folevariant_s_allocate(klass);
-
- Data_Get_Struct(obj, struct olevariantdata, pvar);
- dim = RARRAY_LEN(elems);
-
- psab = ALLOC_N(SAFEARRAYBOUND, dim);
-
- if(!psab) {
- rb_raise(rb_eRuntimeError, "memory allocation error");
- }
-
- for (i = 0; i < dim; i++) {
- psab[i].cElements = FIX2INT(rb_ary_entry(elems, i));
- psab[i].lLbound = 0;
- }
-
- psa = SafeArrayCreate((VARTYPE)(vt & VT_TYPEMASK), dim, psab);
- if (psa == NULL) {
- if (psab) free(psab);
- rb_raise(rb_eRuntimeError, "memory allocation error(SafeArrayCreate)");
- }
-
- V_VT(&(pvar->var)) = vt;
- if (vt & VT_BYREF) {
- V_VT(&(pvar->realvar)) = (vt & ~VT_BYREF);
- V_ARRAY(&(pvar->realvar)) = psa;
- V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
- } else {
- V_ARRAY(&(pvar->var)) = psa;
- }
- if (psab) free(psab);
- return obj;
-}
-
-static void
-check_type_val2variant(VALUE val)
-{
- VALUE elem;
- int len = 0;
- int i = 0;
- if(!rb_obj_is_kind_of(val, cWIN32OLE) &&
- !rb_obj_is_kind_of(val, cWIN32OLE_VARIANT) &&
- !rb_obj_is_kind_of(val, rb_cTime)) {
- switch (TYPE(val)) {
- case T_ARRAY:
- len = RARRAY_LEN(val);
- for(i = 0; i < len; i++) {
- elem = rb_ary_entry(val, i);
- check_type_val2variant(elem);
- }
- break;
- case T_STRING:
- case T_FIXNUM:
- case T_BIGNUM:
- case T_FLOAT:
- case T_TRUE:
- case T_FALSE:
- case T_NIL:
- break;
- default:
- rb_raise(rb_eTypeError, "can not convert WIN32OLE_VARIANT from type %s",
- rb_obj_classname(val));
- }
- }
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIANT.new(val, vartype) #=> WIN32OLE_VARIANT object.
- *
- * Returns Ruby object wrapping OLE variant.
- * The first argument specifies Ruby object to convert OLE variant variable.
- * The second argument specifies VARIANT type.
- * In some situation, you need the WIN32OLE_VARIANT object to pass OLE method
- *
- * shell = WIN32OLE.new("Shell.Application")
- * folder = shell.NameSpace("C:\\Windows")
- * item = folder.ParseName("tmp.txt")
- * # You can't use Ruby String object to call FolderItem.InvokeVerb.
- * # Instead, you have to use WIN32OLE_VARIANT object to call the method.
- * shortcut = WIN32OLE_VARIANT.new("Create Shortcut(\&S)")
- * item.invokeVerb(shortcut)
- *
- */
-static VALUE
-folevariant_initialize(VALUE self, VALUE args)
-{
- int len = 0;
- VARIANT var;
- VALUE val;
- VALUE vvt;
- VARTYPE vt;
- struct olevariantdata *pvar;
-
- len = RARRAY_LEN(args);
- if (len < 1 || len > 3) {
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", len);
- }
- VariantInit(&var);
- val = rb_ary_entry(args, 0);
-
- check_type_val2variant(val);
-
- Data_Get_Struct(self, struct olevariantdata, pvar);
- if (len == 1) {
- ole_val2variant(val, &(pvar->var));
- } else {
- vvt = rb_ary_entry(args, 1);
- vt = NUM2INT(vvt);
- ole_val2olevariantdata(val, vt, pvar);
- }
- vt = V_VT(&pvar->var);
- return self;
-}
-
-static SAFEARRAY *
-get_locked_safe_array(VALUE val)
-{
- struct olevariantdata *pvar;
- SAFEARRAY *psa = NULL;
- HRESULT hr;
- Data_Get_Struct(val, struct olevariantdata, pvar);
- if (!(V_VT(&(pvar->var)) & VT_ARRAY)) {
- rb_raise(rb_eTypeError, "variant type is not VT_ARRAY.");
- }
- psa = V_ISBYREF(&(pvar->var)) ? *V_ARRAYREF(&(pvar->var)) : V_ARRAY(&(pvar->var));
- if (psa == NULL) {
- return psa;
- }
- hr = SafeArrayLock(psa);
- if (FAILED(hr)) {
- ole_raise(hr, rb_eRuntimeError, "failed to SafeArrayLock");
- }
- return psa;
-}
-
-static long *
-ary2safe_array_index(int ary_size, VALUE *ary, SAFEARRAY *psa)
-{
- long dim;
- long *pid;
- long i;
- dim = SafeArrayGetDim(psa);
- if (dim != ary_size) {
- rb_raise(rb_eArgError, "unmatch number of indices");
- }
- pid = ALLOC_N(long, dim);
- if (pid == NULL) {
- rb_raise(rb_eRuntimeError, "failed to allocate memory for indices");
- }
- for (i = 0; i < dim; i++) {
- pid[i] = NUM2INT(ary[i]);
- }
- return pid;
-}
-
-static void
-unlock_safe_array(SAFEARRAY *psa)
-{
- HRESULT hr;
- hr = SafeArrayUnlock(psa);
- if (FAILED(hr)) {
- ole_raise(hr, rb_eRuntimeError, "failed to SafeArrayUnlock");
- }
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIANT[i,j,...] #=> element of OLE array.
- *
- * Returns the element of WIN32OLE_VARIANT object(OLE array).
- * This method is available only when the variant type of
- * WIN32OLE_VARIANT object is VT_ARRAY.
- *
- * REMARK:
- * The all indicies should be 0 or natural number and
- * lower than or equal to max indicies.
- * (This point is different with Ruby Array indicies.)
- *
- * obj = WIN32OLE_VARIANT.new([[1,2,3],[4,5,6]])
- * p obj[0,0] # => 1
- * p obj[1,0] # => 4
- * p obj[2,0] # => WIN32OLERuntimeError
- * p obj[0, -1] # => WIN32OLERuntimeError
- *
- */
-static VALUE
-folevariant_ary_aref(int argc, VALUE *argv, VALUE self)
-{
- struct olevariantdata *pvar;
- SAFEARRAY *psa;
- VALUE val = Qnil;
- VARIANT variant;
- long *pid;
- HRESULT hr;
-
- Data_Get_Struct(self, struct olevariantdata, pvar);
- if (!V_ISARRAY(&(pvar->var))) {
- rb_raise(eWIN32OLERuntimeError,
- "`[]' is not available for this variant type object");
- }
- psa = get_locked_safe_array(self);
- if (psa == NULL) {
- return val;
- }
-
- pid = ary2safe_array_index(argc, argv, psa);
-
- VariantInit(&variant);
- V_VT(&variant) = (V_VT(&(pvar->var)) & ~VT_ARRAY) | VT_BYREF;
- hr = SafeArrayPtrOfIndex(psa, pid, &V_BYREF(&variant));
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "failed to SafeArrayPtrOfIndex");
- }
- val = ole_variant2val(&variant);
-
- unlock_safe_array(psa);
- if (pid) free(pid);
- return val;
-}
-
-static VOID *
-val2variant_ptr(VALUE val, VARIANT *var, VARTYPE vt)
-{
- VOID *p = NULL;
- HRESULT hr = S_OK;
- ole_val2variant_ex(val, var, vt);
- if ((vt & ~VT_BYREF) == VT_VARIANT) {
- p = var;
- } else {
- if ( (vt & ~VT_BYREF) != V_VT(var)) {
- hr = VariantChangeTypeEx(var, var,
- cWIN32OLE_lcid, 0, (VARTYPE)(vt & ~VT_BYREF));
- if (FAILED(hr)) {
- ole_raise(hr, rb_eRuntimeError, "failed to change type");
- }
- }
- p = get_ptr_of_variant(var);
- }
- if (p == NULL) {
- rb_raise(rb_eRuntimeError, "failed to get pointer of variant");
- }
- return p;
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIANT[i,j,...] = val #=> set the element of OLE array
- *
- * Set the element of WIN32OLE_VARIANT object(OLE array) to val.
- * This method is available only when the variant type of
- * WIN32OLE_VARIANT object is VT_ARRAY.
- *
- * REMARK:
- * The all indicies should be 0 or natural number and
- * lower than or equal to max indicies.
- * (This point is different with Ruby Array indicies.)
- *
- * obj = WIN32OLE_VARIANT.new([[1,2,3],[4,5,6]])
- * obj[0,0] = 7
- * obj[1,0] = 8
- * p obj.value # => [[7,2,3], [8,5,6]]
- * obj[2,0] = 9 # => WIN32OLERuntimeError
- * obj[0, -1] = 9 # => WIN32OLERuntimeError
- *
- */
-static VALUE
-folevariant_ary_aset(int argc, VALUE *argv, VALUE self)
-{
- struct olevariantdata *pvar;
- SAFEARRAY *psa;
- VARIANT var;
- VARTYPE vt;
- long *pid;
- HRESULT hr;
- VOID *p = NULL;
-
- Data_Get_Struct(self, struct olevariantdata, pvar);
- if (!V_ISARRAY(&(pvar->var))) {
- rb_raise(eWIN32OLERuntimeError,
- "`[]' is not available for this variant type object");
- }
- psa = get_locked_safe_array(self);
- if (psa == NULL) {
- rb_raise(rb_eRuntimeError, "failed to get SafeArray pointer");
- }
-
- pid = ary2safe_array_index(argc-1, argv, psa);
-
- VariantInit(&var);
- vt = (V_VT(&(pvar->var)) & ~VT_ARRAY);
- p = val2variant_ptr(argv[argc-1], &var, vt);
- if ((V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == NULL) ||
- (V_VT(&var) == VT_UNKNOWN && V_UNKNOWN(&var) == NULL)) {
- rb_raise(eWIN32OLERuntimeError, "argument does not have IDispatch or IUnknown Interface");
- }
- hr = SafeArrayPutElement(psa, pid, p);
- if (FAILED(hr)) {
- ole_raise(hr, eWIN32OLERuntimeError, "failed to SafeArrayPutElement");
- }
-
- unlock_safe_array(psa);
- if (pid) free(pid);
- return argv[argc-1];
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIANT.value #=> Ruby object.
- *
- * Returns Ruby object value from OLE variant.
- * obj = WIN32OLE_VARIANT.new(1, WIN32OLE::VARIANT::VT_BSTR)
- * obj.value # => "1" (not Fixnum object, but String object "1")
- *
- */
-static VALUE
-folevariant_value(VALUE self)
-{
- struct olevariantdata *pvar;
- VALUE val = Qnil;
- VARTYPE vt;
- int dim;
- SAFEARRAY *psa;
- Data_Get_Struct(self, struct olevariantdata, pvar);
-
- val = ole_variant2val(&(pvar->var));
- vt = V_VT(&(pvar->var));
-
- if ((vt & ~VT_BYREF) == (VT_UI1|VT_ARRAY)) {
- if (vt & VT_BYREF) {
- psa = *V_ARRAYREF(&(pvar->var));
- } else {
- psa = V_ARRAY(&(pvar->var));
- }
- if (!psa) {
- return val;
- }
- dim = SafeArrayGetDim(psa);
- if (dim == 1) {
- val = rb_funcall(val, rb_intern("pack"), 1, rb_str_new2("C*"));
- }
- }
- return val;
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIANT.vartype #=> OLE variant type.
- *
- * Returns OLE variant type.
- * obj = WIN32OLE_VARIANT.new("string")
- * obj.vartype # => WIN32OLE::VARIANT::VT_BSTR
- *
- */
-static VALUE
-folevariant_vartype(VALUE self)
-{
- struct olevariantdata *pvar;
- Data_Get_Struct(self, struct olevariantdata, pvar);
- return INT2FIX(V_VT(&pvar->var));
-}
-
-/*
- * call-seq:
- * WIN32OLE_VARIANT.value = val #=> set WIN32OLE_VARIANT value to val.
- *
- * Sets variant value to val. If the val type does not match variant value
- * type(vartype), then val is changed to match variant value type(vartype)
- * before setting val.
- * Thie method is not available when vartype is VT_ARRAY(except VT_UI1|VT_ARRAY).
- * If the vartype is VT_UI1|VT_ARRAY, the val should be String object.
- *
- * obj = WIN32OLE_VARIANT.new(1) # obj.vartype is WIN32OLE::VARIANT::VT_I4
- * obj.value = 3.2 # 3.2 is changed to 3 when setting value.
- * p obj.value # => 3
- */
-static VALUE
-folevariant_set_value(VALUE self, VALUE val)
-{
- struct olevariantdata *pvar;
- VARTYPE vt;
- Data_Get_Struct(self, struct olevariantdata, pvar);
- vt = V_VT(&(pvar->var));
- if (V_ISARRAY(&(pvar->var)) && ((vt & ~VT_BYREF) != (VT_UI1|VT_ARRAY) || TYPE(val) != T_STRING)) {
- rb_raise(eWIN32OLERuntimeError,
- "`value=' is not available for this variant type object");
- }
- ole_val2olevariantdata(val, vt, pvar);
- return Qnil;
}
static void
@@ -9115,10 +3845,8 @@ free_enc2cp(void)
void
Init_win32ole(void)
{
+ cWIN32OLE_lcid = LOCALE_SYSTEM_DEFAULT;
g_ole_initialized_init();
- ary_ole_event = rb_ary_new();
- rb_gc_register_mark_object(ary_ole_event);
- id_events = rb_intern("events");
com_vtbl.QueryInterface = QueryInterface;
com_vtbl.AddRef = AddRef;
@@ -9189,168 +3917,97 @@ Init_win32ole(void)
rb_define_method(cWIN32OLE, "ole_query_interface", fole_query_interface, 1);
rb_define_method(cWIN32OLE, "ole_respond_to?", fole_respond_to, 1);
+ /* Constants definition */
+
+ /*
+ * Version string of WIN32OLE.
+ */
rb_define_const(cWIN32OLE, "VERSION", rb_str_new2(WIN32OLE_VERSION));
+
+ /*
+ * After invoking OLE methods with reference arguments, you can access
+ * the value of arguments by using ARGV.
+ *
+ * If the method of OLE(COM) server written by C#.NET is following:
+ *
+ * void calcsum(int a, int b, out int c) {
+ * c = a + b;
+ * }
+ *
+ * then, the Ruby OLE(COM) client script to retrieve the value of
+ * argument c after invoking calcsum method is following:
+ *
+ * a = 10
+ * b = 20
+ * c = 0
+ * comserver.calcsum(a, b, c)
+ * p c # => 0
+ * p WIN32OLE::ARGV # => [10, 20, 30]
+ *
+ * You can use WIN32OLE_VARIANT object to retrieve the value of reference
+ * arguments instead of refering WIN32OLE::ARGV.
+ *
+ */
rb_define_const(cWIN32OLE, "ARGV", rb_ary_new());
+ /*
+ * 0: ANSI code page. See WIN32OLE.codepage and WIN32OLE.codepage=.
+ */
rb_define_const(cWIN32OLE, "CP_ACP", INT2FIX(CP_ACP));
+
+ /*
+ * 1: OEM code page. See WIN32OLE.codepage and WIN32OLE.codepage=.
+ */
rb_define_const(cWIN32OLE, "CP_OEMCP", INT2FIX(CP_OEMCP));
+
+ /*
+ * 2
+ */
rb_define_const(cWIN32OLE, "CP_MACCP", INT2FIX(CP_MACCP));
+
+ /*
+ * 3: current thread ANSI code page. See WIN32OLE.codepage and
+ * WIN32OLE.codepage=.
+ */
rb_define_const(cWIN32OLE, "CP_THREAD_ACP", INT2FIX(CP_THREAD_ACP));
+
+ /*
+ * 42: symbol code page. See WIN32OLE.codepage and WIN32OLE.codepage=.
+ */
rb_define_const(cWIN32OLE, "CP_SYMBOL", INT2FIX(CP_SYMBOL));
+
+ /*
+ * 65000: UTF-7 code page. See WIN32OLE.codepage and WIN32OLE.codepage=.
+ */
rb_define_const(cWIN32OLE, "CP_UTF7", INT2FIX(CP_UTF7));
+
+ /*
+ * 65001: UTF-8 code page. See WIN32OLE.codepage and WIN32OLE.codepage=.
+ */
rb_define_const(cWIN32OLE, "CP_UTF8", INT2FIX(CP_UTF8));
+ /*
+ * 0x0800: default locale for the operating system. See WIN32OLE.locale
+ * and WIN32OLE.locale=.
+ */
rb_define_const(cWIN32OLE, "LOCALE_SYSTEM_DEFAULT", INT2FIX(LOCALE_SYSTEM_DEFAULT));
+
+ /*
+ * 0x0400: default locale for the user or process. See WIN32OLE.locale
+ * and WIN32OLE.locale=.
+ */
rb_define_const(cWIN32OLE, "LOCALE_USER_DEFAULT", INT2FIX(LOCALE_USER_DEFAULT));
- mWIN32OLE_VARIANT = rb_define_module_under(cWIN32OLE, "VARIANT");
- rb_define_const(mWIN32OLE_VARIANT, "VT_EMPTY", INT2FIX(VT_EMPTY));
- rb_define_const(mWIN32OLE_VARIANT, "VT_NULL", INT2FIX(VT_NULL));
- rb_define_const(mWIN32OLE_VARIANT, "VT_I2", INT2FIX(VT_I2));
- rb_define_const(mWIN32OLE_VARIANT, "VT_I4", INT2FIX(VT_I4));
- rb_define_const(mWIN32OLE_VARIANT, "VT_R4", INT2FIX(VT_R4));
- rb_define_const(mWIN32OLE_VARIANT, "VT_R8", INT2FIX(VT_R8));
- rb_define_const(mWIN32OLE_VARIANT, "VT_CY", INT2FIX(VT_CY));
- rb_define_const(mWIN32OLE_VARIANT, "VT_DATE", INT2FIX(VT_DATE));
- rb_define_const(mWIN32OLE_VARIANT, "VT_BSTR", INT2FIX(VT_BSTR));
- rb_define_const(mWIN32OLE_VARIANT, "VT_USERDEFINED", INT2FIX(VT_USERDEFINED));
- rb_define_const(mWIN32OLE_VARIANT, "VT_PTR", INT2FIX(VT_PTR));
- rb_define_const(mWIN32OLE_VARIANT, "VT_DISPATCH", INT2FIX(VT_DISPATCH));
- rb_define_const(mWIN32OLE_VARIANT, "VT_ERROR", INT2FIX(VT_ERROR));
- rb_define_const(mWIN32OLE_VARIANT, "VT_BOOL", INT2FIX(VT_BOOL));
- rb_define_const(mWIN32OLE_VARIANT, "VT_VARIANT", INT2FIX(VT_VARIANT));
- rb_define_const(mWIN32OLE_VARIANT, "VT_UNKNOWN", INT2FIX(VT_UNKNOWN));
- rb_define_const(mWIN32OLE_VARIANT, "VT_I1", INT2FIX(VT_I1));
- rb_define_const(mWIN32OLE_VARIANT, "VT_UI1", INT2FIX(VT_UI1));
- rb_define_const(mWIN32OLE_VARIANT, "VT_UI2", INT2FIX(VT_UI2));
- rb_define_const(mWIN32OLE_VARIANT, "VT_UI4", INT2FIX(VT_UI4));
-#if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__)
- rb_define_const(mWIN32OLE_VARIANT, "VT_I8", INT2FIX(VT_I8));
- rb_define_const(mWIN32OLE_VARIANT, "VT_UI8", INT2FIX(VT_UI8));
-#endif
- rb_define_const(mWIN32OLE_VARIANT, "VT_INT", INT2FIX(VT_INT));
- rb_define_const(mWIN32OLE_VARIANT, "VT_UINT", INT2FIX(VT_UINT));
- rb_define_const(mWIN32OLE_VARIANT, "VT_ARRAY", INT2FIX(VT_ARRAY));
- rb_define_const(mWIN32OLE_VARIANT, "VT_BYREF", INT2FIX(VT_BYREF));
-
- cWIN32OLE_TYPELIB = rb_define_class("WIN32OLE_TYPELIB", rb_cObject);
- rb_define_singleton_method(cWIN32OLE_TYPELIB, "typelibs", foletypelib_s_typelibs, 0);
- rb_define_alloc_func(cWIN32OLE_TYPELIB, foletypelib_s_allocate);
- rb_define_method(cWIN32OLE_TYPELIB, "initialize", foletypelib_initialize, -2);
- rb_define_method(cWIN32OLE_TYPELIB, "guid", foletypelib_guid, 0);
- rb_define_method(cWIN32OLE_TYPELIB, "name", foletypelib_name, 0);
- rb_define_method(cWIN32OLE_TYPELIB, "version", foletypelib_version, 0);
- rb_define_method(cWIN32OLE_TYPELIB, "major_version", foletypelib_major_version, 0);
- rb_define_method(cWIN32OLE_TYPELIB, "minor_version", foletypelib_minor_version, 0);
- rb_define_method(cWIN32OLE_TYPELIB, "path", foletypelib_path, 0);
- rb_define_method(cWIN32OLE_TYPELIB, "ole_types", foletypelib_ole_types, 0);
- rb_define_alias(cWIN32OLE_TYPELIB, "ole_classes", "ole_types");
- rb_define_method(cWIN32OLE_TYPELIB, "visible?", foletypelib_visible, 0);
- rb_define_method(cWIN32OLE_TYPELIB, "library_name", foletypelib_library_name, 0);
- rb_define_alias(cWIN32OLE_TYPELIB, "to_s", "name");
- rb_define_method(cWIN32OLE_TYPELIB, "inspect", foletypelib_inspect, 0);
-
- cWIN32OLE_TYPE = rb_define_class("WIN32OLE_TYPE", rb_cObject);
- rb_define_singleton_method(cWIN32OLE_TYPE, "ole_classes", foletype_s_ole_classes, 1);
- rb_define_singleton_method(cWIN32OLE_TYPE, "typelibs", foletype_s_typelibs, 0);
- rb_define_singleton_method(cWIN32OLE_TYPE, "progids", foletype_s_progids, 0);
- rb_define_alloc_func(cWIN32OLE_TYPE, foletype_s_allocate);
- rb_define_method(cWIN32OLE_TYPE, "initialize", foletype_initialize, 2);
- rb_define_method(cWIN32OLE_TYPE, "name", foletype_name, 0);
- rb_define_method(cWIN32OLE_TYPE, "ole_type", foletype_ole_type, 0);
- rb_define_method(cWIN32OLE_TYPE, "guid", foletype_guid, 0);
- rb_define_method(cWIN32OLE_TYPE, "progid", foletype_progid, 0);
- rb_define_method(cWIN32OLE_TYPE, "visible?", foletype_visible, 0);
- rb_define_alias(cWIN32OLE_TYPE, "to_s", "name");
- rb_define_method(cWIN32OLE_TYPE, "major_version", foletype_major_version, 0);
- rb_define_method(cWIN32OLE_TYPE, "minor_version", foletype_minor_version, 0);
- rb_define_method(cWIN32OLE_TYPE, "typekind", foletype_typekind, 0);
- rb_define_method(cWIN32OLE_TYPE, "helpstring", foletype_helpstring, 0);
- rb_define_method(cWIN32OLE_TYPE, "src_type", foletype_src_type, 0);
- rb_define_method(cWIN32OLE_TYPE, "helpfile", foletype_helpfile, 0);
- rb_define_method(cWIN32OLE_TYPE, "helpcontext", foletype_helpcontext, 0);
- rb_define_method(cWIN32OLE_TYPE, "variables", foletype_variables, 0);
- rb_define_method(cWIN32OLE_TYPE, "ole_methods", foletype_methods, 0);
- rb_define_method(cWIN32OLE_TYPE, "ole_typelib", foletype_ole_typelib, 0);
- rb_define_method(cWIN32OLE_TYPE, "implemented_ole_types", foletype_impl_ole_types, 0);
- rb_define_method(cWIN32OLE_TYPE, "source_ole_types", foletype_source_ole_types, 0);
- rb_define_method(cWIN32OLE_TYPE, "default_event_sources", foletype_default_event_sources, 0);
- rb_define_method(cWIN32OLE_TYPE, "default_ole_types", foletype_default_ole_types, 0);
- rb_define_method(cWIN32OLE_TYPE, "inspect", foletype_inspect, 0);
-
- cWIN32OLE_VARIABLE = rb_define_class("WIN32OLE_VARIABLE", rb_cObject);
- rb_define_method(cWIN32OLE_VARIABLE, "name", folevariable_name, 0);
- rb_define_method(cWIN32OLE_VARIABLE, "ole_type", folevariable_ole_type, 0);
- rb_define_method(cWIN32OLE_VARIABLE, "ole_type_detail", folevariable_ole_type_detail, 0);
- rb_define_method(cWIN32OLE_VARIABLE, "value", folevariable_value, 0);
- rb_define_method(cWIN32OLE_VARIABLE, "visible?", folevariable_visible, 0);
- rb_define_method(cWIN32OLE_VARIABLE, "variable_kind", folevariable_variable_kind, 0);
- rb_define_method(cWIN32OLE_VARIABLE, "varkind", folevariable_varkind, 0);
- rb_define_method(cWIN32OLE_VARIABLE, "inspect", folevariable_inspect, 0);
- rb_define_alias(cWIN32OLE_VARIABLE, "to_s", "name");
-
- cWIN32OLE_METHOD = rb_define_class("WIN32OLE_METHOD", rb_cObject);
- rb_define_alloc_func(cWIN32OLE_METHOD, folemethod_s_allocate);
- rb_define_method(cWIN32OLE_METHOD, "initialize", folemethod_initialize, 2);
- rb_define_method(cWIN32OLE_METHOD, "name", folemethod_name, 0);
- rb_define_method(cWIN32OLE_METHOD, "return_type", folemethod_return_type, 0);
- rb_define_method(cWIN32OLE_METHOD, "return_vtype", folemethod_return_vtype, 0);
- rb_define_method(cWIN32OLE_METHOD, "return_type_detail", folemethod_return_type_detail, 0);
- rb_define_method(cWIN32OLE_METHOD, "invoke_kind", folemethod_invoke_kind, 0);
- rb_define_method(cWIN32OLE_METHOD, "invkind", folemethod_invkind, 0);
- rb_define_method(cWIN32OLE_METHOD, "visible?", folemethod_visible, 0);
- rb_define_method(cWIN32OLE_METHOD, "event?", folemethod_event, 0);
- rb_define_method(cWIN32OLE_METHOD, "event_interface", folemethod_event_interface, 0);
- rb_define_method(cWIN32OLE_METHOD, "helpstring", folemethod_helpstring, 0);
- rb_define_method(cWIN32OLE_METHOD, "helpfile", folemethod_helpfile, 0);
- rb_define_method(cWIN32OLE_METHOD, "helpcontext", folemethod_helpcontext, 0);
- rb_define_method(cWIN32OLE_METHOD, "dispid", folemethod_dispid, 0);
- rb_define_method(cWIN32OLE_METHOD, "offset_vtbl", folemethod_offset_vtbl, 0);
- rb_define_method(cWIN32OLE_METHOD, "size_params", folemethod_size_params, 0);
- rb_define_method(cWIN32OLE_METHOD, "size_opt_params", folemethod_size_opt_params, 0);
- rb_define_method(cWIN32OLE_METHOD, "params", folemethod_params, 0);
- rb_define_alias(cWIN32OLE_METHOD, "to_s", "name");
- rb_define_method(cWIN32OLE_METHOD, "inspect", folemethod_inspect, 0);
-
- cWIN32OLE_PARAM = rb_define_class("WIN32OLE_PARAM", rb_cObject);
- rb_define_alloc_func(cWIN32OLE_PARAM, foleparam_s_allocate);
- rb_define_method(cWIN32OLE_PARAM, "initialize", foleparam_initialize, 2);
- rb_define_method(cWIN32OLE_PARAM, "name", foleparam_name, 0);
- rb_define_method(cWIN32OLE_PARAM, "ole_type", foleparam_ole_type, 0);
- rb_define_method(cWIN32OLE_PARAM, "ole_type_detail", foleparam_ole_type_detail, 0);
- rb_define_method(cWIN32OLE_PARAM, "input?", foleparam_input, 0);
- rb_define_method(cWIN32OLE_PARAM, "output?", foleparam_output, 0);
- rb_define_method(cWIN32OLE_PARAM, "optional?", foleparam_optional, 0);
- rb_define_method(cWIN32OLE_PARAM, "retval?", foleparam_retval, 0);
- rb_define_method(cWIN32OLE_PARAM, "default", foleparam_default, 0);
- rb_define_alias(cWIN32OLE_PARAM, "to_s", "name");
- rb_define_method(cWIN32OLE_PARAM, "inspect", foleparam_inspect, 0);
-
- cWIN32OLE_EVENT = rb_define_class("WIN32OLE_EVENT", rb_cObject);
- rb_define_singleton_method(cWIN32OLE_EVENT, "message_loop", fev_s_msg_loop, 0);
- rb_define_alloc_func(cWIN32OLE_EVENT, fev_s_allocate);
- rb_define_method(cWIN32OLE_EVENT, "initialize", fev_initialize, -1);
- rb_define_method(cWIN32OLE_EVENT, "on_event", fev_on_event, -1);
- rb_define_method(cWIN32OLE_EVENT, "on_event_with_outargs", fev_on_event_with_outargs, -1);
- rb_define_method(cWIN32OLE_EVENT, "off_event", fev_off_event, -1);
- rb_define_method(cWIN32OLE_EVENT, "unadvise", fev_unadvise, 0);
- rb_define_method(cWIN32OLE_EVENT, "handler=", fev_set_handler, 1);
- rb_define_method(cWIN32OLE_EVENT, "handler", fev_get_handler, 0);
-
- cWIN32OLE_VARIANT = rb_define_class("WIN32OLE_VARIANT", rb_cObject);
- rb_define_alloc_func(cWIN32OLE_VARIANT, folevariant_s_allocate);
- rb_define_singleton_method(cWIN32OLE_VARIANT, "array", folevariant_s_array, 2);
- rb_define_method(cWIN32OLE_VARIANT, "initialize", folevariant_initialize, -2);
- rb_define_method(cWIN32OLE_VARIANT, "value", folevariant_value, 0);
- rb_define_method(cWIN32OLE_VARIANT, "value=", folevariant_set_value, 1);
- rb_define_method(cWIN32OLE_VARIANT, "vartype", folevariant_vartype, 0);
- rb_define_method(cWIN32OLE_VARIANT, "[]", folevariant_ary_aref, -1);
- rb_define_method(cWIN32OLE_VARIANT, "[]=", folevariant_ary_aset, -1);
- rb_define_const(cWIN32OLE_VARIANT, "Empty", rb_funcall(cWIN32OLE_VARIANT, rb_intern("new"), 2, Qnil, INT2FIX(VT_EMPTY)));
- rb_define_const(cWIN32OLE_VARIANT, "Null", rb_funcall(cWIN32OLE_VARIANT, rb_intern("new"), 2, Qnil, INT2FIX(VT_NULL)));
- rb_define_const(cWIN32OLE_VARIANT, "Nothing", rb_funcall(cWIN32OLE_VARIANT, rb_intern("new"), 2, Qnil, INT2FIX(VT_DISPATCH)));
-
- eWIN32OLERuntimeError = rb_define_class("WIN32OLERuntimeError", rb_eRuntimeError);
+ Init_win32ole_variant_m();
+ Init_win32ole_typelib();
+ Init_win32ole_type();
+ Init_win32ole_variable();
+ Init_win32ole_method();
+ Init_win32ole_param();
+ Init_win32ole_event();
+ Init_win32ole_variant();
+ Init_win32ole_record();
+ Init_win32ole_error();
init_enc2cp();
atexit((void (*)(void))free_enc2cp);
diff --git a/ext/win32ole/win32ole.h b/ext/win32ole/win32ole.h
new file mode 100644
index 0000000000..880fe86466
--- /dev/null
+++ b/ext/win32ole/win32ole.h
@@ -0,0 +1,161 @@
+#ifndef WIN32OLE_H
+#define WIN32OLE_H 1
+#include "ruby/ruby.h"
+#include "ruby/st.h"
+#include "ruby/encoding.h"
+
+#define GNUC_OLDER_3_4_4 \
+ ((__GNUC__ < 3) || \
+ ((__GNUC__ <= 3) && (__GNUC_MINOR__ < 4)) || \
+ ((__GNUC__ <= 3) && (__GNUC_MINOR__ <= 4) && (__GNUC_PATCHLEVEL__ <= 4)))
+
+#if (defined(__GNUC__)) && (GNUC_OLDER_3_4_4)
+#ifndef NONAMELESSUNION
+#define NONAMELESSUNION 1
+#endif
+#endif
+
+#include <ctype.h>
+
+#include <windows.h>
+#include <ocidl.h>
+#include <olectl.h>
+#include <ole2.h>
+#if defined(HAVE_TYPE_IMULTILANGUAGE2) || defined(HAVE_TYPE_IMULTILANGUAGE)
+#include <mlang.h>
+#endif
+#include <stdlib.h>
+#include <math.h>
+#ifdef HAVE_STDARG_PROTOTYPES
+#include <stdarg.h>
+#define va_init_list(a,b) va_start(a,b)
+#else
+#include <varargs.h>
+#define va_init_list(a,b) va_start(a)
+#endif
+#include <objidl.h>
+
+#define DOUT fprintf(stderr,"%s(%d)\n", __FILE__, __LINE__)
+#define DOUTS(x) fprintf(stderr,"%s(%d):" #x "=%s\n",__FILE__, __LINE__,x)
+#define DOUTMSG(x) fprintf(stderr, "%s(%d):" #x "\n",__FILE__, __LINE__)
+#define DOUTI(x) fprintf(stderr, "%s(%d):" #x "=%d\n",__FILE__, __LINE__,x)
+#define DOUTD(x) fprintf(stderr, "%s(%d):" #x "=%f\n",__FILE__, __LINE__,x)
+
+#if (defined(__GNUC__)) && (GNUC_OLDER_3_4_4)
+#define V_UNION1(X, Y) ((X)->u.Y)
+#else
+#define V_UNION1(X, Y) ((X)->Y)
+#endif
+
+#if (defined(__GNUC__)) && (GNUC_OLDER_3_4_4)
+#undef V_UNION
+#define V_UNION(X,Y) ((X)->n1.n2.n3.Y)
+
+#undef V_VT
+#define V_VT(X) ((X)->n1.n2.vt)
+
+#undef V_BOOL
+#define V_BOOL(X) V_UNION(X,boolVal)
+#endif
+
+#ifndef V_I1REF
+#define V_I1REF(X) V_UNION(X, pcVal)
+#endif
+
+#ifndef V_UI2REF
+#define V_UI2REF(X) V_UNION(X, puiVal)
+#endif
+
+#ifndef V_INT
+#define V_INT(X) V_UNION(X, intVal)
+#endif
+
+#ifndef V_INTREF
+#define V_INTREF(X) V_UNION(X, pintVal)
+#endif
+
+#ifndef V_UINT
+#define V_UINT(X) V_UNION(X, uintVal)
+#endif
+
+#ifndef V_UINTREF
+#define V_UINTREF(X) V_UNION(X, puintVal)
+#endif
+
+#ifdef HAVE_LONG_LONG
+#define I8_2_NUM LL2NUM
+#define UI8_2_NUM ULL2NUM
+#define NUM2I8 NUM2LL
+#define NUM2UI8 NUM2ULL
+#else
+#define I8_2_NUM INT2NUM
+#define UI8_2_NUM UINT2NUM
+#define NUM2I8 NUM2INT
+#define NUM2UI8 NUM2UINT
+#endif
+
+#define OLE_ADDREF(X) (X) ? ((X)->lpVtbl->AddRef(X)) : 0
+#define OLE_RELEASE(X) (X) ? ((X)->lpVtbl->Release(X)) : 0
+#define OLE_FREE(x) {\
+ if(ole_initialized() == TRUE) {\
+ if(x) {\
+ OLE_RELEASE(x);\
+ (x) = 0;\
+ }\
+ }\
+}
+
+#define OLE_GET_TYPEATTR(X, Y) ((X)->lpVtbl->GetTypeAttr((X), (Y)))
+#define OLE_RELEASE_TYPEATTR(X, Y) ((X)->lpVtbl->ReleaseTypeAttr((X), (Y)))
+
+struct oledata {
+ IDispatch *pDispatch;
+};
+
+#define OLEData_Get_Struct(obj, pole) {\
+ Data_Get_Struct(obj, struct oledata, pole);\
+ if(!pole->pDispatch) {\
+ rb_raise(rb_eRuntimeError, "failed to get Dispatch Interface");\
+ }\
+}
+
+VALUE cWIN32OLE;
+LCID cWIN32OLE_lcid;
+
+LPWSTR ole_vstr2wc(VALUE vstr);
+LONG reg_open_key(HKEY hkey, const char *name, HKEY *phkey);
+LONG reg_open_vkey(HKEY hkey, VALUE key, HKEY *phkey);
+VALUE reg_enum_key(HKEY hkey, DWORD i);
+VALUE reg_get_val(HKEY hkey, const char *subkey);
+VALUE reg_get_val2(HKEY hkey, const char *subkey);
+void ole_initialize(void);
+VALUE default_inspect(VALUE self, const char *class_name);
+char *ole_wc2mb(LPWSTR pw);
+VALUE ole_wc2vstr(LPWSTR pw, BOOL isfree);
+
+#define WC2VSTR(x) ole_wc2vstr((x), TRUE)
+
+BOOL ole_initialized();
+HRESULT ole_docinfo_from_type(ITypeInfo *pTypeInfo, BSTR *name, BSTR *helpstr, DWORD *helpcontext, BSTR *helpfile);
+VALUE ole_typedesc2val(ITypeInfo *pTypeInfo, TYPEDESC *pTypeDesc, VALUE typedetails);
+VALUE make_inspect(const char *class_name, VALUE detail);
+void ole_val2variant(VALUE val, VARIANT *var);
+void ole_val2variant2(VALUE val, VARIANT *var);
+void ole_val2variant_ex(VALUE val, VARIANT *var, VARTYPE vt);
+VALUE ole_variant2val(VARIANT *pvar);
+HRESULT ole_val_ary2variant_ary(VALUE val, VARIANT *var, VARTYPE vt);
+VOID *val2variant_ptr(VALUE val, VARIANT *var, VARTYPE vt);
+HRESULT typelib_from_val(VALUE obj, ITypeLib **pTypeLib);
+
+#include "win32ole_variant_m.h"
+#include "win32ole_typelib.h"
+#include "win32ole_type.h"
+#include "win32ole_variable.h"
+#include "win32ole_method.h"
+#include "win32ole_param.h"
+#include "win32ole_event.h"
+#include "win32ole_variant.h"
+#include "win32ole_record.h"
+#include "win32ole_error.h"
+
+#endif
diff --git a/ext/win32ole/win32ole_error.c b/ext/win32ole/win32ole_error.c
new file mode 100644
index 0000000000..f122b2aa1b
--- /dev/null
+++ b/ext/win32ole/win32ole_error.c
@@ -0,0 +1,82 @@
+#include "win32ole.h"
+
+static VALUE ole_hresult2msg(HRESULT hr);
+
+static VALUE
+ole_hresult2msg(HRESULT hr)
+{
+ VALUE msg = Qnil;
+ char *p_msg = NULL;
+ char *term = NULL;
+ DWORD dwCount;
+
+ char strhr[100];
+ sprintf(strhr, " HRESULT error code:0x%08x\n ", (unsigned)hr);
+ msg = rb_str_new2(strhr);
+ dwCount = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, hr,
+ MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),
+ (LPTSTR)&p_msg, 0, NULL);
+ if (dwCount == 0) {
+ dwCount = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, hr, cWIN32OLE_lcid,
+ (LPTSTR)&p_msg, 0, NULL);
+ }
+ if (dwCount > 0) {
+ term = p_msg + strlen(p_msg);
+ while (p_msg < term) {
+ term--;
+ if (*term == '\r' || *term == '\n')
+ *term = '\0';
+ else break;
+ }
+ if (p_msg[0] != '\0') {
+ rb_str_cat2(msg, p_msg);
+ }
+ }
+ LocalFree(p_msg);
+ return msg;
+}
+
+void
+ole_raise(HRESULT hr, VALUE ecs, const char *fmt, ...)
+{
+ va_list args;
+ VALUE msg;
+ VALUE err_msg;
+ va_init_list(args, fmt);
+ msg = rb_vsprintf(fmt, args);
+ va_end(args);
+
+ err_msg = ole_hresult2msg(hr);
+ if(err_msg != Qnil) {
+ rb_str_cat2(msg, "\n");
+ rb_str_append(msg, err_msg);
+ }
+ rb_exc_raise(rb_exc_new_str(ecs, msg));
+}
+
+void
+Init_win32ole_error() {
+ /*
+ * Document-class: WIN32OLERuntimeError
+ *
+ * Raised when OLE processing failed.
+ *
+ * EX:
+ *
+ * obj = WIN32OLE.new("NonExistProgID")
+ *
+ * raises the exception:
+ *
+ * WIN32OLERuntimeError: unknown OLE server: `NonExistProgID'
+ * HRESULT error code:0x800401f3
+ * Invalid class string
+ *
+ */
+ eWIN32OLERuntimeError = rb_define_class("WIN32OLERuntimeError", rb_eRuntimeError);
+}
diff --git a/ext/win32ole/win32ole_error.h b/ext/win32ole/win32ole_error.h
new file mode 100644
index 0000000000..aa0a42c8c0
--- /dev/null
+++ b/ext/win32ole/win32ole_error.h
@@ -0,0 +1,8 @@
+#ifndef WIN32OLE_ERROR_H
+#define WIN32OLE_ERROR_H 1
+
+VALUE eWIN32OLERuntimeError;
+void ole_raise(HRESULT hr, VALUE ecs, const char *fmt, ...);
+void Init_win32ole_error();
+
+#endif
diff --git a/ext/win32ole/win32ole_event.c b/ext/win32ole/win32ole_event.c
new file mode 100644
index 0000000000..55b884ff1b
--- /dev/null
+++ b/ext/win32ole/win32ole_event.c
@@ -0,0 +1,1258 @@
+#include "win32ole.h"
+
+/*
+ * Document-class: WIN32OLE_EVENT
+ *
+ * <code>WIN32OLE_EVENT</code> objects controls OLE event.
+ */
+
+typedef struct {
+ struct IEventSinkVtbl * lpVtbl;
+} IEventSink, *PEVENTSINK;
+
+typedef struct IEventSinkVtbl IEventSinkVtbl;
+
+struct IEventSinkVtbl {
+ STDMETHOD(QueryInterface)(
+ PEVENTSINK,
+ REFIID,
+ LPVOID *);
+ STDMETHOD_(ULONG, AddRef)(PEVENTSINK);
+ STDMETHOD_(ULONG, Release)(PEVENTSINK);
+
+ STDMETHOD(GetTypeInfoCount)(
+ PEVENTSINK,
+ UINT *);
+ STDMETHOD(GetTypeInfo)(
+ PEVENTSINK,
+ UINT,
+ LCID,
+ ITypeInfo **);
+ STDMETHOD(GetIDsOfNames)(
+ PEVENTSINK,
+ REFIID,
+ OLECHAR **,
+ UINT,
+ LCID,
+ DISPID *);
+ STDMETHOD(Invoke)(
+ PEVENTSINK,
+ DISPID,
+ REFIID,
+ LCID,
+ WORD,
+ DISPPARAMS *,
+ VARIANT *,
+ EXCEPINFO *,
+ UINT *);
+};
+
+typedef struct tagIEVENTSINKOBJ {
+ IEventSinkVtbl *lpVtbl;
+ DWORD m_cRef;
+ IID m_iid;
+ long m_event_id;
+ ITypeInfo *pTypeInfo;
+}IEVENTSINKOBJ, *PIEVENTSINKOBJ;
+
+struct oleeventdata {
+ DWORD dwCookie;
+ IConnectionPoint *pConnectionPoint;
+ IDispatch *pDispatch;
+ long event_id;
+};
+
+static VALUE ary_ole_event;
+static ID id_events;
+
+VALUE cWIN32OLE_EVENT;
+
+static BOOL g_IsEventSinkVtblInitialized = FALSE;
+
+static IEventSinkVtbl vtEventSink;
+
+void EVENTSINK_Destructor(PIEVENTSINKOBJ);
+static void ole_val2ptr_variant(VALUE val, VARIANT *var);
+static void hash2ptr_dispparams(VALUE hash, ITypeInfo *pTypeInfo, DISPID dispid, DISPPARAMS *pdispparams);
+static VALUE hash2result(VALUE hash);
+static void ary2ptr_dispparams(VALUE ary, DISPPARAMS *pdispparams);
+static VALUE exec_callback(VALUE arg);
+static VALUE rescue_callback(VALUE arg);
+static HRESULT find_iid(VALUE ole, char *pitf, IID *piid, ITypeInfo **ppTypeInfo);
+static HRESULT find_coclass(ITypeInfo *pTypeInfo, TYPEATTR *pTypeAttr, ITypeInfo **pTypeInfo2, TYPEATTR **pTypeAttr2);
+static HRESULT find_default_source_from_typeinfo(ITypeInfo *pTypeInfo, TYPEATTR *pTypeAttr, ITypeInfo **ppTypeInfo);
+static HRESULT find_default_source(VALUE ole, IID *piid, ITypeInfo **ppTypeInfo);
+static long ole_search_event_at(VALUE ary, VALUE ev);
+static VALUE ole_search_event(VALUE ary, VALUE ev, BOOL *is_default);
+static VALUE ole_search_handler_method(VALUE handler, VALUE ev, BOOL *is_default_handler);
+static void ole_delete_event(VALUE ary, VALUE ev);
+static void ole_event_free(struct oleeventdata *poleev);
+static VALUE fev_s_allocate(VALUE klass);
+static VALUE ev_advise(int argc, VALUE *argv, VALUE self);
+static VALUE fev_initialize(int argc, VALUE *argv, VALUE self);
+static void ole_msg_loop(void);
+static VALUE fev_s_msg_loop(VALUE klass);
+static void add_event_call_back(VALUE obj, VALUE event, VALUE data);
+static VALUE ev_on_event(int argc, VALUE *argv, VALUE self, VALUE is_ary_arg);
+static VALUE fev_on_event(int argc, VALUE *argv, VALUE self);
+static VALUE fev_on_event_with_outargs(int argc, VALUE *argv, VALUE self);
+static VALUE fev_off_event(int argc, VALUE *argv, VALUE self);
+static VALUE fev_unadvise(VALUE self);
+static VALUE fev_set_handler(VALUE self, VALUE val);
+static VALUE fev_get_handler(VALUE self);
+static VALUE evs_push(VALUE ev);
+static VALUE evs_delete(long i);
+static VALUE evs_entry(long i);
+static long evs_length(void);
+
+STDMETHODIMP EVENTSINK_Invoke(
+ PEVENTSINK pEventSink,
+ DISPID dispid,
+ REFIID riid,
+ LCID lcid,
+ WORD wFlags,
+ DISPPARAMS *pdispparams,
+ VARIANT *pvarResult,
+ EXCEPINFO *pexcepinfo,
+ UINT *puArgErr
+ ) {
+
+ HRESULT hr;
+ BSTR bstr;
+ unsigned int count;
+ unsigned int i;
+ ITypeInfo *pTypeInfo;
+ VARIANT *pvar;
+ VALUE ary, obj, event, args, outargv, ev, result;
+ VALUE handler = Qnil;
+ VALUE arg[3];
+ VALUE mid;
+ VALUE is_outarg = Qfalse;
+ BOOL is_default_handler = FALSE;
+ int state;
+
+ PIEVENTSINKOBJ pEV = (PIEVENTSINKOBJ)pEventSink;
+ pTypeInfo = pEV->pTypeInfo;
+ obj = evs_entry(pEV->m_event_id);
+ if (!rb_obj_is_kind_of(obj, cWIN32OLE_EVENT)) {
+ return NOERROR;
+ }
+
+ ary = rb_ivar_get(obj, id_events);
+ if (NIL_P(ary) || !RB_TYPE_P(ary, T_ARRAY)) {
+ return NOERROR;
+ }
+ hr = pTypeInfo->lpVtbl->GetNames(pTypeInfo, dispid,
+ &bstr, 1, &count);
+ if (FAILED(hr)) {
+ return NOERROR;
+ }
+ ev = WC2VSTR(bstr);
+ event = ole_search_event(ary, ev, &is_default_handler);
+ if (RB_TYPE_P(event, T_ARRAY)) {
+ handler = rb_ary_entry(event, 0);
+ mid = rb_intern("call");
+ is_outarg = rb_ary_entry(event, 3);
+ } else {
+ handler = rb_ivar_get(obj, rb_intern("handler"));
+ if (handler == Qnil) {
+ return NOERROR;
+ }
+ mid = ole_search_handler_method(handler, ev, &is_default_handler);
+ }
+ if (handler == Qnil || mid == Qnil) {
+ return NOERROR;
+ }
+
+ args = rb_ary_new();
+ if (is_default_handler) {
+ rb_ary_push(args, ev);
+ }
+
+ /* make argument of event handler */
+ for (i = 0; i < pdispparams->cArgs; ++i) {
+ pvar = &pdispparams->rgvarg[pdispparams->cArgs-i-1];
+ rb_ary_push(args, ole_variant2val(pvar));
+ }
+ outargv = Qnil;
+ if (is_outarg == Qtrue) {
+ outargv = rb_ary_new();
+ rb_ary_push(args, outargv);
+ }
+
+ /*
+ * if exception raised in event callback,
+ * then you receive cfp consistency error.
+ * to avoid this error we use begin rescue end.
+ * and the exception raised then error message print
+ * and exit ruby process by Win32OLE itself.
+ */
+ arg[0] = handler;
+ arg[1] = mid;
+ arg[2] = args;
+ result = rb_protect(exec_callback, (VALUE)arg, &state);
+ if (state != 0) {
+ rescue_callback(Qnil);
+ }
+ if(RB_TYPE_P(result, T_HASH)) {
+ hash2ptr_dispparams(result, pTypeInfo, dispid, pdispparams);
+ result = hash2result(result);
+ }else if (is_outarg == Qtrue && RB_TYPE_P(outargv, T_ARRAY)) {
+ ary2ptr_dispparams(outargv, pdispparams);
+ }
+
+ if (pvarResult) {
+ VariantInit(pvarResult);
+ ole_val2variant(result, pvarResult);
+ }
+
+ return NOERROR;
+}
+
+STDMETHODIMP
+EVENTSINK_QueryInterface(
+ PEVENTSINK pEV,
+ REFIID iid,
+ LPVOID* ppv
+ ) {
+ if (IsEqualIID(iid, &IID_IUnknown) ||
+ IsEqualIID(iid, &IID_IDispatch) ||
+ IsEqualIID(iid, &((PIEVENTSINKOBJ)pEV)->m_iid)) {
+ *ppv = pEV;
+ }
+ else {
+ *ppv = NULL;
+ return E_NOINTERFACE;
+ }
+ ((LPUNKNOWN)*ppv)->lpVtbl->AddRef((LPUNKNOWN)*ppv);
+ return NOERROR;
+}
+
+STDMETHODIMP_(ULONG)
+EVENTSINK_AddRef(
+ PEVENTSINK pEV
+ ){
+ PIEVENTSINKOBJ pEVObj = (PIEVENTSINKOBJ)pEV;
+ return ++pEVObj->m_cRef;
+}
+
+STDMETHODIMP_(ULONG) EVENTSINK_Release(
+ PEVENTSINK pEV
+ ) {
+ PIEVENTSINKOBJ pEVObj = (PIEVENTSINKOBJ)pEV;
+ --pEVObj->m_cRef;
+ if(pEVObj->m_cRef != 0)
+ return pEVObj->m_cRef;
+ EVENTSINK_Destructor(pEVObj);
+ return 0;
+}
+
+STDMETHODIMP EVENTSINK_GetTypeInfoCount(
+ PEVENTSINK pEV,
+ UINT *pct
+ ) {
+ *pct = 0;
+ return NOERROR;
+}
+
+STDMETHODIMP EVENTSINK_GetTypeInfo(
+ PEVENTSINK pEV,
+ UINT info,
+ LCID lcid,
+ ITypeInfo **pInfo
+ ) {
+ *pInfo = NULL;
+ return DISP_E_BADINDEX;
+}
+
+STDMETHODIMP EVENTSINK_GetIDsOfNames(
+ PEVENTSINK pEventSink,
+ REFIID riid,
+ OLECHAR **szNames,
+ UINT cNames,
+ LCID lcid,
+ DISPID *pDispID
+ ) {
+ ITypeInfo *pTypeInfo;
+ PIEVENTSINKOBJ pEV = (PIEVENTSINKOBJ)pEventSink;
+ pTypeInfo = pEV->pTypeInfo;
+ if (pTypeInfo) {
+ return pTypeInfo->lpVtbl->GetIDsOfNames(pTypeInfo, szNames, cNames, pDispID);
+ }
+ return DISP_E_UNKNOWNNAME;
+}
+
+PIEVENTSINKOBJ
+EVENTSINK_Constructor() {
+ PIEVENTSINKOBJ pEv;
+ if (!g_IsEventSinkVtblInitialized) {
+ vtEventSink.QueryInterface=EVENTSINK_QueryInterface;
+ vtEventSink.AddRef = EVENTSINK_AddRef;
+ vtEventSink.Release = EVENTSINK_Release;
+ vtEventSink.Invoke = EVENTSINK_Invoke;
+ vtEventSink.GetIDsOfNames = EVENTSINK_GetIDsOfNames;
+ vtEventSink.GetTypeInfoCount = EVENTSINK_GetTypeInfoCount;
+ vtEventSink.GetTypeInfo = EVENTSINK_GetTypeInfo;
+
+ g_IsEventSinkVtblInitialized = TRUE;
+ }
+ pEv = ALLOC_N(IEVENTSINKOBJ, 1);
+ if(pEv == NULL) return NULL;
+ pEv->lpVtbl = &vtEventSink;
+ pEv->m_cRef = 0;
+ pEv->m_event_id = 0;
+ pEv->pTypeInfo = NULL;
+ return pEv;
+}
+
+void
+EVENTSINK_Destructor(
+ PIEVENTSINKOBJ pEVObj
+ ) {
+ if(pEVObj != NULL) {
+ OLE_RELEASE(pEVObj->pTypeInfo);
+ free(pEVObj);
+ pEVObj = NULL;
+ }
+}
+
+static void
+ole_val2ptr_variant(VALUE val, VARIANT *var)
+{
+ switch (TYPE(val)) {
+ case T_STRING:
+ if (V_VT(var) == (VT_BSTR | VT_BYREF)) {
+ *V_BSTRREF(var) = ole_vstr2wc(val);
+ }
+ break;
+ case T_FIXNUM:
+ switch(V_VT(var)) {
+ case (VT_UI1 | VT_BYREF) :
+ *V_UI1REF(var) = NUM2CHR(val);
+ break;
+ case (VT_I2 | VT_BYREF) :
+ *V_I2REF(var) = (short)NUM2INT(val);
+ break;
+ case (VT_I4 | VT_BYREF) :
+ *V_I4REF(var) = NUM2INT(val);
+ break;
+ case (VT_R4 | VT_BYREF) :
+ *V_R4REF(var) = (float)NUM2INT(val);
+ break;
+ case (VT_R8 | VT_BYREF) :
+ *V_R8REF(var) = NUM2INT(val);
+ break;
+ default:
+ break;
+ }
+ break;
+ case T_FLOAT:
+ switch(V_VT(var)) {
+ case (VT_I2 | VT_BYREF) :
+ *V_I2REF(var) = (short)NUM2INT(val);
+ break;
+ case (VT_I4 | VT_BYREF) :
+ *V_I4REF(var) = NUM2INT(val);
+ break;
+ case (VT_R4 | VT_BYREF) :
+ *V_R4REF(var) = (float)NUM2DBL(val);
+ break;
+ case (VT_R8 | VT_BYREF) :
+ *V_R8REF(var) = NUM2DBL(val);
+ break;
+ default:
+ break;
+ }
+ break;
+ case T_BIGNUM:
+ if (V_VT(var) == (VT_R8 | VT_BYREF)) {
+ *V_R8REF(var) = rb_big2dbl(val);
+ }
+ break;
+ case T_TRUE:
+ if (V_VT(var) == (VT_BOOL | VT_BYREF)) {
+ *V_BOOLREF(var) = VARIANT_TRUE;
+ }
+ break;
+ case T_FALSE:
+ if (V_VT(var) == (VT_BOOL | VT_BYREF)) {
+ *V_BOOLREF(var) = VARIANT_FALSE;
+ }
+ break;
+ default:
+ break;
+ }
+}
+
+static void
+hash2ptr_dispparams(VALUE hash, ITypeInfo *pTypeInfo, DISPID dispid, DISPPARAMS *pdispparams)
+{
+ BSTR *bstrs;
+ HRESULT hr;
+ UINT len, i;
+ VARIANT *pvar;
+ VALUE val;
+ VALUE key;
+ len = 0;
+ bstrs = ALLOCA_N(BSTR, pdispparams->cArgs + 1);
+ hr = pTypeInfo->lpVtbl->GetNames(pTypeInfo, dispid,
+ bstrs, pdispparams->cArgs + 1,
+ &len);
+ if (FAILED(hr))
+ return;
+
+ for (i = 0; i < len - 1; i++) {
+ key = WC2VSTR(bstrs[i + 1]);
+ val = rb_hash_aref(hash, INT2FIX(i));
+ if (val == Qnil)
+ val = rb_hash_aref(hash, key);
+ if (val == Qnil)
+ val = rb_hash_aref(hash, rb_str_intern(key));
+ pvar = &pdispparams->rgvarg[pdispparams->cArgs-i-1];
+ ole_val2ptr_variant(val, pvar);
+ }
+}
+
+static VALUE
+hash2result(VALUE hash)
+{
+ VALUE ret = Qnil;
+ ret = rb_hash_aref(hash, rb_str_new2("return"));
+ if (ret == Qnil)
+ ret = rb_hash_aref(hash, rb_str_intern(rb_str_new2("return")));
+ return ret;
+}
+
+static void
+ary2ptr_dispparams(VALUE ary, DISPPARAMS *pdispparams)
+{
+ int i;
+ VALUE v;
+ VARIANT *pvar;
+ for(i = 0; i < RARRAY_LEN(ary) && (unsigned int) i < pdispparams->cArgs; i++) {
+ v = rb_ary_entry(ary, i);
+ pvar = &pdispparams->rgvarg[pdispparams->cArgs-i-1];
+ ole_val2ptr_variant(v, pvar);
+ }
+}
+
+static VALUE
+exec_callback(VALUE arg)
+{
+ VALUE *parg = (VALUE *)arg;
+ VALUE handler = parg[0];
+ VALUE mid = parg[1];
+ VALUE args = parg[2];
+ return rb_apply(handler, mid, args);
+}
+
+static VALUE
+rescue_callback(VALUE arg)
+{
+
+ VALUE error;
+ VALUE e = rb_errinfo();
+ VALUE bt = rb_funcall(e, rb_intern("backtrace"), 0);
+ VALUE msg = rb_funcall(e, rb_intern("message"), 0);
+ bt = rb_ary_entry(bt, 0);
+ error = rb_sprintf("%"PRIsVALUE": %"PRIsVALUE" (%s)\n", bt, msg, rb_obj_classname(e));
+ rb_write_error(StringValuePtr(error));
+ rb_backtrace();
+ ruby_finalize();
+ exit(-1);
+
+ return Qnil;
+}
+
+static HRESULT
+find_iid(VALUE ole, char *pitf, IID *piid, ITypeInfo **ppTypeInfo)
+{
+ HRESULT hr;
+ IDispatch *pDispatch;
+ ITypeInfo *pTypeInfo;
+ ITypeLib *pTypeLib;
+ TYPEATTR *pTypeAttr;
+ HREFTYPE RefType;
+ ITypeInfo *pImplTypeInfo;
+ TYPEATTR *pImplTypeAttr;
+
+ struct oledata *pole;
+ unsigned int index;
+ unsigned int count;
+ int type;
+ BSTR bstr;
+ char *pstr;
+
+ BOOL is_found = FALSE;
+ LCID lcid = cWIN32OLE_lcid;
+
+ OLEData_Get_Struct(ole, pole);
+
+ pDispatch = pole->pDispatch;
+
+ hr = pDispatch->lpVtbl->GetTypeInfo(pDispatch, 0, lcid, &pTypeInfo);
+ if (FAILED(hr))
+ return hr;
+
+ hr = pTypeInfo->lpVtbl->GetContainingTypeLib(pTypeInfo,
+ &pTypeLib,
+ &index);
+ OLE_RELEASE(pTypeInfo);
+ if (FAILED(hr))
+ return hr;
+
+ if (!pitf) {
+ hr = pTypeLib->lpVtbl->GetTypeInfoOfGuid(pTypeLib,
+ piid,
+ ppTypeInfo);
+ OLE_RELEASE(pTypeLib);
+ return hr;
+ }
+ count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
+ for (index = 0; index < count; index++) {
+ hr = pTypeLib->lpVtbl->GetTypeInfo(pTypeLib,
+ index,
+ &pTypeInfo);
+ if (FAILED(hr))
+ break;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+
+ if(FAILED(hr)) {
+ OLE_RELEASE(pTypeInfo);
+ break;
+ }
+ if(pTypeAttr->typekind == TKIND_COCLASS) {
+ for (type = 0; type < pTypeAttr->cImplTypes; type++) {
+ hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo,
+ type,
+ &RefType);
+ if (FAILED(hr))
+ break;
+ hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo,
+ RefType,
+ &pImplTypeInfo);
+ if (FAILED(hr))
+ break;
+
+ hr = pImplTypeInfo->lpVtbl->GetDocumentation(pImplTypeInfo,
+ -1,
+ &bstr,
+ NULL, NULL, NULL);
+ if (FAILED(hr)) {
+ OLE_RELEASE(pImplTypeInfo);
+ break;
+ }
+ pstr = ole_wc2mb(bstr);
+ if (strcmp(pitf, pstr) == 0) {
+ hr = pImplTypeInfo->lpVtbl->GetTypeAttr(pImplTypeInfo,
+ &pImplTypeAttr);
+ if (SUCCEEDED(hr)) {
+ is_found = TRUE;
+ *piid = pImplTypeAttr->guid;
+ if (ppTypeInfo) {
+ *ppTypeInfo = pImplTypeInfo;
+ (*ppTypeInfo)->lpVtbl->AddRef((*ppTypeInfo));
+ }
+ pImplTypeInfo->lpVtbl->ReleaseTypeAttr(pImplTypeInfo,
+ pImplTypeAttr);
+ }
+ }
+ free(pstr);
+ OLE_RELEASE(pImplTypeInfo);
+ if (is_found || FAILED(hr))
+ break;
+ }
+ }
+
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ OLE_RELEASE(pTypeInfo);
+ if (is_found || FAILED(hr))
+ break;
+ }
+ OLE_RELEASE(pTypeLib);
+ if(!is_found)
+ return E_NOINTERFACE;
+ return hr;
+}
+
+static HRESULT
+find_coclass(
+ ITypeInfo *pTypeInfo,
+ TYPEATTR *pTypeAttr,
+ ITypeInfo **pCOTypeInfo,
+ TYPEATTR **pCOTypeAttr)
+{
+ HRESULT hr = E_NOINTERFACE;
+ ITypeLib *pTypeLib;
+ int count;
+ BOOL found = FALSE;
+ ITypeInfo *pTypeInfo2;
+ TYPEATTR *pTypeAttr2;
+ int flags;
+ int i,j;
+ HREFTYPE href;
+ ITypeInfo *pRefTypeInfo;
+ TYPEATTR *pRefTypeAttr;
+
+ hr = pTypeInfo->lpVtbl->GetContainingTypeLib(pTypeInfo, &pTypeLib, NULL);
+ if (FAILED(hr)) {
+ return hr;
+ }
+ count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
+ for (i = 0; i < count && !found; i++) {
+ hr = pTypeLib->lpVtbl->GetTypeInfo(pTypeLib, i, &pTypeInfo2);
+ if (FAILED(hr))
+ continue;
+ hr = OLE_GET_TYPEATTR(pTypeInfo2, &pTypeAttr2);
+ if (FAILED(hr)) {
+ OLE_RELEASE(pTypeInfo2);
+ continue;
+ }
+ if (pTypeAttr2->typekind != TKIND_COCLASS) {
+ OLE_RELEASE_TYPEATTR(pTypeInfo2, pTypeAttr2);
+ OLE_RELEASE(pTypeInfo2);
+ continue;
+ }
+ for (j = 0; j < pTypeAttr2->cImplTypes && !found; j++) {
+ hr = pTypeInfo2->lpVtbl->GetImplTypeFlags(pTypeInfo2, j, &flags);
+ if (FAILED(hr))
+ continue;
+ if (!(flags & IMPLTYPEFLAG_FDEFAULT))
+ continue;
+ hr = pTypeInfo2->lpVtbl->GetRefTypeOfImplType(pTypeInfo2, j, &href);
+ if (FAILED(hr))
+ continue;
+ hr = pTypeInfo2->lpVtbl->GetRefTypeInfo(pTypeInfo2, href, &pRefTypeInfo);
+ if (FAILED(hr))
+ continue;
+ hr = OLE_GET_TYPEATTR(pRefTypeInfo, &pRefTypeAttr);
+ if (FAILED(hr)) {
+ OLE_RELEASE(pRefTypeInfo);
+ continue;
+ }
+ if (IsEqualGUID(&(pTypeAttr->guid), &(pRefTypeAttr->guid))) {
+ found = TRUE;
+ }
+ }
+ if (!found) {
+ OLE_RELEASE_TYPEATTR(pTypeInfo2, pTypeAttr2);
+ OLE_RELEASE(pTypeInfo2);
+ }
+ }
+ OLE_RELEASE(pTypeLib);
+ if (found) {
+ *pCOTypeInfo = pTypeInfo2;
+ *pCOTypeAttr = pTypeAttr2;
+ hr = S_OK;
+ } else {
+ hr = E_NOINTERFACE;
+ }
+ return hr;
+}
+
+static HRESULT
+find_default_source_from_typeinfo(
+ ITypeInfo *pTypeInfo,
+ TYPEATTR *pTypeAttr,
+ ITypeInfo **ppTypeInfo)
+{
+ int i = 0;
+ HRESULT hr = E_NOINTERFACE;
+ int flags;
+ HREFTYPE hRefType;
+ /* Enumerate all implemented types of the COCLASS */
+ for (i = 0; i < pTypeAttr->cImplTypes; i++) {
+ hr = pTypeInfo->lpVtbl->GetImplTypeFlags(pTypeInfo, i, &flags);
+ if (FAILED(hr))
+ continue;
+
+ /*
+ looking for the [default] [source]
+ we just hope that it is a dispinterface :-)
+ */
+ if ((flags & IMPLTYPEFLAG_FDEFAULT) &&
+ (flags & IMPLTYPEFLAG_FSOURCE)) {
+
+ hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo,
+ i, &hRefType);
+ if (FAILED(hr))
+ continue;
+ hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo,
+ hRefType, ppTypeInfo);
+ if (SUCCEEDED(hr))
+ break;
+ }
+ }
+ return hr;
+}
+
+static HRESULT
+find_default_source(VALUE ole, IID *piid, ITypeInfo **ppTypeInfo)
+{
+ HRESULT hr;
+ IProvideClassInfo2 *pProvideClassInfo2;
+ IProvideClassInfo *pProvideClassInfo;
+ void *p;
+
+ IDispatch *pDispatch;
+ ITypeInfo *pTypeInfo;
+ ITypeInfo *pTypeInfo2 = NULL;
+ TYPEATTR *pTypeAttr;
+ TYPEATTR *pTypeAttr2 = NULL;
+
+ struct oledata *pole;
+
+ OLEData_Get_Struct(ole, pole);
+ pDispatch = pole->pDispatch;
+ hr = pDispatch->lpVtbl->QueryInterface(pDispatch,
+ &IID_IProvideClassInfo2,
+ &p);
+ if (SUCCEEDED(hr)) {
+ pProvideClassInfo2 = p;
+ hr = pProvideClassInfo2->lpVtbl->GetGUID(pProvideClassInfo2,
+ GUIDKIND_DEFAULT_SOURCE_DISP_IID,
+ piid);
+ OLE_RELEASE(pProvideClassInfo2);
+ if (SUCCEEDED(hr)) {
+ hr = find_iid(ole, NULL, piid, ppTypeInfo);
+ }
+ }
+ if (SUCCEEDED(hr)) {
+ return hr;
+ }
+ hr = pDispatch->lpVtbl->QueryInterface(pDispatch,
+ &IID_IProvideClassInfo,
+ &p);
+ if (SUCCEEDED(hr)) {
+ pProvideClassInfo = p;
+ hr = pProvideClassInfo->lpVtbl->GetClassInfo(pProvideClassInfo,
+ &pTypeInfo);
+ OLE_RELEASE(pProvideClassInfo);
+ }
+ if (FAILED(hr)) {
+ hr = pDispatch->lpVtbl->GetTypeInfo(pDispatch, 0, cWIN32OLE_lcid, &pTypeInfo );
+ }
+ if (FAILED(hr))
+ return hr;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr)) {
+ OLE_RELEASE(pTypeInfo);
+ return hr;
+ }
+
+ *ppTypeInfo = 0;
+ hr = find_default_source_from_typeinfo(pTypeInfo, pTypeAttr, ppTypeInfo);
+ if (!*ppTypeInfo) {
+ hr = find_coclass(pTypeInfo, pTypeAttr, &pTypeInfo2, &pTypeAttr2);
+ if (SUCCEEDED(hr)) {
+ hr = find_default_source_from_typeinfo(pTypeInfo2, pTypeAttr2, ppTypeInfo);
+ OLE_RELEASE_TYPEATTR(pTypeInfo2, pTypeAttr2);
+ OLE_RELEASE(pTypeInfo2);
+ }
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ OLE_RELEASE(pTypeInfo);
+ /* Now that would be a bad surprise, if we didn't find it, wouldn't it? */
+ if (!*ppTypeInfo) {
+ if (SUCCEEDED(hr))
+ hr = E_UNEXPECTED;
+ return hr;
+ }
+
+ /* Determine IID of default source interface */
+ hr = (*ppTypeInfo)->lpVtbl->GetTypeAttr(*ppTypeInfo, &pTypeAttr);
+ if (SUCCEEDED(hr)) {
+ *piid = pTypeAttr->guid;
+ (*ppTypeInfo)->lpVtbl->ReleaseTypeAttr(*ppTypeInfo, pTypeAttr);
+ }
+ else
+ OLE_RELEASE(*ppTypeInfo);
+
+ return hr;
+}
+
+static long
+ole_search_event_at(VALUE ary, VALUE ev)
+{
+ VALUE event;
+ VALUE event_name;
+ long i, len;
+ long ret = -1;
+ len = RARRAY_LEN(ary);
+ for(i = 0; i < len; i++) {
+ event = rb_ary_entry(ary, i);
+ event_name = rb_ary_entry(event, 1);
+ if(NIL_P(event_name) && NIL_P(ev)) {
+ ret = i;
+ break;
+ }
+ else if (RB_TYPE_P(ev, T_STRING) &&
+ RB_TYPE_P(event_name, T_STRING) &&
+ rb_str_cmp(ev, event_name) == 0) {
+ ret = i;
+ break;
+ }
+ }
+ return ret;
+}
+
+static VALUE
+ole_search_event(VALUE ary, VALUE ev, BOOL *is_default)
+{
+ VALUE event;
+ VALUE def_event;
+ VALUE event_name;
+ int i, len;
+ *is_default = FALSE;
+ def_event = Qnil;
+ len = RARRAY_LEN(ary);
+ for(i = 0; i < len; i++) {
+ event = rb_ary_entry(ary, i);
+ event_name = rb_ary_entry(event, 1);
+ if(NIL_P(event_name)) {
+ *is_default = TRUE;
+ def_event = event;
+ }
+ else if (rb_str_cmp(ev, event_name) == 0) {
+ *is_default = FALSE;
+ return event;
+ }
+ }
+ return def_event;
+}
+
+static VALUE
+ole_search_handler_method(VALUE handler, VALUE ev, BOOL *is_default_handler)
+{
+ VALUE mid;
+
+ *is_default_handler = FALSE;
+ mid = rb_to_id(rb_sprintf("on%"PRIsVALUE, ev));
+ if (rb_respond_to(handler, mid)) {
+ return mid;
+ }
+ mid = rb_intern("method_missing");
+ if (rb_respond_to(handler, mid)) {
+ *is_default_handler = TRUE;
+ return mid;
+ }
+ return Qnil;
+}
+
+static void
+ole_delete_event(VALUE ary, VALUE ev)
+{
+ long at = -1;
+ at = ole_search_event_at(ary, ev);
+ if (at >= 0) {
+ rb_ary_delete_at(ary, at);
+ }
+}
+
+
+static void
+ole_event_free(struct oleeventdata *poleev)
+{
+ if (poleev->pConnectionPoint) {
+ poleev->pConnectionPoint->lpVtbl->Unadvise(poleev->pConnectionPoint, poleev->dwCookie);
+ OLE_RELEASE(poleev->pConnectionPoint);
+ poleev->pConnectionPoint = NULL;
+ }
+ OLE_RELEASE(poleev->pDispatch);
+ free(poleev);
+}
+
+static VALUE
+fev_s_allocate(VALUE klass)
+{
+ VALUE obj;
+ struct oleeventdata *poleev;
+ obj = Data_Make_Struct(klass,struct oleeventdata,0,ole_event_free,poleev);
+ poleev->dwCookie = 0;
+ poleev->pConnectionPoint = NULL;
+ poleev->event_id = 0;
+ poleev->pDispatch = NULL;
+ return obj;
+}
+
+static VALUE
+ev_advise(int argc, VALUE *argv, VALUE self)
+{
+
+ VALUE ole, itf;
+ struct oledata *pole;
+ char *pitf;
+ HRESULT hr;
+ IID iid;
+ ITypeInfo *pTypeInfo = 0;
+ IDispatch *pDispatch;
+ IConnectionPointContainer *pContainer;
+ IConnectionPoint *pConnectionPoint;
+ IEVENTSINKOBJ *pIEV;
+ DWORD dwCookie;
+ struct oleeventdata *poleev;
+ void *p;
+
+ rb_scan_args(argc, argv, "11", &ole, &itf);
+
+ if (!rb_obj_is_kind_of(ole, cWIN32OLE)) {
+ rb_raise(rb_eTypeError, "1st parameter must be WIN32OLE object");
+ }
+
+ if(!RB_TYPE_P(itf, T_NIL)) {
+ pitf = StringValuePtr(itf);
+ if (rb_safe_level() > 0 && OBJ_TAINTED(itf)) {
+ rb_raise(rb_eSecurityError, "insecure event creation - `%s'",
+ StringValuePtr(itf));
+ }
+ hr = find_iid(ole, pitf, &iid, &pTypeInfo);
+ }
+ else {
+ hr = find_default_source(ole, &iid, &pTypeInfo);
+ }
+ if (FAILED(hr)) {
+ ole_raise(hr, rb_eRuntimeError, "interface not found");
+ }
+
+ OLEData_Get_Struct(ole, pole);
+ pDispatch = pole->pDispatch;
+ hr = pDispatch->lpVtbl->QueryInterface(pDispatch,
+ &IID_IConnectionPointContainer,
+ &p);
+ if (FAILED(hr)) {
+ OLE_RELEASE(pTypeInfo);
+ ole_raise(hr, rb_eRuntimeError,
+ "failed to query IConnectionPointContainer");
+ }
+ pContainer = p;
+
+ hr = pContainer->lpVtbl->FindConnectionPoint(pContainer,
+ &iid,
+ &pConnectionPoint);
+ OLE_RELEASE(pContainer);
+ if (FAILED(hr)) {
+ OLE_RELEASE(pTypeInfo);
+ ole_raise(hr, rb_eRuntimeError, "failed to query IConnectionPoint");
+ }
+ pIEV = EVENTSINK_Constructor();
+ pIEV->m_iid = iid;
+ hr = pConnectionPoint->lpVtbl->Advise(pConnectionPoint,
+ (IUnknown*)pIEV,
+ &dwCookie);
+ if (FAILED(hr)) {
+ ole_raise(hr, rb_eRuntimeError, "Advise Error");
+ }
+
+ Data_Get_Struct(self, struct oleeventdata, poleev);
+ pIEV->m_event_id = evs_length();
+ pIEV->pTypeInfo = pTypeInfo;
+ poleev->dwCookie = dwCookie;
+ poleev->pConnectionPoint = pConnectionPoint;
+ poleev->event_id = pIEV->m_event_id;
+ poleev->pDispatch = pDispatch;
+ OLE_ADDREF(pDispatch);
+
+ return self;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_EVENT.new(ole, event) #=> WIN32OLE_EVENT object.
+ *
+ * Returns OLE event object.
+ * The first argument specifies WIN32OLE object.
+ * The second argument specifies OLE event name.
+ * ie = WIN32OLE.new('InternetExplorer.Application')
+ * ev = WIN32OLE_EVENT.new(ie, 'DWebBrowserEvents')
+ */
+static VALUE
+fev_initialize(int argc, VALUE *argv, VALUE self)
+{
+ ev_advise(argc, argv, self);
+ evs_push(self);
+ rb_ivar_set(self, id_events, rb_ary_new());
+ fev_set_handler(self, Qnil);
+ return self;
+}
+
+static void
+ole_msg_loop() {
+ MSG msg;
+ while(PeekMessage(&msg,NULL,0,0,PM_REMOVE)) {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_EVENT.message_loop
+ *
+ * Translates and dispatches Windows message.
+ */
+static VALUE
+fev_s_msg_loop(VALUE klass)
+{
+ ole_msg_loop();
+ return Qnil;
+}
+
+static void
+add_event_call_back(VALUE obj, VALUE event, VALUE data)
+{
+ VALUE events = rb_ivar_get(obj, id_events);
+ if (NIL_P(events) || !RB_TYPE_P(events, T_ARRAY)) {
+ events = rb_ary_new();
+ rb_ivar_set(obj, id_events, events);
+ }
+ ole_delete_event(events, event);
+ rb_ary_push(events, data);
+}
+
+static VALUE
+ev_on_event(int argc, VALUE *argv, VALUE self, VALUE is_ary_arg)
+{
+ struct oleeventdata *poleev;
+ VALUE event, args, data;
+ Data_Get_Struct(self, struct oleeventdata, poleev);
+ if (poleev->pConnectionPoint == NULL) {
+ rb_raise(eWIN32OLERuntimeError, "IConnectionPoint not found. You must call advise at first.");
+ }
+ rb_scan_args(argc, argv, "01*", &event, &args);
+ if(!NIL_P(event)) {
+ if(!RB_TYPE_P(event, T_STRING) && !RB_TYPE_P(event, T_SYMBOL)) {
+ rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)");
+ }
+ if (RB_TYPE_P(event, T_SYMBOL)) {
+ event = rb_sym_to_s(event);
+ }
+ }
+ data = rb_ary_new3(4, rb_block_proc(), event, args, is_ary_arg);
+ add_event_call_back(self, event, data);
+ return Qnil;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_EVENT#on_event([event]){...}
+ *
+ * Defines the callback event.
+ * If argument is omitted, this method defines the callback of all events.
+ * If you want to modify reference argument in callback, return hash in
+ * callback. If you want to return value to OLE server as result of callback
+ * use `return' or :return.
+ *
+ * ie = WIN32OLE.new('InternetExplorer.Application')
+ * ev = WIN32OLE_EVENT.new(ie)
+ * ev.on_event("NavigateComplete") {|url| puts url}
+ * ev.on_event() {|ev, *args| puts "#{ev} fired"}
+ *
+ * ev.on_event("BeforeNavigate2") {|*args|
+ * ...
+ * # set true to BeforeNavigate reference argument `Cancel'.
+ * # Cancel is 7-th argument of BeforeNavigate,
+ * # so you can use 6 as key of hash instead of 'Cancel'.
+ * # The argument is counted from 0.
+ * # The hash key of 0 means first argument.)
+ * {:Cancel => true} # or {'Cancel' => true} or {6 => true}
+ * }
+ *
+ * ev.on_event(...) {|*args|
+ * {:return => 1, :xxx => yyy}
+ * }
+ */
+static VALUE
+fev_on_event(int argc, VALUE *argv, VALUE self)
+{
+ return ev_on_event(argc, argv, self, Qfalse);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_EVENT#on_event_with_outargs([event]){...}
+ *
+ * Defines the callback of event.
+ * If you want modify argument in callback,
+ * you could use this method instead of WIN32OLE_EVENT#on_event.
+ *
+ * ie = WIN32OLE.new('InternetExplorer.Application')
+ * ev = WIN32OLE_EVENT.new(ie)
+ * ev.on_event_with_outargs('BeforeNavigate2') {|*args|
+ * args.last[6] = true
+ * }
+ */
+static VALUE
+fev_on_event_with_outargs(int argc, VALUE *argv, VALUE self)
+{
+ return ev_on_event(argc, argv, self, Qtrue);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_EVENT#off_event([event])
+ *
+ * removes the callback of event.
+ *
+ * ie = WIN32OLE.new('InternetExplorer.Application')
+ * ev = WIN32OLE_EVENT.new(ie)
+ * ev.on_event('BeforeNavigate2') {|*args|
+ * args.last[6] = true
+ * }
+ * ...
+ * ev.off_event('BeforeNavigate2')
+ * ...
+ */
+static VALUE
+fev_off_event(int argc, VALUE *argv, VALUE self)
+{
+ VALUE event = Qnil;
+ VALUE events;
+
+ rb_scan_args(argc, argv, "01", &event);
+ if(!NIL_P(event)) {
+ if(!RB_TYPE_P(event, T_STRING) && !RB_TYPE_P(event, T_SYMBOL)) {
+ rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)");
+ }
+ if (RB_TYPE_P(event, T_SYMBOL)) {
+ event = rb_sym_to_s(event);
+ }
+ }
+ events = rb_ivar_get(self, id_events);
+ if (NIL_P(events)) {
+ return Qnil;
+ }
+ ole_delete_event(events, event);
+ return Qnil;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_EVENT#unadvise -> nil
+ *
+ * disconnects OLE server. If this method called, then the WIN32OLE_EVENT object
+ * does not receive the OLE server event any more.
+ * This method is trial implementation.
+ *
+ * ie = WIN32OLE.new('InternetExplorer.Application')
+ * ev = WIN32OLE_EVENT.new(ie)
+ * ev.on_event() {...}
+ * ...
+ * ev.unadvise
+ *
+ */
+static VALUE
+fev_unadvise(VALUE self)
+{
+ struct oleeventdata *poleev;
+ Data_Get_Struct(self, struct oleeventdata, poleev);
+ if (poleev->pConnectionPoint) {
+ ole_msg_loop();
+ evs_delete(poleev->event_id);
+ poleev->pConnectionPoint->lpVtbl->Unadvise(poleev->pConnectionPoint, poleev->dwCookie);
+ OLE_RELEASE(poleev->pConnectionPoint);
+ poleev->pConnectionPoint = NULL;
+ }
+ OLE_FREE(poleev->pDispatch);
+ return Qnil;
+}
+
+static VALUE
+evs_push(VALUE ev)
+{
+ return rb_ary_push(ary_ole_event, ev);
+}
+
+static VALUE
+evs_delete(long i)
+{
+ rb_ary_store(ary_ole_event, i, Qnil);
+ return Qnil;
+}
+
+static VALUE
+evs_entry(long i)
+{
+ return rb_ary_entry(ary_ole_event, i);
+}
+
+static long
+evs_length(void)
+{
+ return RARRAY_LEN(ary_ole_event);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_EVENT#handler=
+ *
+ * sets event handler object. If handler object has onXXX
+ * method according to XXX event, then onXXX method is called
+ * when XXX event occurs.
+ *
+ * If handler object has method_missing and there is no
+ * method according to the event, then method_missing
+ * called and 1-st argument is event name.
+ *
+ * If handler object has onXXX method and there is block
+ * defined by WIN32OLE_EVENT#on_event('XXX'){},
+ * then block is executed but handler object method is not called
+ * when XXX event occurs.
+ *
+ * class Handler
+ * def onStatusTextChange(text)
+ * puts "StatusTextChanged"
+ * end
+ * def onPropertyChange(prop)
+ * puts "PropertyChanged"
+ * end
+ * def method_missing(ev, *arg)
+ * puts "other event #{ev}"
+ * end
+ * end
+ *
+ * handler = Handler.new
+ * ie = WIN32OLE.new('InternetExplorer.Application')
+ * ev = WIN32OLE_EVENT.new(ie)
+ * ev.on_event("StatusTextChange") {|*args|
+ * puts "this block executed."
+ * puts "handler.onStatusTextChange method is not called."
+ * }
+ * ev.handler = handler
+ *
+ */
+static VALUE
+fev_set_handler(VALUE self, VALUE val)
+{
+ return rb_ivar_set(self, rb_intern("handler"), val);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_EVENT#handler
+ *
+ * returns handler object.
+ *
+ */
+static VALUE
+fev_get_handler(VALUE self)
+{
+ return rb_ivar_get(self, rb_intern("handler"));
+}
+
+void
+Init_win32ole_event()
+{
+ ary_ole_event = rb_ary_new();
+ rb_gc_register_mark_object(ary_ole_event);
+ id_events = rb_intern("events");
+ cWIN32OLE_EVENT = rb_define_class("WIN32OLE_EVENT", rb_cObject);
+ rb_define_singleton_method(cWIN32OLE_EVENT, "message_loop", fev_s_msg_loop, 0);
+ rb_define_alloc_func(cWIN32OLE_EVENT, fev_s_allocate);
+ rb_define_method(cWIN32OLE_EVENT, "initialize", fev_initialize, -1);
+ rb_define_method(cWIN32OLE_EVENT, "on_event", fev_on_event, -1);
+ rb_define_method(cWIN32OLE_EVENT, "on_event_with_outargs", fev_on_event_with_outargs, -1);
+ rb_define_method(cWIN32OLE_EVENT, "off_event", fev_off_event, -1);
+ rb_define_method(cWIN32OLE_EVENT, "unadvise", fev_unadvise, 0);
+ rb_define_method(cWIN32OLE_EVENT, "handler=", fev_set_handler, 1);
+ rb_define_method(cWIN32OLE_EVENT, "handler", fev_get_handler, 0);
+}
diff --git a/ext/win32ole/win32ole_event.h b/ext/win32ole/win32ole_event.h
new file mode 100644
index 0000000000..509be05ea9
--- /dev/null
+++ b/ext/win32ole/win32ole_event.h
@@ -0,0 +1,6 @@
+#ifndef WIN32OLE_EVENT_H
+#define WIN32OLE_EVENT_H 1
+
+void Init_win32ole_event();
+
+#endif
diff --git a/ext/win32ole/win32ole_method.c b/ext/win32ole/win32ole_method.c
new file mode 100644
index 0000000000..672ec5c0e0
--- /dev/null
+++ b/ext/win32ole/win32ole_method.c
@@ -0,0 +1,928 @@
+#include "win32ole.h"
+
+static VALUE ole_method_sub(VALUE self, ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE name);
+static VALUE olemethod_from_typeinfo(VALUE self, ITypeInfo *pTypeInfo, VALUE name);
+static VALUE ole_methods_sub(ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE methods, int mask);
+static void olemethod_free(struct olemethoddata *polemethod);
+static VALUE olemethod_set_member(VALUE self, ITypeInfo *pTypeInfo, ITypeInfo *pOwnerTypeInfo, int index, VALUE name);
+static VALUE folemethod_initialize(VALUE self, VALUE oletype, VALUE method);
+static VALUE folemethod_name(VALUE self);
+static VALUE ole_method_return_type(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_return_type(VALUE self);
+static VALUE ole_method_return_vtype(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_return_vtype(VALUE self);
+static VALUE ole_method_return_type_detail(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_return_type_detail(VALUE self);
+static VALUE ole_method_invkind(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE ole_method_invoke_kind(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_invkind(VALUE self);
+static VALUE folemethod_invoke_kind(VALUE self);
+static VALUE ole_method_visible(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_visible(VALUE self);
+static VALUE ole_method_event(ITypeInfo *pTypeInfo, UINT method_index, VALUE method_name);
+static VALUE folemethod_event(VALUE self);
+static VALUE folemethod_event_interface(VALUE self);
+static HRESULT ole_method_docinfo_from_type(ITypeInfo *pTypeInfo, UINT method_index, BSTR *name, BSTR *helpstr, DWORD *helpcontext, BSTR *helpfile);
+static VALUE ole_method_helpstring(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_helpstring(VALUE self);
+static VALUE ole_method_helpfile(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_helpfile(VALUE self);
+static VALUE ole_method_helpcontext(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_helpcontext(VALUE self);
+static VALUE ole_method_dispid(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_dispid(VALUE self);
+static VALUE ole_method_offset_vtbl(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_offset_vtbl(VALUE self);
+static VALUE ole_method_size_params(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_size_params(VALUE self);
+static VALUE ole_method_size_opt_params(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_size_opt_params(VALUE self);
+static VALUE ole_method_params(ITypeInfo *pTypeInfo, UINT method_index);
+static VALUE folemethod_params(VALUE self);
+static VALUE folemethod_inspect(VALUE self);
+
+static void
+olemethod_free(struct olemethoddata *polemethod)
+{
+ OLE_FREE(polemethod->pTypeInfo);
+ OLE_FREE(polemethod->pOwnerTypeInfo);
+ free(polemethod);
+}
+
+static VALUE
+ole_method_sub(VALUE self, ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE name)
+{
+ HRESULT hr;
+ TYPEATTR *pTypeAttr;
+ BSTR bstr;
+ FUNCDESC *pFuncDesc;
+ WORD i;
+ VALUE fname;
+ VALUE method = Qnil;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
+ }
+ for(i = 0; i < pTypeAttr->cFuncs && method == Qnil; i++) {
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, i, &pFuncDesc);
+ if (FAILED(hr))
+ continue;
+
+ hr = pTypeInfo->lpVtbl->GetDocumentation(pTypeInfo, pFuncDesc->memid,
+ &bstr, NULL, NULL, NULL);
+ if (FAILED(hr)) {
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ continue;
+ }
+ fname = WC2VSTR(bstr);
+ if (strcasecmp(StringValuePtr(name), StringValuePtr(fname)) == 0) {
+ olemethod_set_member(self, pTypeInfo, pOwnerTypeInfo, i, fname);
+ method = self;
+ }
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ pFuncDesc=NULL;
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return method;
+}
+
+VALUE
+ole_methods_from_typeinfo(ITypeInfo *pTypeInfo, int mask)
+{
+ HRESULT hr;
+ TYPEATTR *pTypeAttr;
+ WORD i;
+ HREFTYPE href;
+ ITypeInfo *pRefTypeInfo;
+ VALUE methods = rb_ary_new();
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
+ }
+
+ ole_methods_sub(0, pTypeInfo, methods, mask);
+ for(i=0; i < pTypeAttr->cImplTypes; i++){
+ hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo, i, &href);
+ if(FAILED(hr))
+ continue;
+ hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo, href, &pRefTypeInfo);
+ if (FAILED(hr))
+ continue;
+ ole_methods_sub(pTypeInfo, pRefTypeInfo, methods, mask);
+ OLE_RELEASE(pRefTypeInfo);
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return methods;
+}
+
+static VALUE
+olemethod_from_typeinfo(VALUE self, ITypeInfo *pTypeInfo, VALUE name)
+{
+ HRESULT hr;
+ TYPEATTR *pTypeAttr;
+ WORD i;
+ HREFTYPE href;
+ ITypeInfo *pRefTypeInfo;
+ VALUE method = Qnil;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
+ }
+ method = ole_method_sub(self, 0, pTypeInfo, name);
+ if (method != Qnil) {
+ return method;
+ }
+ for(i=0; i < pTypeAttr->cImplTypes && method == Qnil; i++){
+ hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo, i, &href);
+ if(FAILED(hr))
+ continue;
+ hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo, href, &pRefTypeInfo);
+ if (FAILED(hr))
+ continue;
+ method = ole_method_sub(self, pTypeInfo, pRefTypeInfo, name);
+ OLE_RELEASE(pRefTypeInfo);
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return method;
+}
+
+static VALUE
+ole_methods_sub(ITypeInfo *pOwnerTypeInfo, ITypeInfo *pTypeInfo, VALUE methods, int mask)
+{
+ HRESULT hr;
+ TYPEATTR *pTypeAttr;
+ BSTR bstr;
+ FUNCDESC *pFuncDesc;
+ VALUE method;
+ WORD i;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
+ }
+ for(i = 0; i < pTypeAttr->cFuncs; i++) {
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, i, &pFuncDesc);
+ if (FAILED(hr))
+ continue;
+
+ hr = pTypeInfo->lpVtbl->GetDocumentation(pTypeInfo, pFuncDesc->memid,
+ &bstr, NULL, NULL, NULL);
+ if (FAILED(hr)) {
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ continue;
+ }
+ if(pFuncDesc->invkind & mask) {
+ method = folemethod_s_allocate(cWIN32OLE_METHOD);
+ olemethod_set_member(method, pTypeInfo, pOwnerTypeInfo,
+ i, WC2VSTR(bstr));
+ rb_ary_push(methods, method);
+ }
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ pFuncDesc=NULL;
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+
+ return methods;
+}
+
+VALUE
+create_win32ole_method(ITypeInfo *pTypeInfo, VALUE name)
+{
+
+ VALUE method = folemethod_s_allocate(cWIN32OLE_METHOD);
+ VALUE obj = olemethod_from_typeinfo(method, pTypeInfo, name);
+ return obj;
+}
+
+/*
+ * Document-class: WIN32OLE_METHOD
+ *
+ * <code>WIN32OLE_METHOD</code> objects represent OLE method information.
+ */
+
+static VALUE
+olemethod_set_member(VALUE self, ITypeInfo *pTypeInfo, ITypeInfo *pOwnerTypeInfo, int index, VALUE name)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ pmethod->pTypeInfo = pTypeInfo;
+ OLE_ADDREF(pTypeInfo);
+ pmethod->pOwnerTypeInfo = pOwnerTypeInfo;
+ if(pOwnerTypeInfo) OLE_ADDREF(pOwnerTypeInfo);
+ pmethod->index = index;
+ rb_ivar_set(self, rb_intern("name"), name);
+ return self;
+}
+
+VALUE
+folemethod_s_allocate(VALUE klass)
+{
+ struct olemethoddata *pmethod;
+ VALUE obj;
+ obj = Data_Make_Struct(klass,
+ struct olemethoddata,
+ 0, olemethod_free, pmethod);
+ pmethod->pTypeInfo = NULL;
+ pmethod->pOwnerTypeInfo = NULL;
+ pmethod->index = 0;
+ return obj;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD.new(ole_type, method) -> WIN32OLE_METHOD object
+ *
+ * Returns a new WIN32OLE_METHOD object which represents the information
+ * about OLE method.
+ * The first argument <i>ole_type</i> specifies WIN32OLE_TYPE object.
+ * The second argument <i>method</i> specifies OLE method name defined OLE class
+ * which represents WIN32OLE_TYPE object.
+ *
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
+ */
+static VALUE
+folemethod_initialize(VALUE self, VALUE oletype, VALUE method)
+{
+ VALUE obj = Qnil;
+ ITypeInfo *pTypeInfo;
+ if (rb_obj_is_kind_of(oletype, cWIN32OLE_TYPE)) {
+ SafeStringValue(method);
+ pTypeInfo = itypeinfo(oletype);
+ obj = olemethod_from_typeinfo(self, pTypeInfo, method);
+ if (obj == Qnil) {
+ rb_raise(eWIN32OLERuntimeError, "not found %s",
+ StringValuePtr(method));
+ }
+ }
+ else {
+ rb_raise(rb_eTypeError, "1st argument should be WIN32OLE_TYPE object");
+ }
+ return obj;
+}
+
+/*
+ * call-seq
+ * WIN32OLE_METHOD#name
+ *
+ * Returns the name of the method.
+ *
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
+ * puts method.name # => SaveAs
+ *
+ */
+static VALUE
+folemethod_name(VALUE self)
+{
+ return rb_ivar_get(self, rb_intern("name"));
+}
+
+static VALUE
+ole_method_return_type(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE type;
+
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetFuncDesc");
+
+ type = ole_typedesc2val(pTypeInfo, &(pFuncDesc->elemdescFunc.tdesc), Qnil);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return type;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#return_type
+ *
+ * Returns string of return value type of method.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
+ * method = WIN32OLE_METHOD.new(tobj, 'Add')
+ * puts method.return_type # => Workbook
+ *
+ */
+static VALUE
+folemethod_return_type(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_return_type(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_return_vtype(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE vvt;
+
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetFuncDesc");
+
+ vvt = INT2FIX(pFuncDesc->elemdescFunc.tdesc.vt);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return vvt;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#return_vtype
+ *
+ * Returns number of return value type of method.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
+ * method = WIN32OLE_METHOD.new(tobj, 'Add')
+ * puts method.return_vtype # => 26
+ *
+ */
+static VALUE
+folemethod_return_vtype(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_return_vtype(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_return_type_detail(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE type = rb_ary_new();
+
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ return type;
+
+ ole_typedesc2val(pTypeInfo, &(pFuncDesc->elemdescFunc.tdesc), type);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return type;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#return_type_detail
+ *
+ * Returns detail information of return value type of method.
+ * The information is array.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
+ * method = WIN32OLE_METHOD.new(tobj, 'Add')
+ * p method.return_type_detail # => ["PTR", "USERDEFINED", "Workbook"]
+ */
+static VALUE
+folemethod_return_type_detail(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_return_type_detail(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_invkind(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE invkind;
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if(FAILED(hr))
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetFuncDesc");
+ invkind = INT2FIX(pFuncDesc->invkind);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return invkind;
+}
+
+static VALUE
+ole_method_invoke_kind(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ VALUE type = rb_str_new2("UNKNOWN");
+ VALUE invkind = ole_method_invkind(pTypeInfo, method_index);
+ if((FIX2INT(invkind) & INVOKE_PROPERTYGET) &&
+ (FIX2INT(invkind) & INVOKE_PROPERTYPUT) ) {
+ type = rb_str_new2("PROPERTY");
+ } else if(FIX2INT(invkind) & INVOKE_PROPERTYGET) {
+ type = rb_str_new2("PROPERTYGET");
+ } else if(FIX2INT(invkind) & INVOKE_PROPERTYPUT) {
+ type = rb_str_new2("PROPERTYPUT");
+ } else if(FIX2INT(invkind) & INVOKE_PROPERTYPUTREF) {
+ type = rb_str_new2("PROPERTYPUTREF");
+ } else if(FIX2INT(invkind) & INVOKE_FUNC) {
+ type = rb_str_new2("FUNC");
+ }
+ return type;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_MTHOD#invkind
+ *
+ * Returns the method invoke kind.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
+ * method = WIN32OLE_METHOD.new(tobj, 'Add')
+ * puts method.invkind # => 1
+ *
+ */
+static VALUE
+folemethod_invkind(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_invkind(pmethod->pTypeInfo, pmethod->index);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#invoke_kind
+ *
+ * Returns the method kind string. The string is "UNKNOWN" or "PROPERTY"
+ * or "PROPERTY" or "PROPERTYGET" or "PROPERTYPUT" or "PROPERTYPPUTREF"
+ * or "FUNC".
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
+ * method = WIN32OLE_METHOD.new(tobj, 'Add')
+ * puts method.invoke_kind # => "FUNC"
+ */
+static VALUE
+folemethod_invoke_kind(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_invoke_kind(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_visible(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE visible;
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if(FAILED(hr))
+ return Qfalse;
+ if (pFuncDesc->wFuncFlags & (FUNCFLAG_FRESTRICTED |
+ FUNCFLAG_FHIDDEN |
+ FUNCFLAG_FNONBROWSABLE)) {
+ visible = Qfalse;
+ } else {
+ visible = Qtrue;
+ }
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return visible;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#visible?
+ *
+ * Returns true if the method is public.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
+ * method = WIN32OLE_METHOD.new(tobj, 'Add')
+ * puts method.visible? # => true
+ */
+static VALUE
+folemethod_visible(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_visible(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_event(ITypeInfo *pTypeInfo, UINT method_index, VALUE method_name)
+{
+ TYPEATTR *pTypeAttr;
+ HRESULT hr;
+ WORD i;
+ int flags;
+ HREFTYPE href;
+ ITypeInfo *pRefTypeInfo;
+ FUNCDESC *pFuncDesc;
+ BSTR bstr;
+ VALUE name;
+ VALUE event = Qfalse;
+
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr))
+ return event;
+ if(pTypeAttr->typekind != TKIND_COCLASS) {
+ pTypeInfo->lpVtbl->ReleaseTypeAttr(pTypeInfo, pTypeAttr);
+ return event;
+ }
+ for (i = 0; i < pTypeAttr->cImplTypes; i++) {
+ hr = pTypeInfo->lpVtbl->GetImplTypeFlags(pTypeInfo, i, &flags);
+ if (FAILED(hr))
+ continue;
+
+ if (flags & IMPLTYPEFLAG_FSOURCE) {
+ hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo,
+ i, &href);
+ if (FAILED(hr))
+ continue;
+ hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo,
+ href, &pRefTypeInfo);
+ if (FAILED(hr))
+ continue;
+ hr = pRefTypeInfo->lpVtbl->GetFuncDesc(pRefTypeInfo, method_index,
+ &pFuncDesc);
+ if (FAILED(hr)) {
+ OLE_RELEASE(pRefTypeInfo);
+ continue;
+ }
+
+ hr = pRefTypeInfo->lpVtbl->GetDocumentation(pRefTypeInfo,
+ pFuncDesc->memid,
+ &bstr, NULL, NULL, NULL);
+ if (FAILED(hr)) {
+ pRefTypeInfo->lpVtbl->ReleaseFuncDesc(pRefTypeInfo, pFuncDesc);
+ OLE_RELEASE(pRefTypeInfo);
+ continue;
+ }
+
+ name = WC2VSTR(bstr);
+ pRefTypeInfo->lpVtbl->ReleaseFuncDesc(pRefTypeInfo, pFuncDesc);
+ OLE_RELEASE(pRefTypeInfo);
+ if (rb_str_cmp(method_name, name) == 0) {
+ event = Qtrue;
+ break;
+ }
+ }
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return event;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#event?
+ *
+ * Returns true if the method is event.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SheetActivate')
+ * puts method.event? # => true
+ *
+ */
+static VALUE
+folemethod_event(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ if (!pmethod->pOwnerTypeInfo)
+ return Qfalse;
+ return ole_method_event(pmethod->pOwnerTypeInfo,
+ pmethod->index,
+ rb_ivar_get(self, rb_intern("name")));
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#event_interface
+ *
+ * Returns event interface name if the method is event.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SheetActivate')
+ * puts method.event_interface # => WorkbookEvents
+ */
+static VALUE
+folemethod_event_interface(VALUE self)
+{
+ BSTR name;
+ struct olemethoddata *pmethod;
+ HRESULT hr;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ if(folemethod_event(self) == Qtrue) {
+ hr = ole_docinfo_from_type(pmethod->pTypeInfo, &name, NULL, NULL, NULL);
+ if(SUCCEEDED(hr))
+ return WC2VSTR(name);
+ }
+ return Qnil;
+}
+
+static HRESULT
+ole_method_docinfo_from_type(
+ ITypeInfo *pTypeInfo,
+ UINT method_index,
+ BSTR *name,
+ BSTR *helpstr,
+ DWORD *helpcontext,
+ BSTR *helpfile
+ )
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ return hr;
+ hr = pTypeInfo->lpVtbl->GetDocumentation(pTypeInfo, pFuncDesc->memid,
+ name, helpstr,
+ helpcontext, helpfile);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return hr;
+}
+
+static VALUE
+ole_method_helpstring(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ HRESULT hr;
+ BSTR bhelpstring;
+ hr = ole_method_docinfo_from_type(pTypeInfo, method_index, NULL, &bhelpstring,
+ NULL, NULL);
+ if (FAILED(hr))
+ return Qnil;
+ return WC2VSTR(bhelpstring);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#helpstring
+ *
+ * Returns help string of OLE method. If the help string is not found,
+ * then the method returns nil.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', 'IWebBrowser')
+ * method = WIN32OLE_METHOD.new(tobj, 'Navigate')
+ * puts method.helpstring # => Navigates to a URL or file.
+ *
+ */
+static VALUE
+folemethod_helpstring(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_helpstring(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_helpfile(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ HRESULT hr;
+ BSTR bhelpfile;
+ hr = ole_method_docinfo_from_type(pTypeInfo, method_index, NULL, NULL,
+ NULL, &bhelpfile);
+ if (FAILED(hr))
+ return Qnil;
+ return WC2VSTR(bhelpfile);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#helpfile
+ *
+ * Returns help file. If help file is not found, then
+ * the method returns nil.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
+ * method = WIN32OLE_METHOD.new(tobj, 'Add')
+ * puts method.helpfile # => C:\...\VBAXL9.CHM
+ */
+static VALUE
+folemethod_helpfile(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+
+ return ole_method_helpfile(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_helpcontext(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ HRESULT hr;
+ DWORD helpcontext = 0;
+ hr = ole_method_docinfo_from_type(pTypeInfo, method_index, NULL, NULL,
+ &helpcontext, NULL);
+ if (FAILED(hr))
+ return Qnil;
+ return INT2FIX(helpcontext);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#helpcontext
+ *
+ * Returns help context.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
+ * method = WIN32OLE_METHOD.new(tobj, 'Add')
+ * puts method.helpcontext # => 65717
+ */
+static VALUE
+folemethod_helpcontext(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_helpcontext(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_dispid(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE dispid = Qnil;
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ return dispid;
+ dispid = INT2NUM(pFuncDesc->memid);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return dispid;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#dispid
+ *
+ * Returns dispatch ID.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
+ * method = WIN32OLE_METHOD.new(tobj, 'Add')
+ * puts method.dispid # => 181
+ */
+static VALUE
+folemethod_dispid(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_dispid(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_offset_vtbl(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE offset_vtbl = Qnil;
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ return offset_vtbl;
+ offset_vtbl = INT2FIX(pFuncDesc->oVft);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return offset_vtbl;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#offset_vtbl
+ *
+ * Returns the offset ov VTBL.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbooks')
+ * method = WIN32OLE_METHOD.new(tobj, 'Add')
+ * puts method.offset_vtbl # => 40
+ */
+static VALUE
+folemethod_offset_vtbl(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_offset_vtbl(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_size_params(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE size_params = Qnil;
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ return size_params;
+ size_params = INT2FIX(pFuncDesc->cParams);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return size_params;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#size_params
+ *
+ * Returns the size of arguments of the method.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
+ * puts method.size_params # => 11
+ *
+ */
+static VALUE
+folemethod_size_params(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_size_params(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_size_opt_params(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE size_opt_params = Qnil;
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ return size_opt_params;
+ size_opt_params = INT2FIX(pFuncDesc->cParamsOpt);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return size_opt_params;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#size_opt_params
+ *
+ * Returns the size of optional parameters.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
+ * puts method.size_opt_params # => 4
+ */
+static VALUE
+folemethod_size_opt_params(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_size_opt_params(pmethod->pTypeInfo, pmethod->index);
+}
+
+static VALUE
+ole_method_params(ITypeInfo *pTypeInfo, UINT method_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ BSTR *bstrs;
+ UINT len, i;
+ VALUE param;
+ VALUE params = rb_ary_new();
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ return params;
+
+ len = 0;
+ bstrs = ALLOCA_N(BSTR, pFuncDesc->cParams + 1);
+ hr = pTypeInfo->lpVtbl->GetNames(pTypeInfo, pFuncDesc->memid,
+ bstrs, pFuncDesc->cParams + 1,
+ &len);
+ if (FAILED(hr)) {
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return params;
+ }
+ SysFreeString(bstrs[0]);
+ if (pFuncDesc->cParams > 0) {
+ for(i = 1; i < len; i++) {
+ param = create_win32ole_param(pTypeInfo, method_index, i-1, WC2VSTR(bstrs[i]));
+ rb_ary_push(params, param);
+ }
+ }
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return params;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#params
+ *
+ * returns array of WIN32OLE_PARAM object corresponding with method parameters.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
+ * p method.params # => [Filename, FileFormat, Password, WriteResPassword,
+ * ReadOnlyRecommended, CreateBackup, AccessMode,
+ * ConflictResolution, AddToMru, TextCodepage,
+ * TextVisualLayout]
+ */
+static VALUE
+folemethod_params(VALUE self)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(self, struct olemethoddata, pmethod);
+ return ole_method_params(pmethod->pTypeInfo, pmethod->index);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_METHOD#inspect -> String
+ *
+ * Returns the method name with class name.
+ *
+ */
+static VALUE
+folemethod_inspect(VALUE self)
+{
+ return default_inspect(self, "WIN32OLE_METHOD");
+}
+
+void Init_win32ole_method()
+{
+ cWIN32OLE_METHOD = rb_define_class("WIN32OLE_METHOD", rb_cObject);
+ rb_define_alloc_func(cWIN32OLE_METHOD, folemethod_s_allocate);
+ rb_define_method(cWIN32OLE_METHOD, "initialize", folemethod_initialize, 2);
+ rb_define_method(cWIN32OLE_METHOD, "name", folemethod_name, 0);
+ rb_define_method(cWIN32OLE_METHOD, "return_type", folemethod_return_type, 0);
+ rb_define_method(cWIN32OLE_METHOD, "return_vtype", folemethod_return_vtype, 0);
+ rb_define_method(cWIN32OLE_METHOD, "return_type_detail", folemethod_return_type_detail, 0);
+ rb_define_method(cWIN32OLE_METHOD, "invoke_kind", folemethod_invoke_kind, 0);
+ rb_define_method(cWIN32OLE_METHOD, "invkind", folemethod_invkind, 0);
+ rb_define_method(cWIN32OLE_METHOD, "visible?", folemethod_visible, 0);
+ rb_define_method(cWIN32OLE_METHOD, "event?", folemethod_event, 0);
+ rb_define_method(cWIN32OLE_METHOD, "event_interface", folemethod_event_interface, 0);
+ rb_define_method(cWIN32OLE_METHOD, "helpstring", folemethod_helpstring, 0);
+ rb_define_method(cWIN32OLE_METHOD, "helpfile", folemethod_helpfile, 0);
+ rb_define_method(cWIN32OLE_METHOD, "helpcontext", folemethod_helpcontext, 0);
+ rb_define_method(cWIN32OLE_METHOD, "dispid", folemethod_dispid, 0);
+ rb_define_method(cWIN32OLE_METHOD, "offset_vtbl", folemethod_offset_vtbl, 0);
+ rb_define_method(cWIN32OLE_METHOD, "size_params", folemethod_size_params, 0);
+ rb_define_method(cWIN32OLE_METHOD, "size_opt_params", folemethod_size_opt_params, 0);
+ rb_define_method(cWIN32OLE_METHOD, "params", folemethod_params, 0);
+ rb_define_alias(cWIN32OLE_METHOD, "to_s", "name");
+ rb_define_method(cWIN32OLE_METHOD, "inspect", folemethod_inspect, 0);
+}
diff --git a/ext/win32ole/win32ole_method.h b/ext/win32ole/win32ole_method.h
new file mode 100644
index 0000000000..58005dd73f
--- /dev/null
+++ b/ext/win32ole/win32ole_method.h
@@ -0,0 +1,15 @@
+#ifndef WIN32OLE_METHOD_H
+#define WIN32OLE_METHOD_H 1
+
+struct olemethoddata {
+ ITypeInfo *pOwnerTypeInfo;
+ ITypeInfo *pTypeInfo;
+ UINT index;
+};
+
+VALUE cWIN32OLE_METHOD;
+VALUE folemethod_s_allocate(VALUE klass);
+VALUE ole_methods_from_typeinfo(ITypeInfo *pTypeInfo, int mask);
+VALUE create_win32ole_method(ITypeInfo *pTypeInfo, VALUE name);
+void Init_win32ole_method();
+#endif
diff --git a/ext/win32ole/win32ole_param.c b/ext/win32ole/win32ole_param.c
new file mode 100644
index 0000000000..661bd23578
--- /dev/null
+++ b/ext/win32ole/win32ole_param.c
@@ -0,0 +1,418 @@
+#include "win32ole.h"
+
+VALUE cWIN32OLE_PARAM;
+
+struct oleparamdata {
+ ITypeInfo *pTypeInfo;
+ UINT method_index;
+ UINT index;
+};
+
+static void oleparam_free(struct oleparamdata *pole);
+static VALUE foleparam_s_allocate(VALUE klass);
+static VALUE oleparam_ole_param_from_index(VALUE self, ITypeInfo *pTypeInfo, UINT method_index, int param_index);
+static VALUE oleparam_ole_param(VALUE self, VALUE olemethod, int n);
+static VALUE foleparam_initialize(VALUE self, VALUE olemethod, VALUE n);
+static VALUE foleparam_name(VALUE self);
+static VALUE ole_param_ole_type(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
+static VALUE foleparam_ole_type(VALUE self);
+static VALUE ole_param_ole_type_detail(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
+static VALUE foleparam_ole_type_detail(VALUE self);
+static VALUE ole_param_flag_mask(ITypeInfo *pTypeInfo, UINT method_index, UINT index, USHORT mask);
+static VALUE foleparam_input(VALUE self);
+static VALUE foleparam_output(VALUE self);
+static VALUE foleparam_optional(VALUE self);
+static VALUE foleparam_retval(VALUE self);
+static VALUE ole_param_default(ITypeInfo *pTypeInfo, UINT method_index, UINT index);
+static VALUE foleparam_default(VALUE self);
+static VALUE foleparam_inspect(VALUE self);
+
+static void
+oleparam_free(struct oleparamdata *pole)
+{
+ OLE_FREE(pole->pTypeInfo);
+ free(pole);
+}
+
+VALUE
+create_win32ole_param(ITypeInfo *pTypeInfo, UINT method_index, UINT index, VALUE name)
+{
+ struct oleparamdata *pparam;
+ VALUE obj = foleparam_s_allocate(cWIN32OLE_PARAM);
+ Data_Get_Struct(obj, struct oleparamdata, pparam);
+
+ pparam->pTypeInfo = pTypeInfo;
+ OLE_ADDREF(pTypeInfo);
+ pparam->method_index = method_index;
+ pparam->index = index;
+ rb_ivar_set(obj, rb_intern("name"), name);
+ return obj;
+}
+
+/*
+ * Document-class: WIN32OLE_PARAM
+ *
+ * <code>WIN32OLE_PARAM</code> objects represent param information of
+ * the OLE method.
+ */
+static VALUE
+foleparam_s_allocate(VALUE klass)
+{
+ struct oleparamdata *pparam;
+ VALUE obj;
+ obj = Data_Make_Struct(klass,
+ struct oleparamdata,
+ 0, oleparam_free, pparam);
+ pparam->pTypeInfo = NULL;
+ pparam->method_index = 0;
+ pparam->index = 0;
+ return obj;
+}
+
+static VALUE
+oleparam_ole_param_from_index(VALUE self, ITypeInfo *pTypeInfo, UINT method_index, int param_index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ BSTR *bstrs;
+ UINT len;
+ struct oleparamdata *pparam;
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ ole_raise(hr, rb_eRuntimeError, "fail to ITypeInfo::GetFuncDesc");
+
+ len = 0;
+ bstrs = ALLOCA_N(BSTR, pFuncDesc->cParams + 1);
+ hr = pTypeInfo->lpVtbl->GetNames(pTypeInfo, pFuncDesc->memid,
+ bstrs, pFuncDesc->cParams + 1,
+ &len);
+ if (FAILED(hr)) {
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ ole_raise(hr, rb_eRuntimeError, "fail to ITypeInfo::GetNames");
+ }
+ SysFreeString(bstrs[0]);
+ if (param_index < 1 || len <= (UINT)param_index)
+ {
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ rb_raise(rb_eIndexError, "index of param must be in 1..%d", len);
+ }
+
+ Data_Get_Struct(self, struct oleparamdata, pparam);
+ pparam->pTypeInfo = pTypeInfo;
+ OLE_ADDREF(pTypeInfo);
+ pparam->method_index = method_index;
+ pparam->index = param_index - 1;
+ rb_ivar_set(self, rb_intern("name"), WC2VSTR(bstrs[param_index]));
+
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return self;
+}
+
+static VALUE oleparam_ole_param(VALUE self, VALUE olemethod, int n)
+{
+ struct olemethoddata *pmethod;
+ Data_Get_Struct(olemethod, struct olemethoddata, pmethod);
+ return oleparam_ole_param_from_index(self, pmethod->pTypeInfo, pmethod->index, n);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_PARAM.new(method, n) -> WIN32OLE_PARAM object
+ *
+ * Returns WIN32OLE_PARAM object which represents OLE parameter information.
+ * 1st argument should be WIN32OLE_METHOD object.
+ * 2nd argument `n' is n-th parameter of the method specified by 1st argument.
+ *
+ * tobj = WIN32OLE_TYPE.new('Microsoft Scripting Runtime', 'IFileSystem')
+ * method = WIN32OLE_METHOD.new(tobj, 'CreateTextFile')
+ * param = WIN32OLE_PARAM.new(method, 2) # => #<WIN32OLE_PARAM:Overwrite=true>
+ *
+ */
+static VALUE foleparam_initialize(VALUE self, VALUE olemethod, VALUE n)
+{
+ int idx;
+ if (!rb_obj_is_kind_of(olemethod, cWIN32OLE_METHOD)) {
+ rb_raise(rb_eTypeError, "1st parameter must be WIN32OLE_METHOD object");
+ }
+ idx = FIX2INT(n);
+ return oleparam_ole_param(self, olemethod, idx);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_PARAM#name
+ *
+ * Returns name.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
+ * param1 = method.params[0]
+ * puts param1.name # => Filename
+ */
+static VALUE
+foleparam_name(VALUE self)
+{
+ return rb_ivar_get(self, rb_intern("name"));
+}
+
+static VALUE
+ole_param_ole_type(ITypeInfo *pTypeInfo, UINT method_index, UINT index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE type = rb_str_new2("unknown type");
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ return type;
+ type = ole_typedesc2val(pTypeInfo,
+ &(pFuncDesc->lprgelemdescParam[index].tdesc), Qnil);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return type;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_PARAM#ole_type
+ *
+ * Returns OLE type of WIN32OLE_PARAM object(parameter of OLE method).
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
+ * param1 = method.params[0]
+ * puts param1.ole_type # => VARIANT
+ */
+static VALUE
+foleparam_ole_type(VALUE self)
+{
+ struct oleparamdata *pparam;
+ Data_Get_Struct(self, struct oleparamdata, pparam);
+ return ole_param_ole_type(pparam->pTypeInfo, pparam->method_index,
+ pparam->index);
+}
+
+static VALUE
+ole_param_ole_type_detail(ITypeInfo *pTypeInfo, UINT method_index, UINT index)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE typedetail = rb_ary_new();
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ return typedetail;
+ ole_typedesc2val(pTypeInfo,
+ &(pFuncDesc->lprgelemdescParam[index].tdesc), typedetail);
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return typedetail;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_PARAM#ole_type_detail
+ *
+ * Returns detail information of type of argument.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'IWorksheetFunction')
+ * method = WIN32OLE_METHOD.new(tobj, 'SumIf')
+ * param1 = method.params[0]
+ * p param1.ole_type_detail # => ["PTR", "USERDEFINED", "Range"]
+ */
+static VALUE
+foleparam_ole_type_detail(VALUE self)
+{
+ struct oleparamdata *pparam;
+ Data_Get_Struct(self, struct oleparamdata, pparam);
+ return ole_param_ole_type_detail(pparam->pTypeInfo, pparam->method_index,
+ pparam->index);
+}
+
+static VALUE
+ole_param_flag_mask(ITypeInfo *pTypeInfo, UINT method_index, UINT index, USHORT mask)
+{
+ FUNCDESC *pFuncDesc;
+ HRESULT hr;
+ VALUE ret = Qfalse;
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if(FAILED(hr))
+ return ret;
+ if (V_UNION1((&(pFuncDesc->lprgelemdescParam[index])), paramdesc).wParamFlags &mask)
+ ret = Qtrue;
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return ret;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_PARAM#input?
+ *
+ * Returns true if the parameter is input.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
+ * param1 = method.params[0]
+ * puts param1.input? # => true
+ */
+static VALUE foleparam_input(VALUE self)
+{
+ struct oleparamdata *pparam;
+ Data_Get_Struct(self, struct oleparamdata, pparam);
+ return ole_param_flag_mask(pparam->pTypeInfo, pparam->method_index,
+ pparam->index, PARAMFLAG_FIN);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE#output?
+ *
+ * Returns true if argument is output.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', 'DWebBrowserEvents')
+ * method = WIN32OLE_METHOD.new(tobj, 'NewWindow')
+ * method.params.each do |param|
+ * puts "#{param.name} #{param.output?}"
+ * end
+ *
+ * The result of above script is following:
+ * URL false
+ * Flags false
+ * TargetFrameName false
+ * PostData false
+ * Headers false
+ * Processed true
+ */
+static VALUE foleparam_output(VALUE self)
+{
+ struct oleparamdata *pparam;
+ Data_Get_Struct(self, struct oleparamdata, pparam);
+ return ole_param_flag_mask(pparam->pTypeInfo, pparam->method_index,
+ pparam->index, PARAMFLAG_FOUT);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_PARAM#optional?
+ *
+ * Returns true if argument is optional.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
+ * param1 = method.params[0]
+ * puts "#{param1.name} #{param1.optional?}" # => Filename true
+ */
+static VALUE foleparam_optional(VALUE self)
+{
+ struct oleparamdata *pparam;
+ Data_Get_Struct(self, struct oleparamdata, pparam);
+ return ole_param_flag_mask(pparam->pTypeInfo, pparam->method_index,
+ pparam->index, PARAMFLAG_FOPT);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_PARAM#retval?
+ *
+ * Returns true if argument is return value.
+ * tobj = WIN32OLE_TYPE.new('DirectX 7 for Visual Basic Type Library',
+ * 'DirectPlayLobbyConnection')
+ * method = WIN32OLE_METHOD.new(tobj, 'GetPlayerShortName')
+ * param = method.params[0]
+ * puts "#{param.name} #{param.retval?}" # => name true
+ */
+static VALUE foleparam_retval(VALUE self)
+{
+ struct oleparamdata *pparam;
+ Data_Get_Struct(self, struct oleparamdata, pparam);
+ return ole_param_flag_mask(pparam->pTypeInfo, pparam->method_index,
+ pparam->index, PARAMFLAG_FRETVAL);
+}
+
+static VALUE
+ole_param_default(ITypeInfo *pTypeInfo, UINT method_index, UINT index)
+{
+ FUNCDESC *pFuncDesc;
+ ELEMDESC *pElemDesc;
+ PARAMDESCEX * pParamDescEx;
+ HRESULT hr;
+ USHORT wParamFlags;
+ USHORT mask = PARAMFLAG_FOPT|PARAMFLAG_FHASDEFAULT;
+ VALUE defval = Qnil;
+ hr = pTypeInfo->lpVtbl->GetFuncDesc(pTypeInfo, method_index, &pFuncDesc);
+ if (FAILED(hr))
+ return defval;
+ pElemDesc = &pFuncDesc->lprgelemdescParam[index];
+ wParamFlags = V_UNION1(pElemDesc, paramdesc).wParamFlags;
+ if ((wParamFlags & mask) == mask) {
+ pParamDescEx = V_UNION1(pElemDesc, paramdesc).pparamdescex;
+ defval = ole_variant2val(&pParamDescEx->varDefaultValue);
+ }
+ pTypeInfo->lpVtbl->ReleaseFuncDesc(pTypeInfo, pFuncDesc);
+ return defval;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_PARAM#default
+ *
+ * Returns default value. If the default value does not exist,
+ * this method returns nil.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Workbook')
+ * method = WIN32OLE_METHOD.new(tobj, 'SaveAs')
+ * method.params.each do |param|
+ * if param.default
+ * puts "#{param.name} (= #{param.default})"
+ * else
+ * puts "#{param}"
+ * end
+ * end
+ *
+ * The above script result is following:
+ * Filename
+ * FileFormat
+ * Password
+ * WriteResPassword
+ * ReadOnlyRecommended
+ * CreateBackup
+ * AccessMode (= 1)
+ * ConflictResolution
+ * AddToMru
+ * TextCodepage
+ * TextVisualLayout
+ */
+static VALUE foleparam_default(VALUE self)
+{
+ struct oleparamdata *pparam;
+ Data_Get_Struct(self, struct oleparamdata, pparam);
+ return ole_param_default(pparam->pTypeInfo, pparam->method_index,
+ pparam->index);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_PARAM#inspect -> String
+ *
+ * Returns the parameter name with class name. If the parameter has default value,
+ * then returns name=value string with class name.
+ *
+ */
+static VALUE
+foleparam_inspect(VALUE self)
+{
+ VALUE detail = foleparam_name(self);
+ VALUE defval = foleparam_default(self);
+ if (defval != Qnil) {
+ rb_str_cat2(detail, "=");
+ rb_str_concat(detail, rb_inspect(defval));
+ }
+ return make_inspect("WIN32OLE_PARAM", detail);
+}
+
+void
+Init_win32ole_param()
+{
+ cWIN32OLE_PARAM = rb_define_class("WIN32OLE_PARAM", rb_cObject);
+ rb_define_alloc_func(cWIN32OLE_PARAM, foleparam_s_allocate);
+ rb_define_method(cWIN32OLE_PARAM, "initialize", foleparam_initialize, 2);
+ rb_define_method(cWIN32OLE_PARAM, "name", foleparam_name, 0);
+ rb_define_method(cWIN32OLE_PARAM, "ole_type", foleparam_ole_type, 0);
+ rb_define_method(cWIN32OLE_PARAM, "ole_type_detail", foleparam_ole_type_detail, 0);
+ rb_define_method(cWIN32OLE_PARAM, "input?", foleparam_input, 0);
+ rb_define_method(cWIN32OLE_PARAM, "output?", foleparam_output, 0);
+ rb_define_method(cWIN32OLE_PARAM, "optional?", foleparam_optional, 0);
+ rb_define_method(cWIN32OLE_PARAM, "retval?", foleparam_retval, 0);
+ rb_define_method(cWIN32OLE_PARAM, "default", foleparam_default, 0);
+ rb_define_alias(cWIN32OLE_PARAM, "to_s", "name");
+ rb_define_method(cWIN32OLE_PARAM, "inspect", foleparam_inspect, 0);
+}
diff --git a/ext/win32ole/win32ole_param.h b/ext/win32ole/win32ole_param.h
new file mode 100644
index 0000000000..24fcdc0fb2
--- /dev/null
+++ b/ext/win32ole/win32ole_param.h
@@ -0,0 +1,8 @@
+#ifndef WIN32OLE_PARAM_H
+#define WIN32OLE_PARAM_H
+
+VALUE create_win32ole_param(ITypeInfo *pTypeInfo, UINT method_index, UINT index, VALUE name);
+void Init_win32ole_param();
+
+#endif
+
diff --git a/ext/win32ole/win32ole_record.c b/ext/win32ole/win32ole_record.c
new file mode 100644
index 0000000000..b7ce75bbee
--- /dev/null
+++ b/ext/win32ole/win32ole_record.c
@@ -0,0 +1,577 @@
+#include "win32ole.h"
+
+struct olerecorddata {
+ IRecordInfo *pri;
+ void *pdata;
+};
+
+static HRESULT recordinfo_from_itypelib(ITypeLib *pTypeLib, VALUE name, IRecordInfo **ppri);
+static int hash2olerec(VALUE key, VALUE val, VALUE rec);
+static void olerecord_free(struct olerecorddata *pvar);
+static VALUE folerecord_s_allocate(VALUE klass);
+static VALUE folerecord_initialize(VALUE self, VALUE typename, VALUE oleobj);
+static VALUE folerecord_to_h(VALUE self);
+static VALUE folerecord_typename(VALUE self);
+static VALUE olerecord_ivar_get(VALUE self, VALUE name);
+static VALUE olerecord_ivar_set(VALUE self, VALUE name, VALUE val);
+static VALUE folerecord_method_missing(int argc, VALUE *argv, VALUE self);
+static VALUE folerecord_ole_instance_variable_get(VALUE self, VALUE name);
+static VALUE folerecord_ole_instance_variable_set(VALUE self, VALUE name, VALUE val);
+static VALUE folerecord_inspect(VALUE self);
+
+static HRESULT
+recordinfo_from_itypelib(ITypeLib *pTypeLib, VALUE name, IRecordInfo **ppri)
+{
+
+ unsigned int count;
+ unsigned int i;
+ ITypeInfo *pTypeInfo;
+ HRESULT hr = OLE_E_LAST;
+ BSTR bstr;
+
+ count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
+ for (i = 0; i < count; i++) {
+ hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, i,
+ &bstr, NULL, NULL, NULL);
+ if (FAILED(hr))
+ continue;
+
+ hr = pTypeLib->lpVtbl->GetTypeInfo(pTypeLib, i, &pTypeInfo);
+ if (FAILED(hr))
+ continue;
+
+ if (rb_str_cmp(WC2VSTR(bstr), name) == 0) {
+ hr = GetRecordInfoFromTypeInfo(pTypeInfo, ppri);
+ OLE_RELEASE(pTypeInfo);
+ return hr;
+ }
+ OLE_RELEASE(pTypeInfo);
+ }
+ hr = OLE_E_LAST;
+ return hr;
+}
+
+static int
+hash2olerec(VALUE key, VALUE val, VALUE rec)
+{
+ VARIANT var;
+ OLECHAR *pbuf;
+ struct olerecorddata *prec;
+ IRecordInfo *pri;
+ HRESULT hr;
+
+ if (val != Qnil) {
+ Data_Get_Struct(rec, struct olerecorddata, prec);
+ pri = prec->pri;
+ VariantInit(&var);
+ ole_val2variant(val, &var);
+ pbuf = ole_vstr2wc(key);
+ hr = pri->lpVtbl->PutField(pri, INVOKE_PROPERTYPUT, prec->pdata, pbuf, &var);
+ SysFreeString(pbuf);
+ VariantClear(&var);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to putfield of `%s`", StringValuePtr(key));
+ }
+ }
+ return ST_CONTINUE;
+}
+
+void
+ole_rec2variant(VALUE rec, VARIANT *var)
+{
+ struct olerecorddata *prec;
+ ULONG size = 0;
+ IRecordInfo *pri;
+ HRESULT hr;
+ VALUE fields;
+ Data_Get_Struct(rec, struct olerecorddata, prec);
+ pri = prec->pri;
+ if (pri) {
+ hr = pri->lpVtbl->GetSize(pri, &size);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to get size for allocation of VT_RECORD object");
+ }
+ if (prec->pdata) {
+ free(prec->pdata);
+ }
+ prec->pdata = ALLOC_N(char, size);
+ if (!prec->pdata) {
+ rb_raise(rb_eRuntimeError, "failed to memory allocation of %lu bytes", (unsigned long)size);
+ }
+ hr = pri->lpVtbl->RecordInit(pri, prec->pdata);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to initialize VT_RECORD object");
+ }
+ fields = folerecord_to_h(rec);
+ rb_hash_foreach(fields, hash2olerec, rec);
+ V_RECORDINFO(var) = pri;
+ V_RECORD(var) = prec->pdata;
+ V_VT(var) = VT_RECORD;
+ } else {
+ rb_raise(eWIN32OLERuntimeError, "failed to retrieve IRecordInfo interface");
+ }
+}
+
+void
+olerecord_set_ivar(VALUE obj, IRecordInfo *pri, void *prec)
+{
+ HRESULT hr;
+ BSTR bstr;
+ BSTR *bstrs;
+ ULONG count = 0;
+ ULONG i;
+ VALUE fields;
+ VALUE val;
+ VARIANT var;
+ void *pdata = NULL;
+ struct olerecorddata *pvar;
+
+ Data_Get_Struct(obj, struct olerecorddata, pvar);
+ OLE_ADDREF(pri);
+ OLE_RELEASE(pvar->pri);
+ pvar->pri = pri;
+
+ hr = pri->lpVtbl->GetName(pri, &bstr);
+ if (SUCCEEDED(hr)) {
+ rb_ivar_set(obj, rb_intern("typename"), WC2VSTR(bstr));
+ }
+
+ hr = pri->lpVtbl->GetFieldNames(pri, &count, NULL);
+ if (FAILED(hr) || count == 0)
+ return;
+ bstrs = ALLOCA_N(BSTR, count);
+ hr = pri->lpVtbl->GetFieldNames(pri, &count, bstrs);
+ if (FAILED(hr)) {
+ return;
+ }
+
+ fields = rb_hash_new();
+ rb_ivar_set(obj, rb_intern("fields"), fields);
+ for (i = 0; i < count; i++) {
+ pdata = NULL;
+ VariantInit(&var);
+ val = Qnil;
+ if (prec) {
+ hr = pri->lpVtbl->GetFieldNoCopy(pri, prec, bstrs[i], &var, &pdata);
+ if (SUCCEEDED(hr)) {
+ val = ole_variant2val(&var);
+ }
+ }
+ rb_hash_aset(fields, WC2VSTR(bstrs[i]), val);
+ }
+}
+
+VALUE
+create_win32ole_record(IRecordInfo *pri, void *prec)
+{
+ VALUE obj = folerecord_s_allocate(cWIN32OLE_RECORD);
+ olerecord_set_ivar(obj, pri, prec);
+ return obj;
+}
+
+/*
+ * Document-class: WIN32OLE_RECORD
+ *
+ * <code>WIN32OLE_RECORD</code> objects represents VT_RECORD OLE variant.
+ * Win32OLE returns WIN32OLE_RECORD object if the result value of invoking
+ * OLE methods.
+ *
+ * If COM server in VB.NET ComServer project is the following:
+ *
+ * Imports System.Runtime.InteropServices
+ * Public Class ComClass
+ * Public Structure Book
+ * <MarshalAs(UnmanagedType.BStr)> _
+ * Public title As String
+ * Public cost As Integer
+ * End Structure
+ * Public Function getBook() As Book
+ * Dim book As New Book
+ * book.title = "The Ruby Book"
+ * book.cost = 20
+ * Return book
+ * End Function
+ * End Class
+ *
+ * then, you can retrieve getBook return value from the following
+ * Ruby script:
+ *
+ * require 'win32ole'
+ * obj = WIN32OLE.new('ComServer.ComClass')
+ * book = obj.getBook
+ * book.class # => WIN32OLE_RECORD
+ * book.title # => "The Ruby Book"
+ * book.cost # => 20
+ *
+ */
+
+static void
+olerecord_free(struct olerecorddata *pvar) {
+ OLE_FREE(pvar->pri);
+ if (pvar->pdata) {
+ free(pvar->pdata);
+ }
+ free(pvar);
+}
+
+static VALUE
+folerecord_s_allocate(VALUE klass) {
+ VALUE obj = Qnil;
+ struct olerecorddata *pvar;
+ obj = Data_Make_Struct(klass, struct olerecorddata, 0, olerecord_free, pvar);
+ pvar->pri = NULL;
+ pvar->pdata = NULL;
+ return obj;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_RECORD.new(typename, obj) -> WIN32OLE_RECORD object
+ *
+ * Returns WIN32OLE_RECORD object. The first argument is struct name (String
+ * or Symbol).
+ * The second parameter obj should be WIN32OLE object or WIN32OLE_TYPELIB object.
+ * If COM server in VB.NET ComServer project is the following:
+ *
+ * Imports System.Runtime.InteropServices
+ * Public Class ComClass
+ * Public Structure Book
+ * <MarshalAs(UnmanagedType.BStr)> _
+ * Public title As String
+ * Public cost As Integer
+ * End Structure
+ * End Class
+ *
+ * then, you can create WIN32OLE_RECORD object is as following:
+ *
+ * require 'win32ole'
+ * obj = WIN32OLE.new('ComServer.ComClass')
+ * book1 = WIN32OLE_RECORD.new('Book', obj) # => WIN32OLE_RECORD object
+ * tlib = obj.ole_typelib
+ * book2 = WIN32OLE_RECORD.new('Book', tlib) # => WIN32OLE_RECORD object
+ *
+ */
+static VALUE
+folerecord_initialize(VALUE self, VALUE typename, VALUE oleobj) {
+ HRESULT hr;
+ ITypeLib *pTypeLib = NULL;
+ IRecordInfo *pri = NULL;
+
+ if (!RB_TYPE_P(typename, T_STRING) && !RB_TYPE_P(typename, T_SYMBOL)) {
+ rb_raise(rb_eArgError, "1st argument should be String or Symbol");
+ }
+ if (RB_TYPE_P(typename, T_SYMBOL)) {
+ typename = rb_sym_to_s(typename);
+ }
+
+ hr = S_OK;
+ if(rb_obj_is_kind_of(oleobj, cWIN32OLE)) {
+ hr = typelib_from_val(oleobj, &pTypeLib);
+ } else if (rb_obj_is_kind_of(oleobj, cWIN32OLE_TYPELIB)) {
+ pTypeLib = itypelib(oleobj);
+ OLE_ADDREF(pTypeLib);
+ if (pTypeLib) {
+ hr = S_OK;
+ } else {
+ hr = E_FAIL;
+ }
+ } else {
+ rb_raise(rb_eArgError, "2nd argument should be WIN32OLE object or WIN32OLE_TYPELIB object");
+ }
+
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "fail to query ITypeLib interface");
+ }
+
+ hr = recordinfo_from_itypelib(pTypeLib, typename, &pri);
+ OLE_RELEASE(pTypeLib);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "fail to query IRecordInfo interface for `%s'", StringValuePtr(typename));
+ }
+
+ olerecord_set_ivar(self, pri, NULL);
+
+ return self;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_RECORD#to_h #=> Ruby Hash object.
+ *
+ * Returns Ruby Hash object which represents VT_RECORD variable.
+ * The keys of Hash object are member names of VT_RECORD OLE variable and
+ * the values of Hash object are values of VT_RECORD OLE variable.
+ *
+ * If COM server in VB.NET ComServer project is the following:
+ *
+ * Imports System.Runtime.InteropServices
+ * Public Class ComClass
+ * Public Structure Book
+ * <MarshalAs(UnmanagedType.BStr)> _
+ * Public title As String
+ * Public cost As Integer
+ * End Structure
+ * Public Function getBook() As Book
+ * Dim book As New Book
+ * book.title = "The Ruby Book"
+ * book.cost = 20
+ * Return book
+ * End Function
+ * End Class
+ *
+ * then, the result of WIN32OLE_RECORD#to_h is the following:
+ *
+ * require 'win32ole'
+ * obj = WIN32OLE.new('ComServer.ComClass')
+ * book = obj.getBook
+ * book.to_h # => {"title"=>"The Ruby Book", "cost"=>20}
+ *
+ */
+static VALUE
+folerecord_to_h(VALUE self)
+{
+ return rb_ivar_get(self, rb_intern("fields"));
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_RECORD#typename #=> String object
+ *
+ * Returns the type name of VT_RECORD OLE variable.
+ *
+ * If COM server in VB.NET ComServer project is the following:
+ *
+ * Imports System.Runtime.InteropServices
+ * Public Class ComClass
+ * Public Structure Book
+ * <MarshalAs(UnmanagedType.BStr)> _
+ * Public title As String
+ * Public cost As Integer
+ * End Structure
+ * Public Function getBook() As Book
+ * Dim book As New Book
+ * book.title = "The Ruby Book"
+ * book.cost = 20
+ * Return book
+ * End Function
+ * End Class
+ *
+ * then, the result of WIN32OLE_RECORD#typename is the following:
+ *
+ * require 'win32ole'
+ * obj = WIN32OLE.new('ComServer.ComClass')
+ * book = obj.getBook
+ * book.typename # => "Book"
+ *
+ */
+static VALUE
+folerecord_typename(VALUE self)
+{
+ return rb_ivar_get(self, rb_intern("typename"));
+}
+
+static VALUE
+olerecord_ivar_get(VALUE self, VALUE name)
+{
+ VALUE fields;
+ fields = rb_ivar_get(self, rb_intern("fields"));
+ return rb_hash_fetch(fields, name);
+}
+
+static VALUE
+olerecord_ivar_set(VALUE self, VALUE name, VALUE val)
+{
+ long len;
+ char *p;
+ VALUE fields;
+ len = RSTRING_LEN(name);
+ p = RSTRING_PTR(name);
+ if (p[len-1] == '=') {
+ name = rb_str_subseq(name, 0, len-1);
+ }
+ fields = rb_ivar_get(self, rb_intern("fields"));
+ rb_hash_fetch(fields, name);
+ return rb_hash_aset(fields, name, val);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_RECORD#method_missing(name)
+ *
+ * Returns value specified by the member name of VT_RECORD OLE variable.
+ * Or sets value specified by the member name of VT_RECORD OLE variable.
+ * If the member name is not correct, KeyError exception is raised.
+ *
+ * If COM server in VB.NET ComServer project is the following:
+ *
+ * Imports System.Runtime.InteropServices
+ * Public Class ComClass
+ * Public Structure Book
+ * <MarshalAs(UnmanagedType.BStr)> _
+ * Public title As String
+ * Public cost As Integer
+ * End Structure
+ * End Class
+ *
+ * Then getting/setting value from Ruby is as the following:
+ *
+ * obj = WIN32OLE.new('ComServer.ComClass')
+ * book = WIN32OLE_RECORD.new('Book', obj)
+ * book.title # => nil ( book.method_missing(:title) is invoked. )
+ * book.title = "Ruby" # ( book.method_missing(:title=, "Ruby") is invoked. )
+ */
+static VALUE
+folerecord_method_missing(int argc, VALUE *argv, VALUE self)
+{
+ VALUE name;
+ rb_check_arity(argc, 1, 2);
+ name = rb_sym_to_s(argv[0]);
+
+#if SIZEOF_SIZE_T > SIZEOF_LONG
+ {
+ size_t n = strlen(StringValueCStr(name));
+ if (n >= LONG_MAX) {
+ rb_raise(rb_eRuntimeError, "too long member name");
+ }
+ }
+#endif
+
+ if (argc == 1) {
+ return olerecord_ivar_get(self, name);
+ } else if (argc == 2) {
+ return olerecord_ivar_set(self, name, argv[1]);
+ }
+ return Qnil;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_RECORD#ole_instance_variable_get(name)
+ *
+ * Returns value specified by the member name of VT_RECORD OLE object.
+ * If the member name is not correct, KeyError exception is raised.
+ * If you can't access member variable of VT_RECORD OLE object directly,
+ * use this method.
+ *
+ * If COM server in VB.NET ComServer project is the following:
+ *
+ * Imports System.Runtime.InteropServices
+ * Public Class ComClass
+ * Public Structure ComObject
+ * Public object_id As Ineger
+ * End Structure
+ * End Class
+ *
+ * and Ruby Object class has title attribute:
+ *
+ * then accessing object_id of ComObject from Ruby is as the following:
+ *
+ * srver = WIN32OLE.new('ComServer.ComClass')
+ * obj = WIN32OLE_RECORD.new('ComObject', server)
+ * # obj.object_id returns Ruby Object#object_id
+ * obj.ole_instance_variable_get(:object_id) # => nil
+ *
+ */
+static VALUE
+folerecord_ole_instance_variable_get(VALUE self, VALUE name)
+{
+ VALUE sname;
+ if(!RB_TYPE_P(name, T_STRING) && !RB_TYPE_P(name, T_SYMBOL)) {
+ rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)");
+ }
+ sname = name;
+ if (RB_TYPE_P(name, T_SYMBOL)) {
+ sname = rb_sym_to_s(name);
+ }
+ return olerecord_ivar_get(self, sname);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_RECORD#ole_instance_variable_set(name, val)
+ *
+ * Sets value specified by the member name of VT_RECORD OLE object.
+ * If the member name is not correct, KeyError exception is raised.
+ * If you can't set value of member of VT_RECORD OLE object directly,
+ * use this method.
+ *
+ * If COM server in VB.NET ComServer project is the following:
+ *
+ * Imports System.Runtime.InteropServices
+ * Public Class ComClass
+ * <MarshalAs(UnmanagedType.BStr)> _
+ * Public title As String
+ * Public cost As Integer
+ * End Class
+ *
+ * then setting value of the `title' member is as following:
+ *
+ * srver = WIN32OLE.new('ComServer.ComClass')
+ * obj = WIN32OLE_RECORD.new('Book', server)
+ * obj.ole_instance_variable_set(:title, "The Ruby Book")
+ *
+ */
+static VALUE
+folerecord_ole_instance_variable_set(VALUE self, VALUE name, VALUE val)
+{
+ VALUE sname;
+ if(!RB_TYPE_P(name, T_STRING) && !RB_TYPE_P(name, T_SYMBOL)) {
+ rb_raise(rb_eTypeError, "wrong argument type (expected String or Symbol)");
+ }
+ sname = name;
+ if (RB_TYPE_P(name, T_SYMBOL)) {
+ sname = rb_sym_to_s(name);
+ }
+ return olerecord_ivar_set(self, sname, val);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_RECORD#inspect -> String
+ *
+ * Returns the OLE struct name and member name and the value of member
+ *
+ * If COM server in VB.NET ComServer project is the following:
+ *
+ * Imports System.Runtime.InteropServices
+ * Public Class ComClass
+ * <MarshalAs(UnmanagedType.BStr)> _
+ * Public title As String
+ * Public cost As Integer
+ * End Class
+ *
+ * then
+ *
+ * srver = WIN32OLE.new('ComServer.ComClass')
+ * obj = WIN32OLE_RECORD.new('Book', server)
+ * obj.inspect # => <WIN32OLE_RECORD(ComClass) {"title" => nil, "cost" => nil}>
+ *
+ */
+static VALUE
+folerecord_inspect(VALUE self)
+{
+ VALUE tname;
+ VALUE field;
+ tname = folerecord_typename(self);
+ if (tname == Qnil) {
+ tname = rb_inspect(tname);
+ }
+ field = rb_inspect(folerecord_to_h(self));
+ return rb_sprintf("#<WIN32OLE_RECORD(%"PRIsVALUE") %"PRIsVALUE">",
+ tname,
+ field);
+}
+
+void
+Init_win32ole_record()
+{
+ cWIN32OLE_RECORD = rb_define_class("WIN32OLE_RECORD", rb_cObject);
+ rb_define_alloc_func(cWIN32OLE_RECORD, folerecord_s_allocate);
+ rb_define_method(cWIN32OLE_RECORD, "initialize", folerecord_initialize, 2);
+ rb_define_method(cWIN32OLE_RECORD, "to_h", folerecord_to_h, 0);
+ rb_define_method(cWIN32OLE_RECORD, "typename", folerecord_typename, 0);
+ rb_define_method(cWIN32OLE_RECORD, "method_missing", folerecord_method_missing, -1);
+ rb_define_method(cWIN32OLE_RECORD, "ole_instance_variable_get", folerecord_ole_instance_variable_get, 1);
+ rb_define_method(cWIN32OLE_RECORD, "ole_instance_variable_set", folerecord_ole_instance_variable_set, 2);
+ rb_define_method(cWIN32OLE_RECORD, "inspect", folerecord_inspect, 0);
+}
diff --git a/ext/win32ole/win32ole_record.h b/ext/win32ole/win32ole_record.h
new file mode 100644
index 0000000000..2f84d104cc
--- /dev/null
+++ b/ext/win32ole/win32ole_record.h
@@ -0,0 +1,10 @@
+#ifndef WIN32OLE_RECORD_H
+#define WIN32OLE_RECORD_H 1
+
+VALUE cWIN32OLE_RECORD;
+void ole_rec2variant(VALUE rec, VARIANT *var);
+void olerecord_set_ivar(VALUE obj, IRecordInfo *pri, void *prec);
+VALUE create_win32ole_record(IRecordInfo *pri, void *prec);
+void Init_win32ole_record();
+
+#endif
diff --git a/ext/win32ole/win32ole_type.c b/ext/win32ole/win32ole_type.c
new file mode 100644
index 0000000000..00db09e191
--- /dev/null
+++ b/ext/win32ole/win32ole_type.c
@@ -0,0 +1,901 @@
+#include "win32ole.h"
+
+struct oletypedata {
+ ITypeInfo *pTypeInfo;
+};
+
+static void oletype_free(struct oletypedata *poletype);
+static VALUE foletype_s_ole_classes(VALUE self, VALUE typelib);
+static VALUE foletype_s_typelibs(VALUE self);
+static VALUE foletype_s_progids(VALUE self);
+static VALUE oletype_set_member(VALUE self, ITypeInfo *pTypeInfo, VALUE name);
+static VALUE foletype_s_allocate(VALUE klass);
+static VALUE oleclass_from_typelib(VALUE self, ITypeLib *pTypeLib, VALUE oleclass);
+static VALUE foletype_initialize(VALUE self, VALUE typelib, VALUE oleclass);
+static VALUE foletype_name(VALUE self);
+static VALUE ole_ole_type(ITypeInfo *pTypeInfo);
+static VALUE foletype_ole_type(VALUE self);
+static VALUE ole_type_guid(ITypeInfo *pTypeInfo);
+static VALUE foletype_guid(VALUE self);
+static VALUE ole_type_progid(ITypeInfo *pTypeInfo);
+static VALUE foletype_progid(VALUE self);
+static VALUE ole_type_visible(ITypeInfo *pTypeInfo);
+static VALUE foletype_visible(VALUE self);
+static VALUE ole_type_major_version(ITypeInfo *pTypeInfo);
+static VALUE foletype_major_version(VALUE self);
+static VALUE ole_type_minor_version(ITypeInfo *pTypeInfo);
+static VALUE foletype_minor_version(VALUE self);
+static VALUE ole_type_typekind(ITypeInfo *pTypeInfo);
+static VALUE foletype_typekind(VALUE self);
+static VALUE ole_type_helpstring(ITypeInfo *pTypeInfo);
+static VALUE foletype_helpstring(VALUE self);
+static VALUE ole_type_src_type(ITypeInfo *pTypeInfo);
+static VALUE foletype_src_type(VALUE self);
+static VALUE ole_type_helpfile(ITypeInfo *pTypeInfo);
+static VALUE foletype_helpfile(VALUE self);
+static VALUE ole_type_helpcontext(ITypeInfo *pTypeInfo);
+static VALUE foletype_helpcontext(VALUE self);
+static VALUE ole_variables(ITypeInfo *pTypeInfo);
+static VALUE foletype_variables(VALUE self);
+static VALUE foletype_methods(VALUE self);
+static VALUE foletype_ole_typelib(VALUE self);
+static VALUE ole_type_impl_ole_types(ITypeInfo *pTypeInfo, int implflags);
+static VALUE foletype_impl_ole_types(VALUE self);
+static VALUE foletype_source_ole_types(VALUE self);
+static VALUE foletype_default_event_sources(VALUE self);
+static VALUE foletype_default_ole_types(VALUE self);
+static VALUE foletype_inspect(VALUE self);
+
+/*
+ * Document-class: WIN32OLE_TYPE
+ *
+ * <code>WIN32OLE_TYPE</code> objects represent OLE type libarary information.
+ */
+
+static void
+oletype_free(struct oletypedata *poletype)
+{
+ OLE_FREE(poletype->pTypeInfo);
+ free(poletype);
+}
+
+ITypeInfo *itypeinfo(VALUE self)
+{
+ struct oletypedata *ptype;
+ Data_Get_Struct(self, struct oletypedata, ptype);
+ return ptype->pTypeInfo;
+}
+
+VALUE
+ole_type_from_itypeinfo(ITypeInfo *pTypeInfo)
+{
+ ITypeLib *pTypeLib;
+ VALUE type = Qnil;
+ HRESULT hr;
+ unsigned int index;
+ BSTR bstr;
+
+ hr = pTypeInfo->lpVtbl->GetContainingTypeLib( pTypeInfo, &pTypeLib, &index );
+ if(FAILED(hr)) {
+ return Qnil;
+ }
+ hr = pTypeLib->lpVtbl->GetDocumentation( pTypeLib, index,
+ &bstr, NULL, NULL, NULL);
+ OLE_RELEASE(pTypeLib);
+ if (FAILED(hr)) {
+ return Qnil;
+ }
+ type = create_win32ole_type(pTypeInfo, WC2VSTR(bstr));
+ return type;
+}
+
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE.ole_classes(typelib)
+ *
+ * Returns array of WIN32OLE_TYPE objects defined by the <i>typelib</i> type library.
+ * This method will be OBSOLETE. Use WIN32OLE_TYPELIB.new(typelib).ole_classes instead.
+ */
+static VALUE
+foletype_s_ole_classes(VALUE self, VALUE typelib)
+{
+ VALUE obj;
+
+ /*
+ rb_warn("%s is obsolete; use %s instead.",
+ "WIN32OLE_TYPE.ole_classes",
+ "WIN32OLE_TYPELIB.new(typelib).ole_types");
+ */
+ obj = rb_funcall(cWIN32OLE_TYPELIB, rb_intern("new"), 1, typelib);
+ return rb_funcall(obj, rb_intern("ole_types"), 0);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE.typelibs
+ *
+ * Returns array of type libraries.
+ * This method will be OBSOLETE. Use WIN32OLE_TYPELIB.typelibs.collect{|t| t.name} instead.
+ *
+ */
+static VALUE
+foletype_s_typelibs(VALUE self)
+{
+ /*
+ rb_warn("%s is obsolete. use %s instead.",
+ "WIN32OLE_TYPE.typelibs",
+ "WIN32OLE_TYPELIB.typelibs.collect{t|t.name}");
+ */
+ return rb_eval_string("WIN32OLE_TYPELIB.typelibs.collect{|t|t.name}");
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE.progids
+ *
+ * Returns array of ProgID.
+ */
+static VALUE
+foletype_s_progids(VALUE self)
+{
+ HKEY hclsids, hclsid;
+ DWORD i;
+ LONG err;
+ VALUE clsid;
+ VALUE v = rb_str_new2("");
+ VALUE progids = rb_ary_new();
+
+ err = reg_open_key(HKEY_CLASSES_ROOT, "CLSID", &hclsids);
+ if(err != ERROR_SUCCESS) {
+ return progids;
+ }
+ for(i = 0; ; i++) {
+ clsid = reg_enum_key(hclsids, i);
+ if (clsid == Qnil)
+ break;
+ err = reg_open_vkey(hclsids, clsid, &hclsid);
+ if (err != ERROR_SUCCESS)
+ continue;
+ if ((v = reg_get_val2(hclsid, "ProgID")) != Qnil)
+ rb_ary_push(progids, v);
+ if ((v = reg_get_val2(hclsid, "VersionIndependentProgID")) != Qnil)
+ rb_ary_push(progids, v);
+ RegCloseKey(hclsid);
+ }
+ RegCloseKey(hclsids);
+ return progids;
+}
+
+static VALUE
+oletype_set_member(VALUE self, ITypeInfo *pTypeInfo, VALUE name)
+{
+ struct oletypedata *ptype;
+ Data_Get_Struct(self, struct oletypedata, ptype);
+ rb_ivar_set(self, rb_intern("name"), name);
+ ptype->pTypeInfo = pTypeInfo;
+ if(pTypeInfo) OLE_ADDREF(pTypeInfo);
+ return self;
+}
+
+static VALUE
+foletype_s_allocate(VALUE klass)
+{
+ struct oletypedata *poletype;
+ VALUE obj;
+ ole_initialize();
+ obj = Data_Make_Struct(klass,struct oletypedata,0,oletype_free,poletype);
+ poletype->pTypeInfo = NULL;
+ return obj;
+}
+
+VALUE
+create_win32ole_type(ITypeInfo *pTypeInfo, VALUE name)
+{
+ VALUE obj = foletype_s_allocate(cWIN32OLE_TYPE);
+ oletype_set_member(obj, pTypeInfo, name);
+ return obj;
+}
+
+static VALUE
+oleclass_from_typelib(VALUE self, ITypeLib *pTypeLib, VALUE oleclass)
+{
+
+ long count;
+ int i;
+ HRESULT hr;
+ BSTR bstr;
+ VALUE typelib;
+ ITypeInfo *pTypeInfo;
+
+ VALUE found = Qfalse;
+
+ count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
+ for (i = 0; i < count && found == Qfalse; i++) {
+ hr = pTypeLib->lpVtbl->GetTypeInfo(pTypeLib, i, &pTypeInfo);
+ if (FAILED(hr))
+ continue;
+ hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, i,
+ &bstr, NULL, NULL, NULL);
+ if (FAILED(hr))
+ continue;
+ typelib = WC2VSTR(bstr);
+ if (rb_str_cmp(oleclass, typelib) == 0) {
+ oletype_set_member(self, pTypeInfo, typelib);
+ found = Qtrue;
+ }
+ OLE_RELEASE(pTypeInfo);
+ }
+ return found;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE.new(typelib, ole_class) -> WIN32OLE_TYPE object
+ *
+ * Returns a new WIN32OLE_TYPE object.
+ * The first argument <i>typelib</i> specifies OLE type library name.
+ * The second argument specifies OLE class name.
+ *
+ * WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
+ * # => WIN32OLE_TYPE object of Application class of Excel.
+ */
+static VALUE
+foletype_initialize(VALUE self, VALUE typelib, VALUE oleclass)
+{
+ VALUE file;
+ OLECHAR * pbuf;
+ ITypeLib *pTypeLib;
+ HRESULT hr;
+
+ SafeStringValue(oleclass);
+ SafeStringValue(typelib);
+ file = typelib_file(typelib);
+ if (file == Qnil) {
+ file = typelib;
+ }
+ pbuf = ole_vstr2wc(file);
+ hr = LoadTypeLibEx(pbuf, REGKIND_NONE, &pTypeLib);
+ if (FAILED(hr))
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to LoadTypeLibEx");
+ SysFreeString(pbuf);
+ if (oleclass_from_typelib(self, pTypeLib, oleclass) == Qfalse) {
+ OLE_RELEASE(pTypeLib);
+ rb_raise(eWIN32OLERuntimeError, "not found `%s` in `%s`",
+ StringValuePtr(oleclass), StringValuePtr(typelib));
+ }
+ OLE_RELEASE(pTypeLib);
+ return self;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#name #=> OLE type name
+ *
+ * Returns OLE type name.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
+ * puts tobj.name # => Application
+ */
+static VALUE
+foletype_name(VALUE self)
+{
+ return rb_ivar_get(self, rb_intern("name"));
+}
+
+static VALUE
+ole_ole_type(ITypeInfo *pTypeInfo)
+{
+ HRESULT hr;
+ TYPEATTR *pTypeAttr;
+ VALUE type = Qnil;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if(FAILED(hr)){
+ return type;
+ }
+ switch(pTypeAttr->typekind) {
+ case TKIND_ENUM:
+ type = rb_str_new2("Enum");
+ break;
+ case TKIND_RECORD:
+ type = rb_str_new2("Record");
+ break;
+ case TKIND_MODULE:
+ type = rb_str_new2("Module");
+ break;
+ case TKIND_INTERFACE:
+ type = rb_str_new2("Interface");
+ break;
+ case TKIND_DISPATCH:
+ type = rb_str_new2("Dispatch");
+ break;
+ case TKIND_COCLASS:
+ type = rb_str_new2("Class");
+ break;
+ case TKIND_ALIAS:
+ type = rb_str_new2("Alias");
+ break;
+ case TKIND_UNION:
+ type = rb_str_new2("Union");
+ break;
+ case TKIND_MAX:
+ type = rb_str_new2("Max");
+ break;
+ default:
+ type = Qnil;
+ break;
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return type;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#ole_type #=> OLE type string.
+ *
+ * returns type of OLE class.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
+ * puts tobj.ole_type # => Class
+ */
+static VALUE
+foletype_ole_type(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_ole_type(pTypeInfo);
+}
+
+static VALUE
+ole_type_guid(ITypeInfo *pTypeInfo)
+{
+ HRESULT hr;
+ TYPEATTR *pTypeAttr;
+ int len;
+ OLECHAR bstr[80];
+ VALUE guid = Qnil;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr))
+ return guid;
+ len = StringFromGUID2(&pTypeAttr->guid, bstr, sizeof(bstr)/sizeof(OLECHAR));
+ if (len > 3) {
+ guid = ole_wc2vstr(bstr, FALSE);
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return guid;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#guid #=> GUID
+ *
+ * Returns GUID.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
+ * puts tobj.guid # => {00024500-0000-0000-C000-000000000046}
+ */
+static VALUE
+foletype_guid(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_guid(pTypeInfo);
+}
+
+static VALUE
+ole_type_progid(ITypeInfo *pTypeInfo)
+{
+ HRESULT hr;
+ TYPEATTR *pTypeAttr;
+ OLECHAR *pbuf;
+ VALUE progid = Qnil;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr))
+ return progid;
+ hr = ProgIDFromCLSID(&pTypeAttr->guid, &pbuf);
+ if (SUCCEEDED(hr)) {
+ progid = ole_wc2vstr(pbuf, FALSE);
+ CoTaskMemFree(pbuf);
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return progid;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#progid #=> ProgID
+ *
+ * Returns ProgID if it exists. If not found, then returns nil.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
+ * puts tobj.progid # => Excel.Application.9
+ */
+static VALUE
+foletype_progid(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_progid(pTypeInfo);
+}
+
+
+static VALUE
+ole_type_visible(ITypeInfo *pTypeInfo)
+{
+ HRESULT hr;
+ TYPEATTR *pTypeAttr;
+ VALUE visible;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr))
+ return Qtrue;
+ if (pTypeAttr->wTypeFlags & (TYPEFLAG_FHIDDEN | TYPEFLAG_FRESTRICTED)) {
+ visible = Qfalse;
+ } else {
+ visible = Qtrue;
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return visible;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#visible? #=> true or false
+ *
+ * Returns true if the OLE class is public.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Application')
+ * puts tobj.visible # => true
+ */
+static VALUE
+foletype_visible(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_visible(pTypeInfo);
+}
+
+static VALUE
+ole_type_major_version(ITypeInfo *pTypeInfo)
+{
+ VALUE ver;
+ TYPEATTR *pTypeAttr;
+ HRESULT hr;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr))
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
+ ver = INT2FIX(pTypeAttr->wMajorVerNum);
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return ver;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#major_version
+ *
+ * Returns major version.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Word 10.0 Object Library', 'Documents')
+ * puts tobj.major_version # => 8
+ */
+static VALUE
+foletype_major_version(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_major_version(pTypeInfo);
+}
+
+static VALUE
+ole_type_minor_version(ITypeInfo *pTypeInfo)
+{
+ VALUE ver;
+ TYPEATTR *pTypeAttr;
+ HRESULT hr;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr))
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
+ ver = INT2FIX(pTypeAttr->wMinorVerNum);
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return ver;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#minor_version #=> OLE minor version
+ *
+ * Returns minor version.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Word 10.0 Object Library', 'Documents')
+ * puts tobj.minor_version # => 2
+ */
+static VALUE
+foletype_minor_version(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_minor_version(pTypeInfo);
+}
+
+static VALUE
+ole_type_typekind(ITypeInfo *pTypeInfo)
+{
+ VALUE typekind;
+ TYPEATTR *pTypeAttr;
+ HRESULT hr;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr))
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
+ typekind = INT2FIX(pTypeAttr->typekind);
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return typekind;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#typekind #=> number of type.
+ *
+ * Returns number which represents type.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Word 10.0 Object Library', 'Documents')
+ * puts tobj.typekind # => 4
+ *
+ */
+static VALUE
+foletype_typekind(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_typekind(pTypeInfo);
+}
+
+static VALUE
+ole_type_helpstring(ITypeInfo *pTypeInfo)
+{
+ HRESULT hr;
+ BSTR bhelpstr;
+ hr = ole_docinfo_from_type(pTypeInfo, NULL, &bhelpstr, NULL, NULL);
+ if(FAILED(hr)) {
+ return Qnil;
+ }
+ return WC2VSTR(bhelpstr);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#helpstring #=> help string.
+ *
+ * Returns help string.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', 'IWebBrowser')
+ * puts tobj.helpstring # => Web Browser interface
+ */
+static VALUE
+foletype_helpstring(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_helpstring(pTypeInfo);
+}
+
+static VALUE
+ole_type_src_type(ITypeInfo *pTypeInfo)
+{
+ HRESULT hr;
+ TYPEATTR *pTypeAttr;
+ VALUE alias = Qnil;
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr))
+ return alias;
+ if(pTypeAttr->typekind != TKIND_ALIAS) {
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return alias;
+ }
+ alias = ole_typedesc2val(pTypeInfo, &(pTypeAttr->tdescAlias), Qnil);
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return alias;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#src_type #=> OLE source class
+ *
+ * Returns source class when the OLE class is 'Alias'.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Office 9.0 Object Library', 'MsoRGBType')
+ * puts tobj.src_type # => I4
+ *
+ */
+static VALUE
+foletype_src_type(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_src_type(pTypeInfo);
+}
+
+static VALUE
+ole_type_helpfile(ITypeInfo *pTypeInfo)
+{
+ HRESULT hr;
+ BSTR bhelpfile;
+ hr = ole_docinfo_from_type(pTypeInfo, NULL, NULL, NULL, &bhelpfile);
+ if(FAILED(hr)) {
+ return Qnil;
+ }
+ return WC2VSTR(bhelpfile);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#helpfile
+ *
+ * Returns helpfile path. If helpfile is not found, then returns nil.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Worksheet')
+ * puts tobj.helpfile # => C:\...\VBAXL9.CHM
+ *
+ */
+static VALUE
+foletype_helpfile(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_helpfile(pTypeInfo);
+}
+
+static VALUE
+ole_type_helpcontext(ITypeInfo *pTypeInfo)
+{
+ HRESULT hr;
+ DWORD helpcontext;
+ hr = ole_docinfo_from_type(pTypeInfo, NULL, NULL,
+ &helpcontext, NULL);
+ if(FAILED(hr))
+ return Qnil;
+ return INT2FIX(helpcontext);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#helpcontext
+ *
+ * Returns helpcontext. If helpcontext is not found, then returns nil.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Worksheet')
+ * puts tobj.helpfile # => 131185
+ */
+static VALUE
+foletype_helpcontext(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_helpcontext(pTypeInfo);
+}
+
+static VALUE
+ole_variables(ITypeInfo *pTypeInfo)
+{
+ HRESULT hr;
+ TYPEATTR *pTypeAttr;
+ WORD i;
+ UINT len;
+ BSTR bstr;
+ VARDESC *pVarDesc;
+ VALUE var;
+ VALUE variables = rb_ary_new();
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetTypeAttr");
+ }
+
+ for(i = 0; i < pTypeAttr->cVars; i++) {
+ hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, i, &pVarDesc);
+ if(FAILED(hr))
+ continue;
+ len = 0;
+ hr = pTypeInfo->lpVtbl->GetNames(pTypeInfo, pVarDesc->memid, &bstr,
+ 1, &len);
+ if(FAILED(hr) || len == 0 || !bstr)
+ continue;
+
+ var = create_win32ole_variable(pTypeInfo, i, WC2VSTR(bstr));
+ rb_ary_push(variables, var);
+
+ pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
+ pVarDesc = NULL;
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return variables;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#variables
+ *
+ * Returns array of WIN32OLE_VARIABLE objects which represent variables
+ * defined in OLE class.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
+ * vars = tobj.variables
+ * vars.each do |v|
+ * puts "#{v.name} = #{v.value}"
+ * end
+ *
+ * The result of above sample script is follows:
+ * xlChart = -4109
+ * xlDialogSheet = -4116
+ * xlExcel4IntlMacroSheet = 4
+ * xlExcel4MacroSheet = 3
+ * xlWorksheet = -4167
+ *
+ */
+static VALUE
+foletype_variables(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_variables(pTypeInfo);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#ole_methods # the array of WIN32OLE_METHOD objects.
+ *
+ * Returns array of WIN32OLE_METHOD objects which represent OLE method defined in
+ * OLE type library.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Worksheet')
+ * methods = tobj.ole_methods.collect{|m|
+ * m.name
+ * }
+ * # => ['Activate', 'Copy', 'Delete',....]
+ */
+static VALUE
+foletype_methods(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_methods_from_typeinfo(pTypeInfo, INVOKE_FUNC | INVOKE_PROPERTYGET | INVOKE_PROPERTYPUT | INVOKE_PROPERTYPUTREF);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#ole_typelib
+ *
+ * Returns the WIN32OLE_TYPELIB object which is including the WIN32OLE_TYPE
+ * object. If it is not found, then returns nil.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Worksheet')
+ * puts tobj.ole_typelib # => 'Microsoft Excel 9.0 Object Library'
+ */
+static VALUE
+foletype_ole_typelib(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_typelib_from_itypeinfo(pTypeInfo);
+}
+
+static VALUE
+ole_type_impl_ole_types(ITypeInfo *pTypeInfo, int implflags)
+{
+ HRESULT hr;
+ ITypeInfo *pRefTypeInfo;
+ HREFTYPE href;
+ WORD i;
+ VALUE type;
+ TYPEATTR *pTypeAttr;
+ int flags;
+
+ VALUE types = rb_ary_new();
+ hr = OLE_GET_TYPEATTR(pTypeInfo, &pTypeAttr);
+ if (FAILED(hr)) {
+ return types;
+ }
+ for (i = 0; i < pTypeAttr->cImplTypes; i++) {
+ hr = pTypeInfo->lpVtbl->GetImplTypeFlags(pTypeInfo, i, &flags);
+ if (FAILED(hr))
+ continue;
+
+ hr = pTypeInfo->lpVtbl->GetRefTypeOfImplType(pTypeInfo, i, &href);
+ if (FAILED(hr))
+ continue;
+ hr = pTypeInfo->lpVtbl->GetRefTypeInfo(pTypeInfo, href, &pRefTypeInfo);
+ if (FAILED(hr))
+ continue;
+
+ if ((flags & implflags) == implflags) {
+ type = ole_type_from_itypeinfo(pRefTypeInfo);
+ if (type != Qnil) {
+ rb_ary_push(types, type);
+ }
+ }
+
+ OLE_RELEASE(pRefTypeInfo);
+ }
+ OLE_RELEASE_TYPEATTR(pTypeInfo, pTypeAttr);
+ return types;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#implemented_ole_types
+ *
+ * Returns the array of WIN32OLE_TYPE object which is implemented by the WIN32OLE_TYPE
+ * object.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'Worksheet')
+ * p tobj.implemented_ole_types # => [_Worksheet, DocEvents]
+ */
+static VALUE
+foletype_impl_ole_types(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_impl_ole_types(pTypeInfo, 0);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#source_ole_types
+ *
+ * Returns the array of WIN32OLE_TYPE object which is implemented by the WIN32OLE_TYPE
+ * object and having IMPLTYPEFLAG_FSOURCE.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', "InternetExplorer")
+ * p tobj.source_ole_types
+ * # => [#<WIN32OLE_TYPE:DWebBrowserEvents2>, #<WIN32OLE_TYPE:DWebBrowserEvents>]
+ */
+static VALUE
+foletype_source_ole_types(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_impl_ole_types(pTypeInfo, IMPLTYPEFLAG_FSOURCE);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#default_event_sources
+ *
+ * Returns the array of WIN32OLE_TYPE object which is implemented by the WIN32OLE_TYPE
+ * object and having IMPLTYPEFLAG_FSOURCE and IMPLTYPEFLAG_FDEFAULT.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', "InternetExplorer")
+ * p tobj.default_event_sources # => [#<WIN32OLE_TYPE:DWebBrowserEvents2>]
+ */
+static VALUE
+foletype_default_event_sources(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_impl_ole_types(pTypeInfo, IMPLTYPEFLAG_FSOURCE|IMPLTYPEFLAG_FDEFAULT);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#default_ole_types
+ *
+ * Returns the array of WIN32OLE_TYPE object which is implemented by the WIN32OLE_TYPE
+ * object and having IMPLTYPEFLAG_FDEFAULT.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Internet Controls', "InternetExplorer")
+ * p tobj.default_ole_types
+ * # => [#<WIN32OLE_TYPE:IWebBrowser2>, #<WIN32OLE_TYPE:DWebBrowserEvents2>]
+ */
+static VALUE
+foletype_default_ole_types(VALUE self)
+{
+ ITypeInfo *pTypeInfo = itypeinfo(self);
+ return ole_type_impl_ole_types(pTypeInfo, IMPLTYPEFLAG_FDEFAULT);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPE#inspect -> String
+ *
+ * Returns the type name with class name.
+ *
+ * ie = WIN32OLE.new('InternetExplorer.Application')
+ * ie.ole_type.inspect => #<WIN32OLE_TYPE:IWebBrowser2>
+ */
+static VALUE
+foletype_inspect(VALUE self)
+{
+ return default_inspect(self, "WIN32OLE_TYPE");
+}
+
+void Init_win32ole_type()
+{
+ cWIN32OLE_TYPE = rb_define_class("WIN32OLE_TYPE", rb_cObject);
+ rb_define_singleton_method(cWIN32OLE_TYPE, "ole_classes", foletype_s_ole_classes, 1);
+ rb_define_singleton_method(cWIN32OLE_TYPE, "typelibs", foletype_s_typelibs, 0);
+ rb_define_singleton_method(cWIN32OLE_TYPE, "progids", foletype_s_progids, 0);
+ rb_define_alloc_func(cWIN32OLE_TYPE, foletype_s_allocate);
+ rb_define_method(cWIN32OLE_TYPE, "initialize", foletype_initialize, 2);
+ rb_define_method(cWIN32OLE_TYPE, "name", foletype_name, 0);
+ rb_define_method(cWIN32OLE_TYPE, "ole_type", foletype_ole_type, 0);
+ rb_define_method(cWIN32OLE_TYPE, "guid", foletype_guid, 0);
+ rb_define_method(cWIN32OLE_TYPE, "progid", foletype_progid, 0);
+ rb_define_method(cWIN32OLE_TYPE, "visible?", foletype_visible, 0);
+ rb_define_alias(cWIN32OLE_TYPE, "to_s", "name");
+ rb_define_method(cWIN32OLE_TYPE, "major_version", foletype_major_version, 0);
+ rb_define_method(cWIN32OLE_TYPE, "minor_version", foletype_minor_version, 0);
+ rb_define_method(cWIN32OLE_TYPE, "typekind", foletype_typekind, 0);
+ rb_define_method(cWIN32OLE_TYPE, "helpstring", foletype_helpstring, 0);
+ rb_define_method(cWIN32OLE_TYPE, "src_type", foletype_src_type, 0);
+ rb_define_method(cWIN32OLE_TYPE, "helpfile", foletype_helpfile, 0);
+ rb_define_method(cWIN32OLE_TYPE, "helpcontext", foletype_helpcontext, 0);
+ rb_define_method(cWIN32OLE_TYPE, "variables", foletype_variables, 0);
+ rb_define_method(cWIN32OLE_TYPE, "ole_methods", foletype_methods, 0);
+ rb_define_method(cWIN32OLE_TYPE, "ole_typelib", foletype_ole_typelib, 0);
+ rb_define_method(cWIN32OLE_TYPE, "implemented_ole_types", foletype_impl_ole_types, 0);
+ rb_define_method(cWIN32OLE_TYPE, "source_ole_types", foletype_source_ole_types, 0);
+ rb_define_method(cWIN32OLE_TYPE, "default_event_sources", foletype_default_event_sources, 0);
+ rb_define_method(cWIN32OLE_TYPE, "default_ole_types", foletype_default_ole_types, 0);
+ rb_define_method(cWIN32OLE_TYPE, "inspect", foletype_inspect, 0);
+}
diff --git a/ext/win32ole/win32ole_type.h b/ext/win32ole/win32ole_type.h
new file mode 100644
index 0000000000..086d36a241
--- /dev/null
+++ b/ext/win32ole/win32ole_type.h
@@ -0,0 +1,8 @@
+#ifndef WIN32OLE_TYPE_H
+#define WIN32OLE_TYPE_H 1
+VALUE cWIN32OLE_TYPE;
+VALUE create_win32ole_type(ITypeInfo *pTypeInfo, VALUE name);
+ITypeInfo *itypeinfo(VALUE self);
+VALUE ole_type_from_itypeinfo(ITypeInfo *pTypeInfo);
+void Init_win32ole_type();
+#endif
diff --git a/ext/win32ole/win32ole_typelib.c b/ext/win32ole/win32ole_typelib.c
new file mode 100644
index 0000000000..f5ecd4c05c
--- /dev/null
+++ b/ext/win32ole/win32ole_typelib.c
@@ -0,0 +1,832 @@
+#include "win32ole.h"
+
+struct oletypelibdata {
+ ITypeLib *pTypeLib;
+};
+
+static VALUE reg_get_typelib_file_path(HKEY hkey);
+static VALUE oletypelib_path(VALUE guid, VALUE version);
+static HRESULT oletypelib_from_guid(VALUE guid, VALUE version, ITypeLib **ppTypeLib);
+static VALUE foletypelib_s_typelibs(VALUE self);
+static VALUE oletypelib_set_member(VALUE self, ITypeLib *pTypeLib);
+static void oletypelib_free(struct oletypelibdata *poletypelib);
+static VALUE foletypelib_s_allocate(VALUE klass);
+static VALUE oletypelib_search_registry(VALUE self, VALUE typelib);
+static void oletypelib_get_libattr(ITypeLib *pTypeLib, TLIBATTR **ppTLibAttr);
+static VALUE oletypelib_search_registry2(VALUE self, VALUE args);
+static VALUE foletypelib_initialize(VALUE self, VALUE args);
+static VALUE foletypelib_guid(VALUE self);
+static VALUE foletypelib_name(VALUE self);
+static VALUE make_version_str(VALUE major, VALUE minor);
+static VALUE foletypelib_version(VALUE self);
+static VALUE foletypelib_major_version(VALUE self);
+static VALUE foletypelib_minor_version(VALUE self);
+static VALUE foletypelib_path(VALUE self);
+static VALUE foletypelib_visible(VALUE self);
+static VALUE foletypelib_library_name(VALUE self);
+static VALUE ole_types_from_typelib(ITypeLib *pTypeLib, VALUE classes);
+static VALUE typelib_file_from_typelib(VALUE ole);
+static VALUE typelib_file_from_clsid(VALUE ole);
+static VALUE foletypelib_ole_types(VALUE self);
+static VALUE foletypelib_inspect(VALUE self);
+
+static VALUE
+reg_get_typelib_file_path(HKEY hkey)
+{
+ VALUE path = Qnil;
+ path = reg_get_val2(hkey, "win64");
+ if (path != Qnil) {
+ return path;
+ }
+ path = reg_get_val2(hkey, "win32");
+ if (path != Qnil) {
+ return path;
+ }
+ path = reg_get_val2(hkey, "win16");
+ return path;
+}
+
+static VALUE
+oletypelib_path(VALUE guid, VALUE version)
+{
+ int k;
+ LONG err;
+ HKEY hkey;
+ HKEY hlang;
+ VALUE lang;
+ VALUE path = Qnil;
+
+ VALUE key = rb_str_new2("TypeLib\\");
+ rb_str_concat(key, guid);
+ rb_str_cat2(key, "\\");
+ rb_str_concat(key, version);
+
+ err = reg_open_vkey(HKEY_CLASSES_ROOT, key, &hkey);
+ if (err != ERROR_SUCCESS) {
+ return Qnil;
+ }
+ for(k = 0; path == Qnil; k++) {
+ lang = reg_enum_key(hkey, k);
+ if (lang == Qnil)
+ break;
+ err = reg_open_vkey(hkey, lang, &hlang);
+ if (err == ERROR_SUCCESS) {
+ path = reg_get_typelib_file_path(hlang);
+ RegCloseKey(hlang);
+ }
+ }
+ RegCloseKey(hkey);
+ return path;
+}
+
+static HRESULT
+oletypelib_from_guid(VALUE guid, VALUE version, ITypeLib **ppTypeLib)
+{
+ VALUE path;
+ OLECHAR *pBuf;
+ HRESULT hr;
+ path = oletypelib_path(guid, version);
+ if (path == Qnil) {
+ return E_UNEXPECTED;
+ }
+ pBuf = ole_vstr2wc(path);
+ hr = LoadTypeLibEx(pBuf, REGKIND_NONE, ppTypeLib);
+ SysFreeString(pBuf);
+ return hr;
+}
+
+ITypeLib *
+itypelib(VALUE self)
+{
+ struct oletypelibdata *ptlib;
+ Data_Get_Struct(self, struct oletypelibdata, ptlib);
+ return ptlib->pTypeLib;
+}
+
+VALUE
+ole_typelib_from_itypeinfo(ITypeInfo *pTypeInfo)
+{
+ HRESULT hr;
+ ITypeLib *pTypeLib;
+ unsigned int index;
+ VALUE retval = Qnil;
+
+ hr = pTypeInfo->lpVtbl->GetContainingTypeLib(pTypeInfo, &pTypeLib, &index);
+ if(FAILED(hr)) {
+ return Qnil;
+ }
+ retval = create_win32ole_typelib(pTypeLib);
+ return retval;
+}
+
+/*
+ * Document-class: WIN32OLE_TYPELIB
+ *
+ * <code>WIN32OLE_TYPELIB</code> objects represent OLE tyblib information.
+ */
+
+/*
+ * call-seq:
+ *
+ * WIN32OLE_TYPELIB.typelibs
+ *
+ * Returns the array of WIN32OLE_TYPELIB object.
+ *
+ * tlibs = WIN32OLE_TYPELIB.typelibs
+ *
+ */
+static VALUE
+foletypelib_s_typelibs(VALUE self)
+{
+ HKEY htypelib, hguid;
+ DWORD i, j;
+ LONG err;
+ VALUE guid;
+ VALUE version;
+ VALUE name = Qnil;
+ VALUE typelibs = rb_ary_new();
+ VALUE typelib = Qnil;
+ HRESULT hr;
+ ITypeLib *pTypeLib;
+
+ err = reg_open_key(HKEY_CLASSES_ROOT, "TypeLib", &htypelib);
+ if(err != ERROR_SUCCESS) {
+ return typelibs;
+ }
+ for(i = 0; ; i++) {
+ guid = reg_enum_key(htypelib, i);
+ if (guid == Qnil)
+ break;
+ err = reg_open_vkey(htypelib, guid, &hguid);
+ if (err != ERROR_SUCCESS)
+ continue;
+ for(j = 0; ; j++) {
+ version = reg_enum_key(hguid, j);
+ if (version == Qnil)
+ break;
+ if ( (name = reg_get_val2(hguid, StringValuePtr(version))) != Qnil ) {
+ hr = oletypelib_from_guid(guid, version, &pTypeLib);
+ if (SUCCEEDED(hr)) {
+ typelib = create_win32ole_typelib(pTypeLib);
+ rb_ary_push(typelibs, typelib);
+ }
+ }
+ }
+ RegCloseKey(hguid);
+ }
+ RegCloseKey(htypelib);
+ return typelibs;
+}
+
+static VALUE
+oletypelib_set_member(VALUE self, ITypeLib *pTypeLib)
+{
+ struct oletypelibdata *ptlib;
+ Data_Get_Struct(self, struct oletypelibdata, ptlib);
+ ptlib->pTypeLib = pTypeLib;
+ return self;
+}
+
+static void
+oletypelib_free(struct oletypelibdata *poletypelib)
+{
+ OLE_FREE(poletypelib->pTypeLib);
+ free(poletypelib);
+}
+
+static VALUE
+foletypelib_s_allocate(VALUE klass)
+{
+ struct oletypelibdata *poletypelib;
+ VALUE obj;
+ ole_initialize();
+ obj = Data_Make_Struct(klass, struct oletypelibdata, 0, oletypelib_free, poletypelib);
+ poletypelib->pTypeLib = NULL;
+ return obj;
+}
+
+VALUE
+create_win32ole_typelib(ITypeLib *pTypeLib)
+{
+ VALUE obj = foletypelib_s_allocate(cWIN32OLE_TYPELIB);
+ oletypelib_set_member(obj, pTypeLib);
+ return obj;
+}
+
+static VALUE
+oletypelib_search_registry(VALUE self, VALUE typelib)
+{
+ HKEY htypelib, hguid, hversion;
+ DWORD i, j;
+ LONG err;
+ VALUE found = Qfalse;
+ VALUE tlib;
+ VALUE guid;
+ VALUE ver;
+ HRESULT hr;
+ ITypeLib *pTypeLib;
+
+ err = reg_open_key(HKEY_CLASSES_ROOT, "TypeLib", &htypelib);
+ if(err != ERROR_SUCCESS) {
+ return Qfalse;
+ }
+ for(i = 0; !found; i++) {
+ guid = reg_enum_key(htypelib, i);
+ if (guid == Qnil)
+ break;
+ err = reg_open_vkey(htypelib, guid, &hguid);
+ if (err != ERROR_SUCCESS)
+ continue;
+ for(j = 0; found == Qfalse; j++) {
+ ver = reg_enum_key(hguid, j);
+ if (ver == Qnil)
+ break;
+ err = reg_open_vkey(hguid, ver, &hversion);
+ if (err != ERROR_SUCCESS)
+ continue;
+ tlib = reg_get_val(hversion, NULL);
+ if (tlib == Qnil) {
+ RegCloseKey(hversion);
+ continue;
+ }
+ if (rb_str_cmp(typelib, tlib) == 0) {
+ hr = oletypelib_from_guid(guid, ver, &pTypeLib);
+ if (SUCCEEDED(hr)) {
+ oletypelib_set_member(self, pTypeLib);
+ found = Qtrue;
+ }
+ }
+ RegCloseKey(hversion);
+ }
+ RegCloseKey(hguid);
+ }
+ RegCloseKey(htypelib);
+ return found;
+}
+
+static void
+oletypelib_get_libattr(ITypeLib *pTypeLib, TLIBATTR **ppTLibAttr)
+{
+ HRESULT hr;
+ hr = pTypeLib->lpVtbl->GetLibAttr(pTypeLib, ppTLibAttr);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError,
+ "failed to get library attribute(TLIBATTR) from ITypeLib");
+ }
+}
+
+static VALUE
+oletypelib_search_registry2(VALUE self, VALUE args)
+{
+ HKEY htypelib, hguid, hversion;
+ double fver;
+ DWORD j;
+ LONG err;
+ VALUE found = Qfalse;
+ VALUE tlib;
+ VALUE ver;
+ VALUE version_str;
+ VALUE version = Qnil;
+ VALUE typelib = Qnil;
+ HRESULT hr;
+ ITypeLib *pTypeLib;
+
+ VALUE guid = rb_ary_entry(args, 0);
+ version_str = make_version_str(rb_ary_entry(args, 1), rb_ary_entry(args, 2));
+
+ err = reg_open_key(HKEY_CLASSES_ROOT, "TypeLib", &htypelib);
+ if(err != ERROR_SUCCESS) {
+ return Qfalse;
+ }
+ err = reg_open_vkey(htypelib, guid, &hguid);
+ if (err != ERROR_SUCCESS) {
+ RegCloseKey(htypelib);
+ return Qfalse;
+ }
+ if (version_str != Qnil) {
+ err = reg_open_vkey(hguid, version_str, &hversion);
+ if (err == ERROR_SUCCESS) {
+ tlib = reg_get_val(hversion, NULL);
+ if (tlib != Qnil) {
+ typelib = tlib;
+ version = version_str;
+ }
+ }
+ RegCloseKey(hversion);
+ } else {
+ fver = 0.0;
+ for(j = 0; ;j++) {
+ ver = reg_enum_key(hguid, j);
+ if (ver == Qnil)
+ break;
+ err = reg_open_vkey(hguid, ver, &hversion);
+ if (err != ERROR_SUCCESS)
+ continue;
+ tlib = reg_get_val(hversion, NULL);
+ if (tlib == Qnil) {
+ RegCloseKey(hversion);
+ continue;
+ }
+ if (fver < atof(StringValuePtr(ver))) {
+ fver = atof(StringValuePtr(ver));
+ version = ver;
+ typelib = tlib;
+ }
+ RegCloseKey(hversion);
+ }
+ }
+ RegCloseKey(hguid);
+ RegCloseKey(htypelib);
+ if (typelib != Qnil) {
+ hr = oletypelib_from_guid(guid, version, &pTypeLib);
+ if (SUCCEEDED(hr)) {
+ found = Qtrue;
+ oletypelib_set_member(self, pTypeLib);
+ }
+ }
+ return found;
+}
+
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB.new(typelib [, version1, version2]) -> WIN32OLE_TYPELIB object
+ *
+ * Returns a new WIN32OLE_TYPELIB object.
+ *
+ * The first argument <i>typelib</i> specifies OLE type library name or GUID or
+ * OLE library file.
+ * The second argument is major version or version of the type library.
+ * The third argument is minor version.
+ * The second argument and third argument are optional.
+ * If the first argument is type library name, then the second and third argument
+ * are ignored.
+ *
+ * tlib1 = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * tlib2 = WIN32OLE_TYPELIB.new('{00020813-0000-0000-C000-000000000046}')
+ * tlib3 = WIN32OLE_TYPELIB.new('{00020813-0000-0000-C000-000000000046}', 1.3)
+ * tlib4 = WIN32OLE_TYPELIB.new('{00020813-0000-0000-C000-000000000046}', 1, 3)
+ * tlib5 = WIN32OLE_TYPELIB.new("C:\\WINNT\\SYSTEM32\\SHELL32.DLL")
+ * puts tlib1.name # -> 'Microsoft Excel 9.0 Object Library'
+ * puts tlib2.name # -> 'Microsoft Excel 9.0 Object Library'
+ * puts tlib3.name # -> 'Microsoft Excel 9.0 Object Library'
+ * puts tlib4.name # -> 'Microsoft Excel 9.0 Object Library'
+ * puts tlib5.name # -> 'Microsoft Shell Controls And Automation'
+ *
+ */
+static VALUE
+foletypelib_initialize(VALUE self, VALUE args)
+{
+ VALUE found = Qfalse;
+ VALUE typelib = Qnil;
+ int len = 0;
+ OLECHAR * pbuf;
+ ITypeLib *pTypeLib;
+ HRESULT hr = S_OK;
+
+ len = RARRAY_LEN(args);
+ if (len < 1 || len > 3) {
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", len);
+ }
+
+ typelib = rb_ary_entry(args, 0);
+
+ SafeStringValue(typelib);
+
+ found = oletypelib_search_registry(self, typelib);
+ if (found == Qfalse) {
+ found = oletypelib_search_registry2(self, args);
+ }
+ if (found == Qfalse) {
+ pbuf = ole_vstr2wc(typelib);
+ hr = LoadTypeLibEx(pbuf, REGKIND_NONE, &pTypeLib);
+ SysFreeString(pbuf);
+ if (SUCCEEDED(hr)) {
+ found = Qtrue;
+ oletypelib_set_member(self, pTypeLib);
+ }
+ }
+
+ if (found == Qfalse) {
+ rb_raise(eWIN32OLERuntimeError, "not found type library `%s`",
+ StringValuePtr(typelib));
+ }
+ return self;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB#guid -> The guid string.
+ *
+ * Returns guid string which specifies type library.
+ *
+ * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * guid = tlib.guid # -> '{00020813-0000-0000-C000-000000000046}'
+ */
+static VALUE
+foletypelib_guid(VALUE self)
+{
+ ITypeLib *pTypeLib;
+ OLECHAR bstr[80];
+ VALUE guid = Qnil;
+ int len;
+ TLIBATTR *pTLibAttr;
+
+ pTypeLib = itypelib(self);
+ oletypelib_get_libattr(pTypeLib, &pTLibAttr);
+ len = StringFromGUID2(&pTLibAttr->guid, bstr, sizeof(bstr)/sizeof(OLECHAR));
+ if (len > 3) {
+ guid = ole_wc2vstr(bstr, FALSE);
+ }
+ pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
+ return guid;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB#name -> The type library name
+ *
+ * Returns the type library name.
+ *
+ * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * name = tlib.name # -> 'Microsoft Excel 9.0 Object Library'
+ */
+static VALUE
+foletypelib_name(VALUE self)
+{
+ ITypeLib *pTypeLib;
+ HRESULT hr;
+ BSTR bstr;
+ VALUE name;
+ pTypeLib = itypelib(self);
+ hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, -1,
+ NULL, &bstr, NULL, NULL);
+
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to get name from ITypeLib");
+ }
+ name = WC2VSTR(bstr);
+ return name;
+}
+
+static VALUE
+make_version_str(VALUE major, VALUE minor)
+{
+ VALUE version_str = Qnil;
+ VALUE minor_str = Qnil;
+ if (major == Qnil) {
+ return Qnil;
+ }
+ version_str = rb_String(major);
+ if (minor != Qnil) {
+ minor_str = rb_String(minor);
+ rb_str_cat2(version_str, ".");
+ rb_str_append(version_str, minor_str);
+ }
+ return version_str;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB#version -> The type library version String object.
+ *
+ * Returns the type library version.
+ *
+ * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * puts tlib.version #-> "1.3"
+ */
+static VALUE
+foletypelib_version(VALUE self)
+{
+ TLIBATTR *pTLibAttr;
+ ITypeLib *pTypeLib;
+ VALUE version;
+
+ pTypeLib = itypelib(self);
+ oletypelib_get_libattr(pTypeLib, &pTLibAttr);
+ version = rb_sprintf("%d.%d", pTLibAttr->wMajorVerNum, pTLibAttr->wMinorVerNum);
+ pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
+ return version;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB#major_version -> The type library major version.
+ *
+ * Returns the type library major version.
+ *
+ * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * puts tlib.major_version # -> 1
+ */
+static VALUE
+foletypelib_major_version(VALUE self)
+{
+ TLIBATTR *pTLibAttr;
+ VALUE major;
+ ITypeLib *pTypeLib;
+ pTypeLib = itypelib(self);
+ oletypelib_get_libattr(pTypeLib, &pTLibAttr);
+
+ major = INT2NUM(pTLibAttr->wMajorVerNum);
+ pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
+ return major;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB#minor_version -> The type library minor version.
+ *
+ * Returns the type library minor version.
+ *
+ * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * puts tlib.minor_version # -> 3
+ */
+static VALUE
+foletypelib_minor_version(VALUE self)
+{
+ TLIBATTR *pTLibAttr;
+ VALUE minor;
+ ITypeLib *pTypeLib;
+ pTypeLib = itypelib(self);
+ oletypelib_get_libattr(pTypeLib, &pTLibAttr);
+ minor = INT2NUM(pTLibAttr->wMinorVerNum);
+ pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
+ return minor;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB#path -> The type library file path.
+ *
+ * Returns the type library file path.
+ *
+ * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * puts tlib.path #-> 'C:\...\EXCEL9.OLB'
+ */
+static VALUE
+foletypelib_path(VALUE self)
+{
+ TLIBATTR *pTLibAttr;
+ HRESULT hr = S_OK;
+ BSTR bstr;
+ LCID lcid = cWIN32OLE_lcid;
+ VALUE path;
+ ITypeLib *pTypeLib;
+
+ pTypeLib = itypelib(self);
+ oletypelib_get_libattr(pTypeLib, &pTLibAttr);
+ hr = QueryPathOfRegTypeLib(&pTLibAttr->guid,
+ pTLibAttr->wMajorVerNum,
+ pTLibAttr->wMinorVerNum,
+ lcid,
+ &bstr);
+ if (FAILED(hr)) {
+ pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to QueryPathOfRegTypeTypeLib");
+ }
+
+ pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
+ path = WC2VSTR(bstr);
+ return path;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB#visible?
+ *
+ * Returns true if the type library information is not hidden.
+ * If wLibFlags of TLIBATTR is 0 or LIBFLAG_FRESTRICTED or LIBFLAG_FHIDDEN,
+ * the method returns false, otherwise, returns true.
+ * If the method fails to access the TLIBATTR information, then
+ * WIN32OLERuntimeError is raised.
+ *
+ * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * tlib.visible? # => true
+ */
+static VALUE
+foletypelib_visible(VALUE self)
+{
+ ITypeLib *pTypeLib = NULL;
+ VALUE visible = Qtrue;
+ TLIBATTR *pTLibAttr;
+
+ pTypeLib = itypelib(self);
+ oletypelib_get_libattr(pTypeLib, &pTLibAttr);
+
+ if ((pTLibAttr->wLibFlags == 0) ||
+ (pTLibAttr->wLibFlags & LIBFLAG_FRESTRICTED) ||
+ (pTLibAttr->wLibFlags & LIBFLAG_FHIDDEN)) {
+ visible = Qfalse;
+ }
+ pTypeLib->lpVtbl->ReleaseTLibAttr(pTypeLib, pTLibAttr);
+ return visible;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB#library_name
+ *
+ * Returns library name.
+ * If the method fails to access library name, WIN32OLERuntimeError is raised.
+ *
+ * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * tlib.library_name # => Excel
+ */
+static VALUE
+foletypelib_library_name(VALUE self)
+{
+ HRESULT hr;
+ ITypeLib *pTypeLib = NULL;
+ VALUE libname = Qnil;
+ BSTR bstr;
+
+ pTypeLib = itypelib(self);
+ hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, -1,
+ &bstr, NULL, NULL, NULL);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to get library name");
+ }
+ libname = WC2VSTR(bstr);
+ return libname;
+}
+
+static VALUE
+ole_types_from_typelib(ITypeLib *pTypeLib, VALUE classes)
+{
+ long count;
+ int i;
+ HRESULT hr;
+ BSTR bstr;
+ ITypeInfo *pTypeInfo;
+ VALUE type;
+
+ count = pTypeLib->lpVtbl->GetTypeInfoCount(pTypeLib);
+ for (i = 0; i < count; i++) {
+ hr = pTypeLib->lpVtbl->GetDocumentation(pTypeLib, i,
+ &bstr, NULL, NULL, NULL);
+ if (FAILED(hr))
+ continue;
+
+ hr = pTypeLib->lpVtbl->GetTypeInfo(pTypeLib, i, &pTypeInfo);
+ if (FAILED(hr))
+ continue;
+
+ type = create_win32ole_type(pTypeInfo, WC2VSTR(bstr));
+
+ rb_ary_push(classes, type);
+ OLE_RELEASE(pTypeInfo);
+ }
+ return classes;
+}
+
+static VALUE
+typelib_file_from_typelib(VALUE ole)
+{
+ HKEY htypelib, hclsid, hversion, hlang;
+ double fver;
+ DWORD i, j, k;
+ LONG err;
+ BOOL found = FALSE;
+ VALUE typelib;
+ VALUE file = Qnil;
+ VALUE clsid;
+ VALUE ver;
+ VALUE lang;
+
+ err = reg_open_key(HKEY_CLASSES_ROOT, "TypeLib", &htypelib);
+ if(err != ERROR_SUCCESS) {
+ return Qnil;
+ }
+ for(i = 0; !found; i++) {
+ clsid = reg_enum_key(htypelib, i);
+ if (clsid == Qnil)
+ break;
+ err = reg_open_vkey(htypelib, clsid, &hclsid);
+ if (err != ERROR_SUCCESS)
+ continue;
+ fver = 0;
+ for(j = 0; !found; j++) {
+ ver = reg_enum_key(hclsid, j);
+ if (ver == Qnil)
+ break;
+ err = reg_open_vkey(hclsid, ver, &hversion);
+ if (err != ERROR_SUCCESS || fver > atof(StringValuePtr(ver)))
+ continue;
+ fver = atof(StringValuePtr(ver));
+ typelib = reg_get_val(hversion, NULL);
+ if (typelib == Qnil)
+ continue;
+ if (rb_str_cmp(typelib, ole) == 0) {
+ for(k = 0; !found; k++) {
+ lang = reg_enum_key(hversion, k);
+ if (lang == Qnil)
+ break;
+ err = reg_open_vkey(hversion, lang, &hlang);
+ if (err == ERROR_SUCCESS) {
+ if ((file = reg_get_typelib_file_path(hlang)) != Qnil)
+ found = TRUE;
+ RegCloseKey(hlang);
+ }
+ }
+ }
+ RegCloseKey(hversion);
+ }
+ RegCloseKey(hclsid);
+ }
+ RegCloseKey(htypelib);
+ return file;
+}
+
+static VALUE
+typelib_file_from_clsid(VALUE ole)
+{
+ HKEY hroot, hclsid;
+ LONG err;
+ VALUE typelib;
+ char path[MAX_PATH + 1];
+
+ err = reg_open_key(HKEY_CLASSES_ROOT, "CLSID", &hroot);
+ if (err != ERROR_SUCCESS) {
+ return Qnil;
+ }
+ err = reg_open_key(hroot, StringValuePtr(ole), &hclsid);
+ if (err != ERROR_SUCCESS) {
+ RegCloseKey(hroot);
+ return Qnil;
+ }
+ typelib = reg_get_val2(hclsid, "InprocServer32");
+ RegCloseKey(hroot);
+ RegCloseKey(hclsid);
+ if (typelib != Qnil) {
+ ExpandEnvironmentStrings(StringValuePtr(typelib), path, sizeof(path));
+ path[MAX_PATH] = '\0';
+ typelib = rb_str_new2(path);
+ }
+ return typelib;
+}
+
+VALUE
+typelib_file(VALUE ole)
+{
+ VALUE file = typelib_file_from_clsid(ole);
+ if (file != Qnil) {
+ return file;
+ }
+ return typelib_file_from_typelib(ole);
+}
+
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB#ole_types -> The array of WIN32OLE_TYPE object included the type library.
+ *
+ * Returns the type library file path.
+ *
+ * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * classes = tlib.ole_types.collect{|k| k.name} # -> ['AddIn', 'AddIns' ...]
+ */
+static VALUE
+foletypelib_ole_types(VALUE self)
+{
+ ITypeLib *pTypeLib = NULL;
+ VALUE classes = rb_ary_new();
+ pTypeLib = itypelib(self);
+ ole_types_from_typelib(pTypeLib, classes);
+ return classes;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_TYPELIB#inspect -> String
+ *
+ * Returns the type library name with class name.
+ *
+ * tlib = WIN32OLE_TYPELIB.new('Microsoft Excel 9.0 Object Library')
+ * tlib.inspect # => "<#WIN32OLE_TYPELIB:Microsoft Excel 9.0 Object Library>"
+ */
+static VALUE
+foletypelib_inspect(VALUE self)
+{
+ return default_inspect(self, "WIN32OLE_TYPELIB");
+}
+
+void
+Init_win32ole_typelib()
+{
+ cWIN32OLE_TYPELIB = rb_define_class("WIN32OLE_TYPELIB", rb_cObject);
+ rb_define_singleton_method(cWIN32OLE_TYPELIB, "typelibs", foletypelib_s_typelibs, 0);
+ rb_define_alloc_func(cWIN32OLE_TYPELIB, foletypelib_s_allocate);
+ rb_define_method(cWIN32OLE_TYPELIB, "initialize", foletypelib_initialize, -2);
+ rb_define_method(cWIN32OLE_TYPELIB, "guid", foletypelib_guid, 0);
+ rb_define_method(cWIN32OLE_TYPELIB, "name", foletypelib_name, 0);
+ rb_define_method(cWIN32OLE_TYPELIB, "version", foletypelib_version, 0);
+ rb_define_method(cWIN32OLE_TYPELIB, "major_version", foletypelib_major_version, 0);
+ rb_define_method(cWIN32OLE_TYPELIB, "minor_version", foletypelib_minor_version, 0);
+ rb_define_method(cWIN32OLE_TYPELIB, "path", foletypelib_path, 0);
+ rb_define_method(cWIN32OLE_TYPELIB, "ole_types", foletypelib_ole_types, 0);
+ rb_define_alias(cWIN32OLE_TYPELIB, "ole_classes", "ole_types");
+ rb_define_method(cWIN32OLE_TYPELIB, "visible?", foletypelib_visible, 0);
+ rb_define_method(cWIN32OLE_TYPELIB, "library_name", foletypelib_library_name, 0);
+ rb_define_alias(cWIN32OLE_TYPELIB, "to_s", "name");
+ rb_define_method(cWIN32OLE_TYPELIB, "inspect", foletypelib_inspect, 0);
+}
diff --git a/ext/win32ole/win32ole_typelib.h b/ext/win32ole/win32ole_typelib.h
new file mode 100644
index 0000000000..160ed61743
--- /dev/null
+++ b/ext/win32ole/win32ole_typelib.h
@@ -0,0 +1,11 @@
+#ifndef WIN32OLE_TYPELIB_H
+#define WIN32OLE_TYPELIB_H 1
+
+VALUE cWIN32OLE_TYPELIB;
+
+void Init_win32ole_typelib();
+ITypeLib * itypelib(VALUE self);
+VALUE typelib_file(VALUE ole);
+VALUE create_win32ole_typelib(ITypeLib *pTypeLib);
+VALUE ole_typelib_from_itypeinfo(ITypeInfo *pTypeInfo);
+#endif
diff --git a/ext/win32ole/win32ole_variable.c b/ext/win32ole/win32ole_variable.c
new file mode 100644
index 0000000000..85f3341f98
--- /dev/null
+++ b/ext/win32ole/win32ole_variable.c
@@ -0,0 +1,366 @@
+#include "win32ole.h"
+
+struct olevariabledata {
+ ITypeInfo *pTypeInfo;
+ UINT index;
+};
+
+static void olevariable_free(struct olevariabledata *polevar);
+static VALUE folevariable_name(VALUE self);
+static VALUE ole_variable_ole_type(ITypeInfo *pTypeInfo, UINT var_index);
+static VALUE folevariable_ole_type(VALUE self);
+static VALUE ole_variable_ole_type_detail(ITypeInfo *pTypeInfo, UINT var_index);
+static VALUE folevariable_ole_type_detail(VALUE self);
+static VALUE ole_variable_value(ITypeInfo *pTypeInfo, UINT var_index);
+static VALUE folevariable_value(VALUE self);
+static VALUE ole_variable_visible(ITypeInfo *pTypeInfo, UINT var_index);
+static VALUE folevariable_visible(VALUE self);
+static VALUE ole_variable_kind(ITypeInfo *pTypeInfo, UINT var_index);
+static VALUE folevariable_variable_kind(VALUE self);
+static VALUE ole_variable_varkind(ITypeInfo *pTypeInfo, UINT var_index);
+static VALUE folevariable_varkind(VALUE self);
+static VALUE folevariable_inspect(VALUE self);
+
+static void
+olevariable_free(struct olevariabledata *polevar)
+{
+ OLE_FREE(polevar->pTypeInfo);
+ free(polevar);
+}
+
+/*
+ * Document-class: WIN32OLE_VARIABLE
+ *
+ * <code>WIN32OLE_VARIABLE</code> objects represent OLE variable information.
+ */
+
+VALUE
+create_win32ole_variable(ITypeInfo *pTypeInfo, UINT index, VALUE name)
+{
+ struct olevariabledata *pvar;
+ VALUE obj = Data_Make_Struct(cWIN32OLE_VARIABLE, struct olevariabledata,
+ 0,olevariable_free,pvar);
+ pvar->pTypeInfo = pTypeInfo;
+ OLE_ADDREF(pTypeInfo);
+ pvar->index = index;
+ rb_ivar_set(obj, rb_intern("name"), name);
+ return obj;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIABLE#name
+ *
+ * Returns the name of variable.
+ *
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
+ * variables = tobj.variables
+ * variables.each do |variable|
+ * puts "#{variable.name}"
+ * end
+ *
+ * The result of above script is following:
+ * xlChart
+ * xlDialogSheet
+ * xlExcel4IntlMacroSheet
+ * xlExcel4MacroSheet
+ * xlWorksheet
+ *
+ */
+static VALUE
+folevariable_name(VALUE self)
+{
+ return rb_ivar_get(self, rb_intern("name"));
+}
+
+static VALUE
+ole_variable_ole_type(ITypeInfo *pTypeInfo, UINT var_index)
+{
+ VARDESC *pVarDesc;
+ HRESULT hr;
+ VALUE type;
+ hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
+ if (FAILED(hr))
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetVarDesc");
+ type = ole_typedesc2val(pTypeInfo, &(pVarDesc->elemdescVar.tdesc), Qnil);
+ pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
+ return type;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIABLE#ole_type
+ *
+ * Returns OLE type string.
+ *
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
+ * variables = tobj.variables
+ * variables.each do |variable|
+ * puts "#{variable.ole_type} #{variable.name}"
+ * end
+ *
+ * The result of above script is following:
+ * INT xlChart
+ * INT xlDialogSheet
+ * INT xlExcel4IntlMacroSheet
+ * INT xlExcel4MacroSheet
+ * INT xlWorksheet
+ *
+ */
+static VALUE
+folevariable_ole_type(VALUE self)
+{
+ struct olevariabledata *pvar;
+ Data_Get_Struct(self, struct olevariabledata, pvar);
+ return ole_variable_ole_type(pvar->pTypeInfo, pvar->index);
+}
+
+static VALUE
+ole_variable_ole_type_detail(ITypeInfo *pTypeInfo, UINT var_index)
+{
+ VARDESC *pVarDesc;
+ HRESULT hr;
+ VALUE type = rb_ary_new();
+ hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
+ if (FAILED(hr))
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to GetVarDesc");
+ ole_typedesc2val(pTypeInfo, &(pVarDesc->elemdescVar.tdesc), type);
+ pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
+ return type;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIABLE#ole_type_detail
+ *
+ * Returns detail information of type. The information is array of type.
+ *
+ * tobj = WIN32OLE_TYPE.new('DirectX 7 for Visual Basic Type Library', 'D3DCLIPSTATUS')
+ * variable = tobj.variables.find {|variable| variable.name == 'lFlags'}
+ * tdetail = variable.ole_type_detail
+ * p tdetail # => ["USERDEFINED", "CONST_D3DCLIPSTATUSFLAGS"]
+ *
+ */
+static VALUE
+folevariable_ole_type_detail(VALUE self)
+{
+ struct olevariabledata *pvar;
+ Data_Get_Struct(self, struct olevariabledata, pvar);
+ return ole_variable_ole_type_detail(pvar->pTypeInfo, pvar->index);
+}
+
+static VALUE
+ole_variable_value(ITypeInfo *pTypeInfo, UINT var_index)
+{
+ VARDESC *pVarDesc;
+ HRESULT hr;
+ VALUE val = Qnil;
+ hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
+ if (FAILED(hr))
+ return Qnil;
+ if(pVarDesc->varkind == VAR_CONST)
+ val = ole_variant2val(V_UNION1(pVarDesc, lpvarValue));
+ pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
+ return val;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIABLE#value
+ *
+ * Returns value if value is exists. If the value does not exist,
+ * this method returns nil.
+ *
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
+ * variables = tobj.variables
+ * variables.each do |variable|
+ * puts "#{variable.name} #{variable.value}"
+ * end
+ *
+ * The result of above script is following:
+ * xlChart = -4109
+ * xlDialogSheet = -4116
+ * xlExcel4IntlMacroSheet = 4
+ * xlExcel4MacroSheet = 3
+ * xlWorksheet = -4167
+ *
+ */
+static VALUE
+folevariable_value(VALUE self)
+{
+ struct olevariabledata *pvar;
+ Data_Get_Struct(self, struct olevariabledata, pvar);
+ return ole_variable_value(pvar->pTypeInfo, pvar->index);
+}
+
+static VALUE
+ole_variable_visible(ITypeInfo *pTypeInfo, UINT var_index)
+{
+ VARDESC *pVarDesc;
+ HRESULT hr;
+ VALUE visible = Qfalse;
+ hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
+ if (FAILED(hr))
+ return visible;
+ if (!(pVarDesc->wVarFlags & (VARFLAG_FHIDDEN |
+ VARFLAG_FRESTRICTED |
+ VARFLAG_FNONBROWSABLE))) {
+ visible = Qtrue;
+ }
+ pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
+ return visible;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIABLE#visible?
+ *
+ * Returns true if the variable is public.
+ *
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
+ * variables = tobj.variables
+ * variables.each do |variable|
+ * puts "#{variable.name} #{variable.visible?}"
+ * end
+ *
+ * The result of above script is following:
+ * xlChart true
+ * xlDialogSheet true
+ * xlExcel4IntlMacroSheet true
+ * xlExcel4MacroSheet true
+ * xlWorksheet true
+ *
+ */
+static VALUE
+folevariable_visible(VALUE self)
+{
+ struct olevariabledata *pvar;
+ Data_Get_Struct(self, struct olevariabledata, pvar);
+ return ole_variable_visible(pvar->pTypeInfo, pvar->index);
+}
+
+static VALUE
+ole_variable_kind(ITypeInfo *pTypeInfo, UINT var_index)
+{
+ VARDESC *pVarDesc;
+ HRESULT hr;
+ VALUE kind = rb_str_new2("UNKNOWN");
+ hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
+ if (FAILED(hr))
+ return kind;
+ switch(pVarDesc->varkind) {
+ case VAR_PERINSTANCE:
+ kind = rb_str_new2("PERINSTANCE");
+ break;
+ case VAR_STATIC:
+ kind = rb_str_new2("STATIC");
+ break;
+ case VAR_CONST:
+ kind = rb_str_new2("CONSTANT");
+ break;
+ case VAR_DISPATCH:
+ kind = rb_str_new2("DISPATCH");
+ break;
+ default:
+ break;
+ }
+ pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
+ return kind;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIABLE#variable_kind
+ *
+ * Returns variable kind string.
+ *
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
+ * variables = tobj.variables
+ * variables.each do |variable|
+ * puts "#{variable.name} #{variable.variable_kind}"
+ * end
+ *
+ * The result of above script is following:
+ * xlChart CONSTANT
+ * xlDialogSheet CONSTANT
+ * xlExcel4IntlMacroSheet CONSTANT
+ * xlExcel4MacroSheet CONSTANT
+ * xlWorksheet CONSTANT
+ */
+static VALUE
+folevariable_variable_kind(VALUE self)
+{
+ struct olevariabledata *pvar;
+ Data_Get_Struct(self, struct olevariabledata, pvar);
+ return ole_variable_kind(pvar->pTypeInfo, pvar->index);
+}
+
+static VALUE
+ole_variable_varkind(ITypeInfo *pTypeInfo, UINT var_index)
+{
+ VARDESC *pVarDesc;
+ HRESULT hr;
+ VALUE kind = Qnil;
+ hr = pTypeInfo->lpVtbl->GetVarDesc(pTypeInfo, var_index, &pVarDesc);
+ if (FAILED(hr))
+ return kind;
+ pTypeInfo->lpVtbl->ReleaseVarDesc(pTypeInfo, pVarDesc);
+ kind = INT2FIX(pVarDesc->varkind);
+ return kind;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIABLE#varkind
+ *
+ * Returns the number which represents variable kind.
+ * tobj = WIN32OLE_TYPE.new('Microsoft Excel 9.0 Object Library', 'XlSheetType')
+ * variables = tobj.variables
+ * variables.each do |variable|
+ * puts "#{variable.name} #{variable.varkind}"
+ * end
+ *
+ * The result of above script is following:
+ * xlChart 2
+ * xlDialogSheet 2
+ * xlExcel4IntlMacroSheet 2
+ * xlExcel4MacroSheet 2
+ * xlWorksheet 2
+ */
+static VALUE
+folevariable_varkind(VALUE self)
+{
+ struct olevariabledata *pvar;
+ Data_Get_Struct(self, struct olevariabledata, pvar);
+ return ole_variable_varkind(pvar->pTypeInfo, pvar->index);
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIABLE#inspect -> String
+ *
+ * Returns the OLE variable name and the value with class name.
+ *
+ */
+static VALUE
+folevariable_inspect(VALUE self)
+{
+ VALUE v = rb_inspect(folevariable_value(self));
+ VALUE n = folevariable_name(self);
+ VALUE detail = rb_sprintf("%"PRIsVALUE"=%"PRIsVALUE, n, v);
+ return make_inspect("WIN32OLE_VARIABLE", detail);
+}
+
+void Init_win32ole_variable()
+{
+ cWIN32OLE_VARIABLE = rb_define_class("WIN32OLE_VARIABLE", rb_cObject);
+ rb_define_method(cWIN32OLE_VARIABLE, "name", folevariable_name, 0);
+ rb_define_method(cWIN32OLE_VARIABLE, "ole_type", folevariable_ole_type, 0);
+ rb_define_method(cWIN32OLE_VARIABLE, "ole_type_detail", folevariable_ole_type_detail, 0);
+ rb_define_method(cWIN32OLE_VARIABLE, "value", folevariable_value, 0);
+ rb_define_method(cWIN32OLE_VARIABLE, "visible?", folevariable_visible, 0);
+ rb_define_method(cWIN32OLE_VARIABLE, "variable_kind", folevariable_variable_kind, 0);
+ rb_define_method(cWIN32OLE_VARIABLE, "varkind", folevariable_varkind, 0);
+ rb_define_method(cWIN32OLE_VARIABLE, "inspect", folevariable_inspect, 0);
+ rb_define_alias(cWIN32OLE_VARIABLE, "to_s", "name");
+}
diff --git a/ext/win32ole/win32ole_variable.h b/ext/win32ole/win32ole_variable.h
new file mode 100644
index 0000000000..dbb27acf9b
--- /dev/null
+++ b/ext/win32ole/win32ole_variable.h
@@ -0,0 +1,8 @@
+#ifndef WIN32OLE_VARIABLE_H
+#define WIN32OLE_VARIABLE_H 1
+
+VALUE cWIN32OLE_VARIABLE;
+VALUE create_win32ole_variable(ITypeInfo *pTypeInfo, UINT index, VALUE name);
+void Init_win32ole_variable();
+
+#endif
diff --git a/ext/win32ole/win32ole_variant.c b/ext/win32ole/win32ole_variant.c
new file mode 100644
index 0000000000..b0cc5ee5df
--- /dev/null
+++ b/ext/win32ole/win32ole_variant.c
@@ -0,0 +1,707 @@
+#include "win32ole.h"
+
+static void olevariant_free(struct olevariantdata *pvar);
+static void ole_val2olevariantdata(VALUE val, VARTYPE vt, struct olevariantdata *pvar);
+static void ole_val2variant_err(VALUE val, VARIANT *var);
+static void ole_set_byref(VARIANT *realvar, VARIANT *var, VARTYPE vt);
+static VALUE folevariant_s_allocate(VALUE klass);
+static VALUE folevariant_s_array(VALUE klass, VALUE dims, VALUE vvt);
+static void check_type_val2variant(VALUE val);
+static VALUE folevariant_initialize(VALUE self, VALUE args);
+static LONG *ary2safe_array_index(int ary_size, VALUE *ary, SAFEARRAY *psa);
+static void unlock_safe_array(SAFEARRAY *psa);
+static SAFEARRAY *get_locked_safe_array(VALUE val);
+static VALUE folevariant_ary_aref(int argc, VALUE *argv, VALUE self);
+static VALUE folevariant_ary_aset(int argc, VALUE *argv, VALUE self);
+static VALUE folevariant_value(VALUE self);
+static VALUE folevariant_vartype(VALUE self);
+static VALUE folevariant_set_value(VALUE self, VALUE val);
+
+static void
+olevariant_free(struct olevariantdata *pvar)
+{
+ VariantClear(&(pvar->realvar));
+ VariantClear(&(pvar->var));
+ free(pvar);
+}
+
+static void
+ole_val2olevariantdata(VALUE val, VARTYPE vt, struct olevariantdata *pvar)
+{
+ HRESULT hr = S_OK;
+
+ if (((vt & ~VT_BYREF) == (VT_ARRAY | VT_UI1)) && RB_TYPE_P(val, T_STRING)) {
+ long len = RSTRING_LEN(val);
+ void *pdest = NULL;
+ SAFEARRAY *p = NULL;
+ SAFEARRAY *psa = SafeArrayCreateVector(VT_UI1, 0, len);
+ if (!psa) {
+ rb_raise(rb_eRuntimeError, "fail to SafeArrayCreateVector");
+ }
+ hr = SafeArrayAccessData(psa, &pdest);
+ if (SUCCEEDED(hr)) {
+ memcpy(pdest, RSTRING_PTR(val), len);
+ SafeArrayUnaccessData(psa);
+ V_VT(&(pvar->realvar)) = (vt & ~VT_BYREF);
+ p = V_ARRAY(&(pvar->realvar));
+ if (p != NULL) {
+ SafeArrayDestroy(p);
+ }
+ V_ARRAY(&(pvar->realvar)) = psa;
+ if (vt & VT_BYREF) {
+ V_VT(&(pvar->var)) = vt;
+ V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
+ } else {
+ hr = VariantCopy(&(pvar->var), &(pvar->realvar));
+ }
+ } else {
+ if (psa)
+ SafeArrayDestroy(psa);
+ }
+ } else if (vt & VT_ARRAY) {
+ if (val == Qnil) {
+ V_VT(&(pvar->var)) = vt;
+ if (vt & VT_BYREF) {
+ V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
+ }
+ } else {
+ hr = ole_val_ary2variant_ary(val, &(pvar->realvar), (VARTYPE)(vt & ~VT_BYREF));
+ if (SUCCEEDED(hr)) {
+ if (vt & VT_BYREF) {
+ V_VT(&(pvar->var)) = vt;
+ V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
+ } else {
+ hr = VariantCopy(&(pvar->var), &(pvar->realvar));
+ }
+ }
+ }
+#if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__)
+ } else if ( (vt & ~VT_BYREF) == VT_I8 || (vt & ~VT_BYREF) == VT_UI8) {
+ ole_val2variant_ex(val, &(pvar->realvar), (vt & ~VT_BYREF));
+ ole_val2variant_ex(val, &(pvar->var), (vt & ~VT_BYREF));
+ V_VT(&(pvar->var)) = vt;
+ if (vt & VT_BYREF) {
+ ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
+ }
+#endif
+ } else if ( (vt & ~VT_BYREF) == VT_ERROR) {
+ ole_val2variant_err(val, &(pvar->realvar));
+ if (vt & VT_BYREF) {
+ ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
+ } else {
+ hr = VariantCopy(&(pvar->var), &(pvar->realvar));
+ }
+ } else {
+ if (val == Qnil) {
+ V_VT(&(pvar->var)) = vt;
+ if (vt == (VT_BYREF | VT_VARIANT)) {
+ ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
+ } else {
+ V_VT(&(pvar->realvar)) = vt & ~VT_BYREF;
+ if (vt & VT_BYREF) {
+ ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
+ }
+ }
+ } else {
+ ole_val2variant_ex(val, &(pvar->realvar), (VARTYPE)(vt & ~VT_BYREF));
+ if (vt == (VT_BYREF | VT_VARIANT)) {
+ ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
+ } else if (vt & VT_BYREF) {
+ if ( (vt & ~VT_BYREF) != V_VT(&(pvar->realvar))) {
+ hr = VariantChangeTypeEx(&(pvar->realvar), &(pvar->realvar),
+ cWIN32OLE_lcid, 0, (VARTYPE)(vt & ~VT_BYREF));
+ }
+ if (SUCCEEDED(hr)) {
+ ole_set_byref(&(pvar->realvar), &(pvar->var), vt);
+ }
+ } else {
+ if (vt == V_VT(&(pvar->realvar))) {
+ hr = VariantCopy(&(pvar->var), &(pvar->realvar));
+ } else {
+ hr = VariantChangeTypeEx(&(pvar->var), &(pvar->realvar),
+ cWIN32OLE_lcid, 0, vt);
+ }
+ }
+ }
+ }
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to change type");
+ }
+}
+
+static void
+ole_val2variant_err(VALUE val, VARIANT *var)
+{
+ VALUE v = val;
+ if (rb_obj_is_kind_of(v, cWIN32OLE_VARIANT)) {
+ v = folevariant_value(v);
+ }
+ if (TYPE(v) != T_FIXNUM && TYPE(v) != T_BIGNUM && v != Qnil) {
+ rb_raise(eWIN32OLERuntimeError, "failed to convert VT_ERROR VARIANT:`%"PRIsVALUE"'", rb_inspect(v));
+ }
+ V_VT(var) = VT_ERROR;
+ if (v != Qnil) {
+ V_ERROR(var) = NUM2LONG(val);
+ } else {
+ V_ERROR(var) = 0;
+ }
+}
+
+static void
+ole_set_byref(VARIANT *realvar, VARIANT *var, VARTYPE vt)
+{
+ V_VT(var) = vt;
+ if (vt == (VT_VARIANT|VT_BYREF)) {
+ V_VARIANTREF(var) = realvar;
+ } else {
+ if (V_VT(realvar) != (vt & ~VT_BYREF)) {
+ rb_raise(eWIN32OLERuntimeError, "variant type mismatch");
+ }
+ switch(vt & ~VT_BYREF) {
+ case VT_I1:
+ V_I1REF(var) = &V_I1(realvar);
+ break;
+ case VT_UI1:
+ V_UI1REF(var) = &V_UI1(realvar);
+ break;
+ case VT_I2:
+ V_I2REF(var) = &V_I2(realvar);
+ break;
+ case VT_UI2:
+ V_UI2REF(var) = &V_UI2(realvar);
+ break;
+ case VT_I4:
+ V_I4REF(var) = &V_I4(realvar);
+ break;
+ case VT_UI4:
+ V_UI4REF(var) = &V_UI4(realvar);
+ break;
+ case VT_R4:
+ V_R4REF(var) = &V_R4(realvar);
+ break;
+ case VT_R8:
+ V_R8REF(var) = &V_R8(realvar);
+ break;
+
+#if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__)
+#ifdef V_I8REF
+ case VT_I8:
+ V_I8REF(var) = &V_I8(realvar);
+ break;
+#endif
+#ifdef V_UI8REF
+ case VT_UI8:
+ V_UI8REF(var) = &V_UI8(realvar);
+ break;
+#endif
+#endif
+ case VT_INT:
+ V_INTREF(var) = &V_INT(realvar);
+ break;
+
+ case VT_UINT:
+ V_UINTREF(var) = &V_UINT(realvar);
+ break;
+
+ case VT_CY:
+ V_CYREF(var) = &V_CY(realvar);
+ break;
+ case VT_DATE:
+ V_DATEREF(var) = &V_DATE(realvar);
+ break;
+ case VT_BSTR:
+ V_BSTRREF(var) = &V_BSTR(realvar);
+ break;
+ case VT_DISPATCH:
+ V_DISPATCHREF(var) = &V_DISPATCH(realvar);
+ break;
+ case VT_ERROR:
+ V_ERRORREF(var) = &V_ERROR(realvar);
+ break;
+ case VT_BOOL:
+ V_BOOLREF(var) = &V_BOOL(realvar);
+ break;
+ case VT_UNKNOWN:
+ V_UNKNOWNREF(var) = &V_UNKNOWN(realvar);
+ break;
+ case VT_ARRAY:
+ V_ARRAYREF(var) = &V_ARRAY(realvar);
+ break;
+ default:
+ rb_raise(eWIN32OLERuntimeError, "unknown type specified(setting BYREF):%d", vt);
+ break;
+ }
+ }
+}
+
+static VALUE
+folevariant_s_allocate(VALUE klass)
+{
+ struct olevariantdata *pvar;
+ VALUE obj;
+ ole_initialize();
+ obj = Data_Make_Struct(klass,struct olevariantdata,0,olevariant_free,pvar);
+ VariantInit(&(pvar->var));
+ VariantInit(&(pvar->realvar));
+ return obj;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIANT.array(ary, vt)
+ *
+ * Returns Ruby object wrapping OLE variant whose variant type is VT_ARRAY.
+ * The first argument should be Array object which specifies dimensions
+ * and each size of dimensions of OLE array.
+ * The second argument specifies variant type of the element of OLE array.
+ *
+ * The following create 2 dimensions OLE array. The first dimensions size
+ * is 3, and the second is 4.
+ *
+ * ole_ary = WIN32OLE_VARIANT.array([3,4], VT_I4)
+ * ruby_ary = ole_ary.value # => [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
+ *
+ */
+static VALUE
+folevariant_s_array(VALUE klass, VALUE elems, VALUE vvt)
+{
+ VALUE obj = Qnil;
+ VARTYPE vt;
+ struct olevariantdata *pvar;
+ SAFEARRAYBOUND *psab = NULL;
+ SAFEARRAY *psa = NULL;
+ UINT dim = 0;
+ UINT i = 0;
+
+ ole_initialize();
+
+ vt = NUM2UINT(vvt);
+ vt = (vt | VT_ARRAY);
+ Check_Type(elems, T_ARRAY);
+ obj = folevariant_s_allocate(klass);
+
+ Data_Get_Struct(obj, struct olevariantdata, pvar);
+ dim = RARRAY_LEN(elems);
+
+ psab = ALLOC_N(SAFEARRAYBOUND, dim);
+
+ if(!psab) {
+ rb_raise(rb_eRuntimeError, "memory allocation error");
+ }
+
+ for (i = 0; i < dim; i++) {
+ psab[i].cElements = FIX2INT(rb_ary_entry(elems, i));
+ psab[i].lLbound = 0;
+ }
+
+ psa = SafeArrayCreate((VARTYPE)(vt & VT_TYPEMASK), dim, psab);
+ if (psa == NULL) {
+ if (psab) free(psab);
+ rb_raise(rb_eRuntimeError, "memory allocation error(SafeArrayCreate)");
+ }
+
+ V_VT(&(pvar->var)) = vt;
+ if (vt & VT_BYREF) {
+ V_VT(&(pvar->realvar)) = (vt & ~VT_BYREF);
+ V_ARRAY(&(pvar->realvar)) = psa;
+ V_ARRAYREF(&(pvar->var)) = &(V_ARRAY(&(pvar->realvar)));
+ } else {
+ V_ARRAY(&(pvar->var)) = psa;
+ }
+ if (psab) free(psab);
+ return obj;
+}
+
+static void
+check_type_val2variant(VALUE val)
+{
+ VALUE elem;
+ int len = 0;
+ int i = 0;
+ if(!rb_obj_is_kind_of(val, cWIN32OLE) &&
+ !rb_obj_is_kind_of(val, cWIN32OLE_VARIANT) &&
+ !rb_obj_is_kind_of(val, rb_cTime)) {
+ switch (TYPE(val)) {
+ case T_ARRAY:
+ len = RARRAY_LEN(val);
+ for(i = 0; i < len; i++) {
+ elem = rb_ary_entry(val, i);
+ check_type_val2variant(elem);
+ }
+ break;
+ case T_STRING:
+ case T_FIXNUM:
+ case T_BIGNUM:
+ case T_FLOAT:
+ case T_TRUE:
+ case T_FALSE:
+ case T_NIL:
+ break;
+ default:
+ rb_raise(rb_eTypeError, "can not convert WIN32OLE_VARIANT from type %s",
+ rb_obj_classname(val));
+ }
+ }
+}
+
+/*
+ * Document-class: WIN32OLE_VARIANT
+ *
+ * <code>WIN32OLE_VARIANT</code> objects represents OLE variant.
+ *
+ * Win32OLE converts Ruby object into OLE variant automatically when
+ * invoking OLE methods. If OLE method requires the argument which is
+ * different from the variant by automatic conversion of Win32OLE, you
+ * can convert the specfied variant type by using WIN32OLE_VARIANT class.
+ *
+ * param = WIN32OLE_VARIANT.new(10, WIN32OLE::VARIANT::VT_R4)
+ * oleobj.method(param)
+ *
+ * WIN32OLE_VARIANT does not support VT_RECORD variant. Use WIN32OLE_RECORD
+ * class instead of WIN32OLE_VARIANT if the VT_RECORD variant is needed.
+ */
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIANT.new(val, vartype) #=> WIN32OLE_VARIANT object.
+ *
+ * Returns Ruby object wrapping OLE variant.
+ * The first argument specifies Ruby object to convert OLE variant variable.
+ * The second argument specifies VARIANT type.
+ * In some situation, you need the WIN32OLE_VARIANT object to pass OLE method
+ *
+ * shell = WIN32OLE.new("Shell.Application")
+ * folder = shell.NameSpace("C:\\Windows")
+ * item = folder.ParseName("tmp.txt")
+ * # You can't use Ruby String object to call FolderItem.InvokeVerb.
+ * # Instead, you have to use WIN32OLE_VARIANT object to call the method.
+ * shortcut = WIN32OLE_VARIANT.new("Create Shortcut(\&S)")
+ * item.invokeVerb(shortcut)
+ *
+ */
+static VALUE
+folevariant_initialize(VALUE self, VALUE args)
+{
+ int len = 0;
+ VARIANT var;
+ VALUE val;
+ VALUE vvt;
+ VARTYPE vt;
+ struct olevariantdata *pvar;
+
+ len = RARRAY_LEN(args);
+ if (len < 1 || len > 3) {
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 1..3)", len);
+ }
+ VariantInit(&var);
+ val = rb_ary_entry(args, 0);
+
+ check_type_val2variant(val);
+
+ Data_Get_Struct(self, struct olevariantdata, pvar);
+ if (len == 1) {
+ ole_val2variant(val, &(pvar->var));
+ } else {
+ vvt = rb_ary_entry(args, 1);
+ vt = NUM2INT(vvt);
+ if ((vt & VT_TYPEMASK) == VT_RECORD) {
+ rb_raise(rb_eArgError, "not supported VT_RECORD WIN32OLE_VARIANT object");
+ }
+ ole_val2olevariantdata(val, vt, pvar);
+ }
+ return self;
+}
+
+static SAFEARRAY *
+get_locked_safe_array(VALUE val)
+{
+ struct olevariantdata *pvar;
+ SAFEARRAY *psa = NULL;
+ HRESULT hr;
+ Data_Get_Struct(val, struct olevariantdata, pvar);
+ if (!(V_VT(&(pvar->var)) & VT_ARRAY)) {
+ rb_raise(rb_eTypeError, "variant type is not VT_ARRAY.");
+ }
+ psa = V_ISBYREF(&(pvar->var)) ? *V_ARRAYREF(&(pvar->var)) : V_ARRAY(&(pvar->var));
+ if (psa == NULL) {
+ return psa;
+ }
+ hr = SafeArrayLock(psa);
+ if (FAILED(hr)) {
+ ole_raise(hr, rb_eRuntimeError, "failed to SafeArrayLock");
+ }
+ return psa;
+}
+
+static LONG *
+ary2safe_array_index(int ary_size, VALUE *ary, SAFEARRAY *psa)
+{
+ long dim;
+ LONG *pid;
+ long i;
+ dim = SafeArrayGetDim(psa);
+ if (dim != ary_size) {
+ rb_raise(rb_eArgError, "unmatch number of indices");
+ }
+ pid = ALLOC_N(LONG, dim);
+ if (pid == NULL) {
+ rb_raise(rb_eRuntimeError, "failed to allocate memory for indices");
+ }
+ for (i = 0; i < dim; i++) {
+ pid[i] = NUM2INT(ary[i]);
+ }
+ return pid;
+}
+
+static void
+unlock_safe_array(SAFEARRAY *psa)
+{
+ HRESULT hr;
+ hr = SafeArrayUnlock(psa);
+ if (FAILED(hr)) {
+ ole_raise(hr, rb_eRuntimeError, "failed to SafeArrayUnlock");
+ }
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIANT[i,j,...] #=> element of OLE array.
+ *
+ * Returns the element of WIN32OLE_VARIANT object(OLE array).
+ * This method is available only when the variant type of
+ * WIN32OLE_VARIANT object is VT_ARRAY.
+ *
+ * REMARK:
+ * The all indicies should be 0 or natural number and
+ * lower than or equal to max indicies.
+ * (This point is different with Ruby Array indicies.)
+ *
+ * obj = WIN32OLE_VARIANT.new([[1,2,3],[4,5,6]])
+ * p obj[0,0] # => 1
+ * p obj[1,0] # => 4
+ * p obj[2,0] # => WIN32OLERuntimeError
+ * p obj[0, -1] # => WIN32OLERuntimeError
+ *
+ */
+static VALUE
+folevariant_ary_aref(int argc, VALUE *argv, VALUE self)
+{
+ struct olevariantdata *pvar;
+ SAFEARRAY *psa;
+ VALUE val = Qnil;
+ VARIANT variant;
+ LONG *pid;
+ HRESULT hr;
+
+ Data_Get_Struct(self, struct olevariantdata, pvar);
+ if (!V_ISARRAY(&(pvar->var))) {
+ rb_raise(eWIN32OLERuntimeError,
+ "`[]' is not available for this variant type object");
+ }
+ psa = get_locked_safe_array(self);
+ if (psa == NULL) {
+ return val;
+ }
+
+ pid = ary2safe_array_index(argc, argv, psa);
+
+ VariantInit(&variant);
+ V_VT(&variant) = (V_VT(&(pvar->var)) & ~VT_ARRAY) | VT_BYREF;
+ hr = SafeArrayPtrOfIndex(psa, pid, &V_BYREF(&variant));
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to SafeArrayPtrOfIndex");
+ }
+ val = ole_variant2val(&variant);
+
+ unlock_safe_array(psa);
+ if (pid) free(pid);
+ return val;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIANT[i,j,...] = val #=> set the element of OLE array
+ *
+ * Set the element of WIN32OLE_VARIANT object(OLE array) to val.
+ * This method is available only when the variant type of
+ * WIN32OLE_VARIANT object is VT_ARRAY.
+ *
+ * REMARK:
+ * The all indicies should be 0 or natural number and
+ * lower than or equal to max indicies.
+ * (This point is different with Ruby Array indicies.)
+ *
+ * obj = WIN32OLE_VARIANT.new([[1,2,3],[4,5,6]])
+ * obj[0,0] = 7
+ * obj[1,0] = 8
+ * p obj.value # => [[7,2,3], [8,5,6]]
+ * obj[2,0] = 9 # => WIN32OLERuntimeError
+ * obj[0, -1] = 9 # => WIN32OLERuntimeError
+ *
+ */
+static VALUE
+folevariant_ary_aset(int argc, VALUE *argv, VALUE self)
+{
+ struct olevariantdata *pvar;
+ SAFEARRAY *psa;
+ VARIANT var;
+ VARTYPE vt;
+ LONG *pid;
+ HRESULT hr;
+ VOID *p = NULL;
+
+ Data_Get_Struct(self, struct olevariantdata, pvar);
+ if (!V_ISARRAY(&(pvar->var))) {
+ rb_raise(eWIN32OLERuntimeError,
+ "`[]' is not available for this variant type object");
+ }
+ psa = get_locked_safe_array(self);
+ if (psa == NULL) {
+ rb_raise(rb_eRuntimeError, "failed to get SafeArray pointer");
+ }
+
+ pid = ary2safe_array_index(argc-1, argv, psa);
+
+ VariantInit(&var);
+ vt = (V_VT(&(pvar->var)) & ~VT_ARRAY);
+ p = val2variant_ptr(argv[argc-1], &var, vt);
+ if ((V_VT(&var) == VT_DISPATCH && V_DISPATCH(&var) == NULL) ||
+ (V_VT(&var) == VT_UNKNOWN && V_UNKNOWN(&var) == NULL)) {
+ rb_raise(eWIN32OLERuntimeError, "argument does not have IDispatch or IUnknown Interface");
+ }
+ hr = SafeArrayPutElement(psa, pid, p);
+ if (FAILED(hr)) {
+ ole_raise(hr, eWIN32OLERuntimeError, "failed to SafeArrayPutElement");
+ }
+
+ unlock_safe_array(psa);
+ if (pid) free(pid);
+ return argv[argc-1];
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIANT.value #=> Ruby object.
+ *
+ * Returns Ruby object value from OLE variant.
+ * obj = WIN32OLE_VARIANT.new(1, WIN32OLE::VARIANT::VT_BSTR)
+ * obj.value # => "1" (not Fixnum object, but String object "1")
+ *
+ */
+static VALUE
+folevariant_value(VALUE self)
+{
+ struct olevariantdata *pvar;
+ VALUE val = Qnil;
+ VARTYPE vt;
+ int dim;
+ SAFEARRAY *psa;
+ Data_Get_Struct(self, struct olevariantdata, pvar);
+
+ val = ole_variant2val(&(pvar->var));
+ vt = V_VT(&(pvar->var));
+
+ if ((vt & ~VT_BYREF) == (VT_UI1|VT_ARRAY)) {
+ if (vt & VT_BYREF) {
+ psa = *V_ARRAYREF(&(pvar->var));
+ } else {
+ psa = V_ARRAY(&(pvar->var));
+ }
+ if (!psa) {
+ return val;
+ }
+ dim = SafeArrayGetDim(psa);
+ if (dim == 1) {
+ val = rb_funcall(val, rb_intern("pack"), 1, rb_str_new2("C*"));
+ }
+ }
+ return val;
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIANT.vartype #=> OLE variant type.
+ *
+ * Returns OLE variant type.
+ * obj = WIN32OLE_VARIANT.new("string")
+ * obj.vartype # => WIN32OLE::VARIANT::VT_BSTR
+ *
+ */
+static VALUE
+folevariant_vartype(VALUE self)
+{
+ struct olevariantdata *pvar;
+ Data_Get_Struct(self, struct olevariantdata, pvar);
+ return INT2FIX(V_VT(&pvar->var));
+}
+
+/*
+ * call-seq:
+ * WIN32OLE_VARIANT.value = val #=> set WIN32OLE_VARIANT value to val.
+ *
+ * Sets variant value to val. If the val type does not match variant value
+ * type(vartype), then val is changed to match variant value type(vartype)
+ * before setting val.
+ * Thie method is not available when vartype is VT_ARRAY(except VT_UI1|VT_ARRAY).
+ * If the vartype is VT_UI1|VT_ARRAY, the val should be String object.
+ *
+ * obj = WIN32OLE_VARIANT.new(1) # obj.vartype is WIN32OLE::VARIANT::VT_I4
+ * obj.value = 3.2 # 3.2 is changed to 3 when setting value.
+ * p obj.value # => 3
+ */
+static VALUE
+folevariant_set_value(VALUE self, VALUE val)
+{
+ struct olevariantdata *pvar;
+ VARTYPE vt;
+ Data_Get_Struct(self, struct olevariantdata, pvar);
+ vt = V_VT(&(pvar->var));
+ if (V_ISARRAY(&(pvar->var)) && ((vt & ~VT_BYREF) != (VT_UI1|VT_ARRAY) || !RB_TYPE_P(val, T_STRING))) {
+ rb_raise(eWIN32OLERuntimeError,
+ "`value=' is not available for this variant type object");
+ }
+ ole_val2olevariantdata(val, vt, pvar);
+ return Qnil;
+}
+
+void
+Init_win32ole_variant()
+{
+ cWIN32OLE_VARIANT = rb_define_class("WIN32OLE_VARIANT", rb_cObject);
+ rb_define_alloc_func(cWIN32OLE_VARIANT, folevariant_s_allocate);
+ rb_define_singleton_method(cWIN32OLE_VARIANT, "array", folevariant_s_array, 2);
+ rb_define_method(cWIN32OLE_VARIANT, "initialize", folevariant_initialize, -2);
+ rb_define_method(cWIN32OLE_VARIANT, "value", folevariant_value, 0);
+ rb_define_method(cWIN32OLE_VARIANT, "value=", folevariant_set_value, 1);
+ rb_define_method(cWIN32OLE_VARIANT, "vartype", folevariant_vartype, 0);
+ rb_define_method(cWIN32OLE_VARIANT, "[]", folevariant_ary_aref, -1);
+ rb_define_method(cWIN32OLE_VARIANT, "[]=", folevariant_ary_aset, -1);
+
+ /*
+ * represents VT_EMPTY OLE object.
+ */
+ rb_define_const(cWIN32OLE_VARIANT, "Empty",
+ rb_funcall(cWIN32OLE_VARIANT, rb_intern("new"), 2, Qnil, INT2FIX(VT_EMPTY)));
+
+ /*
+ * represents VT_NULL OLE object.
+ */
+ rb_define_const(cWIN32OLE_VARIANT, "Null",
+ rb_funcall(cWIN32OLE_VARIANT, rb_intern("new"), 2, Qnil, INT2FIX(VT_NULL)));
+
+ /*
+ * represents Nothing of VB.NET or VB.
+ */
+ rb_define_const(cWIN32OLE_VARIANT, "Nothing",
+ rb_funcall(cWIN32OLE_VARIANT, rb_intern("new"), 2, Qnil, INT2FIX(VT_DISPATCH)));
+
+ /*
+ * represents VT_ERROR variant with DISP_E_PARAMNOTFOUND.
+ * This constants is used for not specified parameter.
+ *
+ * fso = WIN32OLE.new("Scripting.FileSystemObject")
+ * fso.openTextFile(filename, WIN32OLE_VARIANT::NoParam, false)
+ */
+ rb_define_const(cWIN32OLE_VARIANT, "NoParam",
+ rb_funcall(cWIN32OLE_VARIANT, rb_intern("new"), 2, INT2NUM(DISP_E_PARAMNOTFOUND), INT2FIX(VT_ERROR)));
+}
diff --git a/ext/win32ole/win32ole_variant.h b/ext/win32ole/win32ole_variant.h
new file mode 100644
index 0000000000..500a273a4f
--- /dev/null
+++ b/ext/win32ole/win32ole_variant.h
@@ -0,0 +1,13 @@
+#ifndef WIN32OLE_VARIANT_H
+#define WIN32OLE_VARIANT_H 1
+
+struct olevariantdata {
+ VARIANT realvar;
+ VARIANT var;
+};
+
+VALUE cWIN32OLE_VARIANT;
+void Init_win32ole_variant();
+
+#endif
+
diff --git a/ext/win32ole/win32ole_variant_m.c b/ext/win32ole/win32ole_variant_m.c
new file mode 100644
index 0000000000..ff05c1d11b
--- /dev/null
+++ b/ext/win32ole/win32ole_variant_m.c
@@ -0,0 +1,148 @@
+#include "win32ole.h"
+
+void Init_win32ole_variant_m() {
+ /*
+ * Document-module: WIN32OLE::VARIANT
+ *
+ * The WIN32OLE::VARIANT module includes constants of VARIANT type constants.
+ * The constants is used when creating WIN32OLE_VARIANT object.
+ *
+ * obj = WIN32OLE_VARIANT.new("2e3", WIN32OLE::VARIANT::VT_R4)
+ * obj.value # => 2000.0
+ *
+ */
+ mWIN32OLE_VARIANT = rb_define_module_under(cWIN32OLE, "VARIANT");
+
+ /*
+ * represents VT_EMPTY type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_EMPTY", INT2FIX(VT_EMPTY));
+
+ /*
+ * represents VT_NULL type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_NULL", INT2FIX(VT_NULL));
+
+ /*
+ * represents VT_I2 type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_I2", INT2FIX(VT_I2));
+
+ /*
+ * represents VT_I4 type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_I4", INT2FIX(VT_I4));
+
+ /*
+ * represents VT_R4 type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_R4", INT2FIX(VT_R4));
+
+ /*
+ * represents VT_R8 type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_R8", INT2FIX(VT_R8));
+
+ /*
+ * represents VT_CY type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_CY", INT2FIX(VT_CY));
+
+ /*
+ * represents VT_DATE type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_DATE", INT2FIX(VT_DATE));
+
+ /*
+ * represents VT_BSTR type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_BSTR", INT2FIX(VT_BSTR));
+
+ /*
+ * represents VT_USERDEFINED type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_USERDEFINED", INT2FIX(VT_USERDEFINED));
+
+ /*
+ * represents VT_PTR type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_PTR", INT2FIX(VT_PTR));
+
+ /*
+ * represents VT_DISPATCH type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_DISPATCH", INT2FIX(VT_DISPATCH));
+
+ /*
+ * represents VT_ERROR type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_ERROR", INT2FIX(VT_ERROR));
+
+ /*
+ * represents VT_BOOL type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_BOOL", INT2FIX(VT_BOOL));
+
+ /*
+ * represents VT_VARIANT type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_VARIANT", INT2FIX(VT_VARIANT));
+
+ /*
+ * represents VT_UNKNOWN type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_UNKNOWN", INT2FIX(VT_UNKNOWN));
+
+ /*
+ * represents VT_I1 type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_I1", INT2FIX(VT_I1));
+
+ /*
+ * represents VT_UI1 type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_UI1", INT2FIX(VT_UI1));
+
+ /*
+ * represents VT_UI2 type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_UI2", INT2FIX(VT_UI2));
+
+ /*
+ * represents VT_UI4 type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_UI4", INT2FIX(VT_UI4));
+
+#if (_MSC_VER >= 1300) || defined(__CYGWIN__) || defined(__MINGW32__)
+ /*
+ * represents VT_I8 type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_I8", INT2FIX(VT_I8));
+
+ /*
+ * represents VT_UI8 type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_UI8", INT2FIX(VT_UI8));
+#endif
+
+ /*
+ * represents VT_INT type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_INT", INT2FIX(VT_INT));
+
+ /*
+ * represents VT_UINT type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_UINT", INT2FIX(VT_UINT));
+
+ /*
+ * represents VT_ARRAY type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_ARRAY", INT2FIX(VT_ARRAY));
+
+ /*
+ * represents VT_BYREF type constant.
+ */
+ rb_define_const(mWIN32OLE_VARIANT, "VT_BYREF", INT2FIX(VT_BYREF));
+
+}
diff --git a/ext/win32ole/win32ole_variant_m.h b/ext/win32ole/win32ole_variant_m.h
new file mode 100644
index 0000000000..56dabc1276
--- /dev/null
+++ b/ext/win32ole/win32ole_variant_m.h
@@ -0,0 +1,7 @@
+#ifndef WIN32OLE_VARIANT_M_H
+#define WIN32OLE_VARIANT_M_H 1
+
+VALUE mWIN32OLE_VARIANT;
+void Init_win32ole_variant_m();
+
+#endif
diff --git a/ext/zlib/zlib.c b/ext/zlib/zlib.c
index 9dbc193f54..af45b6f884 100644
--- a/ext/zlib/zlib.c
+++ b/ext/zlib/zlib.c
@@ -27,9 +27,6 @@
#define RUBY_ZLIB_VERSION "0.6.0"
-
-#define OBJ_IS_FREED(val) (RBASIC(val)->flags == 0)
-
#ifndef GZIP_SUPPORT
#define GZIP_SUPPORT 1
#endif
@@ -429,7 +426,14 @@ do_checksum(argc, argv, func)
* +adler+. If +string+ is omitted, it returns the Adler-32 initial value. If
* +adler+ is omitted, it assumes that the initial value is given to +adler+.
*
- * FIXME: expression.
+ * Example usage:
+ *
+ * require "zlib"
+ *
+ * data = "foo"
+ * puts "Adler32 checksum: #{Zlib.adler32(data).to_s(16)}"
+ * #=> Adler32 checksum: 2820145
+ *
*/
static VALUE
rb_zlib_adler32(int argc, VALUE *argv, VALUE klass)
@@ -461,7 +465,7 @@ rb_zlib_adler32_combine(VALUE klass, VALUE adler1, VALUE adler2, VALUE len2)
/*
* Document-method: Zlib.crc32
*
- * call-seq: Zlib.crc32(string, crc)
+ * call-seq: Zlib.crc32(string, adler)
*
* Calculates CRC checksum for +string+, and returns updated value of +crc+. If
* +string+ is omitted, it returns the CRC initial value. If +crc+ is omitted, it
@@ -580,7 +584,7 @@ struct zstream_run_args {
static voidpf
zlib_mem_alloc(voidpf opaque, uInt items, uInt size)
{
- voidpf p = xmalloc(items * size);
+ voidpf p = xmalloc2(items, size);
/* zlib FAQ: Valgrind (or some similar memory access checker) says that
deflate is performing a conditional jump that depends on an
uninitialized value. Isn't that a bug?
@@ -807,8 +811,7 @@ zstream_shift_buffer(struct zstream *z, long len)
return zstream_detach_buffer(z);
}
- dst = rb_str_subseq(z->buf, 0, len);
- rb_obj_reveal(dst, rb_cString);
+ dst = rb_str_new(RSTRING_PTR(z->buf), len);
z->buf_filled -= len;
memmove(RSTRING_PTR(z->buf), RSTRING_PTR(z->buf) + len,
z->buf_filled);
@@ -1460,13 +1463,15 @@ rb_deflate_s_allocate(VALUE klass)
* the default value of that argument is used.
*
* The +level+ sets the compression level for the deflate stream between 0 (no
- * compression) and 9 (best compression. The following constants have been
+ * compression) and 9 (best compression). The following constants have been
* defined to make code more readable:
*
- * * Zlib::NO_COMPRESSION = 0
- * * Zlib::BEST_SPEED = 1
- * * Zlib::DEFAULT_COMPRESSION = 6
- * * Zlib::BEST_COMPRESSION = 9
+ * * Zlib::DEFAULT_COMPRESSION
+ * * Zlib::NO_COMPRESSION
+ * * Zlib::BEST_SPEED
+ * * Zlib::BEST_COMPRESSION
+ *
+ * See http://www.zlib.net/manual.html#Constants for further information.
*
* The +window_bits+ sets the size of the history buffer and should be between
* 8 and 15. Larger values of this parameter result in better compression at
@@ -1588,7 +1593,7 @@ deflate_run(VALUE args)
*
* Compresses the given +string+. Valid values of level are
* Zlib::NO_COMPRESSION, Zlib::BEST_SPEED, Zlib::BEST_COMPRESSION,
- * Zlib::DEFAULT_COMPRESSION, or an integer from 0 to 9 (the default is 6).
+ * Zlib::DEFAULT_COMPRESSION, or an integer from 0 to 9.
*
* This method is almost equivalent to the following code:
*
diff --git a/file.c b/file.c
index e9e2dd1340..34b2693430 100644
--- a/file.c
+++ b/file.c
@@ -401,7 +401,7 @@ static struct timespec stat_mtimespec(struct stat *st);
* Compares File::Stat objects by comparing their respective modification
* times.
*
- * +nil+ is returned if the two values are incomparable.
+ * +nil+ is returned if +other_stat+ is not a File::Stat object
*
* f1 = File.new("f1", "w")
* sleep 1
@@ -782,6 +782,20 @@ stat_ctime(struct stat *st)
return rb_time_nano_new(ts.tv_sec, ts.tv_nsec);
}
+#define HAVE_STAT_BIRTHTIME
+#if defined(HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC)
+static VALUE
+stat_birthtime(struct stat *st)
+{
+ struct timespec *ts = &st->st_birthtimespec;
+ return rb_time_nano_new(ts->tv_sec, ts->tv_nsec);
+}
+#elif defined(_WIN32)
+# define stat_birthtime stat_ctime
+#else
+# undef HAVE_STAT_BIRTHTIME
+#endif
+
/*
* call-seq:
* stat.atime -> time
@@ -835,6 +849,37 @@ rb_stat_ctime(VALUE self)
return stat_ctime(get_stat(self));
}
+#if defined(HAVE_STAT_BIRTHTIME)
+/*
+ * call-seq:
+ * stat.birthtime -> aTime
+ *
+ * Returns the birth time for <i>stat</i>.
+ * If the platform doesn't have birthtime, returns <i>ctime</i>.
+ *
+ * File.write("testfile", "foo")
+ * sleep 10
+ * File.write("testfile", "bar")
+ * sleep 10
+ * File.chmod(0644, "testfile")
+ * sleep 10
+ * File.read("testfile")
+ * File.stat("testfile").birthtime #=> 2014-02-24 11:19:17 +0900
+ * File.stat("testfile").mtime #=> 2014-02-24 11:19:27 +0900
+ * File.stat("testfile").ctime #=> 2014-02-24 11:19:37 +0900
+ * File.stat("testfile").atime #=> 2014-02-24 11:19:47 +0900
+ *
+ */
+
+static VALUE
+rb_stat_birthtime(VALUE self)
+{
+ return stat_birthtime(get_stat(self));
+}
+#else
+# define rb_stat_birthtime rb_f_notimplement
+#endif
+
/*
* call-seq:
* stat.inspect -> string
@@ -846,7 +891,8 @@ rb_stat_ctime(VALUE self)
* # nlink=1, uid=0, gid=0, rdev=0x0, size=1374, blksize=4096,
* # blocks=8, atime=Wed Dec 10 10:16:12 CST 2003,
* # mtime=Fri Sep 12 15:41:41 CDT 2003,
- * # ctime=Mon Oct 27 11:20:27 CST 2003>"
+ * # ctime=Mon Oct 27 11:20:27 CST 2003,
+ * # birthtime=Mon Aug 04 08:13:49 CDT 2003>"
*/
static VALUE
@@ -871,6 +917,9 @@ rb_stat_inspect(VALUE self)
{"atime", rb_stat_atime},
{"mtime", rb_stat_mtime},
{"ctime", rb_stat_ctime},
+#if defined(HAVE_STRUCT_STAT_ST_BIRTHTIMESPEC)
+ {"birthtime", rb_stat_birthtime},
+#endif
};
struct stat* st;
@@ -1380,7 +1429,6 @@ rb_file_chardev_p(VALUE obj, VALUE fname)
/*
* call-seq:
* File.exist?(file_name) -> true or false
- * File.exists?(file_name) -> true or false
*
* Return <code>true</code> if the named file exists.
*
@@ -1398,6 +1446,12 @@ rb_file_exist_p(VALUE obj, VALUE fname)
return Qtrue;
}
+/*
+ * call-seq:
+ * File.exists?(file_name) -> true or false
+ *
+ * Deprecated method. Don't use.
+ */
static VALUE
rb_file_exists_p(VALUE obj, VALUE fname)
{
@@ -1596,12 +1650,14 @@ rb_file_executable_real_p(VALUE obj, VALUE fname)
/*
* call-seq:
- * File.file?(file_name) -> true or false
+ * File.file?(file) -> true or false
*
- * Returns <code>true</code> if the named file exists and is a
- * regular file.
+ * Returns +true+ if the named +file+ exists and is a regular file.
*
- * _file_name_ can be an IO object.
+ * +file+ can be an IO object.
+ *
+ * If the +file+ argument is a symbolic link, it will resolve the symbolic link
+ * and use the file referenced by the link.
*/
static VALUE
@@ -2082,6 +2138,65 @@ rb_file_ctime(VALUE obj)
return stat_ctime(&st);
}
+#if defined(HAVE_STAT_BIRTHTIME)
+/*
+ * call-seq:
+ * File.birthtime(file_name) -> time
+ *
+ * Returns the birth time for the named file.
+ *
+ * _file_name_ can be an IO object.
+ *
+ * Note that on Windows (NTFS), returns creation time (birth time).
+ *
+ * File.birthtime("testfile") #=> Wed Apr 09 08:53:13 CDT 2003
+ *
+ */
+
+static VALUE
+rb_file_s_birthtime(VALUE klass, VALUE fname)
+{
+ struct stat st;
+
+ if (rb_stat(fname, &st) < 0) {
+ FilePathValue(fname);
+ rb_sys_fail_path(fname);
+ }
+ return stat_birthtime(&st);
+}
+#else
+# define rb_file_s_birthtime rb_f_notimplement
+#endif
+
+#if defined(HAVE_STAT_BIRTHTIME)
+/*
+ * call-seq:
+ * file.birthtime -> time
+ *
+ * Returns the birth time for <i>file</i>.
+ *
+ * Note that on Windows (NTFS), returns creation time (birth time).
+ *
+ * File.new("testfile").birthtime #=> Wed Apr 09 08:53:14 CDT 2003
+ *
+ */
+
+static VALUE
+rb_file_birthtime(VALUE obj)
+{
+ rb_io_t *fptr;
+ struct stat st;
+
+ GetOpenFile(obj, fptr);
+ if (fstat(fptr->fd, &st) == -1) {
+ rb_sys_fail_path(fptr->pathv);
+ }
+ return stat_birthtime(&st);
+}
+#else
+# define rb_file_birthtime rb_f_notimplement
+#endif
+
/*
* call-seq:
* file.size -> integer
@@ -2219,6 +2334,24 @@ rb_file_s_lchmod(int argc, VALUE *argv)
#define rb_file_s_lchmod rb_f_notimplement
#endif
+static inline rb_uid_t
+to_uid(VALUE u)
+{
+ if (NIL_P(u)) {
+ return (rb_uid_t)-1;
+ }
+ return NUM2UIDT(u);
+}
+
+static inline rb_gid_t
+to_gid(VALUE g)
+{
+ if (NIL_P(g)) {
+ return (rb_gid_t)-1;
+ }
+ return NUM2GIDT(g);
+}
+
struct chown_args {
rb_uid_t owner;
rb_gid_t group;
@@ -2256,18 +2389,8 @@ rb_file_s_chown(int argc, VALUE *argv)
rb_secure(2);
rb_scan_args(argc, argv, "2*", &o, &g, &rest);
- if (NIL_P(o)) {
- arg.owner = -1;
- }
- else {
- arg.owner = NUM2UIDT(o);
- }
- if (NIL_P(g)) {
- arg.group = -1;
- }
- else {
- arg.group = NUM2GIDT(g);
- }
+ arg.owner = to_uid(o);
+ arg.group = to_gid(g);
n = apply2files(chown_internal, rest, &arg);
return LONG2FIX(n);
@@ -2292,14 +2415,15 @@ static VALUE
rb_file_chown(VALUE obj, VALUE owner, VALUE group)
{
rb_io_t *fptr;
- int o, g;
+ rb_uid_t o;
+ rb_gid_t g;
#ifndef HAVE_FCHOWN
VALUE path;
#endif
rb_secure(2);
- o = NIL_P(owner) ? -1 : NUM2INT(owner);
- g = NIL_P(group) ? -1 : NUM2INT(group);
+ o = to_uid(owner);
+ g = to_gid(group);
GetOpenFile(obj, fptr);
#ifndef HAVE_FCHOWN
if (NIL_P(fptr->pathv)) return Qnil;
@@ -2343,18 +2467,8 @@ rb_file_s_lchown(int argc, VALUE *argv)
rb_secure(2);
rb_scan_args(argc, argv, "2*", &o, &g, &rest);
- if (NIL_P(o)) {
- arg.owner = -1;
- }
- else {
- arg.owner = NUM2UIDT(o);
- }
- if (NIL_P(g)) {
- arg.group = -1;
- }
- else {
- arg.group = NUM2GIDT(g);
- }
+ arg.owner = to_uid(o);
+ arg.group = to_gid(g);
n = apply2files(lchown_internal, rest, &arg);
return LONG2FIX(n);
@@ -2510,6 +2624,9 @@ sys_fail2(VALUE s1, VALUE s2)
const int max_pathlen = MAXPATHLEN;
#endif
+ if (errno == EEXIST) {
+ rb_sys_fail_path(rb_str_ellipsize(s2, max_pathlen));
+ }
str = rb_str_new_cstr("(");
rb_str_append(str, rb_str_ellipsize(s1, max_pathlen));
rb_str_cat2(str, ", ");
@@ -3459,7 +3576,7 @@ rb_file_expand_path_fast(VALUE fname, VALUE dname)
*/
VALUE
-rb_file_s_expand_path(int argc, VALUE *argv)
+rb_file_s_expand_path(int argc, const VALUE *argv)
{
VALUE fname, dname;
@@ -3492,7 +3609,7 @@ rb_file_absolute_path(VALUE fname, VALUE dname)
*/
VALUE
-rb_file_s_absolute_path(int argc, VALUE *argv)
+rb_file_s_absolute_path(int argc, const VALUE *argv)
{
VALUE fname, dname;
@@ -3840,10 +3957,12 @@ ruby_enc_find_basename(const char *name, long *baselen, long *alllen, rb_encodin
* <code>File::ALT_SEPARATOR</code> as the separator when
* <code>File::ALT_SEPARATOR</code> is not <code>nil</code>. If
* <i>suffix</i> is given and present at the end of <i>file_name</i>,
- * it is removed.
+ * it is removed. If <i>suffix</i> is ".*", any extension will be
+ * removed.
*
* File.basename("/home/gumby/work/ruby.rb") #=> "ruby.rb"
* File.basename("/home/gumby/work/ruby.rb", ".rb") #=> "ruby"
+ * File.basename("/home/gumby/work/ruby.rb", ".*") #=> "ruby"
*/
static VALUE
@@ -4179,7 +4298,7 @@ rb_file_join(VALUE ary, VALUE sep)
/*
* call-seq:
- * File.join(string, ...) -> path
+ * File.join(string, ...) -> string
*
* Returns a new string formed by joining the strings using
* <code>File::SEPARATOR</code>.
@@ -4441,7 +4560,7 @@ test_check(int n, int argc, VALUE *argv)
* call-seq:
* test(cmd, file1 [, file2] ) -> obj
*
- * Uses the integer +cmd+ to perform various tests on +file1+ (first
+ * Uses the character +cmd+ to perform various tests on +file1+ (first
* table below) or on +file1+ and +file2+ (second table).
*
* File tests on a single file:
@@ -4524,7 +4643,6 @@ rb_f_test(int argc, VALUE *argv)
case 'd':
return rb_file_directory_p(0, argv[1]);
- case 'a':
case 'e':
return rb_file_exist_p(0, argv[1]);
@@ -5654,6 +5772,7 @@ Init_File(void)
rb_define_singleton_method(rb_cFile, "atime", rb_file_s_atime, 1);
rb_define_singleton_method(rb_cFile, "mtime", rb_file_s_mtime, 1);
rb_define_singleton_method(rb_cFile, "ctime", rb_file_s_ctime, 1);
+ rb_define_singleton_method(rb_cFile, "birthtime", rb_file_s_birthtime, 1);
rb_define_singleton_method(rb_cFile, "utime", rb_file_s_utime, -1);
rb_define_singleton_method(rb_cFile, "chmod", rb_file_s_chmod, -1);
@@ -5701,6 +5820,7 @@ Init_File(void)
rb_define_method(rb_cFile, "atime", rb_file_atime, 0);
rb_define_method(rb_cFile, "mtime", rb_file_mtime, 0);
rb_define_method(rb_cFile, "ctime", rb_file_ctime, 0);
+ rb_define_method(rb_cFile, "birthtime", rb_file_birthtime, 0);
rb_define_method(rb_cFile, "size", rb_file_size, 0);
rb_define_method(rb_cFile, "chmod", rb_file_chmod, 1);
@@ -5822,6 +5942,7 @@ Init_File(void)
rb_define_method(rb_cStat, "atime", rb_stat_atime, 0);
rb_define_method(rb_cStat, "mtime", rb_stat_mtime, 0);
rb_define_method(rb_cStat, "ctime", rb_stat_ctime, 0);
+ rb_define_method(rb_cStat, "birthtime", rb_stat_birthtime, 0);
rb_define_method(rb_cStat, "inspect", rb_stat_inspect, 0);
diff --git a/gc.c b/gc.c
index f9048e031a..5ee5beea26 100644
--- a/gc.c
+++ b/gc.c
@@ -88,10 +88,14 @@
#define rb_setjmp(env) RUBY_SETJMP(env)
#define rb_jmp_buf rb_jmpbuf_t
-#if defined(HAVE_RB_GC_GUARDED_PTR) && HAVE_RB_GC_GUARDED_PTR
+#if defined(HAVE_RB_GC_GUARDED_PTR_VAL) && HAVE_RB_GC_GUARDED_PTR_VAL
+/* trick the compiler into thinking a external signal handler uses this */
+volatile VALUE rb_gc_guarded_val;
volatile VALUE *
-rb_gc_guarded_ptr(volatile VALUE *ptr)
+rb_gc_guarded_ptr_val(volatile VALUE *ptr, VALUE val)
{
+ rb_gc_guarded_val = val;
+
return ptr;
}
#endif
@@ -112,6 +116,13 @@ rb_gc_guarded_ptr(volatile VALUE *ptr)
#define GC_HEAP_OLDOBJECT_LIMIT_FACTOR 2.0
#endif
+#ifndef GC_HEAP_FREE_SLOTS_MIN_RATIO
+#define GC_HEAP_FREE_SLOTS_MIN_RATIO 0.3
+#endif
+#ifndef GC_HEAP_FREE_SLOTS_MAX_RATIO
+#define GC_HEAP_FREE_SLOTS_MAX_RATIO 0.8
+#endif
+
#ifndef GC_MALLOC_LIMIT_MIN
#define GC_MALLOC_LIMIT_MIN (16 * 1024 * 1024 /* 16MB */)
#endif
@@ -132,21 +143,32 @@ rb_gc_guarded_ptr(volatile VALUE *ptr)
#define GC_OLDMALLOC_LIMIT_MAX (128 * 1024 * 1024 /* 128MB */)
#endif
+#ifndef PRINT_MEASURE_LINE
+#define PRINT_MEASURE_LINE 0
+#endif
+#ifndef PRINT_ENTER_EXIT_TICK
+#define PRINT_ENTER_EXIT_TICK 0
+#endif
+#ifndef PRINT_ROOT_TICKS
+#define PRINT_ROOT_TICKS 0
+#endif
+
+#define USE_TICK_T (PRINT_ENTER_EXIT_TICK || PRINT_MEASURE_LINE)
+#define TICK_TYPE 1
+
typedef struct {
- unsigned int heap_init_slots;
- unsigned int heap_free_slots;
+ size_t heap_init_slots;
+ size_t heap_free_slots;
double growth_factor;
- unsigned int growth_max_slots;
+ size_t growth_max_slots;
double oldobject_limit_factor;
- unsigned int malloc_limit_min;
- unsigned int malloc_limit_max;
+ size_t malloc_limit_min;
+ size_t malloc_limit_max;
double malloc_limit_growth_factor;
- unsigned int oldmalloc_limit_min;
- unsigned int oldmalloc_limit_max;
+ size_t oldmalloc_limit_min;
+ size_t oldmalloc_limit_max;
double oldmalloc_limit_growth_factor;
-#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
VALUE gc_stress;
-#endif
} ruby_gc_params_t;
static ruby_gc_params_t gc_params = {
@@ -188,9 +210,10 @@ static ruby_gc_params_t gc_params = {
/* RGENGC_CHECK_MODE
* 0: disable all assertions
* 1: enable assertions (to debug RGenGC)
- * 2: enable generational bits check (for debugging)
- * 3: enable livness check
- * 4: show all references
+ * 2: enable internal consistency check at each GC (for debugging)
+ * 3: enable internal consistency check at each GC steps (for debugging)
+ * 4: enable livness check
+ * 5: show all references
*/
#ifndef RGENGC_CHECK_MODE
#define RGENGC_CHECK_MODE 0
@@ -205,18 +228,9 @@ static ruby_gc_params_t gc_params = {
#define RGENGC_PROFILE 0
#endif
-/* RGENGC_THREEGEN
- * Enable/disable three gen GC.
- * 0: Infant gen -> Old gen
- * 1: Infant gen -> Young -> Old gen
- */
-#ifndef RGENGC_THREEGEN
-#define RGENGC_THREEGEN 0
-#endif
-
/* RGENGC_ESTIMATE_OLDMALLOC
* Enable/disable to estimate increase size of malloc'ed size by old objects.
- * If estimation exceeds threashold, then will invoke full GC.
+ * If estimation exceeds threshold, then will invoke full GC.
* 0: disable estimation.
* 1: enable estimation.
*/
@@ -224,13 +238,26 @@ static ruby_gc_params_t gc_params = {
#define RGENGC_ESTIMATE_OLDMALLOC 1
#endif
+/* RGENGC_FORCE_MAJOR_GC
+ * Force major/full GC if this macro is not 0.
+ */
+#ifndef RGENGC_FORCE_MAJOR_GC
+#define RGENGC_FORCE_MAJOR_GC 0
+#endif
+
#else /* USE_RGENGC */
+#ifdef RGENGC_DEBUG
+#undef RGENGC_DEBUG
+#endif
#define RGENGC_DEBUG 0
+#ifdef RGENGC_CHECK_MODE
+#undef RGENGC_CHECK_MODE
+#endif
#define RGENGC_CHECK_MODE 0
#define RGENGC_PROFILE 0
-#define RGENGC_THREEGEN 0
#define RGENGC_ESTIMATE_OLDMALLOC 0
+#define RGENGC_FORCE_MAJOR_GC 0
#endif /* USE_RGENGC */
@@ -240,6 +267,9 @@ static ruby_gc_params_t gc_params = {
#ifndef GC_PROFILE_DETAIL_MEMORY
#define GC_PROFILE_DETAIL_MEMORY 0
#endif
+#ifndef GC_ENABLE_INCREMENTAL_MARK
+#define GC_ENABLE_INCREMENTAL_MARK USE_RINCGC
+#endif
#ifndef GC_ENABLE_LAZY_SWEEP
#define GC_ENABLE_LAZY_SWEEP 1
#endif
@@ -263,8 +293,7 @@ typedef enum {
GPR_FLAG_MAJOR_BY_NOFREE = 0x001,
GPR_FLAG_MAJOR_BY_OLDGEN = 0x002,
GPR_FLAG_MAJOR_BY_SHADY = 0x004,
- GPR_FLAG_MAJOR_BY_RESCAN = 0x008,
- GPR_FLAG_MAJOR_BY_STRESS = 0x010,
+ GPR_FLAG_MAJOR_BY_FORCE = 0x008,
#if RGENGC_ESTIMATE_OLDMALLOC
GPR_FLAG_MAJOR_BY_OLDMALLOC = 0x020,
#endif
@@ -350,6 +379,7 @@ typedef struct RVALUE {
struct RMatch match;
struct RRational rational;
struct RComplex complex;
+ struct RSymbol symbol;
struct {
struct RBasic basic;
VALUE v1;
@@ -359,7 +389,7 @@ typedef struct RVALUE {
} as;
#if GC_DEBUG
const char *file;
- VALUE line;
+ int line;
#endif
} RVALUE;
@@ -398,22 +428,31 @@ typedef struct stack_chunk {
typedef struct mark_stack {
stack_chunk_t *chunk;
stack_chunk_t *cache;
- size_t index;
- size_t limit;
+ int index;
+ int limit;
size_t cache_size;
size_t unused_cache_size;
} mark_stack_t;
typedef struct rb_heap_struct {
- struct heap_page *pages;
+ RVALUE *freelist;
+
struct heap_page *free_pages;
struct heap_page *using_page;
+ struct heap_page *pages;
struct heap_page *sweep_pages;
- RVALUE *freelist;
+ struct heap_page *pooled_pages;
+
size_t page_length; /* total page count in a heap */
size_t total_slots; /* total slot count (page_length * HEAP_OBJ_LIMIT) */
} rb_heap_t;
+enum gc_stat {
+ gc_stat_none,
+ gc_stat_marking,
+ gc_stat_sweeping
+};
+
typedef struct rb_objspace {
struct {
size_t limit;
@@ -424,37 +463,60 @@ typedef struct rb_objspace {
#endif
} malloc_params;
+ struct {
+ enum gc_stat stat : 2;
+ unsigned int immediate_sweep : 1;
+ unsigned int dont_gc : 1;
+ unsigned int dont_incremental : 1;
+ unsigned int during_gc : 1;
+ unsigned int gc_stressful: 1;
+#if USE_RGENGC
+ unsigned int during_minor_gc : 1;
+#endif
+#if GC_ENABLE_INCREMENTAL_MARK
+ unsigned int during_incremental_marking : 1;
+#endif
+ } flags;
+
+ rb_event_flag_t hook_events;
+ size_t total_allocated_objects;
+
rb_heap_t eden_heap;
rb_heap_t tomb_heap; /* heap for zombies and ghosts */
struct {
+ rb_atomic_t finalizing;
+ } atomic_flags;
+
+ struct mark_func_data_struct {
+ void *data;
+ void (*mark_func)(VALUE v, void *data);
+ } *mark_func_data;
+
+ mark_stack_t mark_stack;
+ size_t marked_slots;
+
+ struct {
struct heap_page **sorted;
- size_t used;
- size_t length;
+ size_t allocated_pages;
+ size_t allocatable_pages;
+ size_t sorted_length;
RVALUE *range[2];
- size_t limit;
- size_t increment;
-
size_t swept_slots;
size_t min_free_slots;
size_t max_free_slots;
/* final */
size_t final_slots;
- RVALUE *deferred_final;
+ VALUE deferred_final;
} heap_pages;
- struct {
- int dont_gc;
- int dont_lazy_sweep;
- int during_gc;
- rb_atomic_t finalizing;
- } flags;
st_table *finalizer_table;
- mark_stack_t mark_stack;
+
struct {
int run;
+ int latest_gc_info;
gc_profile_record *records;
gc_profile_record *current_record;
size_t next_index;
@@ -469,24 +531,18 @@ typedef struct rb_objspace {
size_t minor_gc_count;
size_t major_gc_count;
#if RGENGC_PROFILE > 0
- size_t generated_normal_object_count;
- size_t generated_shady_object_count;
- size_t shade_operation_count;
- size_t promote_infant_count;
-#if RGENGC_THREEGEN
- size_t promote_young_count;
-#endif
- size_t remembered_normal_object_count;
- size_t remembered_shady_object_count;
+ size_t total_generated_normal_object_count;
+ size_t total_generated_shady_object_count;
+ size_t total_shade_operation_count;
+ size_t total_promoted_count;
+ size_t total_remembered_normal_object_count;
+ size_t total_remembered_shady_object_count;
#if RGENGC_PROFILE >= 2
size_t generated_normal_object_count_types[RUBY_T_MASK];
size_t generated_shady_object_count_types[RUBY_T_MASK];
size_t shade_operation_count_types[RUBY_T_MASK];
- size_t promote_infant_types[RUBY_T_MASK];
-#if RGENGC_THREEGEN
- size_t promote_young_types[RUBY_T_MASK];
-#endif
+ size_t promoted_types[RUBY_T_MASK];
size_t remembered_normal_object_count_types[RUBY_T_MASK];
size_t remembered_shady_object_count_types[RUBY_T_MASK];
#endif
@@ -495,40 +551,29 @@ typedef struct rb_objspace {
/* temporary profiling space */
double gc_sweep_start_time;
- size_t total_allocated_object_num_at_gc_start;
+ size_t total_allocated_objects_at_gc_start;
size_t heap_used_at_gc_start;
/* basic statistics */
size_t count;
- size_t total_allocated_object_num;
- size_t total_freed_object_num;
- int latest_gc_info;
+ size_t total_freed_objects;
+ size_t total_allocated_pages;
+ size_t total_freed_pages;
} profile;
struct gc_list *global_list;
- rb_event_flag_t hook_events; /* this place may be affinity with memory cache */
- VALUE gc_stress;
- struct mark_func_data_struct {
- void *data;
- void (*mark_func)(VALUE v, void *data);
- } *mark_func_data;
+ VALUE gc_stress_mode;
#if USE_RGENGC
struct {
- int during_minor_gc;
- int parent_object_is_old;
-
+ VALUE parent_object;
int need_major_gc;
-
size_t last_major_gc;
-
- size_t remembered_shady_object_count;
- size_t remembered_shady_object_limit;
- size_t old_object_count;
- size_t old_object_limit;
-#if RGENGC_THREEGEN
- size_t young_object_count;
-#endif
+ size_t remembered_wb_unprotected_objects;
+ size_t remembered_wb_unprotected_objects_limit;
+ size_t old_objects;
+ size_t old_objects_limit;
+ size_t old_objects_at_gc_start;
#if RGENGC_ESTIMATE_OLDMALLOC
size_t oldmalloc_increase;
@@ -562,58 +607,76 @@ enum {
struct heap_page {
struct heap_page_body *body;
- RVALUE *freelist;
- RVALUE *start;
- size_t final_slots;
- size_t limit;
- struct heap_page *next;
struct heap_page *prev;
- struct heap_page *free_next;
rb_heap_t *heap;
- int before_sweep;
+ int total_slots;
+ int free_slots;
+ int final_slots;
+
+ struct heap_page *free_next;
+ RVALUE *start;
+ RVALUE *freelist;
+ struct heap_page *next;
+
+ struct {
+ unsigned int before_sweep : 1;
+ unsigned int has_remembered_objects : 1;
+ unsigned int has_long_lived_shady_objects : 1;
+ } flags;
+#if USE_RGENGC
+ bits_t wb_unprotected_bits[HEAP_BITMAP_LIMIT];
+#endif
+ /* the following three bitmaps are cleared at the beggining of full GC */
bits_t mark_bits[HEAP_BITMAP_LIMIT];
#if USE_RGENGC
- bits_t rememberset_bits[HEAP_BITMAP_LIMIT];
- bits_t oldgen_bits[HEAP_BITMAP_LIMIT];
+ bits_t long_lived_bits[HEAP_BITMAP_LIMIT];
+ bits_t marking_bits[HEAP_BITMAP_LIMIT];
#endif
};
-#define GET_PAGE_BODY(x) ((struct heap_page_body *)((bits_t)(x) & ~(HEAP_ALIGN_MASK)))
-#define GET_PAGE_HEADER(x) (&GET_PAGE_BODY(x)->header)
-#define GET_HEAP_PAGE(x) (GET_PAGE_HEADER(x)->page)
-#define GET_HEAP_MARK_BITS(x) (&GET_HEAP_PAGE(x)->mark_bits[0])
-#define GET_HEAP_REMEMBERSET_BITS(x) (&GET_HEAP_PAGE(x)->rememberset_bits[0])
-#define GET_HEAP_OLDGEN_BITS(x) (&GET_HEAP_PAGE(x)->oldgen_bits[0])
-#define NUM_IN_PAGE(p) (((bits_t)(p) & HEAP_ALIGN_MASK)/sizeof(RVALUE))
-#define BITMAP_INDEX(p) (NUM_IN_PAGE(p) / BITS_BITLENGTH )
-#define BITMAP_OFFSET(p) (NUM_IN_PAGE(p) & (BITS_BITLENGTH-1))
-#define BITMAP_BIT(p) ((bits_t)1 << BITMAP_OFFSET(p))
+#define GET_PAGE_BODY(x) ((struct heap_page_body *)((bits_t)(x) & ~(HEAP_ALIGN_MASK)))
+#define GET_PAGE_HEADER(x) (&GET_PAGE_BODY(x)->header)
+#define GET_HEAP_PAGE(x) (GET_PAGE_HEADER(x)->page)
+
+#define NUM_IN_PAGE(p) (((bits_t)(p) & HEAP_ALIGN_MASK)/sizeof(RVALUE))
+#define BITMAP_INDEX(p) (NUM_IN_PAGE(p) / BITS_BITLENGTH )
+#define BITMAP_OFFSET(p) (NUM_IN_PAGE(p) & (BITS_BITLENGTH-1))
+#define BITMAP_BIT(p) ((bits_t)1 << BITMAP_OFFSET(p))
+
/* Bitmap Operations */
#define MARKED_IN_BITMAP(bits, p) ((bits)[BITMAP_INDEX(p)] & BITMAP_BIT(p))
#define MARK_IN_BITMAP(bits, p) ((bits)[BITMAP_INDEX(p)] = (bits)[BITMAP_INDEX(p)] | BITMAP_BIT(p))
#define CLEAR_IN_BITMAP(bits, p) ((bits)[BITMAP_INDEX(p)] = (bits)[BITMAP_INDEX(p)] & ~BITMAP_BIT(p))
+/* getting bitmap */
+#define GET_HEAP_MARK_BITS(x) (&GET_HEAP_PAGE(x)->mark_bits[0])
+#if USE_RGENGC
+#define GET_HEAP_LONG_LIVED_BITS(x) (&GET_HEAP_PAGE(x)->long_lived_bits[0])
+#define GET_HEAP_WB_UNPROTECTED_BITS(x) (&GET_HEAP_PAGE(x)->wb_unprotected_bits[0])
+#define GET_HEAP_MARKING_BITS(x) (&GET_HEAP_PAGE(x)->marking_bits[0])
+#endif
+
/* Aliases */
#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
#define rb_objspace (*GET_VM()->objspace)
-#define ruby_initial_gc_stress gc_params.gc_stress
-VALUE *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
#else
static rb_objspace_t rb_objspace = {{GC_MALLOC_LIMIT_MIN}};
-VALUE *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
#endif
+#define ruby_initial_gc_stress gc_params.gc_stress
+VALUE *ruby_initial_gc_stress_ptr = &ruby_initial_gc_stress;
+
#define malloc_limit objspace->malloc_params.limit
#define malloc_increase objspace->malloc_params.increase
#define malloc_allocated_size objspace->malloc_params.allocated_size
#define heap_pages_sorted objspace->heap_pages.sorted
-#define heap_pages_used objspace->heap_pages.used
-#define heap_pages_length objspace->heap_pages.length
+#define heap_allocated_pages objspace->heap_pages.allocated_pages
+#define heap_pages_sorted_length objspace->heap_pages.sorted_length
#define heap_pages_lomem objspace->heap_pages.range[0]
#define heap_pages_himem objspace->heap_pages.range[1]
#define heap_pages_swept_slots objspace->heap_pages.swept_slots
-#define heap_pages_increment objspace->heap_pages.increment
+#define heap_allocatable_pages objspace->heap_pages.allocatable_pages
#define heap_pages_min_free_slots objspace->heap_pages.min_free_slots
#define heap_pages_max_free_slots objspace->heap_pages.max_free_slots
#define heap_pages_final_slots objspace->heap_pages.final_slots
@@ -622,14 +685,27 @@ VALUE *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
#define heap_tomb (&objspace->tomb_heap)
#define dont_gc objspace->flags.dont_gc
#define during_gc objspace->flags.during_gc
-#define finalizing objspace->flags.finalizing
+#define finalizing objspace->atomic_flags.finalizing
#define finalizer_table objspace->finalizer_table
-#define global_List objspace->global_list
-#define ruby_gc_stress objspace->gc_stress
-#define monitor_level objspace->rgengc.monitor_level
-#define monitored_object_table objspace->rgengc.monitored_object_table
+#define global_list objspace->global_list
+#define ruby_gc_stressful objspace->flags.gc_stressful
+#define ruby_gc_stress_mode objspace->gc_stress_mode
+
+#define is_marking(objspace) ((objspace)->flags.stat == gc_stat_marking)
+#define is_sweeping(objspace) ((objspace)->flags.stat == gc_stat_sweeping)
+#define is_full_marking(objspace) ((objspace)->flags.during_minor_gc == FALSE)
+#if GC_ENABLE_INCREMENTAL_MARK
+#define is_incremental_marking(objspace) ((objspace)->flags.during_incremental_marking != FALSE)
+#else
+#define is_incremental_marking(objspace) 0
+#endif
+#define is_lazy_sweeping(heap) (GC_ENABLE_LAZY_SWEEP && (heap)->sweep_pages != 0)
+#if GC_ENABLE_INCREMENTAL_MARK
+#define will_be_incremental_marking(objspace) ((objspace)->rgengc.need_major_gc != GPR_FLAG_NONE)
+#else
+#define will_be_incremental_marking(objspace) 0
+#endif
-#define is_lazy_sweeping(heap) ((heap)->sweep_pages != 0)
#if SIZEOF_LONG == SIZEOF_VOIDP
# define nonspecial_obj_id(obj) (VALUE)((SIGNED_VALUE)(obj)|FIXNUM_FLAG)
# define obj_id_to_ref(objid) ((objid) ^ FIXNUM_FLAG) /* unset FIXNUM_FLAG */
@@ -643,11 +719,20 @@ VALUE *ruby_initial_gc_stress_ptr = &rb_objspace.gc_stress;
#define RANY(o) ((RVALUE*)(o))
+struct RZombie {
+ struct RBasic basic;
+ VALUE next;
+ void (*dfree)(void *);
+ void *data;
+};
+
+#define RZOMBIE(o) ((struct RZombie *)(o))
+
#define nomem_error GET_VM()->special_exceptions[ruby_error_nomemory]
int ruby_gc_debug_indent = 0;
VALUE rb_mGC;
-int ruby_disable_gc_stress = 0;
+int ruby_disable_gc = 0;
void rb_gcdebug_print_obj_condition(VALUE obj);
@@ -660,21 +745,51 @@ static void aligned_free(void *);
static void init_mark_stack(mark_stack_t *stack);
-static VALUE lazy_sweep_enable(void);
static int ready_to_gc(rb_objspace_t *objspace);
-static int heap_ready_to_gc(rb_objspace_t *objspace, rb_heap_t *heap);
-static int garbage_collect(rb_objspace_t *, int full_mark, int immediate_sweep, int reason);
-static int garbage_collect_body(rb_objspace_t *, int full_mark, int immediate_sweep, int reason);
-static int gc_heap_lazy_sweep(rb_objspace_t *objspace, rb_heap_t *heap);
-static void gc_rest_sweep(rb_objspace_t *objspace);
-static void gc_heap_rest_sweep(rb_objspace_t *objspace, rb_heap_t *heap);
-
-static void gc_mark_stacked_objects(rb_objspace_t *);
+
+static int garbage_collect(rb_objspace_t *, int full_mark, int immediate_mark, int immediate_sweep, int reason);
+
+static int gc_start(rb_objspace_t *objspace, const int full_mark, const int immediate_mark, const unsigned int immediate_sweep, int reason);
+static void gc_rest(rb_objspace_t *objspace);
+static inline void gc_enter(rb_objspace_t *objspace, const char *event);
+static inline void gc_exit(rb_objspace_t *objspace, const char *event);
+
+static void gc_marks(rb_objspace_t *objspace, int full_mark);
+static void gc_marks_start(rb_objspace_t *objspace, int full);
+static int gc_marks_finish(rb_objspace_t *objspace);
+static void gc_marks_step(rb_objspace_t *objspace, int slots);
+static void gc_marks_rest(rb_objspace_t *objspace);
+static void gc_marks_continue(rb_objspace_t *objspace, rb_heap_t *heap);
+
+static void gc_sweep(rb_objspace_t *objspace);
+static void gc_sweep_start(rb_objspace_t *objspace);
+static void gc_sweep_finish(rb_objspace_t *objspace);
+static int gc_sweep_step(rb_objspace_t *objspace, rb_heap_t *heap);
+static void gc_sweep_rest(rb_objspace_t *objspace);
+static void gc_sweep_continue(rb_objspace_t *objspace, rb_heap_t *heap);
+
static void gc_mark(rb_objspace_t *objspace, VALUE ptr);
+static void gc_mark_ptr(rb_objspace_t *objspace, VALUE ptr);
static void gc_mark_maybe(rb_objspace_t *objspace, VALUE ptr);
static void gc_mark_children(rb_objspace_t *objspace, VALUE ptr);
-static size_t obj_memsize_of(VALUE obj, int use_tdata);
+static int gc_mark_stacked_objects_incremental(rb_objspace_t *, size_t count);
+static int gc_mark_stacked_objects_all(rb_objspace_t *);
+static void gc_grey(rb_objspace_t *objspace, VALUE ptr);
+
+static inline int is_pointer_to_heap(rb_objspace_t *objspace, void *ptr);
+
+static void push_mark_stack(mark_stack_t *, VALUE);
+static int pop_mark_stack(mark_stack_t *, VALUE *);
+static size_t mark_stack_size(mark_stack_t *stack);
+static void shrink_stack_chunk_cache(mark_stack_t *stack);
+
+static size_t obj_memsize_of(VALUE obj, int use_all_types);
+static VALUE gc_verify_internal_consistency(VALUE self);
+static int gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj);
+static int gc_verify_heap_pages(rb_objspace_t *objspace);
+
+static void gc_stress_set(rb_objspace_t *objspace, VALUE flag);
static double getrusage_time(void);
static inline void gc_prof_setup_new_record(rb_objspace_t *objspace, int reason);
@@ -690,176 +805,366 @@ static inline void gc_prof_set_heap_info(rb_objspace_t *);
#define gc_prof_record(objspace) (objspace)->profile.current_record
#define gc_prof_enabled(objspace) ((objspace)->profile.run && (objspace)->profile.current_record)
-#define rgengc_report if (RGENGC_DEBUG) rgengc_report_body
-static void rgengc_report_body(int level, rb_objspace_t *objspace, const char *fmt, ...);
-static const char * type_name(int type, VALUE obj);
-static const char *obj_type_name(VALUE obj);
+#ifdef HAVE_VA_ARGS_MACRO
+# define gc_report(level, objspace, fmt, ...) \
+ if ((level) > RGENGC_DEBUG) {} else gc_report_body(level, objspace, fmt, ##__VA_ARGS__)
+#else
+# define gc_report if (!(RGENGC_DEBUG)) {} else gc_report_body
+#endif
+PRINTF_ARGS(static void gc_report_body(int level, rb_objspace_t *objspace, const char *fmt, ...), 3, 4);
+static const char *obj_info(VALUE obj);
+
+#define PUSH_MARK_FUNC_DATA(v) do { \
+ struct mark_func_data_struct *prev_mark_func_data = objspace->mark_func_data; \
+ objspace->mark_func_data = (v);
+
+#define POP_MARK_FUNC_DATA() objspace->mark_func_data = prev_mark_func_data;} while (0)
+
+/*
+ * 1 - TSC (H/W Time Stamp Counter)
+ * 2 - getrusage
+ */
+#ifndef TICK_TYPE
+#define TICK_TYPE 1
+#endif
+
+#if USE_TICK_T
+
+#if TICK_TYPE == 1
+/* the following code is only for internal tuning. */
+
+/* Source code to use RDTSC is quoted and modified from
+ * http://www.mcs.anl.gov/~kazutomo/rdtsc.html
+ * written by Kazutomo Yoshii <kazutomo@mcs.anl.gov>
+ */
+
+#if defined(__GNUC__) && defined(__i386__)
+typedef unsigned long long tick_t;
+#define PRItick "llu"
+static inline tick_t
+tick(void)
+{
+ unsigned long long int x;
+ __asm__ __volatile__ ("rdtsc" : "=A" (x));
+ return x;
+}
+
+#elif defined(__GNUC__) && defined(__x86_64__)
+typedef unsigned long long tick_t;
+#define PRItick "llu"
+
+static __inline__ tick_t
+tick(void)
+{
+ unsigned long hi, lo;
+ __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
+ return ((unsigned long long)lo)|( ((unsigned long long)hi)<<32);
+}
+
+#elif defined(_WIN32) && defined(_MSC_VER)
+#include <intrin.h>
+typedef unsigned __int64 tick_t;
+#define PRItick "llu"
+
+static inline tick_t
+tick(void)
+{
+ return __rdtsc();
+}
+
+#else /* use clock */
+typedef clock_t tick_t;
+#define PRItick "llu"
+
+static inline tick_t
+tick(void)
+{
+ return clock();
+}
+#endif /* TSC */
+
+#elif TICK_TYPE == 2
+typedef double tick_t;
+#define PRItick "4.9f"
+
+static inline tick_t
+tick(void)
+{
+ return getrusage_time();
+}
+#else /* TICK_TYPE */
+#error "choose tick type"
+#endif /* TICK_TYPE */
+
+#define MEASURE_LINE(expr) do { \
+ volatile tick_t start_time = tick(); \
+ volatile tick_t end_time; \
+ expr; \
+ end_time = tick(); \
+ fprintf(stderr, "0\t%"PRItick"\t%s\n", end_time - start_time, #expr); \
+} while (0)
+
+#else /* USE_TICK_T */
+#define MEASURE_LINE(expr) expr
+#endif /* USE_TICK_T */
+
+#define FL_TEST2(x,f) ((RGENGC_CHECK_MODE && SPECIAL_CONST_P(x)) ? (rb_bug("FL_TEST2: SPECIAL_CONST (%p)", (void *)(x)), 0) : FL_TEST_RAW((x),(f)) != 0)
+#define FL_SET2(x,f) do {if (RGENGC_CHECK_MODE && SPECIAL_CONST_P(x)) rb_bug("FL_SET2: SPECIAL_CONST"); RBASIC(x)->flags |= (f);} while (0)
+#define FL_UNSET2(x,f) do {if (RGENGC_CHECK_MODE && SPECIAL_CONST_P(x)) rb_bug("FL_UNSET2: SPECIAL_CONST"); RBASIC(x)->flags &= ~(f);} while (0)
+
+#define RVALUE_MARK_BITMAP(obj) MARKED_IN_BITMAP(GET_HEAP_MARK_BITS(obj), (obj))
+#define RVALUE_PAGE_MARKED(page, obj) MARKED_IN_BITMAP((page)->mark_bits, (obj))
#if USE_RGENGC
+#define RVALUE_WB_UNPROTECTED_BITMAP(obj) MARKED_IN_BITMAP(GET_HEAP_WB_UNPROTECTED_BITS(obj), (obj))
+#define RVALUE_LONG_LIVED_BITMAP(obj) MARKED_IN_BITMAP(GET_HEAP_LONG_LIVED_BITS(obj), (obj))
+#define RVALUE_MARKING_BITMAP(obj) MARKED_IN_BITMAP(GET_HEAP_MARKING_BITS(obj), (obj))
+
+#define RVALUE_PAGE_WB_UNPROTECTED(apge, obj) MARKED_IN_BITMAP((page)->wb_unprotected_bits, (obj))
+#define RVALUE_PAGE_LONG_LIVED(page, obj) MARKED_IN_BITMAP((page)->long_lived_bits, (obj))
+#define RVALUE_PAGE_MARKING(page, obj) MARKED_IN_BITMAP((page)->marking_bits, (obj))
+
+#define RVALUE_OLD_AGE 3
+#define RVALUE_AGE_SHIFT 5 /* FL_PROMOTED0 bit */
+
static int rgengc_remembered(rb_objspace_t *objspace, VALUE obj);
static int rgengc_remember(rb_objspace_t *objspace, VALUE obj);
static void rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_heap_t *heap);
static void rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap);
-#define FL_TEST2(x,f) ((RGENGC_CHECK_MODE && SPECIAL_CONST_P(x)) ? (rb_bug("FL_TEST2: SPECIAL_CONST"), 0) : FL_TEST_RAW((x),(f)) != 0)
-#define FL_SET2(x,f) do {if (RGENGC_CHECK_MODE && SPECIAL_CONST_P(x)) rb_bug("FL_SET2: SPECIAL_CONST"); RBASIC(x)->flags |= (f);} while (0)
-#define FL_UNSET2(x,f) do {if (RGENGC_CHECK_MODE && SPECIAL_CONST_P(x)) rb_bug("FL_UNSET2: SPECIAL_CONST"); RBASIC(x)->flags &= ~(f);} while (0)
-
-#define RVALUE_WB_PROTECTED_RAW(obj) FL_TEST2((obj), FL_WB_PROTECTED)
-#define RVALUE_WB_PROTECTED(obj) RVALUE_WB_PROTECTED_RAW(check_gen_consistency((VALUE)obj))
-
-#define RVALUE_OLDGEN_BITMAP(obj) MARKED_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj), (obj))
+static inline int
+RVALUE_FLAGS_AGE(VALUE flags)
+{
+ return (int)((flags & (FL_PROMOTED0 | FL_PROMOTED1)) >> RVALUE_AGE_SHIFT);
+}
-static inline int is_pointer_to_heap(rb_objspace_t *objspace, void *ptr);
-static inline int gc_marked(rb_objspace_t *objspace, VALUE ptr);
+#endif /* USE_RGENGC */
static inline VALUE
-check_gen_consistency(VALUE obj)
+check_rvalue_consistency(const VALUE obj)
{
- if (RGENGC_CHECK_MODE > 0) {
- int old_flag = RVALUE_OLDGEN_BITMAP(obj) != 0;
- int promoted_flag = FL_TEST2(obj, FL_PROMOTED);
- rb_objspace_t *objspace = &rb_objspace;
+#if RGENGC_CHECK_MODE > 0
+ rb_objspace_t *objspace = &rb_objspace;
+
+ if (!is_pointer_to_heap(objspace, (void *)obj)) {
+ rb_bug("check_rvalue_consistency: %p is not a Ruby object.", (void *)obj);
+ }
+ else if (SPECIAL_CONST_P(obj)) {
+ rb_bug("check_rvalue_consistency: %p is a special const.", (void *)obj);
+ }
+ else {
+ int wb_unprotected_bit = RVALUE_WB_UNPROTECTED_BITMAP(obj) != 0;
+ int long_lived_bit = RVALUE_LONG_LIVED_BITMAP(obj) != 0;
+ int age = RVALUE_FLAGS_AGE(RBASIC(obj)->flags);
+ if (BUILTIN_TYPE(obj) == T_NONE) rb_bug("check_rvalue_consistency: %p is T_NONE", obj_info(obj));
+ if (BUILTIN_TYPE(obj) == T_ZOMBIE) rb_bug("check_rvalue_consistency: %p is T_ZOMBIE", obj_info(obj));
obj_memsize_of((VALUE)obj, FALSE);
- if (!is_pointer_to_heap(objspace, (void *)obj)) {
- rb_bug("check_gen_consistency: %p (%s) is not Ruby object.", (void *)obj, obj_type_name(obj));
+ /* check generation
+ *
+ * OLD == age == 3 && old-bitmap && mark-bit (except incremental marking)
+ */
+ if (age > 0 && wb_unprotected_bit) {
+ rb_bug("check_rvalue_consistency: %s is not WB protected, but age is %d > 0.", obj_info(obj), age);
}
-
- if (promoted_flag) {
- if (!RVALUE_WB_PROTECTED_RAW(obj)) {
- const char *type = old_flag ? "old" : "young";
- rb_bug("check_gen_consistency: %p (%s) is not WB protected, but %s object.", (void *)obj, obj_type_name(obj), type);
- }
-
-#if !RGENGC_THREEGEN
- if (!old_flag) {
- rb_bug("check_gen_consistency: %p (%s) is not infant, but is not old (on 2gen).", (void *)obj, obj_type_name(obj));
- }
-#endif
-
- if (old_flag && objspace->rgengc.during_minor_gc && !gc_marked(objspace, obj)) {
- rb_bug("check_gen_consistency: %p (%s) is old, but is not marked while minor marking.", (void *)obj, obj_type_name(obj));
- }
+ if (!is_full_marking(objspace) && long_lived_bit && age != RVALUE_OLD_AGE && !wb_unprotected_bit) {
+ rb_bug("check_rvalue_consistency: %s is long lived, but not old (age: %d) and not WB unprotected.\n", obj_info(obj), age);
}
- else {
- if (old_flag) {
- rb_bug("check_gen_consistency: %p (%s) is not infant, but is old.", (void *)obj, obj_type_name(obj));
- }
+ if (!is_marking(objspace) && !is_sweeping(objspace) && long_lived_bit && RVALUE_MARK_BITMAP(obj) == 0) {
+ rb_bug("check_rvalue_consistency: %s is long lived, but is not marked while !gc.", obj_info(obj));
+ }
+
+ /*
+ * check coloring
+ *
+ * marking:false marking:true
+ * marked:false white *invalid*
+ * marked:true black grey
+ */
+ if (RVALUE_MARKING_BITMAP(obj)) {
+ if (!is_marking(objspace) && !RVALUE_MARK_BITMAP(obj)) rb_bug("check_rvalue_consistency: %s is marking, but not marked.", obj_info(obj));
}
}
+#endif
return obj;
}
-static inline VALUE
-RVALUE_INFANT_P(VALUE obj)
+static inline int
+RVALUE_MARKED(VALUE obj)
{
- check_gen_consistency(obj);
- return !FL_TEST2(obj, FL_PROMOTED);
+ check_rvalue_consistency(obj);
+ return RVALUE_MARK_BITMAP(obj) != 0;
}
-static inline VALUE
-RVALUE_OLD_BITMAP_P(VALUE obj)
+#if USE_RGENGC
+static inline int
+RVALUE_WB_UNPROTECTED(VALUE obj)
{
- check_gen_consistency(obj);
- return (RVALUE_OLDGEN_BITMAP(obj) != 0);
+ check_rvalue_consistency(obj);
+ return RVALUE_WB_UNPROTECTED_BITMAP(obj) != 0;
}
-static inline VALUE
-RVALUE_OLD_P(VALUE obj)
+static inline int
+RVALUE_MARKING(VALUE obj)
{
- check_gen_consistency(obj);
-#if RGENGC_THREEGEN
- return FL_TEST2(obj, FL_PROMOTED) && RVALUE_OLD_BITMAP_P(obj);
-#else
- return FL_TEST2(obj, FL_PROMOTED);
-#endif
+ check_rvalue_consistency(obj);
+ return RVALUE_MARKING_BITMAP(obj) != 0;
}
-static inline VALUE
-RVALUE_PROMOTED_P(VALUE obj)
+static inline int
+RVALUE_REMEMBERED(VALUE obj)
{
- check_gen_consistency(obj);
- return FL_TEST2(obj, FL_PROMOTED);
+ check_rvalue_consistency(obj);
+ return RVALUE_MARKING_BITMAP(obj) != 0;
}
-static inline void
-RVALUE_PROMOTE_INFANT(VALUE obj)
+static inline int
+RVALUE_LONG_LIVED(VALUE obj)
+{
+ check_rvalue_consistency(obj);
+ return RVALUE_LONG_LIVED_BITMAP(obj) != 0;
+}
+
+static inline int
+RVALUE_OLD_P_RAW(VALUE obj)
+{
+ const VALUE promoted = FL_PROMOTED0 | FL_PROMOTED1;
+ return (RBASIC(obj)->flags & promoted) == promoted;
+}
+
+static inline int
+RVALUE_OLD_P(VALUE obj)
{
- check_gen_consistency(obj);
- if (RGENGC_CHECK_MODE && !RVALUE_INFANT_P(obj)) rb_bug("RVALUE_PROMOTE_INFANT: %p (%s) is not infant object.", (void *)obj, obj_type_name(obj));
- FL_SET2(obj, FL_PROMOTED);
-#if !RGENGC_THREEGEN
- MARK_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj), obj);
+ check_rvalue_consistency(obj);
+ return RVALUE_OLD_P_RAW(obj);
+}
+
+#if RGENGC_CHECK_MODE || GC_DEBUG
+static inline int
+RVALUE_AGE(VALUE obj)
+{
+ check_rvalue_consistency(obj);
+ return RVALUE_FLAGS_AGE(RBASIC(obj)->flags);
+}
#endif
- check_gen_consistency(obj);
-#if RGENGC_PROFILE >= 1
- {
- rb_objspace_t *objspace = &rb_objspace;
- objspace->profile.promote_infant_count++;
+static inline void
+RVALUE_PROMOTE_RAW(rb_objspace_t *objspace, VALUE obj)
+{
+ MARK_IN_BITMAP(GET_HEAP_LONG_LIVED_BITS(obj), obj);
+ objspace->rgengc.old_objects++;
#if RGENGC_PROFILE >= 2
- objspace->profile.promote_infant_types[BUILTIN_TYPE(obj)]++;
-#endif
- }
+ objspace->profile.total_promoted_count++;
+ objspace->profile.promoted_types[BUILTIN_TYPE(obj)]++;
#endif
}
-#if RGENGC_THREEGEN
-/*
- * Two gen: Infant -> Old.
- * Three gen: Infant -> Young -> Old.
- */
static inline VALUE
-RVALUE_YOUNG_P(VALUE obj)
+RVALUE_FLAGS_AGE_SET(VALUE flags, int age)
{
- check_gen_consistency(obj);
- return FL_TEST2(obj, FL_PROMOTED) && (RVALUE_OLDGEN_BITMAP(obj) == 0);
+ flags &= ~(FL_PROMOTED0 | FL_PROMOTED1);
+ flags |= (age << RVALUE_AGE_SHIFT);
+ return flags;
}
+/* set age to age+1 */
static inline void
-RVALUE_PROMOTE_YOUNG(VALUE obj)
+RVALUE_AGE_INC(rb_objspace_t *objspace, VALUE obj)
{
- check_gen_consistency(obj);
- if (RGENGC_CHECK_MODE && !RVALUE_YOUNG_P(obj)) rb_bug("RVALUE_PROMOTE_YOUNG: %p (%s) is not young object.", (void *)obj, obj_type_name(obj));
- MARK_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj), obj);
- check_gen_consistency(obj);
+ VALUE flags = RBASIC(obj)->flags;
+ int age = RVALUE_FLAGS_AGE(flags);
-#if RGENGC_PROFILE >= 1
- {
- rb_objspace_t *objspace = &rb_objspace;
- objspace->profile.promote_young_count++;
-#if RGENGC_PROFILE >= 2
- objspace->profile.promote_young_types[BUILTIN_TYPE(obj)]++;
-#endif
+ if (RGENGC_CHECK_MODE && age == RVALUE_OLD_AGE) {
+ rb_bug("RVALUE_AGE_INC: can not increment age of OLD object %s.", obj_info(obj));
}
-#endif
+
+ age++;
+ RBASIC(obj)->flags = RVALUE_FLAGS_AGE_SET(flags, age);
+
+ if (age == RVALUE_OLD_AGE) {
+ RVALUE_PROMOTE_RAW(objspace, obj);
+ }
+ check_rvalue_consistency(obj);
}
+/* set age to RVALUE_OLD_AGE */
static inline void
-RVALUE_DEMOTE_FROM_YOUNG(VALUE obj)
+RVALUE_AGE_SET_OLD(rb_objspace_t *objspace, VALUE obj)
{
- if (RGENGC_CHECK_MODE && !RVALUE_YOUNG_P(obj))
- rb_bug("RVALUE_DEMOTE_FROM_YOUNG: %p (%s) is not young object.", (void *)obj, obj_type_name(obj));
+ check_rvalue_consistency(obj);
+ if (RGENGC_CHECK_MODE) assert(!RVALUE_OLD_P(obj));
+
+ RBASIC(obj)->flags = RVALUE_FLAGS_AGE_SET(RBASIC(obj)->flags, RVALUE_OLD_AGE);
+ RVALUE_PROMOTE_RAW(objspace, obj);
- check_gen_consistency(obj);
- FL_UNSET2(obj, FL_PROMOTED);
- check_gen_consistency(obj);
+ check_rvalue_consistency(obj);
}
-#endif
+/* set age to RVALUE_OLD_AGE - 1 */
static inline void
-RVALUE_DEMOTE_FROM_OLD(VALUE obj)
+RVALUE_AGE_SET_CANDIDATE(rb_objspace_t *objspace, VALUE obj)
+{
+ check_rvalue_consistency(obj);
+ if (RGENGC_CHECK_MODE) assert(!RVALUE_OLD_P(obj));
+
+ RBASIC(obj)->flags = RVALUE_FLAGS_AGE_SET(RBASIC(obj)->flags, RVALUE_OLD_AGE - 1);
+
+ check_rvalue_consistency(obj);
+}
+
+static inline void
+RVALUE_DEMOTE_RAW(rb_objspace_t *objspace, VALUE obj)
+{
+ RBASIC(obj)->flags = RVALUE_FLAGS_AGE_SET(RBASIC(obj)->flags, 0);
+ CLEAR_IN_BITMAP(GET_HEAP_LONG_LIVED_BITS(obj), obj);
+}
+
+static inline void
+RVALUE_DEMOTE(rb_objspace_t *objspace, VALUE obj)
+{
+ check_rvalue_consistency(obj);
+ if (RGENGC_CHECK_MODE) assert(RVALUE_OLD_P(obj));
+
+ RVALUE_DEMOTE_RAW(objspace, obj);
+
+ if (RVALUE_MARKED(obj)) {
+ objspace->rgengc.old_objects--;
+ }
+
+ check_rvalue_consistency(obj);
+}
+
+static inline void
+RVALUE_AGE_RESET(VALUE obj)
+{
+ check_rvalue_consistency(obj);
+ if (RGENGC_CHECK_MODE) assert(!RVALUE_OLD_P(obj));
+
+ RBASIC(obj)->flags = RVALUE_FLAGS_AGE_SET(RBASIC(obj)->flags, 0);
+
+ check_rvalue_consistency(obj);
+}
+
+static inline int
+RVALUE_BLACK_P(VALUE obj)
{
- if (RGENGC_CHECK_MODE && !RVALUE_OLD_P(obj))
- rb_bug("RVALUE_DEMOTE_FROM_OLD: %p (%s) is not old object.", (void *)obj, obj_type_name(obj));
+ return RVALUE_MARKED(obj) && !RVALUE_MARKING(obj);
+}
- check_gen_consistency(obj);
- FL_UNSET2(obj, FL_PROMOTED);
- CLEAR_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj), obj);
- check_gen_consistency(obj);
+#if 0
+static inline int
+RVALUE_GREY_P(VALUE obj)
+{
+ return RVALUE_MARKED(obj) && RVALUE_MARKING(obj);
+}
+#endif
+
+static inline int
+RVALUE_WHITE_P(VALUE obj)
+{
+ return RVALUE_MARKED(obj) == FALSE;
}
#endif /* USE_RGENGC */
@@ -872,10 +1177,7 @@ RVALUE_DEMOTE_FROM_OLD(VALUE obj)
rb_objspace_t *
rb_objspace_alloc(void)
{
- rb_objspace_t *objspace = malloc(sizeof(rb_objspace_t));
- memset(objspace, 0, sizeof(*objspace));
- ruby_gc_stress = ruby_initial_gc_stress;
-
+ rb_objspace_t *objspace = calloc(1, sizeof(rb_objspace_t));
malloc_limit = gc_params.malloc_limit_min;
return objspace;
@@ -889,28 +1191,26 @@ static void heap_page_free(rb_objspace_t *objspace, struct heap_page *page);
void
rb_objspace_free(rb_objspace_t *objspace)
{
- gc_rest_sweep(objspace);
-
if (objspace->profile.records) {
free(objspace->profile.records);
objspace->profile.records = 0;
}
- if (global_List) {
+ if (global_list) {
struct gc_list *list, *next;
- for (list = global_List; list; list = next) {
+ for (list = global_list; list; list = next) {
next = list->next;
xfree(list);
}
}
if (heap_pages_sorted) {
size_t i;
- for (i = 0; i < heap_pages_used; ++i) {
+ for (i = 0; i < heap_allocated_pages; ++i) {
heap_page_free(objspace, heap_pages_sorted[i]);
}
free(heap_pages_sorted);
- heap_pages_used = 0;
- heap_pages_length = 0;
+ heap_allocated_pages = 0;
+ heap_pages_sorted_length = 0;
heap_pages_lomem = 0;
heap_pages_himem = 0;
@@ -926,17 +1226,17 @@ rb_objspace_free(rb_objspace_t *objspace)
static void
heap_pages_expand_sorted(rb_objspace_t *objspace)
{
- size_t next_length = heap_pages_increment;
+ size_t next_length = heap_allocatable_pages;
next_length += heap_eden->page_length;
next_length += heap_tomb->page_length;
- if (next_length > heap_pages_length) {
+ if (next_length > heap_pages_sorted_length) {
struct heap_page **sorted;
size_t size = next_length * sizeof(struct heap_page *);
- rgengc_report(3, objspace, "heap_pages_expand_sorted: next_length: %d, size: %d\n", (int)next_length, (int)size);
+ gc_report(3, objspace, "heap_pages_expand_sorted: next_length: %d, size: %d\n", (int)next_length, (int)size);
- if (heap_pages_length > 0) {
+ if (heap_pages_sorted_length > 0) {
sorted = (struct heap_page **)realloc(heap_pages_sorted, size);
if (sorted) heap_pages_sorted = sorted;
}
@@ -945,11 +1245,10 @@ heap_pages_expand_sorted(rb_objspace_t *objspace)
}
if (sorted == 0) {
- during_gc = 0;
rb_memerror();
}
- heap_pages_length = next_length;
+ heap_pages_sorted_length = next_length;
}
}
@@ -960,7 +1259,12 @@ heap_page_add_freeobj(rb_objspace_t *objspace, struct heap_page *page, VALUE obj
p->as.free.flags = 0;
p->as.free.next = page->freelist;
page->freelist = p;
- rgengc_report(3, objspace, "heap_page_add_freeobj: %p (%s) is added to freelist\n", p, obj_type_name(obj));
+
+ if (RGENGC_CHECK_MODE && !is_pointer_to_heap(objspace, p)) {
+ rb_bug("heap_page_add_freeobj: %p is not rvalue.", p);
+ }
+
+ gc_report(3, objspace, "heap_page_add_freeobj: add %p to freelist\n", (void *)obj);
}
static inline void
@@ -972,6 +1276,15 @@ heap_add_freepage(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *pa
}
}
+static inline void
+heap_add_poolpage(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page)
+{
+ if (page->freelist) {
+ page->free_next = heap->pooled_pages;
+ heap->pooled_pages = page;
+ }
+}
+
static void
heap_unlink_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page)
{
@@ -982,13 +1295,14 @@ heap_unlink_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *pag
page->next = NULL;
page->heap = NULL;
heap->page_length--;
- heap->total_slots -= page->limit;
+ heap->total_slots -= page->total_slots;
}
static void
heap_page_free(rb_objspace_t *objspace, struct heap_page *page)
{
- heap_pages_used--;
+ heap_allocated_pages--;
+ objspace->profile.total_freed_pages++;
aligned_free(page->body);
free(page);
}
@@ -998,28 +1312,30 @@ heap_pages_free_unused_pages(rb_objspace_t *objspace)
{
size_t i, j;
- for (i = j = 1; j < heap_pages_used; i++) {
- struct heap_page *page = heap_pages_sorted[i];
-
- if (page->heap == heap_tomb && page->final_slots == 0) {
- if (heap_pages_swept_slots - page->limit > heap_pages_max_free_slots) {
- if (0) fprintf(stderr, "heap_pages_free_unused_pages: %d free page %p, heap_pages_swept_slots: %d, heap_pages_max_free_slots: %d\n",
- (int)i, page, (int)heap_pages_swept_slots, (int)heap_pages_max_free_slots);
- heap_pages_swept_slots -= page->limit;
- heap_unlink_page(objspace, heap_tomb, page);
- heap_page_free(objspace, page);
- continue;
+ if (heap_tomb->pages && heap_pages_swept_slots > heap_pages_max_free_slots) {
+ for (i = j = 1; j < heap_allocated_pages; i++) {
+ struct heap_page *page = heap_pages_sorted[i];
+
+ if (page->heap == heap_tomb && page->free_slots == page->total_slots) {
+ if (heap_pages_swept_slots - page->total_slots > heap_pages_max_free_slots) {
+ if (0) fprintf(stderr, "heap_pages_free_unused_pages: %d free page %p, heap_pages_swept_slots: %d, heap_pages_max_free_slots: %d\n",
+ (int)i, page, (int)heap_pages_swept_slots, (int)heap_pages_max_free_slots);
+ heap_pages_swept_slots -= page->total_slots;
+ heap_unlink_page(objspace, heap_tomb, page);
+ heap_page_free(objspace, page);
+ continue;
+ }
+ else if (i == j) {
+ return; /* no need to check rest pages */
+ }
}
- else {
- /* fprintf(stderr, "heap_pages_free_unused_pages: remain!!\n"); */
+ if (i != j) {
+ heap_pages_sorted[j] = page;
}
+ j++;
}
- if (i != j) {
- heap_pages_sorted[j] = page;
- }
- j++;
+ if (RGENGC_CHECK_MODE) assert(j == heap_allocated_pages);
}
- assert(j == heap_pages_used);
}
static struct heap_page *
@@ -1029,29 +1345,26 @@ heap_page_allocate(rb_objspace_t *objspace)
struct heap_page *page;
struct heap_page_body *page_body = 0;
size_t hi, lo, mid;
- size_t limit = HEAP_OBJ_LIMIT;
+ int limit = HEAP_OBJ_LIMIT;
/* assign heap_page body (contains heap_page_header and RVALUEs) */
page_body = (struct heap_page_body *)aligned_malloc(HEAP_ALIGN, HEAP_SIZE);
if (page_body == 0) {
- during_gc = 0;
rb_memerror();
}
/* assign heap_page entry */
- page = (struct heap_page *)malloc(sizeof(struct heap_page));
+ page = (struct heap_page *)calloc(1, sizeof(struct heap_page));
if (page == 0) {
aligned_free(page_body);
- during_gc = 0;
rb_memerror();
}
- MEMZERO((void*)page, struct heap_page, 1);
page->body = page_body;
/* setup heap_pages_sorted */
lo = 0;
- hi = heap_pages_used;
+ hi = heap_allocated_pages;
while (lo < hi) {
struct heap_page *mid_page;
@@ -1067,21 +1380,23 @@ heap_page_allocate(rb_objspace_t *objspace)
rb_bug("same heap page is allocated: %p at %"PRIuVALUE, (void *)page_body, (VALUE)mid);
}
}
- if (hi < heap_pages_used) {
- MEMMOVE(&heap_pages_sorted[hi+1], &heap_pages_sorted[hi], struct heap_page_header*, heap_pages_used - hi);
+ if (hi < heap_allocated_pages) {
+ MEMMOVE(&heap_pages_sorted[hi+1], &heap_pages_sorted[hi], struct heap_page_header*, heap_allocated_pages - hi);
}
heap_pages_sorted[hi] = page;
- heap_pages_used++;
- assert(heap_pages_used <= heap_pages_length);
+ heap_allocated_pages++;
+ objspace->profile.total_allocated_pages++;
+
+ if (RGENGC_CHECK_MODE) assert(heap_allocated_pages <= heap_pages_sorted_length);
/* adjust obj_limit (object number available in this page) */
start = (RVALUE*)((VALUE)page_body + sizeof(struct heap_page_header));
if ((VALUE)start % sizeof(RVALUE) != 0) {
int delta = (int)(sizeof(RVALUE) - ((VALUE)start % sizeof(RVALUE)));
start = (RVALUE*)((VALUE)start + delta);
- limit = (HEAP_SIZE - (size_t)((VALUE)start - (VALUE)page_body))/sizeof(RVALUE);
+ limit = (HEAP_SIZE - (int)((VALUE)start - (VALUE)page_body))/(int)sizeof(RVALUE);
}
end = start + limit;
@@ -1089,13 +1404,14 @@ heap_page_allocate(rb_objspace_t *objspace)
if (heap_pages_himem < end) heap_pages_himem = end;
page->start = start;
- page->limit = limit;
+ page->total_slots = limit;
page_body->header.page = page;
for (p = start; p != end; p++) {
- rgengc_report(3, objspace, "assign_heap_page: %p is added to freelist\n");
+ gc_report(3, objspace, "assign_heap_page: %p is added to freelist\n", p);
heap_page_add_freeobj(objspace, page, (VALUE)p);
}
+ page->free_slots = limit;
return page;
}
@@ -1121,8 +1437,8 @@ heap_page_create(rb_objspace_t *objspace)
page = heap_page_allocate(objspace);
method = "allocate";
}
- if (0) fprintf(stderr, "heap_page_create: %s - %p, heap_pages_used: %d, heap_pages_used: %d, tomb->page_length: %d\n",
- method, page, (int)heap_pages_length, (int)heap_pages_used, (int)heap_tomb->page_length);
+ if (0) fprintf(stderr, "heap_page_create: %s - %p, heap_allocated_pages: %d, heap_allocated_pages: %d, tomb->page_length: %d\n",
+ method, page, (int)heap_pages_sorted_length, (int)heap_allocated_pages, (int)heap_tomb->page_length);
return page;
}
@@ -1134,7 +1450,7 @@ heap_add_page(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *page)
if (heap->pages) heap->pages->prev = page;
heap->pages = page;
heap->page_length++;
- heap->total_slots += page->limit;
+ heap->total_slots += page->total_slots;
}
static void
@@ -1150,80 +1466,72 @@ heap_add_pages(rb_objspace_t *objspace, rb_heap_t *heap, size_t add)
{
size_t i;
- heap_pages_increment = add;
+ heap_allocatable_pages = add;
heap_pages_expand_sorted(objspace);
for (i = 0; i < add; i++) {
heap_assign_page(objspace, heap);
}
- heap_pages_increment = 0;
+ heap_allocatable_pages = 0;
}
-static void
-heap_set_increment(rb_objspace_t *objspace, size_t minimum_limit)
+static size_t
+heap_extend_pages(rb_objspace_t *objspace)
{
- size_t used = heap_pages_used - heap_tomb->page_length;
+ size_t used = heap_allocated_pages - heap_tomb->page_length;
size_t next_used_limit = (size_t)(used * gc_params.growth_factor);
+
if (gc_params.growth_max_slots > 0) {
size_t max_used_limit = (size_t)(used + gc_params.growth_max_slots/HEAP_OBJ_LIMIT);
if (next_used_limit > max_used_limit) next_used_limit = max_used_limit;
}
- if (next_used_limit == heap_pages_used) next_used_limit++;
- if (next_used_limit < minimum_limit) {
- next_used_limit = minimum_limit;
- }
+ return next_used_limit - used;
+}
- heap_pages_increment = next_used_limit - used;
+static void
+heap_set_increment(rb_objspace_t *objspace, size_t additional_pages)
+{
+ size_t used = heap_eden->page_length;
+ size_t next_used_limit = used + additional_pages;
+
+ if (next_used_limit == heap_allocated_pages) next_used_limit++;
+
+ heap_allocatable_pages = next_used_limit - used;
heap_pages_expand_sorted(objspace);
- if (0) fprintf(stderr, "heap_set_increment: heap_pages_length: %d, heap_pages_used: %d, heap_pages_increment: %d, next_used_limit: %d\n",
- (int)heap_pages_length, (int)heap_pages_used, (int)heap_pages_increment, (int)next_used_limit);
+ gc_report(1, objspace, "heap_set_increment: heap_allocatable_pages is %d\n", (int)heap_allocatable_pages);
}
static int
heap_increment(rb_objspace_t *objspace, rb_heap_t *heap)
{
- rgengc_report(5, objspace, "heap_increment: heap_pages_length: %d, heap_pages_inc: %d, heap->page_length: %d\n",
- (int)heap_pages_length, (int)heap_pages_increment, (int)heap->page_length);
-
- if (heap_pages_increment > 0) {
- heap_pages_increment--;
+ if (heap_allocatable_pages > 0) {
+ gc_report(1, objspace, "heap_increment: heap_pages_sorted_length: %d, heap_pages_inc: %d, heap->page_length: %d\n",
+ (int)heap_pages_sorted_length, (int)heap_allocatable_pages, (int)heap->page_length);
+ heap_allocatable_pages--;
heap_assign_page(objspace, heap);
return TRUE;
}
return FALSE;
}
-static struct heap_page *
-heap_prepare_freepage(rb_objspace_t *objspace, rb_heap_t *heap)
+static void
+heap_prepare(rb_objspace_t *objspace, rb_heap_t *heap)
{
- if (!GC_ENABLE_LAZY_SWEEP && objspace->flags.dont_lazy_sweep) {
- if (heap_increment(objspace, heap) == 0 &&
- garbage_collect(objspace, FALSE, TRUE, GPR_FLAG_NEWOBJ) == 0) {
- goto err;
- }
- goto ok;
- }
-
- if (!heap_ready_to_gc(objspace, heap)) return heap->free_pages;
-
- during_gc++;
+ if (RGENGC_CHECK_MODE) assert(heap->free_pages == NULL);
- if ((is_lazy_sweeping(heap) && gc_heap_lazy_sweep(objspace, heap)) || heap_increment(objspace, heap)) {
- goto ok;
+ if (is_lazy_sweeping(heap)) {
+ gc_sweep_continue(objspace, heap);
+ }
+ else if (is_incremental_marking(objspace)) {
+ gc_marks_continue(objspace, heap);
}
-#if GC_PROFILE_MORE_DETAIL
- objspace->profile.prepare_time = 0;
-#endif
- if (garbage_collect_body(objspace, 0, 0, GPR_FLAG_NEWOBJ) == 0) {
- err:
- during_gc = 0;
+ if (heap->free_pages == NULL &&
+ (will_be_incremental_marking(objspace) || heap_increment(objspace, heap) == FALSE) &&
+ gc_start(objspace, FALSE, FALSE, FALSE, GPR_FLAG_NEWOBJ) == FALSE) {
rb_memerror();
}
- ok:
- during_gc = 0;
- return heap->free_pages;
}
static RVALUE *
@@ -1232,16 +1540,17 @@ heap_get_freeobj_from_next_freepage(rb_objspace_t *objspace, rb_heap_t *heap)
struct heap_page *page;
RVALUE *p;
- page = heap->free_pages;
- while (page == NULL) {
- page = heap_prepare_freepage(objspace, heap);
+ while (UNLIKELY(heap->free_pages == NULL)) {
+ heap_prepare(objspace, heap);
}
+ page = heap->free_pages;
heap->free_pages = page->free_next;
heap->using_page = page;
+ if (RGENGC_CHECK_MODE) assert(page->free_slots != 0);
p = page->freelist;
page->freelist = NULL;
-
+ page->free_slots = 0;
return p;
}
@@ -1251,7 +1560,7 @@ heap_get_freeobj(rb_objspace_t *objspace, rb_heap_t *heap)
RVALUE *p = heap->freelist;
while (1) {
- if (p) {
+ if (LIKELY(p != NULL)) {
heap->freelist = p->as.free.next;
return (VALUE)p;
}
@@ -1287,60 +1596,71 @@ newobj_of(VALUE klass, VALUE flags, VALUE v1, VALUE v2, VALUE v3)
rb_objspace_t *objspace = &rb_objspace;
VALUE obj;
- if (UNLIKELY(during_gc)) {
- dont_gc = 1;
- during_gc = 0;
- rb_bug("object allocation during garbage collection phase");
- }
-
- if (UNLIKELY(ruby_gc_stress && !ruby_disable_gc_stress)) {
- if (!garbage_collect(objspace, FALSE, FALSE, GPR_FLAG_NEWOBJ)) {
+ if (UNLIKELY(during_gc || ruby_gc_stressful)) {
+ if (during_gc) {
+ dont_gc = 1;
during_gc = 0;
- rb_memerror();
+ rb_bug("object allocation during garbage collection phase");
+ }
+
+ if (ruby_gc_stressful) {
+ if (!garbage_collect(objspace, FALSE, FALSE, FALSE, GPR_FLAG_NEWOBJ)) {
+ rb_memerror();
+ }
}
}
obj = heap_get_freeobj(objspace, heap_eden);
+ if (RGENGC_CHECK_MODE > 0) assert(BUILTIN_TYPE(obj) == T_NONE);
+
/* OBJSETUP */
- RBASIC(obj)->flags = flags;
+ RBASIC(obj)->flags = flags & ~FL_WB_PROTECTED;
RBASIC_SET_CLASS_RAW(obj, klass);
if (rb_safe_level() >= 3) FL_SET((obj), FL_TAINT);
RANY(obj)->as.values.v1 = v1;
RANY(obj)->as.values.v2 = v2;
RANY(obj)->as.values.v3 = v3;
-#if GC_DEBUG
- RANY(obj)->file = rb_sourcefile();
- RANY(obj)->line = rb_sourceline();
- assert(!SPECIAL_CONST_P(obj)); /* check alignment */
+#if RGENGC_CHECK_MODE
+ assert(RVALUE_MARKED(obj) == FALSE);
+ assert(RVALUE_MARKING(obj) == FALSE);
+ assert(RVALUE_OLD_P(obj) == FALSE);
+ assert(RVALUE_WB_UNPROTECTED(obj) == FALSE);
+ if (RVALUE_AGE(obj) > 0) rb_bug("newobj: %s of age (%d) > 0.", obj_info(obj), RVALUE_AGE(obj));
+ if (rgengc_remembered(objspace, (VALUE)obj)) rb_bug("newobj: %s is remembered.", obj_info(obj));
+#endif
+
+#if USE_RGENGC
+ if ((flags & FL_WB_PROTECTED) == 0) {
+ MARK_IN_BITMAP(GET_HEAP_WB_UNPROTECTED_BITS(obj), obj);
+ }
#endif
#if RGENGC_PROFILE
if (flags & FL_WB_PROTECTED) {
- objspace->profile.generated_normal_object_count++;
+ objspace->profile.total_generated_normal_object_count++;
#if RGENGC_PROFILE >= 2
objspace->profile.generated_normal_object_count_types[BUILTIN_TYPE(obj)]++;
#endif
}
else {
- objspace->profile.generated_shady_object_count++;
+ objspace->profile.total_generated_shady_object_count++;
#if RGENGC_PROFILE >= 2
objspace->profile.generated_shady_object_count_types[BUILTIN_TYPE(obj)]++;
#endif
}
#endif
- rgengc_report(5, objspace, "newobj: %p (%s)\n", (void *)obj, obj_type_name(obj));
-
-#if USE_RGENGC && RGENGC_CHECK_MODE
- if (RVALUE_PROMOTED_P(obj)) rb_bug("newobj: %p (%s) is promoted.\n", (void *)obj, obj_type_name(obj));
- if (rgengc_remembered(objspace, (VALUE)obj)) rb_bug("newobj: %p (%s) is remembered.\n", (void *)obj, obj_type_name(obj));
+#if GC_DEBUG
+ RANY(obj)->file = rb_sourcefile();
+ RANY(obj)->line = rb_sourceline();
+ assert(!SPECIAL_CONST_P(obj)); /* check alignment */
#endif
- objspace->profile.total_allocated_object_num++;
+ objspace->total_allocated_objects++;
gc_event_hook(objspace, RUBY_INTERNAL_EVENT_NEWOBJ, obj);
-
+ gc_report(5, objspace, "newobj: %s\n", obj_info(obj));
return obj;
}
@@ -1413,12 +1733,12 @@ is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
/* check if p looks like a pointer using bsearch*/
lo = 0;
- hi = heap_pages_used;
+ hi = heap_allocated_pages;
while (lo < hi) {
mid = (lo + hi) / 2;
page = heap_pages_sorted[mid];
if (page->start <= p) {
- if (p < page->start + page->limit) {
+ if (p < page->start + page->total_slots) {
return TRUE;
}
lo = mid + 1;
@@ -1431,15 +1751,16 @@ is_pointer_to_heap(rb_objspace_t *objspace, void *ptr)
}
static int
-free_method_entry_i(ID key, rb_method_entry_t *me, st_data_t data)
+free_method_entry_i(st_data_t key, st_data_t value, st_data_t data)
{
+ rb_method_entry_t *me = (rb_method_entry_t *)value;
if (!me->mark) {
rb_free_method_entry(me);
}
return ST_CONTINUE;
}
-void
+static void
rb_free_m_tbl(st_table *tbl)
{
st_foreach(tbl, free_method_entry_i, 0);
@@ -1456,8 +1777,9 @@ rb_free_m_tbl_wrapper(struct method_table_wrapper *wrapper)
}
static int
-free_const_entry_i(ID key, rb_const_entry_t *ce, st_data_t data)
+free_const_entry_i(st_data_t key, st_data_t value, st_data_t data)
{
+ rb_const_entry_t *ce = (rb_const_entry_t *)value;
xfree(ce);
return ST_CONTINUE;
}
@@ -1470,20 +1792,21 @@ rb_free_const_table(st_table *tbl)
}
static inline void
-make_deferred(rb_objspace_t *objspace,RVALUE *p)
+make_zombie(rb_objspace_t *objspace, VALUE obj, void (*dfree)(void *), void *data)
{
- p->as.basic.flags = T_ZOMBIE;
- p->as.free.next = heap_pages_deferred_final;
- heap_pages_deferred_final = p;
+ struct RZombie *zombie = RZOMBIE(obj);
+ zombie->basic.flags = T_ZOMBIE;
+ zombie->dfree = dfree;
+ zombie->data = data;
+ zombie->next = heap_pages_deferred_final;
+ heap_pages_deferred_final = (VALUE)zombie;
}
static inline void
-make_io_deferred(rb_objspace_t *objspace,RVALUE *p)
+make_io_zombie(rb_objspace_t *objspace, VALUE obj)
{
- rb_io_t *fptr = p->as.file.fptr;
- make_deferred(objspace, p);
- p->as.data.dfree = (void (*)(void*))rb_io_fptr_finalize;
- p->as.data.data = fptr;
+ rb_io_t *fptr = RANY(obj)->as.file.fptr;
+ make_zombie(objspace, obj, (void (*)(void*))rb_io_fptr_finalize, fptr);
}
static int
@@ -1506,8 +1829,16 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
}
#if USE_RGENGC
- if (MARKED_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj),obj))
- CLEAR_IN_BITMAP(GET_HEAP_OLDGEN_BITS(obj),obj);
+ if (RVALUE_WB_UNPROTECTED(obj)) CLEAR_IN_BITMAP(GET_HEAP_WB_UNPROTECTED_BITS(obj), obj);
+
+#if RGENGC_CHECK_MODE
+#define CHECK(x) if (x(obj) != FALSE) rb_bug("obj_free: " #x "(%s) != FALSE", obj_info(obj))
+ CHECK(RVALUE_WB_UNPROTECTED);
+ CHECK(RVALUE_MARKED);
+ CHECK(RVALUE_MARKING);
+ CHECK(RVALUE_LONG_LIVED);
+#undef CHECK
+#endif
#endif
switch (BUILTIN_TYPE(obj)) {
@@ -1565,22 +1896,30 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
case T_DATA:
if (DATA_PTR(obj)) {
int free_immediately = FALSE;
+ void (*dfree)(void *);
+ void *data = DATA_PTR(obj);
if (RTYPEDDATA_P(obj)) {
free_immediately = (RANY(obj)->as.typeddata.type->flags & RUBY_TYPED_FREE_IMMEDIATELY) != 0;
- RDATA(obj)->dfree = RANY(obj)->as.typeddata.type->function.dfree;
- if (0 && free_immediately == 0) /* to expose non-free-immediate T_DATA */
+ dfree = RANY(obj)->as.typeddata.type->function.dfree;
+ if (0 && free_immediately == 0) {
+ /* to expose non-free-immediate T_DATA */
fprintf(stderr, "not immediate -> %s\n", RANY(obj)->as.typeddata.type->wrap_struct_name);
+ }
}
- if (RANY(obj)->as.data.dfree == RUBY_DEFAULT_FREE) {
- xfree(DATA_PTR(obj));
+ else {
+ dfree = RANY(obj)->as.data.dfree;
}
- else if (RANY(obj)->as.data.dfree) {
- if (free_immediately) {
- (RDATA(obj)->dfree)(DATA_PTR(obj));
+
+ if (dfree) {
+ if (dfree == RUBY_DEFAULT_FREE) {
+ xfree(data);
+ }
+ else if (free_immediately) {
+ (*dfree)(data);
}
else {
- make_deferred(objspace, RANY(obj));
+ make_zombie(objspace, obj, dfree, data);
return 1;
}
}
@@ -1597,7 +1936,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
break;
case T_FILE:
if (RANY(obj)->as.file.fptr) {
- make_io_deferred(objspace, RANY(obj));
+ make_io_zombie(objspace, obj);
return 1;
}
break;
@@ -1620,26 +1959,13 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
break;
case T_BIGNUM:
- if (!(RBASIC(obj)->flags & RBIGNUM_EMBED_FLAG) && RBIGNUM_DIGITS(obj)) {
- xfree(RBIGNUM_DIGITS(obj));
+ if (!(RBASIC(obj)->flags & BIGNUM_EMBED_FLAG) && BIGNUM_DIGITS(obj)) {
+ xfree(BIGNUM_DIGITS(obj));
}
break;
+
case T_NODE:
- switch (nd_type(obj)) {
- case NODE_SCOPE:
- if (RANY(obj)->as.node.u1.tbl) {
- xfree(RANY(obj)->as.node.u1.tbl);
- }
- break;
- case NODE_ARGS:
- if (RANY(obj)->as.node.u3.args) {
- xfree(RANY(obj)->as.node.u3.args);
- }
- break;
- case NODE_ALLOCA:
- xfree(RANY(obj)->as.node.u1.node);
- break;
- }
+ rb_gc_free_node(obj);
break; /* no need to free iv_tbl */
case T_STRUCT:
@@ -1649,12 +1975,24 @@ obj_free(rb_objspace_t *objspace, VALUE obj)
}
break;
+ case T_SYMBOL:
+ {
+ rb_gc_free_dsymbol(obj);
+ }
+ break;
+
default:
rb_bug("gc_sweep(): unknown data type 0x%x(%p) 0x%"PRIxVALUE,
BUILTIN_TYPE(obj), (void*)obj, RBASIC(obj)->flags);
}
- return 0;
+ if (FL_TEST(obj, FL_FINALIZE)) {
+ make_zombie(objspace, obj, 0, 0);
+ return 1;
+ }
+ else {
+ return 0;
+ }
}
void
@@ -1662,12 +2000,13 @@ Init_heap(void)
{
rb_objspace_t *objspace = &rb_objspace;
+ gc_stress_set(objspace, ruby_initial_gc_stress);
+
#if RGENGC_ESTIMATE_OLDMALLOC
objspace->rgengc.oldmalloc_increase_limit = gc_params.oldmalloc_limit_min;
#endif
heap_add_pages(objspace, heap_eden, gc_params.heap_init_slots / HEAP_OBJ_LIMIT);
-
init_mark_stack(&objspace->mark_stack);
#ifdef USE_SIGALTSTACK
@@ -1702,16 +2041,16 @@ objspace_each_objects(VALUE arg)
struct each_obj_args *args = (struct each_obj_args *)arg;
i = 0;
- while (i < heap_pages_used) {
+ while (i < heap_allocated_pages) {
while (0 < i && last_body < heap_pages_sorted[i-1]->body) i--;
- while (i < heap_pages_used && heap_pages_sorted[i]->body <= last_body) i++;
- if (heap_pages_used <= i) break;
+ while (i < heap_allocated_pages && heap_pages_sorted[i]->body <= last_body) i++;
+ if (heap_allocated_pages <= i) break;
page = heap_pages_sorted[i];
last_body = page->body;
pstart = page->start;
- pend = pstart + page->limit;
+ pend = pstart + page->total_slots;
if ((*args->callback)(pstart, pend, sizeof(RVALUE), args->data)) {
break;
@@ -1721,6 +2060,15 @@ objspace_each_objects(VALUE arg)
return Qnil;
}
+static VALUE
+incremental_enable(void)
+{
+ rb_objspace_t *objspace = &rb_objspace;
+
+ objspace->flags.dont_incremental = FALSE;
+ return Qnil;
+}
+
/*
* rb_objspace_each_objects() is special C API to walk through
* Ruby object space. This C API is too difficult to use it.
@@ -1762,22 +2110,32 @@ rb_objspace_each_objects(each_obj_callback *callback, void *data)
{
struct each_obj_args args;
rb_objspace_t *objspace = &rb_objspace;
- int prev_dont_lazy_sweep = objspace->flags.dont_lazy_sweep;
+ int prev_dont_incremental = objspace->flags.dont_incremental;
- gc_rest_sweep(objspace);
- objspace->flags.dont_lazy_sweep = TRUE;
+ gc_rest(objspace);
+ objspace->flags.dont_incremental = TRUE;
args.callback = callback;
args.data = data;
- if (prev_dont_lazy_sweep) {
+ if (prev_dont_incremental) {
objspace_each_objects((VALUE)&args);
}
else {
- rb_ensure(objspace_each_objects, (VALUE)&args, lazy_sweep_enable, Qnil);
+ rb_ensure(objspace_each_objects, (VALUE)&args, incremental_enable, Qnil);
}
}
+void
+rb_objspace_each_objects_without_setup(each_obj_callback *callback, void *data)
+{
+ struct each_obj_args args;
+ args.callback = callback;
+ args.data = data;
+
+ objspace_each_objects((VALUE)&args);
+}
+
struct os_each_struct {
size_t num;
VALUE of;
@@ -1922,18 +2280,18 @@ static void
should_be_callable(VALUE block)
{
if (!rb_obj_respond_to(block, rb_intern("call"), TRUE)) {
- rb_raise(rb_eArgError, "wrong type argument %s (should be callable)",
- rb_obj_classname(block));
+ rb_raise(rb_eArgError, "wrong type argument %"PRIsVALUE" (should be callable)",
+ rb_obj_class(block));
}
}
static void
should_be_finalizable(VALUE obj)
{
- rb_check_frozen(obj);
if (!FL_ABLE(obj)) {
rb_raise(rb_eArgError, "cannot define finalizer for %s",
rb_obj_classname(obj));
}
+ rb_check_frozen(obj);
}
/*
@@ -2045,56 +2403,49 @@ run_finalizer(rb_objspace_t *objspace, VALUE obj, VALUE table)
}
static void
-run_final(rb_objspace_t *objspace, VALUE obj)
+run_final(rb_objspace_t *objspace, VALUE zombie)
{
- RUBY_DATA_FUNC free_func = 0;
st_data_t key, table;
- heap_pages_final_slots--;
-
- RBASIC_CLEAR_CLASS(obj);
-
- if (RTYPEDDATA_P(obj)) {
- free_func = RTYPEDDATA_TYPE(obj)->function.dfree;
- }
- else {
- free_func = RDATA(obj)->dfree;
- }
- if (free_func) {
- (*free_func)(DATA_PTR(obj));
+ if (RZOMBIE(zombie)->dfree) {
+ RZOMBIE(zombie)->dfree(RZOMBIE(zombie)->data);
}
- key = (st_data_t)obj;
+ key = (st_data_t)zombie;
if (st_delete(finalizer_table, &key, &table)) {
- run_finalizer(objspace, obj, (VALUE)table);
+ run_finalizer(objspace, zombie, (VALUE)table);
}
}
static void
-finalize_list(rb_objspace_t *objspace, RVALUE *p)
+finalize_list(rb_objspace_t *objspace, VALUE zombie)
{
- while (p) {
- RVALUE *tmp = p->as.free.next;
- struct heap_page *page = GET_HEAP_PAGE(p);
+ while (zombie) {
+ VALUE next_zombie = RZOMBIE(zombie)->next;
+ struct heap_page *page = GET_HEAP_PAGE(zombie);
- run_final(objspace, (VALUE)p);
- objspace->profile.total_freed_object_num++;
+ run_final(objspace, zombie);
+ RZOMBIE(zombie)->basic.flags = 0;
+ heap_pages_final_slots--;
page->final_slots--;
- heap_page_add_freeobj(objspace, GET_HEAP_PAGE(p), (VALUE)p);
+ page->free_slots++;
+ heap_page_add_freeobj(objspace, GET_HEAP_PAGE(zombie), zombie);
+
heap_pages_swept_slots++;
+ objspace->profile.total_freed_objects++;
- p = tmp;
+ zombie = next_zombie;
}
}
static void
finalize_deferred(rb_objspace_t *objspace)
{
- RVALUE *p;
+ VALUE zombie;
- while ((p = ATOMIC_PTR_EXCHANGE(heap_pages_deferred_final, 0)) != 0) {
- finalize_list(objspace, p);
+ while ((zombie = (VALUE)ATOMIC_PTR_EXCHANGE(heap_pages_deferred_final, 0)) != 0) {
+ finalize_list(objspace, zombie);
}
}
@@ -2143,6 +2494,9 @@ force_chain_object(st_data_t key, st_data_t val, st_data_t arg)
void
rb_gc_call_finalizer_at_exit(void)
{
+#if RGENGC_CHECK_MODE >= 2
+ gc_verify_internal_consistency(Qnil);
+#endif
rb_objspace_call_finalizer(&rb_objspace);
}
@@ -2152,7 +2506,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
RVALUE *p, *pend;
size_t i;
- gc_rest_sweep(objspace);
+ gc_rest(objspace);
if (ATOMIC_EXCHANGE(finalizing, 1)) return;
@@ -2175,11 +2529,11 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
}
/* finalizers are part of garbage collection */
- during_gc++;
+ gc_enter(objspace, "rb_objspace_call_finalizer");
/* run data object's finalizers */
- for (i = 0; i < heap_pages_used; i++) {
- p = heap_pages_sorted[i]->start; pend = p + heap_pages_sorted[i]->limit;
+ for (i = 0; i < heap_allocated_pages; i++) {
+ p = heap_pages_sorted[i]->start; pend = p + heap_pages_sorted[i]->total_slots;
while (p < pend) {
switch (BUILTIN_TYPE(p)) {
case T_DATA:
@@ -2195,19 +2549,21 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace)
xfree(DATA_PTR(p));
}
else if (RANY(p)->as.data.dfree) {
- make_deferred(objspace, RANY(p));
+ make_zombie(objspace, (VALUE)p, RANY(p)->as.data.dfree, RANY(p)->as.data.data);
}
break;
case T_FILE:
if (RANY(p)->as.file.fptr) {
- make_io_deferred(objspace, RANY(p));
+ make_io_zombie(objspace, (VALUE)p);
}
break;
}
p++;
}
}
- during_gc = 0;
+
+ gc_exit(objspace, "rb_objspace_call_finalizer");
+
if (heap_pages_deferred_final) {
finalize_list(objspace, heap_pages_deferred_final);
}
@@ -2230,7 +2586,7 @@ static inline int
heap_is_swept_object(rb_objspace_t *objspace, rb_heap_t *heap, VALUE ptr)
{
struct heap_page *page = GET_HEAP_PAGE(ptr);
- return page->before_sweep ? FALSE : TRUE;
+ return page->flags.before_sweep ? FALSE : TRUE;
}
static inline int
@@ -2244,37 +2600,44 @@ is_swept_object(rb_objspace_t *objspace, VALUE ptr)
}
}
+/* garbage objects will be collected soon. */
static inline int
-is_dead_object(rb_objspace_t *objspace, VALUE ptr)
+is_garbage_object(rb_objspace_t *objspace, VALUE ptr)
{
- if (!is_lazy_sweeping(heap_eden) || MARKED_IN_BITMAP(GET_HEAP_MARK_BITS(ptr), ptr)) return FALSE;
- if (!is_swept_object(objspace, ptr)) return TRUE;
- return FALSE;
+ if (!is_lazy_sweeping(heap_eden) ||
+ is_swept_object(objspace, ptr) ||
+ MARKED_IN_BITMAP(GET_HEAP_MARK_BITS(ptr), ptr)) {
+
+ return FALSE;
+ }
+ else {
+ return TRUE;
+ }
}
static inline int
is_live_object(rb_objspace_t *objspace, VALUE ptr)
{
switch (BUILTIN_TYPE(ptr)) {
- case 0: case T_ZOMBIE:
+ case T_NONE:
+ case T_ZOMBIE:
+ return FALSE;
+ }
+
+ if (!is_garbage_object(objspace, ptr)) {
+ return TRUE;
+ }
+ else {
return FALSE;
}
- if (is_dead_object(objspace, ptr)) return FALSE;
- return TRUE;
}
static inline int
is_markable_object(rb_objspace_t *objspace, VALUE obj)
{
- if (rb_special_const_p(obj)) return 0; /* special const is not markable */
-
- if (RGENGC_CHECK_MODE) {
- if (!is_pointer_to_heap(objspace, (void *)obj)) rb_bug("is_markable_object: %p is not pointer to heap", (void *)obj);
- if (BUILTIN_TYPE(obj) == T_NONE) rb_bug("is_markable_object: %p is T_NONE", (void *)obj);
- if (BUILTIN_TYPE(obj) == T_ZOMBIE) rb_bug("is_markable_object: %p is T_ZOMBIE", (void *)obj);
- }
-
- return 1;
+ if (rb_special_const_p(obj)) return FALSE; /* special const is not markable */
+ check_rvalue_consistency(obj);
+ return TRUE;
}
int
@@ -2284,6 +2647,13 @@ rb_objspace_markable_object_p(VALUE obj)
return is_markable_object(objspace, obj) && is_live_object(objspace, obj);
}
+int
+rb_objspace_garbage_object_p(VALUE obj)
+{
+ rb_objspace_t *objspace = &rb_objspace;
+ return is_garbage_object(objspace, obj);
+}
+
/*
* call-seq:
* ObjectSpace._id2ref(object_id) -> an_object
@@ -2345,28 +2715,18 @@ id2ref(VALUE obj, VALUE objid)
*
* Returns an integer identifier for +obj+.
*
- * The same number will be returned on all calls to +id+ for a given object,
+ * The same number will be returned on all calls to +object_id+ for a given object,
* and no two active objects will share an id.
*
- * Object#object_id is a different concept from the +:name+ notation, which
- * returns the symbol id of +name+.
+ * Note that some objects of builtin classes are reused for optimization.
+ * This is the case for immediate values and frozen string litterals.
+ * Immediate values are not passed by reference but are passed by value:
+ * +nil+, +true+, +false+, Fixnums, Symbols. Some Floats may be immediates too.
*
- * Replaces the deprecated Object#id.
- */
-
-/*
- * call-seq:
- * obj.hash -> fixnum
- *
- * Generates a Fixnum hash value for this object.
- *
- * This function must have the property that <code>a.eql?(b)</code> implies
- * <code>a.hash == b.hash</code>.
- *
- * The hash value is used by Hash class.
- *
- * Any hash value that exceeds the capacity of a Fixnum will be truncated
- * before being used.
+ * Object.new.object_id == Object.new.object_id # => false
+ * (21 * 2).object_id == (21 * 2).object_id # => true
+ * "hello".object_id == "hello".object_id # => false
+ * "hi".freeze.object_id == "hi".freeze.object_id # => true
*/
VALUE
@@ -2400,7 +2760,7 @@ rb_obj_id(VALUE obj)
* 24 if 32-bit, double is 8-byte aligned
* 40 if 64-bit
*/
- if (SYMBOL_P(obj)) {
+ if (STATIC_SYM_P(obj)) {
return (SYM2ID(obj) * sizeof(RVALUE) + (4 << 2)) | FIXNUM_FLAG;
}
else if (FLONUM_P(obj)) {
@@ -2423,7 +2783,7 @@ size_t rb_generic_ivar_memsize(VALUE);
#include "regint.h"
static size_t
-obj_memsize_of(VALUE obj, int use_tdata)
+obj_memsize_of(VALUE obj, int use_all_types)
{
size_t size = 0;
@@ -2483,7 +2843,7 @@ obj_memsize_of(VALUE obj, int use_tdata)
}
break;
case T_DATA:
- if (use_tdata) size += rb_objspace_data_type_memsize(obj);
+ if (use_all_types) size += rb_objspace_data_type_memsize(obj);
break;
case T_MATCH:
if (RMATCH(obj)->rmatch) {
@@ -2506,25 +2866,18 @@ obj_memsize_of(VALUE obj, int use_tdata)
break;
case T_FLOAT:
+ case T_SYMBOL:
break;
case T_BIGNUM:
- if (!(RBASIC(obj)->flags & RBIGNUM_EMBED_FLAG) && RBIGNUM_DIGITS(obj)) {
- size += RBIGNUM_LEN(obj) * sizeof(BDIGIT);
+ if (!(RBASIC(obj)->flags & BIGNUM_EMBED_FLAG) && BIGNUM_DIGITS(obj)) {
+ size += BIGNUM_LEN(obj) * sizeof(BDIGIT);
}
break;
+
case T_NODE:
- switch (nd_type(obj)) {
- case NODE_SCOPE:
- if (RNODE(obj)->u1.tbl) {
- /* TODO: xfree(RANY(obj)->as.node.u1.tbl); */
- }
- break;
- case NODE_ALLOCA:
- /* TODO: xfree(RANY(obj)->as.node.u1.node); */
- ;
- }
- break; /* no need to free iv_tbl */
+ if (use_all_types) size += rb_node_memsize(obj);
+ break;
case T_STRUCT:
if ((RBASIC(obj)->flags & RSTRUCT_EMBED_LEN_MASK) == 0 &&
@@ -2603,11 +2956,11 @@ count_objects(int argc, VALUE *argv, VALUE os)
counts[i] = 0;
}
- for (i = 0; i < heap_pages_used; i++) {
+ for (i = 0; i < heap_allocated_pages; i++) {
struct heap_page *page = heap_pages_sorted[i];
RVALUE *p, *pend;
- p = page->start; pend = p + page->limit;
+ p = page->start; pend = p + page->total_slots;
for (;p < pend; p++) {
if (p->as.basic.flags) {
counts[BUILTIN_TYPE(p)]++;
@@ -2616,7 +2969,7 @@ count_objects(int argc, VALUE *argv, VALUE os)
freed++;
}
}
- total += page->limit;
+ total += page->total_slots;
}
if (hash == Qnil) {
@@ -2673,31 +3026,22 @@ count_objects(int argc, VALUE *argv, VALUE os)
/* Sweeping */
-static VALUE
-lazy_sweep_enable(void)
-{
- rb_objspace_t *objspace = &rb_objspace;
-
- objspace->flags.dont_lazy_sweep = FALSE;
- return Qnil;
-}
-
static size_t
-objspace_live_slot(rb_objspace_t *objspace)
+objspace_available_slots(rb_objspace_t *objspace)
{
- return objspace->profile.total_allocated_object_num - objspace->profile.total_freed_object_num;
+ return heap_eden->total_slots + heap_tomb->total_slots;
}
static size_t
-objspace_total_slot(rb_objspace_t *objspace)
+objspace_live_slots(rb_objspace_t *objspace)
{
- return heap_eden->total_slots + heap_tomb->total_slots;
+ return (objspace->total_allocated_objects - objspace->profile.total_freed_objects) - heap_pages_final_slots;
}
static size_t
-objspace_free_slot(rb_objspace_t *objspace)
+objspace_free_slots(rb_objspace_t *objspace)
{
- return objspace_total_slot(objspace) - (objspace_live_slot(objspace) - heap_pages_final_slots);
+ return objspace_available_slots(objspace) - objspace_live_slots(objspace) - heap_pages_final_slots;
}
static void
@@ -2705,26 +3049,28 @@ gc_setup_mark_bits(struct heap_page *page)
{
#if USE_RGENGC
/* copy oldgen bitmap to mark bitmap */
- memcpy(&page->mark_bits[0], &page->oldgen_bits[0], HEAP_BITMAP_SIZE);
+ memcpy(&page->mark_bits[0], &page->long_lived_bits[0], HEAP_BITMAP_SIZE);
#else
/* clear mark bitmap */
memset(&page->mark_bits[0], 0, HEAP_BITMAP_SIZE);
#endif
}
+/* TRUE : has empty slots */
+/* FALSE: no empty slots (or move to tomb heap because no live slots) */
static inline void
gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_page)
{
int i;
- size_t empty_slots = 0, freed_slots = 0, final_slots = 0;
+ int empty_slots = 0, freed_slots = 0, final_slots = 0;
RVALUE *p, *pend,*offset;
bits_t *bits, bitset;
- rgengc_report(1, objspace, "page_sweep: start.\n");
+ gc_report(2, objspace, "page_sweep: start.\n");
- sweep_page->before_sweep = 0;
+ sweep_page->flags.before_sweep = FALSE;
- p = sweep_page->start; pend = p + sweep_page->limit;
+ p = sweep_page->start; pend = p + sweep_page->total_slots;
offset = p - NUM_IN_PAGE(p);
bits = sweep_page->mark_bits;
@@ -2737,30 +3083,35 @@ gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_
if (bitset) {
p = offset + i * BITS_BITLENGTH;
do {
- if ((bitset & 1) && BUILTIN_TYPE(p) != T_ZOMBIE) {
- if (p->as.basic.flags) {
- rgengc_report(3, objspace, "page_sweep: free %p (%s)\n", p, obj_type_name((VALUE)p));
+ if (bitset & 1) {
+ switch (BUILTIN_TYPE(p)) {
+ default: { /* majority case */
+ gc_report(2, objspace, "page_sweep: free %s\n", obj_info((VALUE)p));
#if USE_RGENGC && RGENGC_CHECK_MODE
- if (objspace->rgengc.during_minor_gc && RVALUE_OLD_P((VALUE)p)) rb_bug("page_sweep: %p (%s) is old while minor GC.\n", p, obj_type_name((VALUE)p));
- if (rgengc_remembered(objspace, (VALUE)p)) rb_bug("page_sweep: %p (%s) is remembered.\n", p, obj_type_name((VALUE)p));
-#endif
- if (obj_free(objspace, (VALUE)p)) {
- final_slots++;
- }
- else if (FL_TEST(p, FL_FINALIZE)) {
- RDATA(p)->dfree = 0;
- make_deferred(objspace,p);
- final_slots++;
- }
- else {
- (void)VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
- heap_page_add_freeobj(objspace, sweep_page, (VALUE)p);
- rgengc_report(3, objspace, "page_sweep: %p (%s) is added to freelist\n", p, obj_type_name((VALUE)p));
- freed_slots++;
- }
- }
- else {
- empty_slots++;
+ if (!is_full_marking(objspace)) {
+ if (RVALUE_OLD_P((VALUE)p)) rb_bug("page_sweep: %s - old while minor GC.", obj_info((VALUE)p));
+ if (rgengc_remembered(objspace, (VALUE)p)) rb_bug("page_sweep: %s - remembered.", obj_info((VALUE)p));
+ }
+#endif
+ if (obj_free(objspace, (VALUE)p)) {
+ final_slots++;
+ }
+ else {
+ (void)VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
+ heap_page_add_freeobj(objspace, sweep_page, (VALUE)p);
+ gc_report(3, objspace, "page_sweep: %s is added to freelist\n", obj_info((VALUE)p));
+ freed_slots++;
+ }
+ break;
+ }
+
+ /* minor cases */
+ case T_ZOMBIE:
+ /* already counted */
+ break;
+ case T_NONE:
+ empty_slots++; /* already freed */
+ break;
}
}
p++;
@@ -2778,29 +3129,15 @@ gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_
record->empty_objects += empty_slots;
}
#endif
+ if (0) fprintf(stderr, "gc_page_sweep(%d): total_slots: %d, freed_slots: %d, empty_slots: %d, final_slots: %d\n",
+ (int)rb_gc_count(),
+ (int)sweep_page->total_slots,
+ freed_slots, empty_slots, final_slots);
- if (final_slots + freed_slots + empty_slots == sweep_page->limit) {
- /* there are no living objects -> move this page to tomb heap */
- heap_unlink_page(objspace, heap, sweep_page);
- heap_add_page(objspace, heap_tomb, sweep_page);
- }
- else {
- if (freed_slots + empty_slots > 0) {
- heap_add_freepage(objspace, heap, sweep_page);
- }
- else {
- sweep_page->free_next = NULL;
- }
- }
- heap_pages_swept_slots += freed_slots + empty_slots;
- objspace->profile.total_freed_object_num += freed_slots;
+ heap_pages_swept_slots += sweep_page->free_slots = freed_slots + empty_slots;
+ objspace->profile.total_freed_objects += freed_slots;
heap_pages_final_slots += final_slots;
- sweep_page->final_slots = final_slots;
-
- if (0) fprintf(stderr, "gc_page_sweep(%d): freed?: %d, limt: %d, freed_slots: %d, empty_slots: %d, final_slots: %d\n",
- (int)rb_gc_count(),
- final_slots + freed_slots + empty_slots == sweep_page->limit,
- (int)sweep_page->limit, (int)freed_slots, (int)empty_slots, (int)final_slots);
+ sweep_page->final_slots += final_slots;
if (heap_pages_deferred_final && !finalizing) {
rb_thread_t *th = GET_THREAD();
@@ -2809,28 +3146,42 @@ gc_page_sweep(rb_objspace_t *objspace, rb_heap_t *heap, struct heap_page *sweep_
}
}
- rgengc_report(1, objspace, "page_sweep: end.\n");
+ gc_report(2, objspace, "page_sweep: end.\n");
}
/* allocate additional minimum page to work */
static void
gc_heap_prepare_minimum_pages(rb_objspace_t *objspace, rb_heap_t *heap)
{
- if (!heap->free_pages) {
+ if (!heap->free_pages && heap_increment(objspace, heap) == FALSE) {
/* there is no free after page_sweep() */
- heap_set_increment(objspace, 0);
+ heap_set_increment(objspace, 1);
if (!heap_increment(objspace, heap)) { /* can't allocate additional free objects */
- during_gc = 0;
rb_memerror();
}
}
}
static void
-gc_before_heap_sweep(rb_objspace_t *objspace, rb_heap_t *heap)
+gc_stat_transition(rb_objspace_t *objspace, enum gc_stat stat)
+{
+#if RGENGC_CHECK_MODE
+ enum gc_stat prev_stat = objspace->flags.stat;
+ switch (prev_stat) {
+ case gc_stat_none: assert(stat == gc_stat_marking); break;
+ case gc_stat_marking: assert(stat == gc_stat_sweeping); break;
+ case gc_stat_sweeping: assert(stat == gc_stat_none); break;
+ }
+#endif
+ objspace->flags.stat = stat;
+}
+
+static void
+gc_sweep_start_heap(rb_objspace_t *objspace, rb_heap_t *heap)
{
heap->sweep_pages = heap->pages;
heap->free_pages = NULL;
+ heap->pooled_pages = NULL;
if (heap->using_page) {
RVALUE **p = &heap->using_page->freelist;
@@ -2847,26 +3198,27 @@ gc_before_heap_sweep(rb_objspace_t *objspace, rb_heap_t *heap)
__attribute__((noinline))
#endif
static void
-gc_before_sweep(rb_objspace_t *objspace)
+gc_sweep_start(rb_objspace_t *objspace)
{
rb_heap_t *heap;
size_t total_limit_slot;
- rgengc_report(1, objspace, "gc_before_sweep\n");
+ gc_stat_transition(objspace, gc_stat_sweeping);
/* sweep unlinked method entries */
if (GET_VM()->unlinked_method_entry_list) {
rb_sweep_method_entry(GET_VM());
}
- heap_pages_swept_slots = 0;
- total_limit_slot = objspace_total_slot(objspace);
+ /* sometimes heap_allocatable_pages is not 0 */
+ heap_pages_swept_slots = heap_allocatable_pages * HEAP_OBJ_LIMIT;
+ total_limit_slot = objspace_available_slots(objspace);
- heap_pages_min_free_slots = (size_t)(total_limit_slot * 0.30);
+ heap_pages_min_free_slots = (size_t)(total_limit_slot * GC_HEAP_FREE_SLOTS_MIN_RATIO);
if (heap_pages_min_free_slots < gc_params.heap_free_slots) {
heap_pages_min_free_slots = gc_params.heap_free_slots;
}
- heap_pages_max_free_slots = (size_t)(total_limit_slot * 0.80);
+ heap_pages_max_free_slots = (size_t)(total_limit_slot * GC_HEAP_FREE_SLOTS_MAX_RATIO);
if (heap_pages_max_free_slots < gc_params.heap_init_slots) {
heap_pages_max_free_slots = gc_params.heap_init_slots;
}
@@ -2874,207 +3226,141 @@ gc_before_sweep(rb_objspace_t *objspace)
(int)heap_pages_min_free_slots, (int)heap_pages_max_free_slots);
heap = heap_eden;
- gc_before_heap_sweep(objspace, heap);
-
- gc_prof_set_malloc_info(objspace);
-
- /* reset malloc info */
- if (0) fprintf(stderr, "%d\t%d\t%d\n", (int)rb_gc_count(), (int)malloc_increase, (int)malloc_limit);
-
- {
- size_t inc = ATOMIC_SIZE_EXCHANGE(malloc_increase, 0);
- size_t old_limit = malloc_limit;
-
- if (inc > malloc_limit) {
- malloc_limit = (size_t)(inc * gc_params.malloc_limit_growth_factor);
- if (gc_params.malloc_limit_max > 0 && /* ignore max-check if 0 */
- malloc_limit > gc_params.malloc_limit_max) {
- malloc_limit = gc_params.malloc_limit_max;
- }
- }
- else {
- malloc_limit = (size_t)(malloc_limit * 0.98); /* magic number */
- if (malloc_limit < gc_params.malloc_limit_min) {
- malloc_limit = gc_params.malloc_limit_min;
- }
- }
-
- if (0) {
- if (old_limit != malloc_limit) {
- fprintf(stderr, "[%"PRIuSIZE"] malloc_limit: %"PRIuSIZE" -> %"PRIuSIZE"\n",
- rb_gc_count(), old_limit, malloc_limit);
- }
- else {
- fprintf(stderr, "[%"PRIuSIZE"] malloc_limit: not changed (%"PRIuSIZE")\n",
- rb_gc_count(), malloc_limit);
- }
- }
- }
-
- /* reset oldmalloc info */
-#if RGENGC_ESTIMATE_OLDMALLOC
- if (objspace->rgengc.during_minor_gc) {
- if (objspace->rgengc.oldmalloc_increase > objspace->rgengc.oldmalloc_increase_limit) {
- objspace->rgengc.need_major_gc = GPR_FLAG_MAJOR_BY_OLDMALLOC;;
- objspace->rgengc.oldmalloc_increase_limit =
- (size_t)(objspace->rgengc.oldmalloc_increase_limit * gc_params.oldmalloc_limit_growth_factor);
-
- if (objspace->rgengc.oldmalloc_increase_limit > gc_params.oldmalloc_limit_max) {
- objspace->rgengc.oldmalloc_increase_limit = gc_params.oldmalloc_limit_max;
- }
- }
-
- if (0) fprintf(stderr, "%d\t%d\t%u\t%u\t%d\n",
- (int)rb_gc_count(),
- (int)objspace->rgengc.need_major_gc,
- (unsigned int)objspace->rgengc.oldmalloc_increase,
- (unsigned int)objspace->rgengc.oldmalloc_increase_limit,
- (unsigned int)gc_params.oldmalloc_limit_max);
- }
- else {
- /* major GC */
- objspace->rgengc.oldmalloc_increase = 0;
-
- if ((objspace->profile.latest_gc_info & GPR_FLAG_MAJOR_BY_OLDMALLOC) == 0) {
- objspace->rgengc.oldmalloc_increase_limit =
- (size_t)(objspace->rgengc.oldmalloc_increase_limit / ((gc_params.oldmalloc_limit_growth_factor - 1)/10 + 1));
- if (objspace->rgengc.oldmalloc_increase_limit < gc_params.oldmalloc_limit_min) {
- objspace->rgengc.oldmalloc_increase_limit = gc_params.oldmalloc_limit_min;
- }
- }
- }
-
-#endif
-
+ gc_sweep_start_heap(objspace, heap);
}
static void
-gc_after_sweep(rb_objspace_t *objspace)
+gc_sweep_finish(rb_objspace_t *objspace)
{
rb_heap_t *heap = heap_eden;
- rgengc_report(1, objspace, "after_gc_sweep: heap->total_slots: %d, heap->swept_slots: %d, min_free_slots: %d\n",
+ gc_report(1, objspace, "gc_sweep_finish: heap->total_slots: %d, heap->swept_slots: %d, min_free_slots: %d\n",
(int)heap->total_slots, (int)heap_pages_swept_slots, (int)heap_pages_min_free_slots);
- if (heap_pages_swept_slots < heap_pages_min_free_slots) {
-#if USE_RGENGC
- if (objspace->rgengc.during_minor_gc && objspace->profile.count - objspace->rgengc.last_major_gc > 2 /* magic number */) {
- objspace->rgengc.need_major_gc = GPR_FLAG_MAJOR_BY_NOFREE;
- }
- else {
- heap_set_increment(objspace, (heap_pages_min_free_slots - heap_pages_swept_slots) / HEAP_OBJ_LIMIT);
- heap_increment(objspace, heap);
- }
-#else
- heap_set_increment(objspace, (heap_pages_min_free_slots - heap_pages_swept_slots) / HEAP_OBJ_LIMIT);
- heap_increment(objspace, heap);
-#endif
- }
-
gc_prof_set_heap_info(objspace);
heap_pages_free_unused_pages(objspace);
/* if heap_pages has unused pages, then assign them to increment */
- if (heap_pages_increment < heap_tomb->page_length) {
- heap_pages_increment = heap_tomb->page_length;
+ if (heap_allocatable_pages < heap_tomb->page_length) {
+ heap_allocatable_pages = heap_tomb->page_length;
}
-#if RGENGC_PROFILE > 0
- if (0) {
- fprintf(stderr, "%d\t%d\t%d\t%d\t%d\t%d\t%d\n",
- (int)rb_gc_count(),
- (int)objspace->profile.major_gc_count,
- (int)objspace->profile.minor_gc_count,
- (int)objspace->profile.promote_infant_count,
-#if RGENGC_THREEGEN
- (int)objspace->profile.promote_young_count,
-#else
- 0,
-#endif
- (int)objspace->profile.remembered_normal_object_count,
- (int)objspace->rgengc.remembered_shady_object_count);
- }
-#endif
-
gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_END_SWEEP, 0);
+ gc_stat_transition(objspace, gc_stat_none);
+
+#if RGENGC_CHECK_MODE >= 2
+ gc_verify_internal_consistency(Qnil);
+#endif
}
static int
-gc_heap_lazy_sweep(rb_objspace_t *objspace, rb_heap_t *heap)
+gc_sweep_step(rb_objspace_t *objspace, rb_heap_t *heap)
{
- struct heap_page *page = heap->sweep_pages, *next;
- int result = FALSE;
+ struct heap_page *sweep_page = heap->sweep_pages, *next;
+ int need_pool = will_be_incremental_marking(objspace) ? TRUE : FALSE;
+ int unlink_limit = 3;
- if (page == NULL) return FALSE;
+ gc_report(2, objspace, "gc_sweep_step (need_pool: %d)\n", need_pool);
+
+ if (sweep_page == NULL) return FALSE;
#if GC_ENABLE_LAZY_SWEEP
gc_prof_sweep_timer_start(objspace);
#endif
- while (page) {
- heap->sweep_pages = next = page->next;
-
- gc_page_sweep(objspace, heap, page);
+ while (sweep_page) {
+ heap->sweep_pages = next = sweep_page->next;
+ gc_page_sweep(objspace, heap, sweep_page);
- if (!next) gc_after_sweep(objspace);
+ if (sweep_page->final_slots + sweep_page->free_slots == sweep_page->total_slots &&
+ unlink_limit > 0) {
+ unlink_limit--;
+ /* there are no living objects -> move this page to tomb heap */
+ heap_unlink_page(objspace, heap, sweep_page);
+ heap_add_page(objspace, heap_tomb, sweep_page);
+ }
+ else if (sweep_page->free_slots > 0) {
+ if (need_pool) {
+ need_pool = FALSE;
+ heap_add_poolpage(objspace, heap, sweep_page);
+ }
+ else {
+ heap_add_freepage(objspace, heap, sweep_page);
+ break;
+ }
+ }
+ else {
+ sweep_page->free_next = NULL;
+ }
- if (heap->free_pages) {
- result = TRUE;
- break;
- }
+ sweep_page = next;
+ }
- page = next;
+ if (heap->sweep_pages == NULL) {
+ gc_sweep_finish(objspace);
}
#if GC_ENABLE_LAZY_SWEEP
gc_prof_sweep_timer_stop(objspace);
#endif
- return result;
+ return heap->free_pages != NULL;
}
static void
-gc_heap_rest_sweep(rb_objspace_t *objspace, rb_heap_t *heap)
+gc_sweep_rest(rb_objspace_t *objspace)
{
+ rb_heap_t *heap = heap_eden; /* lazy sweep only for eden */
+
if (is_lazy_sweeping(heap)) {
- during_gc++;
while (is_lazy_sweeping(heap)) {
- gc_heap_lazy_sweep(objspace, heap);
+ gc_sweep_step(objspace, heap);
}
- during_gc = 0;
}
}
static void
-gc_rest_sweep(rb_objspace_t *objspace)
+gc_sweep_continue(rb_objspace_t *objspace, rb_heap_t *heap)
{
- rb_heap_t *heap = heap_eden; /* lazy sweep only for eden */
- gc_heap_rest_sweep(objspace, heap);
+ if (RGENGC_CHECK_MODE) assert(dont_gc == FALSE);
+
+ gc_enter(objspace, "sweep_continue");
+#if USE_RGENGC
+ if (objspace->rgengc.need_major_gc == GPR_FLAG_NONE && heap_increment(objspace, heap)) {
+ gc_report(3, objspace, "gc_sweep_continue: success heap_increment().\n");
+ }
+#endif
+ gc_sweep_step(objspace, heap);
+ gc_exit(objspace, "sweep_continue");
}
static void
-gc_sweep(rb_objspace_t *objspace, int immediate_sweep)
+gc_sweep(rb_objspace_t *objspace)
{
+ const unsigned int immediate_sweep = objspace->flags.immediate_sweep;
+
+ gc_report(1, objspace, "gc_sweep: immediate: %d\n", immediate_sweep);
+
if (immediate_sweep) {
#if !GC_ENABLE_LAZY_SWEEP
gc_prof_sweep_timer_start(objspace);
#endif
- gc_before_sweep(objspace);
- gc_heap_rest_sweep(objspace, heap_eden);
+ gc_sweep_start(objspace);
+ gc_sweep_rest(objspace);
#if !GC_ENABLE_LAZY_SWEEP
gc_prof_sweep_timer_stop(objspace);
#endif
}
else {
struct heap_page *page;
- gc_before_sweep(objspace);
+ gc_sweep_start(objspace);
page = heap_eden->sweep_pages;
while (page) {
- page->before_sweep = 1;
+ page->flags.before_sweep = TRUE;
page = page->next;
}
- gc_heap_lazy_sweep(objspace, heap_eden);
+ gc_sweep_step(objspace, heap_eden);
}
gc_heap_prepare_minimum_pages(objspace, heap_eden);
@@ -3082,10 +3368,6 @@ gc_sweep(rb_objspace_t *objspace, int immediate_sweep)
/* Marking - Marking stack */
-static void push_mark_stack(mark_stack_t *, VALUE);
-static int pop_mark_stack(mark_stack_t *, VALUE *);
-static void shrink_stack_chunk_cache(mark_stack_t *stack);
-
static stack_chunk_t *
stack_chunk_alloc(void)
{
@@ -3104,6 +3386,19 @@ is_mark_stack_empty(mark_stack_t *stack)
return stack->chunk == NULL;
}
+static size_t
+mark_stack_size(mark_stack_t *stack)
+{
+ size_t size = stack->index;
+ stack_chunk_t *chunk = stack->chunk ? stack->chunk->next : NULL;
+
+ while (chunk) {
+ size += stack->limit;
+ chunk = chunk->next;
+ }
+ return size;
+}
+
static void
add_stack_chunk_cache(mark_stack_t *stack, stack_chunk_t *chunk)
{
@@ -3131,7 +3426,8 @@ push_mark_stack_chunk(mark_stack_t *stack)
{
stack_chunk_t *next;
- assert(stack->index == stack->limit);
+ if (RGENGC_CHECK_MODE) assert(stack->index == stack->limit);
+
if (stack->cache_size > 0) {
next = stack->cache;
stack->cache = stack->cache->next;
@@ -3153,13 +3449,13 @@ pop_mark_stack_chunk(mark_stack_t *stack)
stack_chunk_t *prev;
prev = stack->chunk->next;
- assert(stack->index == 0);
+ if (RGENGC_CHECK_MODE) assert(stack->index == 0);
add_stack_chunk_cache(stack, stack->chunk);
stack->chunk = prev;
stack->index = stack->limit;
}
-#if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
+#if (defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE) || (RGENGC_CHECK_MODE >= 4)
static void
free_stack_chunks(mark_stack_t *stack)
{
@@ -3199,13 +3495,43 @@ pop_mark_stack(mark_stack_t *stack, VALUE *data)
return TRUE;
}
+#if GC_ENABLE_INCREMENTAL_MARK
+static int
+invalidate_mark_stack_chunk(stack_chunk_t *chunk, int limit, VALUE obj)
+{
+ int i;
+ for (i=0; i<limit; i++) {
+ if (chunk->data[i] == obj) {
+ chunk->data[i] = Qundef;
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+static void
+invalidate_mark_stack(mark_stack_t *stack, VALUE obj)
+{
+ stack_chunk_t *chunk = stack->chunk;
+ int limit = stack->index;
+
+ while (chunk) {
+ if (invalidate_mark_stack_chunk(chunk, limit, obj)) return;
+ chunk = chunk->next;
+ limit = stack->limit;
+ }
+ rb_bug("invalid_mark_stack: unreachable");
+}
+#endif
+
static void
init_mark_stack(mark_stack_t *stack)
{
int i;
- if (0) push_mark_stack_chunk(stack);
+ MEMZERO(stack, mark_stack_t, 1);
stack->index = stack->limit = STACK_CHUNK_SIZE;
+ stack->cache_size = 0;
for (i=0; i < 4; i++) {
add_stack_chunk_cache(stack, stack_chunk_alloc());
@@ -3287,7 +3613,7 @@ ruby_stack_check(void)
ATTRIBUTE_NO_ADDRESS_SAFETY_ANALYSIS
static void
-mark_locations_array(rb_objspace_t *objspace, register VALUE *x, register long n)
+mark_locations_array(rb_objspace_t *objspace, register const VALUE *x, register long n)
{
VALUE v;
while (n--) {
@@ -3298,7 +3624,7 @@ mark_locations_array(rb_objspace_t *objspace, register VALUE *x, register long n
}
static void
-gc_mark_locations(rb_objspace_t *objspace, VALUE *start, VALUE *end)
+gc_mark_locations(rb_objspace_t *objspace, const VALUE *start, const VALUE *end)
{
long n;
@@ -3308,11 +3634,22 @@ gc_mark_locations(rb_objspace_t *objspace, VALUE *start, VALUE *end)
}
void
-rb_gc_mark_locations(VALUE *start, VALUE *end)
+rb_gc_mark_locations(const VALUE *start, const VALUE *end)
{
gc_mark_locations(&rb_objspace, start, end);
}
+void
+rb_gc_mark_values(long n, const VALUE *values)
+{
+ rb_objspace_t *objspace = &rb_objspace;
+ long i;
+
+ for (i=0; i<n; i++) {
+ gc_mark(objspace, values[i]);
+ }
+}
+
#define rb_gc_mark_locations(start, end) gc_mark_locations(objspace, (start), (end))
struct mark_tbl_arg {
@@ -3420,8 +3757,9 @@ rb_mark_method_entry(const rb_method_entry_t *me)
}
static int
-mark_method_entry_i(ID key, const rb_method_entry_t *me, st_data_t data)
+mark_method_entry_i(st_data_t key, st_data_t value, st_data_t data)
{
+ const rb_method_entry_t *me = (const rb_method_entry_t *)value;
struct mark_tbl_arg *arg = (void*)data;
mark_method_entry(arg->objspace, me);
return ST_CONTINUE;
@@ -3432,7 +3770,7 @@ mark_m_tbl_wrapper(rb_objspace_t *objspace, struct method_table_wrapper *wrapper
{
struct mark_tbl_arg arg;
if (!wrapper || !wrapper->tbl) return;
- if (LIKELY(objspace->mark_func_data == 0)) {
+ if (LIKELY(objspace->mark_func_data == 0) && !is_incremental_marking(objspace)) {
/* prevent multiple marking during same GC cycle,
* since m_tbl is shared between several T_ICLASS */
size_t serial = rb_gc_count();
@@ -3444,8 +3782,9 @@ mark_m_tbl_wrapper(rb_objspace_t *objspace, struct method_table_wrapper *wrapper
}
static int
-mark_const_entry_i(ID key, const rb_const_entry_t *ce, st_data_t data)
+mark_const_entry_i(st_data_t key, st_data_t value, st_data_t data)
{
+ const rb_const_entry_t *ce = (const rb_const_entry_t *)value;
struct mark_tbl_arg *arg = (void*)data;
gc_mark(arg->objspace, ce->value);
gc_mark(arg->objspace, ce->file);
@@ -3528,7 +3867,7 @@ gc_mark_maybe(rb_objspace_t *objspace, VALUE obj)
if (is_pointer_to_heap(objspace, (void *)obj)) {
int type = BUILTIN_TYPE(obj);
if (type != T_ZOMBIE && type != T_NONE) {
- gc_mark(objspace, obj);
+ gc_mark_ptr(objspace, obj);
}
}
}
@@ -3540,159 +3879,182 @@ rb_gc_mark_maybe(VALUE obj)
}
static inline int
-gc_marked(rb_objspace_t *objspace, VALUE ptr)
+gc_mark_set(rb_objspace_t *objspace, VALUE obj)
{
- register bits_t *bits = GET_HEAP_MARK_BITS(ptr);
- if (MARKED_IN_BITMAP(bits, ptr)) return 1;
- return 0;
+ if (RVALUE_MARKED(obj)) return 0;
+ MARK_IN_BITMAP(GET_HEAP_MARK_BITS(obj), obj);
+ return 1;
}
-static inline int
-gc_mark_ptr(rb_objspace_t *objspace, VALUE ptr)
+#if USE_RGENGC
+static int
+gc_remember_unprotected(rb_objspace_t *objspace, VALUE obj)
{
- register bits_t *bits = GET_HEAP_MARK_BITS(ptr);
- if (gc_marked(objspace, ptr)) return 0;
- MARK_IN_BITMAP(bits, ptr);
- return 1;
+ struct heap_page *page = GET_HEAP_PAGE(obj);
+ bits_t *bits = &page->long_lived_bits[0];
+
+ if (!MARKED_IN_BITMAP(bits, obj)) {
+ page->flags.has_long_lived_shady_objects = TRUE;
+ MARK_IN_BITMAP(bits, obj);
+ objspace->rgengc.remembered_wb_unprotected_objects++;
+
+#if RGENGC_PROFILE > 0
+ objspace->profile.total_remembered_shady_object_count++;
+#if RGENGC_PROFILE >= 2
+ objspace->profile.remembered_shady_object_count_types[BUILTIN_TYPE(obj)]++;
+#endif
+#endif
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
}
+#endif
static void
rgengc_check_relation(rb_objspace_t *objspace, VALUE obj)
{
#if USE_RGENGC
- if (objspace->rgengc.parent_object_is_old) {
- if (!RVALUE_WB_PROTECTED(obj)) {
- if (rgengc_remember(objspace, obj)) {
- objspace->rgengc.remembered_shady_object_count++;
+ const VALUE old_parent = objspace->rgengc.parent_object;
+
+ if (old_parent) { /* parent object is old */
+ if (RVALUE_WB_UNPROTECTED(obj)) {
+ if (gc_remember_unprotected(objspace, obj)) {
+ gc_report(2, objspace, "relation: (O->S) %s -> %s\n", obj_info(old_parent), obj_info(obj));
}
}
-#if RGENGC_THREEGEN
else {
- if (gc_marked(objspace, obj)) {
- if (!RVALUE_OLD_P(obj)) {
+ if (!RVALUE_OLD_P(obj)) {
+ if (RVALUE_MARKED(obj)) {
/* An object pointed from an OLD object should be OLD. */
- rgengc_remember(objspace, obj);
+ gc_report(2, objspace, "relation: (O->unmarked Y) %s -> %s\n", obj_info(old_parent), obj_info(obj));
+ RVALUE_AGE_SET_OLD(objspace, obj);
+ if (is_incremental_marking(objspace)) {
+ if (!RVALUE_MARKING(obj)) {
+ gc_grey(objspace, obj);
+ }
+ }
+ else {
+ rgengc_remember(objspace, obj);
+ }
}
- }
- else {
- if (RVALUE_INFANT_P(obj)) {
- RVALUE_PROMOTE_INFANT(obj);
+ else {
+ gc_report(2, objspace, "relation: (O->Y) %s -> %s\n", obj_info(old_parent), obj_info(obj));
+ RVALUE_AGE_SET_CANDIDATE(objspace, obj);
}
}
}
+ }
+
+ if (RGENGC_CHECK_MODE) assert(old_parent == objspace->rgengc.parent_object);
#endif
+}
+
+static void
+gc_grey(rb_objspace_t *objspace, VALUE obj)
+{
+#if RGENGC_CHECK_MODE
+ if (RVALUE_MARKED(obj) == FALSE) rb_bug("gc_grey: %s is not marked.", obj_info(obj));
+ if (RVALUE_MARKING(obj) == TRUE) rb_bug("gc_grey: %s is marking/remembered.", obj_info(obj));
+#endif
+
+#if GC_ENABLE_INCREMENTAL_MARK
+ if (is_incremental_marking(objspace)) {
+ MARK_IN_BITMAP(GET_HEAP_MARKING_BITS(obj), obj);
}
#endif
+
+ push_mark_stack(&objspace->mark_stack, obj);
}
static void
-gc_mark(rb_objspace_t *objspace, VALUE ptr)
+gc_aging(rb_objspace_t *objspace, VALUE obj)
{
- if (!is_markable_object(objspace, ptr)) return;
+#if USE_RGENGC
+ struct heap_page *page = GET_HEAP_PAGE(obj);
- if (LIKELY(objspace->mark_func_data == 0)) {
- rgengc_check_relation(objspace, ptr);
- if (!gc_mark_ptr(objspace, ptr)) return; /* already marked */
- push_mark_stack(&objspace->mark_stack, ptr);
+#if RGENGC_CHECK_MODE
+ assert(RVALUE_MARKING(obj) == FALSE);
+#endif
+
+ check_rvalue_consistency(obj);
+
+ if (RVALUE_PAGE_WB_UNPROTECTED(page, obj) == 0) {
+ if (!RVALUE_OLD_P(obj)) {
+ gc_report(3, objspace, "gc_aging: YOUNG: %s\n", obj_info(obj));
+ RVALUE_AGE_INC(objspace, obj);
+ }
+ else if (is_full_marking(objspace)) {
+ if (RGENGC_CHECK_MODE) assert(RVALUE_PAGE_LONG_LIVED(page, obj) == FALSE);
+ MARK_IN_BITMAP(page->long_lived_bits, obj);
+ objspace->rgengc.old_objects++;
+ }
+ }
+ check_rvalue_consistency(obj);
+#endif /* USE_RGENGC */
+
+ objspace->marked_slots++;
+}
+
+static void
+gc_mark_ptr(rb_objspace_t *objspace, VALUE obj)
+{
+ if (LIKELY(objspace->mark_func_data == NULL)) {
+ rgengc_check_relation(objspace, obj);
+ if (!gc_mark_set(objspace, obj)) return; /* already marked */
+ gc_aging(objspace, obj);
+ gc_grey(objspace, obj);
}
else {
- objspace->mark_func_data->mark_func(ptr, objspace->mark_func_data->data);
+ objspace->mark_func_data->mark_func(obj, objspace->mark_func_data->data);
}
}
+static void
+gc_mark(rb_objspace_t *objspace, VALUE obj)
+{
+ if (!is_markable_object(objspace, obj)) return;
+ gc_mark_ptr(objspace, obj);
+}
+
void
rb_gc_mark(VALUE ptr)
{
gc_mark(&rb_objspace, ptr);
}
-/* resurrect non-marked `obj' if obj is before swept */
+/* CAUTION: THIS FUNCTION ENABLE *ONLY BEFORE* SWEEPING.
+ * This function is only for GC_END_MARK timing.
+ */
-void
-rb_gc_resurrect(VALUE obj)
+int
+rb_objspace_marked_object_p(VALUE obj)
{
- rb_objspace_t *objspace = &rb_objspace;
-
- if (is_lazy_sweeping(heap_eden) &&
- !gc_marked(objspace, obj) &&
- !is_swept_object(objspace, obj)) {
- gc_mark_ptr(objspace, obj);
- }
+ return RVALUE_MARKED(obj) ? TRUE : FALSE;
}
-static void
-gc_mark_children(rb_objspace_t *objspace, VALUE ptr)
+static inline void
+gc_mark_set_parent(rb_objspace_t *objspace, VALUE obj)
{
- register RVALUE *obj = RANY(ptr);
-
- goto marking; /* skip */
-
- again:
- if (LIKELY(objspace->mark_func_data == 0)) {
- obj = RANY(ptr);
- if (!is_markable_object(objspace, ptr)) return;
- rgengc_check_relation(objspace, ptr);
- if (!gc_mark_ptr(objspace, ptr)) return; /* already marked */
+#if USE_RGENGC
+ if (RVALUE_OLD_P(obj)) {
+ objspace->rgengc.parent_object = obj;
}
else {
- gc_mark(objspace, ptr);
- return;
+ objspace->rgengc.parent_object = Qfalse;
}
-
- marking:
-
-#if USE_RGENGC
- check_gen_consistency((VALUE)obj);
-
- if (LIKELY(objspace->mark_func_data == 0)) {
- /* minor/major common */
- if (RVALUE_WB_PROTECTED(obj)) {
- if (RVALUE_INFANT_P((VALUE)obj)) {
- /* infant -> young */
- RVALUE_PROMOTE_INFANT((VALUE)obj);
-#if RGENGC_THREEGEN
- /* infant -> young */
- objspace->rgengc.young_object_count++;
- objspace->rgengc.parent_object_is_old = FALSE;
-#else
- /* infant -> old */
- objspace->rgengc.old_object_count++;
- objspace->rgengc.parent_object_is_old = TRUE;
#endif
- rgengc_report(3, objspace, "gc_mark_children: promote infant -> young %p (%s).\n", (void *)obj, obj_type_name((VALUE)obj));
- }
- else {
- objspace->rgengc.parent_object_is_old = TRUE;
-
-#if RGENGC_THREEGEN
- if (RVALUE_YOUNG_P((VALUE)obj)) {
- /* young -> old */
- RVALUE_PROMOTE_YOUNG((VALUE)obj);
- objspace->rgengc.old_object_count++;
- rgengc_report(3, objspace, "gc_mark_children: promote young -> old %p (%s).\n", (void *)obj, obj_type_name((VALUE)obj));
- }
- else {
-#endif
- if (!objspace->rgengc.during_minor_gc) {
- /* major/full GC */
- objspace->rgengc.old_object_count++;
- }
-#if RGENGC_THREEGEN
- }
-#endif
- }
- }
- else {
- rgengc_report(3, objspace, "gc_mark_children: do not promote non-WB-protected %p (%s).\n", (void *)obj, obj_type_name((VALUE)obj));
- objspace->rgengc.parent_object_is_old = FALSE;
- }
- }
+}
- check_gen_consistency((VALUE)obj);
-#endif /* USE_RGENGC */
+static void
+gc_mark_children(rb_objspace_t *objspace, VALUE obj)
+{
+ register RVALUE *any = RANY(obj);
+ gc_mark_set_parent(objspace, obj);
if (FL_TEST(obj, FL_EXIVAR)) {
- rb_mark_generic_ivar(ptr);
+ rb_mark_generic_ivar(obj);
}
switch (BUILTIN_TYPE(obj)) {
@@ -3702,150 +4064,13 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr)
break;
case T_NODE:
- switch (nd_type(obj)) {
- case NODE_IF: /* 1,2,3 */
- case NODE_FOR:
- case NODE_ITER:
- case NODE_WHEN:
- case NODE_MASGN:
- case NODE_RESCUE:
- case NODE_RESBODY:
- case NODE_CLASS:
- case NODE_BLOCK_PASS:
- gc_mark(objspace, (VALUE)obj->as.node.u2.node);
- /* fall through */
- case NODE_BLOCK: /* 1,3 */
- case NODE_ARRAY:
- case NODE_DSTR:
- case NODE_DXSTR:
- case NODE_DREGX:
- case NODE_DREGX_ONCE:
- case NODE_ENSURE:
- case NODE_CALL:
- case NODE_DEFS:
- case NODE_OP_ASGN1:
- gc_mark(objspace, (VALUE)obj->as.node.u1.node);
- /* fall through */
- case NODE_SUPER: /* 3 */
- case NODE_FCALL:
- case NODE_DEFN:
- case NODE_ARGS_AUX:
- ptr = (VALUE)obj->as.node.u3.node;
- goto again;
-
- case NODE_WHILE: /* 1,2 */
- case NODE_UNTIL:
- case NODE_AND:
- case NODE_OR:
- case NODE_CASE:
- case NODE_SCLASS:
- case NODE_DOT2:
- case NODE_DOT3:
- case NODE_FLIP2:
- case NODE_FLIP3:
- case NODE_MATCH2:
- case NODE_MATCH3:
- case NODE_OP_ASGN_OR:
- case NODE_OP_ASGN_AND:
- case NODE_MODULE:
- case NODE_ALIAS:
- case NODE_VALIAS:
- case NODE_ARGSCAT:
- gc_mark(objspace, (VALUE)obj->as.node.u1.node);
- /* fall through */
- case NODE_GASGN: /* 2 */
- case NODE_LASGN:
- case NODE_DASGN:
- case NODE_DASGN_CURR:
- case NODE_IASGN:
- case NODE_IASGN2:
- case NODE_CVASGN:
- case NODE_COLON3:
- case NODE_OPT_N:
- case NODE_EVSTR:
- case NODE_UNDEF:
- case NODE_POSTEXE:
- ptr = (VALUE)obj->as.node.u2.node;
- goto again;
-
- case NODE_HASH: /* 1 */
- case NODE_LIT:
- case NODE_STR:
- case NODE_XSTR:
- case NODE_DEFINED:
- case NODE_MATCH:
- case NODE_RETURN:
- case NODE_BREAK:
- case NODE_NEXT:
- case NODE_YIELD:
- case NODE_COLON2:
- case NODE_SPLAT:
- case NODE_TO_ARY:
- ptr = (VALUE)obj->as.node.u1.node;
- goto again;
-
- case NODE_SCOPE: /* 2,3 */
- case NODE_CDECL:
- case NODE_OPT_ARG:
- gc_mark(objspace, (VALUE)obj->as.node.u3.node);
- ptr = (VALUE)obj->as.node.u2.node;
- goto again;
-
- case NODE_ARGS: /* custom */
- {
- struct rb_args_info *args = obj->as.node.u3.args;
- if (args) {
- if (args->pre_init) gc_mark(objspace, (VALUE)args->pre_init);
- if (args->post_init) gc_mark(objspace, (VALUE)args->post_init);
- if (args->opt_args) gc_mark(objspace, (VALUE)args->opt_args);
- if (args->kw_args) gc_mark(objspace, (VALUE)args->kw_args);
- if (args->kw_rest_arg) gc_mark(objspace, (VALUE)args->kw_rest_arg);
- }
- }
- ptr = (VALUE)obj->as.node.u2.node;
- goto again;
-
- case NODE_ZARRAY: /* - */
- case NODE_ZSUPER:
- case NODE_VCALL:
- case NODE_GVAR:
- case NODE_LVAR:
- case NODE_DVAR:
- case NODE_IVAR:
- case NODE_CVAR:
- case NODE_NTH_REF:
- case NODE_BACK_REF:
- case NODE_REDO:
- case NODE_RETRY:
- case NODE_SELF:
- case NODE_NIL:
- case NODE_TRUE:
- case NODE_FALSE:
- case NODE_ERRINFO:
- case NODE_BLOCK_ARG:
- break;
- case NODE_ALLOCA:
- mark_locations_array(objspace,
- (VALUE*)obj->as.node.u1.value,
- obj->as.node.u3.cnt);
- gc_mark(objspace, (VALUE)obj->as.node.u2.node);
- break;
-
- case NODE_CREF:
- gc_mark(objspace, obj->as.node.nd_refinements);
- gc_mark(objspace, (VALUE)obj->as.node.nd_clss);
- ptr = (VALUE)obj->as.node.nd_next;
- goto again;
-
- default: /* unlisted NODE */
- gc_mark_maybe(objspace, (VALUE)obj->as.node.u1.node);
- gc_mark_maybe(objspace, (VALUE)obj->as.node.u2.node);
- gc_mark_maybe(objspace, (VALUE)obj->as.node.u3.node);
- }
+ obj = rb_gc_mark_node(&any->as.node);
+ if (obj) gc_mark(objspace, obj);
return; /* no need to mark class. */
}
- gc_mark(objspace, obj->as.basic.klass);
+ gc_mark(objspace, any->as.basic.klass);
+
switch (BUILTIN_TYPE(obj)) {
case T_ICLASS:
case T_CLASS:
@@ -3854,13 +4079,12 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr)
if (!RCLASS_EXT(obj)) break;
mark_tbl(objspace, RCLASS_IV_TBL(obj));
mark_const_tbl(objspace, RCLASS_CONST_TBL(obj));
- ptr = RCLASS_SUPER((VALUE)obj);
- goto again;
+ gc_mark(objspace, RCLASS_SUPER((VALUE)obj));
+ break;
case T_ARRAY:
if (FL_TEST(obj, ELTS_SHARED)) {
- ptr = obj->as.array.as.heap.aux.shared;
- goto again;
+ gc_mark(objspace, any->as.array.as.heap.aux.shared);
}
else {
long i, len = RARRAY_LEN(obj);
@@ -3872,25 +4096,23 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr)
break;
case T_HASH:
- mark_hash(objspace, obj->as.hash.ntbl);
- ptr = obj->as.hash.ifnone;
- goto again;
+ mark_hash(objspace, any->as.hash.ntbl);
+ gc_mark(objspace, any->as.hash.ifnone);
+ break;
case T_STRING:
-#define STR_ASSOC FL_USER3 /* copied from string.c */
- if (FL_TEST(obj, RSTRING_NOEMBED) && FL_ANY(obj, ELTS_SHARED|STR_ASSOC)) {
- ptr = obj->as.string.as.heap.aux.shared;
- goto again;
+ if (STR_SHARED_P(obj)) {
+ gc_mark(objspace, any->as.string.as.heap.aux.shared);
}
break;
case T_DATA:
if (RTYPEDDATA_P(obj)) {
- RUBY_DATA_FUNC mark_func = obj->as.typeddata.type->function.dmark;
+ RUBY_DATA_FUNC mark_func = any->as.typeddata.type->function.dmark;
if (mark_func) (*mark_func)(DATA_PTR(obj));
}
else {
- if (obj->as.data.dmark) (*obj->as.data.dmark)(DATA_PTR(obj));
+ if (any->as.data.dmark) (*any->as.data.dmark)(DATA_PTR(obj));
}
break;
@@ -3905,41 +4127,41 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr)
break;
case T_FILE:
- if (obj->as.file.fptr) {
- gc_mark(objspace, obj->as.file.fptr->pathv);
- gc_mark(objspace, obj->as.file.fptr->tied_io_for_writing);
- gc_mark(objspace, obj->as.file.fptr->writeconv_asciicompat);
- gc_mark(objspace, obj->as.file.fptr->writeconv_pre_ecopts);
- gc_mark(objspace, obj->as.file.fptr->encs.ecopts);
- gc_mark(objspace, obj->as.file.fptr->write_lock);
+ if (any->as.file.fptr) {
+ gc_mark(objspace, any->as.file.fptr->pathv);
+ gc_mark(objspace, any->as.file.fptr->tied_io_for_writing);
+ gc_mark(objspace, any->as.file.fptr->writeconv_asciicompat);
+ gc_mark(objspace, any->as.file.fptr->writeconv_pre_ecopts);
+ gc_mark(objspace, any->as.file.fptr->encs.ecopts);
+ gc_mark(objspace, any->as.file.fptr->write_lock);
}
break;
case T_REGEXP:
- ptr = obj->as.regexp.src;
- goto again;
+ gc_mark(objspace, any->as.regexp.src);
+ break;
case T_FLOAT:
case T_BIGNUM:
+ case T_SYMBOL:
break;
case T_MATCH:
- gc_mark(objspace, obj->as.match.regexp);
- if (obj->as.match.str) {
- ptr = obj->as.match.str;
- goto again;
+ gc_mark(objspace, any->as.match.regexp);
+ if (any->as.match.str) {
+ gc_mark(objspace, any->as.match.str);
}
break;
case T_RATIONAL:
- gc_mark(objspace, obj->as.rational.num);
- ptr = obj->as.rational.den;
- goto again;
+ gc_mark(objspace, any->as.rational.num);
+ gc_mark(objspace, any->as.rational.den);
+ break;
case T_COMPLEX:
- gc_mark(objspace, obj->as.complex.real);
- ptr = obj->as.complex.imag;
- goto again;
+ gc_mark(objspace, any->as.complex.real);
+ gc_mark(objspace, any->as.complex.imag);
+ break;
case T_STRUCT:
{
@@ -3959,79 +4181,75 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr)
if (BUILTIN_TYPE(obj) == T_NONE) rb_bug("rb_gc_mark(): %p is T_NONE", (void *)obj);
if (BUILTIN_TYPE(obj) == T_ZOMBIE) rb_bug("rb_gc_mark(): %p is T_ZOMBIE", (void *)obj);
rb_bug("rb_gc_mark(): unknown data type 0x%x(%p) %s",
- BUILTIN_TYPE(obj), (void *)obj,
- is_pointer_to_heap(objspace, obj) ? "corrupted object" : "non object");
+ BUILTIN_TYPE(obj), any,
+ is_pointer_to_heap(objspace, any) ? "corrupted object" : "non object");
}
}
-static void
-gc_mark_stacked_objects(rb_objspace_t *objspace)
+/**
+ * incremental: 0 -> not incremental (do all)
+ * incremental: n -> mark at most `n' objects
+ */
+static inline int
+gc_mark_stacked_objects(rb_objspace_t *objspace, int incremental, size_t count)
{
mark_stack_t *mstack = &objspace->mark_stack;
- VALUE obj = 0;
+ VALUE obj;
+#if GC_ENABLE_INCREMENTAL_MARK
+ size_t marked_slots_at_the_beggining = objspace->marked_slots;
+#endif
- if (!mstack->index) return;
while (pop_mark_stack(mstack, &obj)) {
- if (RGENGC_CHECK_MODE > 0 && !gc_marked(objspace, obj)) {
- rb_bug("gc_mark_stacked_objects: %p (%s) is infant, but not marked.", (void *)obj, obj_type_name(obj));
+ if (obj == Qundef) continue; /* skip */
+
+ if (RGENGC_CHECK_MODE && !RVALUE_MARKED(obj)) {
+ rb_bug("gc_mark_stacked_objects: %s is not marked.", obj_info(obj));
}
gc_mark_children(objspace, obj);
- }
- shrink_stack_chunk_cache(mstack);
-}
-#ifndef RGENGC_PRINT_TICK
-#define RGENGC_PRINT_TICK 0
-#endif
-/* the following code is only for internal tuning. */
-
-/* Source code to use RDTSC is quoted and modified from
- * http://www.mcs.anl.gov/~kazutomo/rdtsc.html
- * written by Kazutomo Yoshii <kazutomo@mcs.anl.gov>
- */
-
-#if RGENGC_PRINT_TICK
-#if defined(__GNUC__) && defined(__i386__)
-typedef unsigned long long tick_t;
+#if GC_ENABLE_INCREMENTAL_MARK
+ if (incremental) {
+ if (RGENGC_CHECK_MODE && !RVALUE_MARKING(obj)) {
+ rb_bug("gc_mark_stacked_objects: incremental, but marking bit is 0");
+ }
+ CLEAR_IN_BITMAP(GET_HEAP_MARKING_BITS(obj), obj);
-static inline tick_t
-tick(void)
-{
- unsigned long long int x;
- __asm__ __volatile__ ("rdtsc" : "=A" (x));
- return x;
-}
+ if (objspace->marked_slots - marked_slots_at_the_beggining > count) {
+ break;
+ }
+ }
+ else {
+ /* just ignore marking bits */
+ }
+#endif
+ }
-#elif defined(__GNUC__) && defined(__x86_64__)
-typedef unsigned long long tick_t;
+ if (RGENGC_CHECK_MODE >= 3) {
+ gc_verify_internal_consistency(Qnil);
+ }
-static __inline__ tick_t
-tick(void)
-{
- unsigned long hi, lo;
- __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
- return ((unsigned long long)lo)|( ((unsigned long long)hi)<<32);
+ if (is_mark_stack_empty(mstack)) {
+ shrink_stack_chunk_cache(mstack);
+ return TRUE;
+ }
+ else {
+ return FALSE;
+ }
}
-#elif defined(_WIN32) && defined(_MSC_VER)
-#include <intrin.h>
-typedef unsigned __int64 tick_t;
-
-static inline tick_t
-tick(void)
+static int
+gc_mark_stacked_objects_incremental(rb_objspace_t *objspace, size_t count)
{
- return __rdtsc();
+ return gc_mark_stacked_objects(objspace, TRUE, count);
}
-#else /* use clock */
-typedef clock_t tick_t;
-static inline tick_t
-tick(void)
+static int
+gc_mark_stacked_objects_all(rb_objspace_t *objspace)
{
- return clock();
+ return gc_mark_stacked_objects(objspace, FALSE, 0);
}
-#endif
+#if PRINT_ROOT_TICKS
#define MAX_TICKS 0x100
static tick_t mark_ticks[MAX_TICKS];
static const char *mark_ticks_categories[MAX_TICKS];
@@ -4052,16 +4270,20 @@ show_mark_ticks(void)
}
}
-#endif /* RGENGC_PRINT_TICK */
+#endif /* PRITNT_ROOT_TICKS */
static void
-gc_mark_roots(rb_objspace_t *objspace, int full_mark, const char **categoryp)
+gc_mark_roots(rb_objspace_t *objspace, const char **categoryp)
{
struct gc_list *list;
rb_thread_t *th = GET_THREAD();
if (categoryp) *categoryp = "xxx";
-#if RGENGC_PRINT_TICK
+#if USE_RGENGC
+ objspace->rgengc.parent_object = Qfalse;
+#endif
+
+#if PRINT_ROOT_TICKS
tick_t start_tick = tick();
int tick_count = 0;
const char *prev_category = 0;
@@ -4071,7 +4293,7 @@ gc_mark_roots(rb_objspace_t *objspace, int full_mark, const char **categoryp)
}
#endif
-#if RGENGC_PRINT_TICK
+#if PRINT_ROOT_TICKS
#define MARK_CHECKPOINT_PRINT_TICK(category) do { \
if (prev_category) { \
tick_t t = tick(); \
@@ -4082,7 +4304,7 @@ gc_mark_roots(rb_objspace_t *objspace, int full_mark, const char **categoryp)
prev_category = category; \
start_tick = tick(); \
} while (0)
-#else /* RGENGC_PRINT_TICK */
+#else /* PRITNT_ROOT_TICKS */
#define MARK_CHECKPOINT_PRINT_TICK(category)
#endif
@@ -4093,7 +4315,8 @@ gc_mark_roots(rb_objspace_t *objspace, int full_mark, const char **categoryp)
MARK_CHECKPOINT("vm");
SET_STACK_END;
- th->vm->self ? rb_gc_mark(th->vm->self) : rb_vm_mark(th->vm);
+ rb_vm_mark(th->vm);
+ if (th->vm->self) gc_mark_set(objspace, th->vm->self);
MARK_CHECKPOINT("finalizers");
mark_tbl(objspace, finalizer_table);
@@ -4101,21 +4324,12 @@ gc_mark_roots(rb_objspace_t *objspace, int full_mark, const char **categoryp)
MARK_CHECKPOINT("machine_context");
mark_current_machine_context(objspace, th);
- MARK_CHECKPOINT("symbols");
-#if USE_RGENGC
- objspace->rgengc.parent_object_is_old = TRUE;
- rb_gc_mark_symbols(full_mark);
- objspace->rgengc.parent_object_is_old = FALSE;
-#else
- rb_gc_mark_symbols(full_mark);
-#endif
-
MARK_CHECKPOINT("encodings");
rb_gc_mark_encodings();
/* mark protected global variables */
MARK_CHECKPOINT("global_list");
- for (list = global_List; list; list = list->next) {
+ for (list = global_list; list; list = list->next) {
rb_gc_mark_maybe(*list->varptr);
}
@@ -4129,9 +4343,6 @@ gc_mark_roots(rb_objspace_t *objspace, int full_mark, const char **categoryp)
MARK_CHECKPOINT("generic_ivars");
rb_mark_generic_ivar_tbl();
- MARK_CHECKPOINT("parser");
- rb_gc_mark_parser();
-
MARK_CHECKPOINT("live_method_entries");
rb_gc_mark_unlinked_live_method_entries(th->vm);
@@ -4139,109 +4350,7 @@ gc_mark_roots(rb_objspace_t *objspace, int full_mark, const char **categoryp)
#undef MARK_CHECKPOINT
}
-static void
-gc_marks_body(rb_objspace_t *objspace, int full_mark)
-{
- /* start marking */
- rgengc_report(1, objspace, "gc_marks_body: start (%s)\n", full_mark ? "full" : "minor");
-
-#if USE_RGENGC
- objspace->rgengc.parent_object_is_old = FALSE;
- objspace->rgengc.during_minor_gc = full_mark ? FALSE : TRUE;
-
- if (objspace->rgengc.during_minor_gc) {
- objspace->profile.minor_gc_count++;
- rgengc_rememberset_mark(objspace, heap_eden);
- }
- else {
- objspace->profile.major_gc_count++;
- rgengc_mark_and_rememberset_clear(objspace, heap_eden);
- }
-#endif
- gc_mark_roots(objspace, full_mark, 0);
- gc_mark_stacked_objects(objspace);
-
- gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_END_MARK, 0);
- rgengc_report(1, objspace, "gc_marks_body: end (%s)\n", full_mark ? "full" : "minor");
-}
-
-struct verify_internal_consistency_struct {
- rb_objspace_t *objspace;
- int err_count;
- VALUE parent;
-};
-
-#if USE_RGENGC
-static void
-verify_internal_consistency_reachable_i(VALUE child, void *ptr)
-{
- struct verify_internal_consistency_struct *data = (struct verify_internal_consistency_struct *)ptr;
-
- assert(RVALUE_OLD_P(data->parent));
-
- if (!RVALUE_OLD_P(child)) {
- if (!MARKED_IN_BITMAP(GET_HEAP_PAGE(data->parent)->rememberset_bits, data->parent) &&
- !MARKED_IN_BITMAP(GET_HEAP_PAGE(child)->rememberset_bits, child)) {
- fprintf(stderr, "verify_internal_consistency_reachable_i: WB miss %p (%s) -> %p (%s)\n",
- (void *)data->parent, obj_type_name(data->parent),
- (void *)child, obj_type_name(child));
- data->err_count++;
- }
- }
-}
-
-static int
-verify_internal_consistency_i(void *page_start, void *page_end, size_t stride, void *ptr)
-{
- struct verify_internal_consistency_struct *data = (struct verify_internal_consistency_struct *)ptr;
- VALUE v;
-
- for (v = (VALUE)page_start; v != (VALUE)page_end; v += stride) {
- if (is_live_object(data->objspace, v)) {
- if (RVALUE_OLD_P(v)) {
- data->parent = v;
- /* reachable objects from an oldgen object should be old or (young with remember) */
- rb_objspace_reachable_objects_from(v, verify_internal_consistency_reachable_i, (void *)data);
- }
- }
- }
-
- return 0;
-}
-#endif /* USE_RGENGC */
-
-/*
- * call-seq:
- * GC.verify_internal_consistency -> nil
- *
- * Verify internal consistency.
- *
- * This method is implementation specific.
- * Now this method checks generatioanl consistency
- * if RGenGC is supported.
- */
-static VALUE
-gc_verify_internal_consistency(VALUE self)
-{
- struct verify_internal_consistency_struct data;
- data.objspace = &rb_objspace;
- data.err_count = 0;
-
-#if USE_RGENGC
- {
- struct each_obj_args eo_args;
- eo_args.callback = verify_internal_consistency_i;
- eo_args.data = (void *)&data;
- objspace_each_objects((VALUE)&eo_args);
- }
-#endif
- if (data.err_count != 0) {
- rb_bug("gc_verify_internal_consistency: found internal consistency.\n");
- }
- return Qnil;
-}
-
-#if RGENGC_CHECK_MODE >= 3
+#if RGENGC_CHECK_MODE >= 4
#define MAKE_ROOTSIG(obj) (((VALUE)(obj) << 1) | 0x01)
#define IS_ROOTSIG(obj) ((VALUE)(obj) & 0x01)
@@ -4292,13 +4401,12 @@ reflist_dump(struct reflist *refs)
fprintf(stderr, "<root@%s>", GET_ROOTSIG(obj));
}
else {
- fprintf(stderr, "<%p@%s>", (void *)obj, obj_type_name(obj));
+ fprintf(stderr, "<%s>", obj_info(obj));
}
if (i+1 < refs->pos) fprintf(stderr, ", ");
}
}
-#if RGENGC_CHECK_MODE >= 3
static int
reflist_refered_from_machine_context(struct reflist *refs)
{
@@ -4309,7 +4417,6 @@ reflist_refered_from_machine_context(struct reflist *refs)
}
return 0;
}
-#endif
struct allrefs {
rb_objspace_t *objspace;
@@ -4323,6 +4430,7 @@ struct allrefs {
struct st_table *references;
const char *category;
VALUE root_obj;
+ mark_stack_t mark_stack;
};
static int
@@ -4347,7 +4455,7 @@ allrefs_i(VALUE obj, void *ptr)
struct allrefs *data = (struct allrefs *)ptr;
if (allrefs_add(data, obj)) {
- push_mark_stack(&data->objspace->mark_stack, obj);
+ push_mark_stack(&data->mark_stack, obj);
}
}
@@ -4359,7 +4467,7 @@ allrefs_roots_i(VALUE obj, void *ptr)
data->root_obj = MAKE_ROOTSIG(data->category);
if (allrefs_add(data, obj)) {
- push_mark_stack(&data->objspace->mark_stack, obj);
+ push_mark_stack(&data->mark_stack, obj);
}
}
@@ -4369,24 +4477,29 @@ objspace_allrefs(rb_objspace_t *objspace)
struct allrefs data;
struct mark_func_data_struct mfd;
VALUE obj;
+ int prev_dont_gc = dont_gc;
+ dont_gc = TRUE;
data.objspace = objspace;
data.references = st_init_numtable();
+ init_mark_stack(&data.mark_stack);
mfd.mark_func = allrefs_roots_i;
mfd.data = &data;
/* traverse root objects */
+ PUSH_MARK_FUNC_DATA(&mfd);
objspace->mark_func_data = &mfd;
- gc_mark_roots(objspace, TRUE, &data.category);
- objspace->mark_func_data = 0;
+ gc_mark_roots(objspace, &data.category);
+ POP_MARK_FUNC_DATA();
/* traverse rest objects reachable from root objects */
- while (pop_mark_stack(&objspace->mark_stack, &obj)) {
+ while (pop_mark_stack(&data.mark_stack, &obj)) {
rb_objspace_reachable_objects_from(data.root_obj = obj, allrefs_i, &data);
}
- shrink_stack_chunk_cache(&objspace->mark_stack);
+ free_stack_chunks(&data.mark_stack);
+ dont_gc = prev_dont_gc;
return data.references;
}
@@ -4405,17 +4518,13 @@ objspace_allrefs_destruct(struct st_table *refs)
st_free_table(refs);
}
-#if RGENGC_CHECK_MODE >= 4
+#if RGENGC_CHECK_MODE >= 5
static int
allrefs_dump_i(st_data_t k, st_data_t v, st_data_t ptr)
{
VALUE obj = (VALUE)k;
struct reflist *refs = (struct reflist *)v;
- fprintf(stderr, "[allrefs_dump_i] %p (%s%s%s%s) <- ",
- (void *)obj, obj_type_name(obj),
- RVALUE_OLD_P(obj) ? "[O]" : "[Y]",
- RVALUE_WB_PROTECTED(obj) ? "[W]" : "",
- MARKED_IN_BITMAP(GET_HEAP_REMEMBERSET_BITS(obj), obj) ? "[R]" : "");
+ fprintf(stderr, "[allrefs_dump_i] %s <- ", obj_info(obj));
reflist_dump(refs);
fprintf(stderr, "\n");
return ST_CONTINUE;
@@ -4429,7 +4538,6 @@ allrefs_dump(rb_objspace_t *objspace)
}
#endif
-#if RGENGC_CHECK_MODE >= 3
static int
gc_check_after_marks_i(st_data_t k, st_data_t v, void *ptr)
{
@@ -4439,7 +4547,7 @@ gc_check_after_marks_i(st_data_t k, st_data_t v, void *ptr)
/* object should be marked or oldgen */
if (!MARKED_IN_BITMAP(GET_HEAP_MARK_BITS(obj), obj)) {
- fprintf(stderr, "gc_check_after_marks_i: %p (%s) is not marked and not oldgen.\n", (void *)obj, obj_type_name(obj));
+ fprintf(stderr, "gc_check_after_marks_i: %s is not marked and not oldgen.\n", obj_info(obj));
fprintf(stderr, "gc_check_after_marks_i: %p is referred from ", (void *)obj);
reflist_dump(refs);
@@ -4454,12 +4562,10 @@ gc_check_after_marks_i(st_data_t k, st_data_t v, void *ptr)
}
return ST_CONTINUE;
}
-#endif
static void
gc_marks_check(rb_objspace_t *objspace, int (*checker_func)(ANYARGS), const char *checker_name)
{
-
size_t saved_malloc_increase = objspace->malloc_params.increase;
#if RGENGC_ESTIMATE_OLDMALLOC
size_t saved_oldmalloc_increase = objspace->rgengc.oldmalloc_increase;
@@ -4467,13 +4573,16 @@ gc_marks_check(rb_objspace_t *objspace, int (*checker_func)(ANYARGS), const char
VALUE already_disabled = rb_gc_disable();
objspace->rgengc.allrefs_table = objspace_allrefs(objspace);
- st_foreach(objspace->rgengc.allrefs_table, checker_func, (st_data_t)objspace);
+
+ if (checker_func) {
+ st_foreach(objspace->rgengc.allrefs_table, checker_func, (st_data_t)objspace);
+ }
if (objspace->rgengc.error_count > 0) {
-#if RGENGC_CHECK_MODE >= 4
+#if RGENGC_CHECK_MODE >= 5
allrefs_dump(objspace);
#endif
- rb_bug("%s: GC has problem.", checker_name);
+ if (checker_name) rb_bug("%s: GC has problem.", checker_name);
}
objspace_allrefs_destruct(objspace->rgengc.allrefs_table);
@@ -4485,68 +4594,549 @@ gc_marks_check(rb_objspace_t *objspace, int (*checker_func)(ANYARGS), const char
objspace->rgengc.oldmalloc_increase = saved_oldmalloc_increase;
#endif
}
+#endif /* RGENGC_CHECK_MODE >= 4 */
-#endif /* RGENGC_CHECK_MODE >= 2 */
+struct verify_internal_consistency_struct {
+ rb_objspace_t *objspace;
+ int err_count;
+ size_t live_object_count;
+ size_t zombie_object_count;
+#if USE_RGENGC
+ VALUE parent;
+ size_t old_object_count;
+ size_t remembered_shady_count;
+#endif
+};
+
+#if USE_RGENGC
static void
-gc_marks(rb_objspace_t *objspace, int full_mark)
+check_generation_i(const VALUE child, void *ptr)
{
- struct mark_func_data_struct *prev_mark_func_data;
+ struct verify_internal_consistency_struct *data = (struct verify_internal_consistency_struct *)ptr;
+ const VALUE parent = data->parent;
- gc_prof_mark_timer_start(objspace);
- {
- /* setup marking */
- prev_mark_func_data = objspace->mark_func_data;
- objspace->mark_func_data = 0;
+ if (RGENGC_CHECK_MODE) assert(RVALUE_OLD_P(parent));
+
+ if (!RVALUE_OLD_P(child)) {
+ if (!RVALUE_REMEMBERED(parent) &&
+ !RVALUE_REMEMBERED(child) &&
+ !RVALUE_LONG_LIVED(child)) {
+ fprintf(stderr, "verify_internal_consistency_reachable_i: WB miss (O->Y) %s -> %s\n", obj_info(parent), obj_info(child));
+ data->err_count++;
+ }
+ }
+}
+
+static void
+check_color_i(const VALUE child, void *ptr)
+{
+ struct verify_internal_consistency_struct *data = (struct verify_internal_consistency_struct *)ptr;
+ const VALUE parent = data->parent;
+
+ if (!RVALUE_WB_UNPROTECTED(parent) && RVALUE_WHITE_P(child)) {
+ fprintf(stderr, "verify_internal_consistency_reachable_i: WB miss (B->W) - %s -> %s\n",
+ obj_info(parent), obj_info(child));
+ data->err_count++;
+ }
+}
+#endif
+
+static void
+check_children_i(const VALUE child, void *ptr)
+{
+ check_rvalue_consistency(child);
+}
+
+static int
+verify_internal_consistency_i(void *page_start, void *page_end, size_t stride, void *ptr)
+{
+ struct verify_internal_consistency_struct *data = (struct verify_internal_consistency_struct *)ptr;
+ VALUE obj;
+ rb_objspace_t *objspace = data->objspace;
+
+ for (obj = (VALUE)page_start; obj != (VALUE)page_end; obj += stride) {
+ if (is_live_object(objspace, obj)) {
+ /* count objects */
+ data->live_object_count++;
+
+ rb_objspace_reachable_objects_from(obj, check_children_i, (void *)data);
+
+#if USE_RGENGC
+ /* check health of children */
+ data->parent = obj;
+
+ if (RVALUE_OLD_P(obj)) data->old_object_count++;
+ if (RVALUE_WB_UNPROTECTED(obj) && RVALUE_LONG_LIVED(obj)) data->remembered_shady_count++;
+
+ if (!is_marking(objspace) && RVALUE_OLD_P(obj)) {
+ /* reachable objects from an oldgen object should be old or (young with remember) */
+ data->parent = obj;
+ rb_objspace_reachable_objects_from(obj, check_generation_i, (void *)data);
+ }
+
+ if (is_incremental_marking(objspace)) {
+ if (RVALUE_BLACK_P(obj)) {
+ /* reachable objects from black objects should be black or grey objects */
+ data->parent = obj;
+ rb_objspace_reachable_objects_from(obj, check_color_i, (void *)data);
+ }
+ }
+#endif
+ }
+ else {
+ if (BUILTIN_TYPE(obj) == T_ZOMBIE) {
+ if (RGENGC_CHECK_MODE) assert(RBASIC(obj)->flags == T_ZOMBIE);
+ data->zombie_object_count++;
+ }
+ }
+ }
+
+ return 0;
+}
+
+static int
+gc_verify_heap_page(rb_objspace_t *objspace, struct heap_page *page, VALUE obj)
+{
+#if USE_RGENGC
+ int i;
+ unsigned int has_remembered_shady = FALSE;
+ unsigned int has_remembered_old = FALSE;
+ int rememberd_old_objects = 0;
+
+ for (i=0; i<page->total_slots; i++) {
+ VALUE obj = (VALUE)&page->start[i];
+ if (RVALUE_PAGE_LONG_LIVED(page, obj) && RVALUE_PAGE_WB_UNPROTECTED(page, obj)) has_remembered_shady = TRUE;
+ if (RVALUE_PAGE_MARKING(page, obj)) {
+ has_remembered_old = TRUE;
+ rememberd_old_objects++;
+ }
+ }
+
+ if (!is_incremental_marking(objspace) &&
+ page->flags.has_remembered_objects == FALSE && has_remembered_old == TRUE) {
+
+ for (i=0; i<page->total_slots; i++) {
+ VALUE obj = (VALUE)&page->start[i];
+ if (RVALUE_PAGE_MARKING(page, obj)) {
+ fprintf(stderr, "marking -> %s\n", obj_info(obj));
+ }
+ }
+ rb_bug("page %p's has_remembered_objects should be false, but there are remembered old objects (%d). %s",
+ page, rememberd_old_objects, obj ? obj_info(obj) : "");
+ }
+
+ if (page->flags.has_long_lived_shady_objects == FALSE && has_remembered_shady == TRUE) {
+ rb_bug("page %p's has_remembered_shady should be false, but there are remembered shady objects. %s",
+ page, obj ? obj_info(obj) : "");
+ }
+
+ return rememberd_old_objects;
+#else
+ return 0;
+#endif
+}
+
+static int
+gc_verify_heap_pages(rb_objspace_t *objspace)
+{
+ int rememberd_old_objects = 0;
+ struct heap_page *page = heap_eden->pages;
+
+ while (page) {
+ if (page->flags.has_remembered_objects == FALSE)
+ rememberd_old_objects += gc_verify_heap_page(objspace, page, Qfalse);
+ page = page->next;
+ }
+
+ return rememberd_old_objects;
+}
+
+/*
+ * call-seq:
+ * GC.verify_internal_consistency -> nil
+ *
+ * Verify internal consistency.
+ *
+ * This method is implementation specific.
+ * Now this method checks generational consistency
+ * if RGenGC is supported.
+ */
+static VALUE
+gc_verify_internal_consistency(VALUE self)
+{
+ rb_objspace_t *objspace = &rb_objspace;
+ struct verify_internal_consistency_struct data = {0};
+ struct each_obj_args eo_args;
+
+ data.objspace = objspace;
+ gc_report(5, objspace, "gc_verify_internal_consistency: start\n");
+
+ /* check relations */
+
+ eo_args.callback = verify_internal_consistency_i;
+ eo_args.data = (void *)&data;
+ objspace_each_objects((VALUE)&eo_args);
+
+ if (data.err_count != 0) {
+#if RGENGC_CHECK_MODE >= 5
+ objspace->rgengc.error_count = data.err_count;
+ gc_marks_check(objspace, NULL, NULL);
+ allrefs_dump(objspace);
+#endif
+ rb_bug("gc_verify_internal_consistency: found internal inconsistency.");
+ }
+
+ /* check heap_page status */
+ gc_verify_heap_pages(objspace);
+
+ /* check counters */
+
+ if (!is_lazy_sweeping(heap_eden) && !finalizing) {
+ if (objspace_live_slots(objspace) != data.live_object_count) {
+ fprintf(stderr, "heap_pages_final_slots: %d, objspace->profile.total_freed_objects: %d\n",
+ (int)heap_pages_final_slots, (int)objspace->profile.total_freed_objects);
+ rb_bug("inconsistent live slot nubmer: expect %"PRIuSIZE", but %"PRIuSIZE".", objspace_live_slots(objspace), data.live_object_count);
+ }
+ }
+
+#if USE_RGENGC
+ if (!is_marking(objspace)) {
+ if (objspace->rgengc.old_objects != data.old_object_count) {
+ rb_bug("inconsistent old slot nubmer: expect %"PRIuSIZE", but %"PRIuSIZE".", objspace->rgengc.old_objects, data.old_object_count);
+ }
+ if (objspace->rgengc.remembered_wb_unprotected_objects != data.remembered_shady_count) {
+ rb_bug("inconsistent old slot nubmer: expect %"PRIuSIZE", but %"PRIuSIZE".", objspace->rgengc.remembered_wb_unprotected_objects, data.remembered_shady_count);
+ }
+ }
+#endif
+
+ if (!finalizing) {
+ size_t list_count = 0;
+
+ {
+ VALUE z = heap_pages_deferred_final;
+ while (z) {
+ list_count++;
+ z = RZOMBIE(z)->next;
+ }
+ }
+
+ if (heap_pages_final_slots != data.zombie_object_count ||
+ heap_pages_final_slots != list_count) {
+
+ rb_bug("inconsistent finalizing object count:\n"
+ " expect %"PRIuSIZE"\n"
+ " but %"PRIuSIZE" zombies\n"
+ " heap_pages_deferred_final list has %"PRIuSIZE" items.",
+ heap_pages_final_slots,
+ data.zombie_object_count,
+ list_count);
+ }
+ }
+
+ gc_report(5, objspace, "gc_verify_internal_consistency: OK\n");
+
+ return Qnil;
+}
+
+/* marks */
+
+static void
+gc_marks_start(rb_objspace_t *objspace, int full_mark)
+{
+ /* start marking */
+ gc_report(1, objspace, "gc_marks_start: (%s)\n", full_mark ? "full" : "minor");
+ gc_stat_transition(objspace, gc_stat_marking);
+
+ objspace->marked_slots = 0;
#if USE_RGENGC
+ objspace->rgengc.old_objects_at_gc_start = objspace->rgengc.old_objects;
+
+ if (full_mark) {
+ objspace->flags.during_minor_gc = FALSE;
+ objspace->profile.major_gc_count++;
+ objspace->rgengc.remembered_wb_unprotected_objects = 0;
+ objspace->rgengc.old_objects = 0;
+ objspace->rgengc.last_major_gc = objspace->profile.count;
+ rgengc_mark_and_rememberset_clear(objspace, heap_eden);
+ }
+ else {
+ objspace->flags.during_minor_gc = TRUE;
+ objspace->marked_slots =
+ objspace->rgengc.old_objects +
+ objspace->rgengc.remembered_wb_unprotected_objects; /* long lived objects are marked already */
+ objspace->profile.minor_gc_count++;
+ rgengc_rememberset_mark(objspace, heap_eden);
+ }
+#endif
+ gc_mark_roots(objspace, NULL);
+
+ gc_report(1, objspace, "gc_marks_start: (%s) end, stack in %d\n", full_mark ? "full" : "minor", (int)mark_stack_size(&objspace->mark_stack));
+}
+
+#if GC_ENABLE_INCREMENTAL_MARK
+static void
+gc_marks_wb_unprotected_objects(rb_objspace_t *objspace)
+{
+ struct heap_page *page = heap_eden->pages;
+
+ while (page) {
+ bits_t *mark_bits = page->mark_bits;
+ bits_t *wbun_bits = page->wb_unprotected_bits;
+ RVALUE *p = page->start;
+ RVALUE *offset = p - NUM_IN_PAGE(p);
+ size_t j;
+
+ for (j=0; j<HEAP_BITMAP_LIMIT; j++) {
+ bits_t bits = mark_bits[j] & wbun_bits[j];
+
+ if (bits) {
+ p = offset + j * BITS_BITLENGTH;
+
+ do {
+ if (bits & 1) {
+ gc_report(2, objspace, "gc_marks_wb_unprotected_objects: marked shady: %s\n", obj_info((VALUE)p));
+ if (RGENGC_CHECK_MODE > 0) {
+ assert(RVALUE_WB_UNPROTECTED((VALUE)p));
+ assert(RVALUE_MARKED((VALUE)p));
+ }
+ gc_mark_children(objspace, (VALUE)p);
+ }
+ p++;
+ bits >>= 1;
+ } while (bits);
+ }
+ }
+
+ page = page->next;
+ }
+
+ gc_mark_stacked_objects_all(objspace);
+}
+#endif
+
+static struct heap_page *
+heap_move_pooled_pages_to_free_pages(rb_heap_t *heap)
+{
+ struct heap_page *page = heap->pooled_pages;
+
+ if (page) {
+ heap->pooled_pages = page->free_next;
+ page->free_next = heap->free_pages;
+ heap->free_pages = page;
+ }
+
+ return page;
+}
+
+static int
+gc_marks_finish(rb_objspace_t *objspace)
+{
+#if GC_ENABLE_INCREMENTAL_MARK
+ /* finish incremental GC */
+ if (is_incremental_marking(objspace)) {
+ if (heap_eden->pooled_pages) {
+ heap_move_pooled_pages_to_free_pages(heap_eden);
+ gc_report(1, objspace, "gc_marks_finish: pooled pages are exists. retry.\n");
+ return FALSE; /* continue marking phase */
+ }
+
+ if (RGENGC_CHECK_MODE && is_mark_stack_empty(&objspace->mark_stack) == 0) {
+ rb_bug("gc_marks_finish: mark stack is not empty (%d).", (int)mark_stack_size(&objspace->mark_stack));
+ }
+
+ gc_mark_roots(objspace, 0);
+
+ if (is_mark_stack_empty(&objspace->mark_stack) == FALSE) {
+ gc_report(1, objspace, "gc_marks_finish: not empty (%d). retry.\n", (int)mark_stack_size(&objspace->mark_stack));
+ return FALSE;
+ }
#if RGENGC_CHECK_MODE >= 2
- gc_verify_internal_consistency(Qnil);
+ if (gc_verify_heap_pages(objspace) != 0) {
+ rb_bug("gc_marks_finish (incremental): there are remembered old objects.");
+ }
+#endif
+
+ objspace->flags.during_incremental_marking = FALSE;
+ /* check children of all marked wb-unprotected objects */
+ gc_marks_wb_unprotected_objects(objspace);
+ }
+#endif /* GC_ENABLE_INCREMENTAL_MARK */
+
+#if RGENGC_CHECK_MODE >= 2
+ gc_verify_internal_consistency(Qnil);
#endif
- if (full_mark == TRUE) { /* major/full GC */
- objspace->rgengc.remembered_shady_object_count = 0;
- objspace->rgengc.old_object_count = 0;
-#if RGENGC_THREEGEN
- objspace->rgengc.young_object_count = 0;
+
+#if USE_RGENGC
+ if (is_full_marking(objspace)) {
+ /* See the comment about RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR */
+ const double r = gc_params.oldobject_limit_factor;
+ objspace->rgengc.remembered_wb_unprotected_objects_limit = (size_t)(objspace->rgengc.remembered_wb_unprotected_objects * r);
+ objspace->rgengc.old_objects_limit = (size_t)(objspace->rgengc.old_objects * r);
+ }
#endif
- gc_marks_body(objspace, TRUE);
- {
- /* See the comment about RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR */
- const double r = gc_params.oldobject_limit_factor;
- objspace->rgengc.remembered_shady_object_limit = (size_t)(objspace->rgengc.remembered_shady_object_count * r);
- objspace->rgengc.old_object_limit = (size_t)(objspace->rgengc.old_object_count * r);
+#if RGENGC_CHECK_MODE >= 4
+ gc_marks_check(objspace, gc_check_after_marks_i, "after_marks");
+#endif
+
+ { /* decide full GC is needed or not */
+ rb_heap_t *heap = heap_eden;
+ size_t sweep_slots =
+ (heap_allocatable_pages * HEAP_OBJ_LIMIT) + /* allocatable slots in empty pages */
+ (heap->total_slots - objspace->marked_slots); /* will be sweep slots */
+
+#if RGENGC_CHECK_MODE
+ assert(heap->total_slots >= objspace->marked_slots);
+#endif
+
+ if (sweep_slots < heap_pages_min_free_slots) {
+#if USE_RGENGC
+ if (!is_full_marking(objspace) && objspace->profile.count - objspace->rgengc.last_major_gc > 3 /* magic number */) {
+ gc_report(1, objspace, "gc_marks_finish: next is full GC!!)\n");
+ objspace->rgengc.need_major_gc |= GPR_FLAG_MAJOR_BY_NOFREE;
+ }
+ else {
+ gc_report(1, objspace, "gc_marks_finish: heap_set_increment!!\n");
+ heap_set_increment(objspace, heap_extend_pages(objspace));
+ heap_increment(objspace, heap);
+ }
+#else
+ gc_report(1, objspace, "gc_marks_finish: heap_set_increment!!\n");
+ heap_set_increment(objspace, heap_extend_pages(objspace));
+ heap_increment(objspace, heap);
+#endif
+ }
+
+#if USE_RGENGC
+ if (objspace->rgengc.remembered_wb_unprotected_objects > objspace->rgengc.remembered_wb_unprotected_objects_limit) {
+ objspace->rgengc.need_major_gc |= GPR_FLAG_MAJOR_BY_SHADY;
+ }
+ if (objspace->rgengc.old_objects > objspace->rgengc.old_objects_limit) {
+ objspace->rgengc.need_major_gc |= GPR_FLAG_MAJOR_BY_OLDGEN;
+ }
+
+ gc_report(1, objspace, "gc_marks_finish (marks %d objects, old %d objects, total %d slots, sweep %d slots, increment: %d, next GC: %s)\n",
+ (int)objspace->marked_slots, (int)objspace->rgengc.old_objects, (int)heap->total_slots, (int)sweep_slots, (int)heap_allocatable_pages,
+ objspace->rgengc.need_major_gc ? "major" : "minor");
+#endif
+ }
+
+ gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_END_MARK, 0);
+
+ return TRUE;
+}
+
+static void
+gc_marks_step(rb_objspace_t *objspace, int slots)
+{
+ if (RGENGC_CHECK_MODE) assert(is_marking(objspace));
+
+ if (gc_mark_stacked_objects_incremental(objspace, slots)) {
+ if (gc_marks_finish(objspace)) {
+ /* finish */
+ gc_sweep(objspace);
+ }
+ }
+}
+
+static void
+gc_marks_rest(rb_objspace_t *objspace)
+{
+ gc_report(1, objspace, "gc_marks_rest\n");
+
+ heap_eden->pooled_pages = NULL;
+
+ if (is_incremental_marking(objspace)) {
+ do {
+ while (gc_mark_stacked_objects_incremental(objspace, INT_MAX) == FALSE);
+ } while (gc_marks_finish(objspace) == FALSE);
+ }
+ else {
+ gc_mark_stacked_objects_all(objspace);
+ gc_marks_finish(objspace);
+ }
+
+ /* move to sweep */
+ gc_sweep(objspace);
+}
+
+static void
+gc_marks_continue(rb_objspace_t *objspace, rb_heap_t *heap)
+{
+ int slots = 0;
+ const char *from;
+
+ if (RGENGC_CHECK_MODE) assert(dont_gc == FALSE);
+
+ gc_enter(objspace, "marks_continue");
+
+ PUSH_MARK_FUNC_DATA(NULL);
+ {
+ if (heap->pooled_pages) {
+ while (heap->pooled_pages && slots < HEAP_OBJ_LIMIT) {
+ struct heap_page *page = heap_move_pooled_pages_to_free_pages(heap);
+ slots += page->free_slots;
}
+ from = "pooled-pages";
}
- else { /* minor GC */
- gc_marks_body(objspace, FALSE);
+ else if (heap_increment(objspace, heap)) {
+ slots = heap->free_pages->free_slots;
+ from = "incremented-pages";
+ }
+
+ if (slots > 0) {
+ gc_report(2, objspace, "gc_marks_continue: provide %d slots from %s.\n", slots, from);
+ gc_marks_step(objspace, slots);
+ }
+ else {
+ gc_report(2, objspace, "gc_marks_continue: no more pooled pages (stack depth: %d).\n", (int)mark_stack_size(&objspace->mark_stack));
+ gc_marks_rest(objspace);
+ }
+ }
+ POP_MARK_FUNC_DATA();
+
+ gc_exit(objspace, "marks_continue");
+}
+
+static void
+gc_marks(rb_objspace_t *objspace, int full_mark)
+{
+ gc_prof_mark_timer_start(objspace);
+
+ PUSH_MARK_FUNC_DATA(NULL);
+ {
+ /* setup marking */
+
+#if USE_RGENGC
+ gc_marks_start(objspace, full_mark);
+ if (!is_incremental_marking(objspace)) {
+ gc_marks_rest(objspace);
}
#if RGENGC_PROFILE > 0
if (gc_prof_record(objspace)) {
gc_profile_record *record = gc_prof_record(objspace);
- record->old_objects = objspace->rgengc.old_object_count;
+ record->old_objects = objspace->rgengc.old_objects;
}
#endif
-#if RGENGC_CHECK_MODE >= 3
- gc_marks_check(objspace, gc_check_after_marks_i, "after_marks");
-#endif
-
#else /* USE_RGENGC */
- gc_marks_body(objspace, TRUE);
+ gc_marks_start(objspace, TRUE);
+ gc_marks_rest(objspace);
#endif
-
- objspace->mark_func_data = prev_mark_func_data;
}
+ POP_MARK_FUNC_DATA();
gc_prof_mark_timer_stop(objspace);
}
/* RGENGC */
static void
-rgengc_report_body(int level, rb_objspace_t *objspace, const char *fmt, ...)
+gc_report_body(int level, rb_objspace_t *objspace, const char *fmt, ...)
{
if (level <= RGENGC_DEBUG) {
char buf[1024];
@@ -4556,7 +5146,15 @@ rgengc_report_body(int level, rb_objspace_t *objspace, const char *fmt, ...)
#if USE_RGENGC
if (during_gc) {
- status = objspace->rgengc.during_minor_gc ? "-" : "+";
+ status = is_full_marking(objspace) ? "+" : "-";
+ }
+ else {
+ if (is_lazy_sweeping(heap_eden)) {
+ status = "S";
+ }
+ if (is_incremental_marking(objspace)) {
+ status = "M";
+ }
}
#endif
@@ -4576,18 +5174,22 @@ rgengc_report_body(int level, rb_objspace_t *objspace, const char *fmt, ...)
static int
rgengc_remembersetbits_get(rb_objspace_t *objspace, VALUE obj)
{
- bits_t *bits = GET_HEAP_REMEMBERSET_BITS(obj);
- return MARKED_IN_BITMAP(bits, obj) ? 1 : 0;
+ return RVALUE_REMEMBERED(obj);
}
static int
rgengc_remembersetbits_set(rb_objspace_t *objspace, VALUE obj)
{
- bits_t *bits = GET_HEAP_REMEMBERSET_BITS(obj);
+ struct heap_page *page = GET_HEAP_PAGE(obj);
+ bits_t *bits = &page->marking_bits[0];
+
+ if (RGENGC_CHECK_MODE) assert(!is_incremental_marking(objspace));
+
if (MARKED_IN_BITMAP(bits, obj)) {
return FALSE;
}
else {
+ page->flags.has_remembered_objects = TRUE;
MARK_IN_BITMAP(bits, obj);
return TRUE;
}
@@ -4599,41 +5201,25 @@ rgengc_remembersetbits_set(rb_objspace_t *objspace, VALUE obj)
static int
rgengc_remember(rb_objspace_t *objspace, VALUE obj)
{
- rgengc_report(2, objspace, "rgengc_remember: %p (%s, %s) %s\n", (void *)obj, obj_type_name(obj),
- RVALUE_WB_PROTECTED(obj) ? "WB-protected" : "non-WB-protected",
- rgengc_remembersetbits_get(objspace, obj) ? "was already remembered" : "is remembered now");
+ gc_report(6, objspace, "rgengc_remember: %s %s\n", obj_info(obj),
+ rgengc_remembersetbits_get(objspace, obj) ? "was already remembered" : "is remembered now");
-#if RGENGC_CHECK_MODE > 0
- {
- switch (BUILTIN_TYPE(obj)) {
- case T_NONE:
- case T_ZOMBIE:
- rb_bug("rgengc_remember: should not remember %p (%s)\n",
- (void *)obj, obj_type_name(obj));
- default:
- ;
- }
+ check_rvalue_consistency(obj);
+
+ if (RGENGC_CHECK_MODE) {
+ if (RVALUE_WB_UNPROTECTED(obj)) rb_bug("rgengc_remember: %s is not wb protected.", obj_info(obj));
}
-#endif
- if (RGENGC_PROFILE) {
- if (!rgengc_remembered(objspace, obj)) {
#if RGENGC_PROFILE > 0
- if (RVALUE_WB_PROTECTED(obj)) {
- objspace->profile.remembered_normal_object_count++;
-#if RGENGC_PROFILE >= 2
- objspace->profile.remembered_normal_object_count_types[BUILTIN_TYPE(obj)]++;
-#endif
- }
- else {
- objspace->profile.remembered_shady_object_count++;
+ if (!rgengc_remembered(objspace, obj)) {
+ if (RVALUE_WB_UNPROTECTED(obj) == 0) {
+ objspace->profile.total_remembered_normal_object_count++;
#if RGENGC_PROFILE >= 2
- objspace->profile.remembered_shady_object_count_types[BUILTIN_TYPE(obj)]++;
+ objspace->profile.remembered_normal_object_count_types[BUILTIN_TYPE(obj)]++;
#endif
- }
-#endif /* RGENGC_PROFILE > 0 */
}
}
+#endif /* RGENGC_PROFILE > 0 */
return rgengc_remembersetbits_set(objspace, obj);
}
@@ -4642,75 +5228,81 @@ static int
rgengc_remembered(rb_objspace_t *objspace, VALUE obj)
{
int result = rgengc_remembersetbits_get(objspace, obj);
- check_gen_consistency(obj);
- rgengc_report(6, objspace, "gc_remembered: %p (%s) => %d\n", (void *)obj, obj_type_name(obj), result);
+ check_rvalue_consistency(obj);
+ gc_report(6, objspace, "rgengc_remembered: %s\n", obj_info(obj));
return result;
}
+#ifndef PROFILE_REMEMBERSET_MARK
+#define PROFILE_REMEMBERSET_MARK 0
+#endif
+
static void
rgengc_rememberset_mark(rb_objspace_t *objspace, rb_heap_t *heap)
{
size_t j;
- RVALUE *p, *offset;
- bits_t *bits, bitset;
struct heap_page *page = heap->pages;
-
-#if RGENGC_PROFILE > 0
- size_t shady_object_count = 0, clear_count = 0;
+#if PROFILE_REMEMBERSET_MARK
+ int has_old = 0, has_shady = 0, has_both = 0, skip = 0;
#endif
+ gc_report(1, objspace, "rgengc_rememberset_mark: start\n");
while (page) {
- p = page->start;
- bits = page->rememberset_bits;
- offset = p - NUM_IN_PAGE(p);
+ if (page->flags.has_remembered_objects | page->flags.has_long_lived_shady_objects) {
+ RVALUE *p = page->start;
+ RVALUE *offset = p - NUM_IN_PAGE(p);
+ bits_t bitset, bits[HEAP_BITMAP_LIMIT];
+ bits_t *marking_bits = page->marking_bits;
+ bits_t *long_lived_bits = page->long_lived_bits;
+ bits_t *wb_unprotected_bits = page->wb_unprotected_bits;
+#if PROFILE_REMEMBERSET_MARK
+ if (page->flags.has_remembered_objects && page->flags.has_long_lived_shady_objects) has_both++;
+ else if (page->flags.has_remembered_objects) has_old++;
+ else if (page->flags.has_long_lived_shady_objects) has_shady++;
+#endif
+ for (j=0; j<HEAP_BITMAP_LIMIT; j++) {
+ bits[j] = marking_bits[j] | (long_lived_bits[j] & wb_unprotected_bits[j]);
+ marking_bits[j] = 0;
+ }
+ page->flags.has_remembered_objects = FALSE;
- for (j=0; j < HEAP_BITMAP_LIMIT; j++) {
- if (bits[j]) {
- p = offset + j * BITS_BITLENGTH;
+ for (j=0; j < HEAP_BITMAP_LIMIT; j++) {
bitset = bits[j];
- do {
- if (bitset & 1) {
- /* mark before RVALUE_PROMOTE_... */
- gc_mark_ptr(objspace, (VALUE)p);
- if (RVALUE_WB_PROTECTED(p)) {
- rgengc_report(2, objspace, "rgengc_rememberset_mark: clear %p (%s)\n", p, obj_type_name((VALUE)p));
-#if RGENGC_THREEGEN
- if (RVALUE_INFANT_P((VALUE)p)) RVALUE_PROMOTE_INFANT((VALUE)p);
- if (RVALUE_YOUNG_P((VALUE)p)) RVALUE_PROMOTE_YOUNG((VALUE)p);
-#endif
- CLEAR_IN_BITMAP(bits, p);
-#if RGENGC_PROFILE > 0
- clear_count++;
-#endif
- }
- else {
-#if RGENGC_PROFILE > 0
- shady_object_count++;
-#endif
- }
+ if (bitset) {
+ p = offset + j * BITS_BITLENGTH;
- rgengc_report(2, objspace, "rgengc_rememberset_mark: mark %p (%s)\n", p, obj_type_name((VALUE)p));
- gc_mark_children(objspace, (VALUE) p);
- }
- p++;
- bitset >>= 1;
- } while (bitset);
+ do {
+ if (bitset & 1) {
+ VALUE obj = (VALUE)p;
+ gc_report(2, objspace, "rgengc_rememberset_mark: mark %s\n", obj_info(obj));
+
+ if (RGENGC_CHECK_MODE) {
+ assert(RVALUE_LONG_LIVED(obj));
+ assert(RVALUE_OLD_P(obj) || RVALUE_WB_UNPROTECTED(obj));
+ }
+
+ gc_mark_children(objspace, obj);
+ }
+ p++;
+ bitset >>= 1;
+ } while (bitset);
+ }
}
}
+#if PROFILE_REMEMBERSET_MARK
+ else {
+ skip++;
+ }
+#endif
+
page = page->next;
}
- rgengc_report(2, objspace, "rgengc_rememberset_mark: finished\n");
-
-#if RGENGC_PROFILE > 0
- rgengc_report(2, objspace, "rgengc_rememberset_mark: clear_count: %"PRIdSIZE", shady_object_count: %"PRIdSIZE"\n", clear_count, shady_object_count);
- if (gc_prof_record(objspace)) {
- gc_profile_record *record = gc_prof_record(objspace);
- record->remembered_normal_objects = clear_count;
- record->remembered_shady_objects = shady_object_count;
- }
+#if PROFILE_REMEMBERSET_MARK
+ fprintf(stderr, "%d\t%d\t%d\t%d\n", has_both, has_old, has_shady, skip);
#endif
+ gc_report(1, objspace, "rgengc_rememberset_mark: finished\n");
}
static void
@@ -4719,8 +5311,11 @@ rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_heap_t *heap)
struct heap_page *page = heap->pages;
while (page) {
- memset(&page->mark_bits[0], 0, HEAP_BITMAP_SIZE);
- memset(&page->rememberset_bits[0], 0, HEAP_BITMAP_SIZE);
+ memset(&page->mark_bits[0], 0, HEAP_BITMAP_SIZE);
+ memset(&page->marking_bits[0], 0, HEAP_BITMAP_SIZE);
+ memset(&page->long_lived_bits[0], 0, HEAP_BITMAP_SIZE);
+ page->flags.has_long_lived_shady_objects = FALSE;
+ page->flags.has_remembered_objects = FALSE;
page = page->next;
}
}
@@ -4728,67 +5323,137 @@ rgengc_mark_and_rememberset_clear(rb_objspace_t *objspace, rb_heap_t *heap)
/* RGENGC: APIs */
void
-rb_gc_writebarrier(VALUE a, VALUE b)
+rb_gc_writebarrier_generational(VALUE a, VALUE b)
{
+ rb_objspace_t *objspace = &rb_objspace;
+
if (RGENGC_CHECK_MODE) {
- if (!RVALUE_PROMOTED_P(a)) rb_bug("rb_gc_writebarrier: referer object %p (%s) is not promoted.\n", (void *)a, obj_type_name(a));
+ if (!RVALUE_OLD_P(a)) rb_bug("rb_gc_writebarrier_generational: %s is not an old object.", obj_info(a));
+ if ( RVALUE_OLD_P(b)) rb_bug("rb_gc_writebarrier_generational: %s is an old object.", obj_info(b));
+ if (is_incremental_marking(objspace)) rb_bug("rb_gc_writebarrier_generational: called while incremental marking: %s -> %s", obj_info(a), obj_info(b));
}
- if (!RVALUE_OLD_P(b) && RVALUE_OLD_BITMAP_P(a)) {
- rb_objspace_t *objspace = &rb_objspace;
-
- if (!rgengc_remembered(objspace, a)) {
- rgengc_report(2, objspace, "rb_gc_wb: %p (%s) -> %p (%s)\n",
- (void *)a, obj_type_name(a), (void *)b, obj_type_name(b));
- rgengc_remember(objspace, a);
- }
+ if (!rgengc_remembered(objspace, a)) {
+ gc_report(1, objspace, "rb_gc_writebarrier_generational: %s -> %s\n", obj_info(a), obj_info(b));
+ rgengc_remember(objspace, a);
}
}
-void
-rb_gc_writebarrier_unprotect_promoted(VALUE obj)
+#if GC_ENABLE_INCREMENTAL_MARK
+
+static void
+gc_mark_from(rb_objspace_t *objspace, VALUE obj, VALUE parent)
+{
+ gc_mark_set_parent(objspace, parent);
+ rgengc_check_relation(objspace, obj);
+ if (gc_mark_set(objspace, obj) == FALSE) return;
+ gc_aging(objspace, obj);
+ gc_grey(objspace, obj);
+}
+
+int
+rb_gc_writebarrier_incremental(VALUE a, VALUE b)
{
rb_objspace_t *objspace = &rb_objspace;
if (RGENGC_CHECK_MODE) {
- if (!RVALUE_PROMOTED_P(obj)) rb_bug("rb_gc_writebarrier_unprotect_promoted: called on non-promoted object");
- if (!RVALUE_WB_PROTECTED(obj)) rb_bug("rb_gc_writebarrier_unprotect_promoted: called on shady object");
+ if (SPECIAL_CONST_P(a)) rb_bug("rb_gc_writebarrier: a is special const");
+ if (SPECIAL_CONST_P(b)) rb_bug("rb_gc_writebarrier: a is special const");
}
- rgengc_report(0, objspace, "rb_gc_writebarrier_unprotect_promoted: %p (%s)%s\n", (void *)obj, obj_type_name(obj),
- rgengc_remembered(objspace, obj) ? " (already remembered)" : "");
+ if (LIKELY(!is_incremental_marking(objspace))) {
+ return FALSE;
+ }
+ else {
+ gc_report(2, objspace, "rb_gc_writebarrier_incremental: [LG] %s -> %s\n", obj_info(a), obj_info(b));
- if (RVALUE_OLD_P(obj)) {
- RVALUE_DEMOTE_FROM_OLD(obj);
+ if (RVALUE_BLACK_P(a)) {
+ if (RVALUE_WHITE_P(b)) {
+ if (!RVALUE_WB_UNPROTECTED(a)) {
+ gc_report(2, objspace, "rb_gc_writebarrier_incremental: [IN] %s -> %s\n", obj_info(a), obj_info(b));
+ gc_mark_from(objspace, b, a);
+ }
+ }
+ else if (RVALUE_OLD_P(a) && !RVALUE_OLD_P(b)) {
+ if (!RVALUE_WB_UNPROTECTED(b)) {
+ gc_report(1, objspace, "rb_gc_writebarrier_incremental: [GN] %s -> %s\n", obj_info(a), obj_info(b));
+ RVALUE_AGE_SET_OLD(objspace, b);
+
+ if (RVALUE_BLACK_P(b)) {
+ gc_grey(objspace, b);
+ }
+ }
+ else {
+ gc_report(1, objspace, "rb_gc_writebarrier_incremental: [LL] %s -> %s\n", obj_info(a), obj_info(b));
+ gc_remember_unprotected(objspace, b);
+ }
+ }
+ }
+
+ return TRUE;
+ }
+}
+#endif
- rgengc_remember(objspace, obj);
- objspace->rgengc.remembered_shady_object_count++;
+void
+rb_gc_writebarrier_unprotect(VALUE obj)
+{
+ if (RVALUE_WB_UNPROTECTED(obj)) {
+ return;
+ }
+ else {
+ rb_objspace_t *objspace = &rb_objspace;
+
+ gc_report(2, objspace, "rb_gc_writebarrier_unprotect: %s %s\n", obj_info(obj),
+ rgengc_remembered(objspace, obj) ? " (already remembered)" : "");
+
+ if (RVALUE_OLD_P(obj)) {
+ gc_report(1, objspace, "rb_gc_writebarrier_unprotect: %s\n", obj_info(obj));
+ RVALUE_DEMOTE(objspace, obj);
+ gc_mark_set(objspace, obj);
+ gc_remember_unprotected(objspace, obj);
#if RGENGC_PROFILE
- objspace->profile.shade_operation_count++;
+ objspace->profile.total_shade_operation_count++;
#if RGENGC_PROFILE >= 2
- objspace->profile.shade_operation_count_types[BUILTIN_TYPE(obj)]++;
+ objspace->profile.shade_operation_count_types[BUILTIN_TYPE(obj)]++;
#endif /* RGENGC_PROFILE >= 2 */
#endif /* RGENGC_PROFILE */
+ }
+ else {
+ RVALUE_AGE_RESET(obj);
+ }
+
+ MARK_IN_BITMAP(GET_HEAP_WB_UNPROTECTED_BITS(obj), obj);
}
-#if RGENGC_THREEGEN
- else {
- RVALUE_DEMOTE_FROM_YOUNG(obj);
- }
-#endif
}
+/*
+ * remember `obj' if needed.
+ */
void
-rb_gc_writebarrier_remember_promoted(VALUE obj)
+rb_gc_writebarrier_remember(VALUE obj)
{
rb_objspace_t *objspace = &rb_objspace;
- rgengc_remember(objspace, obj);
+
+ gc_report(1, objspace, "rb_gc_writebarrier_remember: %s\n", obj_info(obj));
+
+ if (is_incremental_marking(objspace)) {
+ if (RVALUE_BLACK_P(obj)) {
+ gc_grey(objspace, obj);
+ }
+ }
+ else {
+ if (RVALUE_OLD_P(obj)) {
+ rgengc_remember(objspace, obj);
+ }
+ }
}
static st_table *rgengc_unprotect_logging_table;
static int
-rgengc_unprotect_logging_exit_func_i(st_data_t key, st_data_t val)
+rgengc_unprotect_logging_exit_func_i(st_data_t key, st_data_t val, st_data_t arg)
{
fprintf(stderr, "%s\t%d\n", (char *)key, (int)val);
return ST_CONTINUE;
@@ -4810,12 +5475,12 @@ rb_gc_unprotect_logging(void *objptr, const char *filename, int line)
atexit(rgengc_unprotect_logging_exit_func);
}
- if (OBJ_WB_PROTECTED(obj)) {
+ if (RVALUE_WB_UNPROTECTED(obj) == 0) {
char buff[0x100];
st_data_t cnt = 1;
char *ptr = buff;
- snprintf(ptr, 0x100 - 1, "%s|%s:%d", obj_type_name(obj), filename, line);
+ snprintf(ptr, 0x100 - 1, "%s|%s:%d", obj_info(obj), filename, line);
if (st_lookup(rgengc_unprotect_logging_table, (st_data_t)ptr, &cnt)) {
cnt++;
@@ -4830,12 +5495,26 @@ rb_gc_unprotect_logging(void *objptr, const char *filename, int line)
#endif /* USE_RGENGC */
+void
+rb_copy_wb_protected_attribute(VALUE dest, VALUE obj)
+{
+#if USE_RGENGC
+ if (RVALUE_WB_UNPROTECTED(obj)) {
+ MARK_IN_BITMAP(GET_HEAP_WB_UNPROTECTED_BITS(dest), dest);
+ }
+#endif
+}
+
/* RGENGC analysis information */
VALUE
rb_obj_rgengc_writebarrier_protected_p(VALUE obj)
{
- return OBJ_WB_PROTECTED(obj) ? Qtrue : Qfalse;
+#if USE_RGENGC
+ return RVALUE_WB_UNPROTECTED(obj) ? Qfalse : Qtrue;
+#else
+ return Qfalse;
+#endif
}
VALUE
@@ -4850,10 +5529,7 @@ rb_obj_gc_flags(VALUE obj, ID* flags, size_t max)
size_t n = 0;
static ID ID_marked;
#if USE_RGENGC
- static ID ID_wb_protected, ID_old, ID_remembered;
-#if RGENGC_THREEGEN
- static ID ID_young, ID_infant;
-#endif
+ static ID ID_wb_protected, ID_old, ID_marking, ID_long_lived;
#endif
if (!ID_marked) {
@@ -4862,52 +5538,64 @@ rb_obj_gc_flags(VALUE obj, ID* flags, size_t max)
#if USE_RGENGC
I(wb_protected);
I(old);
- I(remembered);
-#if RGENGC_THREEGEN
- I(young);
- I(infant);
-#endif
+ I(marking);
+ I(long_lived);
#endif
#undef I
}
#if USE_RGENGC
- if (OBJ_WB_PROTECTED(obj) && n<max)
- flags[n++] = ID_wb_protected;
- if (RVALUE_OLD_P(obj) && n<max)
- flags[n++] = ID_old;
-#if RGENGC_THREEGEN
- if (RVALUE_YOUNG_P(obj) && n<max)
- flags[n++] = ID_young;
- if (RVALUE_INFANT_P(obj) && n<max)
- flags[n++] = ID_infant;
-#endif
- if (MARKED_IN_BITMAP(GET_HEAP_REMEMBERSET_BITS(obj), obj) && n<max)
- flags[n++] = ID_remembered;
-#endif
- if (MARKED_IN_BITMAP(GET_HEAP_MARK_BITS(obj), obj) && n<max)
- flags[n++] = ID_marked;
-
+ if (RVALUE_WB_UNPROTECTED(obj) == 0 && n<max) flags[n++] = ID_wb_protected;
+ if (RVALUE_OLD_P(obj) && n<max) flags[n++] = ID_old;
+ if (RVALUE_LONG_LIVED(obj) && n<max) flags[n++] = ID_long_lived;
+ if (MARKED_IN_BITMAP(GET_HEAP_MARKING_BITS(obj), obj) && n<max) flags[n++] = ID_marking;
+#endif
+ if (MARKED_IN_BITMAP(GET_HEAP_MARK_BITS(obj), obj) && n<max) flags[n++] = ID_marked;
return n;
}
/* GC */
void
-rb_gc_force_recycle(VALUE p)
+rb_gc_force_recycle(VALUE obj)
{
rb_objspace_t *objspace = &rb_objspace;
#if USE_RGENGC
- CLEAR_IN_BITMAP(GET_HEAP_REMEMBERSET_BITS(p), p);
- CLEAR_IN_BITMAP(GET_HEAP_OLDGEN_BITS(p), p);
- if (!GET_HEAP_PAGE(p)->before_sweep) {
- CLEAR_IN_BITMAP(GET_HEAP_MARK_BITS(p), p);
+ int is_old = RVALUE_OLD_P(obj);
+
+ gc_report(2, objspace, "rb_gc_force_recycle: %s\n", obj_info(obj));
+
+ if (is_old) {
+ if (RVALUE_MARKED(obj)) {
+ objspace->rgengc.old_objects--;
+ }
}
+ CLEAR_IN_BITMAP(GET_HEAP_LONG_LIVED_BITS(obj), obj);
+ CLEAR_IN_BITMAP(GET_HEAP_WB_UNPROTECTED_BITS(obj), obj);
+
+#if GC_ENABLE_INCREMENTAL_MARK
+ if (is_incremental_marking(objspace)) {
+ if (MARKED_IN_BITMAP(GET_HEAP_MARKING_BITS(obj), obj)) {
+ invalidate_mark_stack(&objspace->mark_stack, obj);
+ CLEAR_IN_BITMAP(GET_HEAP_MARKING_BITS(obj), obj);
+ }
+ CLEAR_IN_BITMAP(GET_HEAP_MARK_BITS(obj), obj);
+ }
+ else {
+#endif
+ if (is_old || !GET_HEAP_PAGE(obj)->flags.before_sweep) {
+ CLEAR_IN_BITMAP(GET_HEAP_MARK_BITS(obj), obj);
+ }
+ CLEAR_IN_BITMAP(GET_HEAP_MARKING_BITS(obj), obj);
+#if GC_ENABLE_INCREMENTAL_MARK
+ }
+#endif
#endif
- objspace->profile.total_freed_object_num++;
- heap_page_add_freeobj(objspace, GET_HEAP_PAGE(p), p);
+ objspace->profile.total_freed_objects++;
+
+ heap_page_add_freeobj(objspace, GET_HEAP_PAGE(obj), obj);
/* Disable counting swept_slots because there are no meaning.
* if (!MARKED_IN_BITMAP(GET_HEAP_MARK_BITS(p), p)) {
@@ -4916,10 +5604,21 @@ rb_gc_force_recycle(VALUE p)
*/
}
+#ifndef MARK_OBJECT_ARY_BUCKET_SIZE
+#define MARK_OBJECT_ARY_BUCKET_SIZE 1024
+#endif
+
void
rb_gc_register_mark_object(VALUE obj)
{
- VALUE ary = GET_THREAD()->vm->mark_object_ary;
+ VALUE ary_ary = GET_THREAD()->vm->mark_object_ary;
+ VALUE ary = rb_ary_last(0, 0, ary_ary);
+
+ if (ary == Qnil || RARRAY_LEN(ary) >= MARK_OBJECT_ARY_BUCKET_SIZE) {
+ ary = rb_ary_tmp_new(MARK_OBJECT_ARY_BUCKET_SIZE);
+ rb_ary_push(ary_ary, ary);
+ }
+
rb_ary_push(ary, obj);
}
@@ -4930,19 +5629,19 @@ rb_gc_register_address(VALUE *addr)
struct gc_list *tmp;
tmp = ALLOC(struct gc_list);
- tmp->next = global_List;
+ tmp->next = global_list;
tmp->varptr = addr;
- global_List = tmp;
+ global_list = tmp;
}
void
rb_gc_unregister_address(VALUE *addr)
{
rb_objspace_t *objspace = &rb_objspace;
- struct gc_list *tmp = global_List;
+ struct gc_list *tmp = global_list;
if (tmp->varptr == addr) {
- global_List = tmp->next;
+ global_list = tmp->next;
xfree(tmp);
return;
}
@@ -4966,134 +5665,351 @@ rb_global_variable(VALUE *var)
#define GC_NOTIFY 0
+enum {
+ gc_stress_no_major,
+ gc_stress_no_immediate_sweep,
+ gc_stress_full_mark_after_malloc,
+ gc_stress_max
+};
+
+#define gc_stress_full_mark_after_malloc_p() \
+ (FIXNUM_P(ruby_gc_stress_mode) && (FIX2LONG(ruby_gc_stress_mode) & (1<<gc_stress_full_mark_after_malloc)))
+
+static void
+heap_ready_to_gc(rb_objspace_t *objspace, rb_heap_t *heap)
+{
+ if (!heap->freelist && !heap->free_pages) {
+ if (!heap_increment(objspace, heap)) {
+ heap_set_increment(objspace, 1);
+ heap_increment(objspace, heap);
+ }
+ }
+}
+
static int
-garbage_collect_body(rb_objspace_t *objspace, int full_mark, int immediate_sweep, int reason)
+ready_to_gc(rb_objspace_t *objspace)
+{
+ if (dont_gc || during_gc || ruby_disable_gc) {
+ heap_ready_to_gc(objspace, heap_eden);
+ return FALSE;
+ }
+ else {
+ return TRUE;
+ }
+}
+
+static void
+gc_reset_malloc_info(rb_objspace_t *objspace)
{
- if (ruby_gc_stress && !ruby_disable_gc_stress) {
- int flag = FIXNUM_P(ruby_gc_stress) ? FIX2INT(ruby_gc_stress) : 0;
+ gc_prof_set_malloc_info(objspace);
+ {
+ size_t inc = ATOMIC_SIZE_EXCHANGE(malloc_increase, 0);
+ size_t old_limit = malloc_limit;
- if (flag & 0x01)
- reason &= ~GPR_FLAG_MAJOR_MASK;
- else
- reason |= GPR_FLAG_MAJOR_BY_STRESS;
- immediate_sweep = !(flag & 0x02);
+ if (inc > malloc_limit) {
+ malloc_limit = (size_t)(inc * gc_params.malloc_limit_growth_factor);
+ if (gc_params.malloc_limit_max > 0 && /* ignore max-check if 0 */
+ malloc_limit > gc_params.malloc_limit_max) {
+ malloc_limit = gc_params.malloc_limit_max;
+ }
+ }
+ else {
+ malloc_limit = (size_t)(malloc_limit * 0.98); /* magic number */
+ if (malloc_limit < gc_params.malloc_limit_min) {
+ malloc_limit = gc_params.malloc_limit_min;
+ }
+ }
+
+ if (0) {
+ if (old_limit != malloc_limit) {
+ fprintf(stderr, "[%"PRIuSIZE"] malloc_limit: %"PRIuSIZE" -> %"PRIuSIZE"\n",
+ rb_gc_count(), old_limit, malloc_limit);
+ }
+ else {
+ fprintf(stderr, "[%"PRIuSIZE"] malloc_limit: not changed (%"PRIuSIZE")\n",
+ rb_gc_count(), malloc_limit);
+ }
+ }
+ }
+
+ /* reset oldmalloc info */
+#if RGENGC_ESTIMATE_OLDMALLOC
+ if (!is_full_marking(objspace)) {
+ if (objspace->rgengc.oldmalloc_increase > objspace->rgengc.oldmalloc_increase_limit) {
+ objspace->rgengc.need_major_gc |= GPR_FLAG_MAJOR_BY_OLDMALLOC;;
+ objspace->rgengc.oldmalloc_increase_limit =
+ (size_t)(objspace->rgengc.oldmalloc_increase_limit * gc_params.oldmalloc_limit_growth_factor);
+
+ if (objspace->rgengc.oldmalloc_increase_limit > gc_params.oldmalloc_limit_max) {
+ objspace->rgengc.oldmalloc_increase_limit = gc_params.oldmalloc_limit_max;
+ }
+ }
+
+ if (0) fprintf(stderr, "%d\t%d\t%u\t%u\t%d\n",
+ (int)rb_gc_count(),
+ (int)objspace->rgengc.need_major_gc,
+ (unsigned int)objspace->rgengc.oldmalloc_increase,
+ (unsigned int)objspace->rgengc.oldmalloc_increase_limit,
+ (unsigned int)gc_params.oldmalloc_limit_max);
}
else {
- if (!GC_ENABLE_LAZY_SWEEP || objspace->flags.dont_lazy_sweep) {
- immediate_sweep = TRUE;
+ /* major GC */
+ objspace->rgengc.oldmalloc_increase = 0;
+
+ if ((objspace->profile.latest_gc_info & GPR_FLAG_MAJOR_BY_OLDMALLOC) == 0) {
+ objspace->rgengc.oldmalloc_increase_limit =
+ (size_t)(objspace->rgengc.oldmalloc_increase_limit / ((gc_params.oldmalloc_limit_growth_factor - 1)/10 + 1));
+ if (objspace->rgengc.oldmalloc_increase_limit < gc_params.oldmalloc_limit_min) {
+ objspace->rgengc.oldmalloc_increase_limit = gc_params.oldmalloc_limit_min;
+ }
}
-#if USE_RGENGC
- if (full_mark) {
- reason |= GPR_FLAG_MAJOR_BY_NOFREE;
+ }
+#endif
+}
+
+static int
+garbage_collect(rb_objspace_t *objspace, int full_mark, int immediate_mark, int immediate_sweep, int reason)
+{
+#if GC_PROFILE_MORE_DETAIL
+ objspace->profile.prepare_time = getrusage_time();
+#endif
+
+ gc_rest(objspace);
+
+#if GC_PROFILE_MORE_DETAIL
+ objspace->profile.prepare_time = getrusage_time() - objspace->profile.prepare_time;
+#endif
+
+ return gc_start(objspace, full_mark, immediate_mark, immediate_sweep, reason);
+}
+
+static int
+gc_start(rb_objspace_t *objspace, const int full_mark, const int immediate_mark, const unsigned int immediate_sweep, int reason)
+{
+ int do_full_mark = full_mark;
+ objspace->flags.immediate_sweep = immediate_sweep;
+
+ if (!heap_allocated_pages) return FALSE; /* heap is not ready */
+ if (!ready_to_gc(objspace)) return TRUE; /* GC is not allowed */
+
+ if (RGENGC_CHECK_MODE) {
+ assert(objspace->flags.stat == gc_stat_none);
+ assert(!is_lazy_sweeping(heap_eden));
+ assert(!is_incremental_marking(objspace));
+#if RGENGC_CHECK_MODE >= 2
+ gc_verify_internal_consistency(Qnil);
+#endif
+ }
+
+ gc_enter(objspace, "gc_start");
+
+ if (ruby_gc_stressful) {
+ int flag = FIXNUM_P(ruby_gc_stress_mode) ? FIX2INT(ruby_gc_stress_mode) : 0;
+
+ if ((flag & (1<<gc_stress_no_major)) == 0) {
+ do_full_mark = TRUE;
}
+
+ objspace->flags.immediate_sweep = !(flag & (1<<gc_stress_no_immediate_sweep));
+ }
+ else {
+#if USE_RGENGC
if (objspace->rgengc.need_major_gc) {
reason |= objspace->rgengc.need_major_gc;
- objspace->rgengc.need_major_gc = GPR_FLAG_NONE;
- }
- if (objspace->rgengc.remembered_shady_object_count > objspace->rgengc.remembered_shady_object_limit) {
- reason |= GPR_FLAG_MAJOR_BY_SHADY;
- }
- if (objspace->rgengc.old_object_count > objspace->rgengc.old_object_limit) {
- reason |= GPR_FLAG_MAJOR_BY_OLDGEN;
+ do_full_mark = TRUE;
}
+
+ objspace->rgengc.need_major_gc = GPR_FLAG_NONE;
+ if (RGENGC_FORCE_MAJOR_GC) objspace->rgengc.need_major_gc = GPR_FLAG_MAJOR_BY_NOFREE;
+#endif
+ }
+
+ if (do_full_mark && (reason & GPR_FLAG_MAJOR_MASK) == 0) {
+ reason |= GPR_FLAG_MAJOR_BY_FORCE; /* GC by CAPI, METHOD, and so on. */
+ }
+
+#if GC_ENABLE_INCREMENTAL_MARK
+ if (!GC_ENABLE_INCREMENTAL_MARK || objspace->flags.dont_incremental || immediate_mark) {
+ objspace->flags.during_incremental_marking = FALSE;
+ }
+ else {
+ objspace->flags.during_incremental_marking = do_full_mark;
+ }
#endif
+
+ if (!GC_ENABLE_LAZY_SWEEP || objspace->flags.dont_incremental) {
+ objspace->flags.immediate_sweep = TRUE;
}
- if (immediate_sweep) reason |= GPR_FLAG_IMMEDIATE_SWEEP;
- full_mark = (reason & GPR_FLAG_MAJOR_MASK) ? TRUE : FALSE;
+ if (objspace->flags.immediate_sweep) reason |= GPR_FLAG_IMMEDIATE_SWEEP;
- if (GC_NOTIFY) fprintf(stderr, "start garbage_collect(%d, %d, %d)\n", full_mark, immediate_sweep, reason);
+ gc_report(1, objspace, "gc_start(%d, %d, %d, reason: %d) => %d, %d, %d\n",
+ full_mark, immediate_mark, immediate_sweep, reason,
+ do_full_mark, !is_incremental_marking(objspace), objspace->flags.immediate_sweep);
objspace->profile.count++;
objspace->profile.latest_gc_info = reason;
+ objspace->profile.total_allocated_objects_at_gc_start = objspace->total_allocated_objects;
+ objspace->profile.heap_used_at_gc_start = heap_allocated_pages;
+ gc_prof_setup_new_record(objspace, reason);
+ gc_reset_malloc_info(objspace);
gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_START, 0 /* TODO: pass minor/immediate flag? */);
+ if (RGENGC_CHECK_MODE) assert(during_gc);
- objspace->profile.total_allocated_object_num_at_gc_start = objspace->profile.total_allocated_object_num;
- objspace->profile.heap_used_at_gc_start = heap_pages_used;
-
- gc_prof_setup_new_record(objspace, reason);
gc_prof_timer_start(objspace);
{
- if (during_gc == 0) {
- rb_bug("during_gc should not be 0. RUBY_INTERNAL_EVENT_GC_START user should not cause GC in events.");
- }
- gc_marks(objspace, full_mark);
- gc_sweep(objspace, immediate_sweep);
- during_gc = 0;
+ gc_marks(objspace, do_full_mark);
}
gc_prof_timer_stop(objspace);
- if (GC_NOTIFY) fprintf(stderr, "end garbage_collect()\n");
+ gc_exit(objspace, "gc_start");
return TRUE;
}
-static int
-heap_ready_to_gc(rb_objspace_t *objspace, rb_heap_t *heap)
+static void
+gc_rest(rb_objspace_t *objspace)
{
- if (dont_gc || during_gc) {
- if (!heap->freelist && !heap->free_pages) {
- if (!heap_increment(objspace, heap)) {
- heap_set_increment(objspace, 0);
- heap_increment(objspace, heap);
- }
+ int marking = is_incremental_marking(objspace);
+ int sweeping = is_lazy_sweeping(heap_eden);
+
+ if (marking || sweeping) {
+ gc_enter(objspace, "gc_rest");
+
+ if (RGENGC_CHECK_MODE >= 2) gc_verify_internal_consistency(Qnil);
+
+ if (is_incremental_marking(objspace)) {
+ PUSH_MARK_FUNC_DATA(NULL);
+ gc_marks_rest(objspace);
+ POP_MARK_FUNC_DATA();
}
- return FALSE;
+ if (is_lazy_sweeping(heap_eden)) {
+ gc_sweep_rest(objspace);
+ }
+ gc_exit(objspace, "gc_rest");
}
- return TRUE;
}
-static int
-ready_to_gc(rb_objspace_t *objspace)
-{
- return heap_ready_to_gc(objspace, heap_eden);
-}
+struct objspace_and_reason {
+ rb_objspace_t *objspace;
+ int reason;
+ int full_mark;
+ int immediate_mark;
+ int immediate_sweep;
+};
-static int
-garbage_collect(rb_objspace_t *objspace, int full_mark, int immediate_sweep, int reason)
+static void
+gc_current_status_fill(rb_objspace_t *objspace, char *buff)
{
- if (!heap_pages_used) {
- during_gc = 0;
- return FALSE;
+ int i = 0;
+ if (is_marking(objspace)) {
+ buff[i++] = 'M';
+#if USE_RGENGC
+ if (is_full_marking(objspace)) buff[i++] = 'F';
+#if GC_ENABLE_INCREMENTAL_MARK
+ if (is_incremental_marking(objspace)) buff[i++] = 'I';
+#endif
+#endif
}
- if (!ready_to_gc(objspace)) {
- during_gc = 0;
- return TRUE;
+ else if (is_sweeping(objspace)) {
+ buff[i++] = 'S';
+ if (is_lazy_sweeping(heap_eden)) buff[i++] = 'L';
+ }
+ else {
+ buff[i++] = 'N';
}
+ buff[i] = '\0';
+}
-#if GC_PROFILE_MORE_DETAIL
- objspace->profile.prepare_time = getrusage_time();
-#endif
- gc_rest_sweep(objspace);
-#if GC_PROFILE_MORE_DETAIL
- objspace->profile.prepare_time = getrusage_time() - objspace->profile.prepare_time;
+static const char *
+gc_current_status(rb_objspace_t *objspace)
+{
+ static char buff[0x10];
+ gc_current_status_fill(objspace, buff);
+ return buff;
+}
+
+#if PRINT_ENTER_EXIT_TICK
+
+static tick_t last_exit_tick;
+static tick_t enter_tick;
+static int enter_count = 0;
+static char last_gc_status[0x10];
+
+static inline void
+gc_record(rb_objspace_t *objspace, int direction, const char *event)
+{
+ if (direction == 0) { /* enter */
+ enter_count++;
+ enter_tick = tick();
+ gc_current_status_fill(objspace, last_gc_status);
+ }
+ else { /* exit */
+ tick_t exit_tick = tick();
+ char current_gc_status[0x10];
+ gc_current_status_fill(objspace, current_gc_status);
+#if 1
+ /* [last mutator time] [gc time] [event] */
+ fprintf(stderr, "%"PRItick"\t%"PRItick"\t%s\t[%s->%s]\n",
+ enter_tick - last_exit_tick,
+ exit_tick - enter_tick,
+ event,
+ last_gc_status, current_gc_status);
+ last_exit_tick = exit_tick;
+#else
+ /* [enter_tick] [gc time] [event] */
+ fprintf(stderr, "%"PRItick"\t%"PRItick"\t%s\t[%s->%s]\n",
+ enter_tick,
+ exit_tick - enter_tick,
+ event,
+ last_gc_status, current_gc_status);
#endif
+ }
+}
+#else /* PRINT_ENTER_EXIT_TICK */
+static inline void
+gc_record(rb_objspace_t *objspace, int direction, const char *event)
+{
+ /* null */
+}
+#endif /* PRINT_ENTER_EXIT_TICK */
- during_gc++;
+static inline void
+gc_enter(rb_objspace_t *objspace, const char *event)
+{
+ if (RGENGC_CHECK_MODE) assert(during_gc == 0);
+ if (RGENGC_CHECK_MODE >= 3) gc_verify_internal_consistency(Qnil);
- return garbage_collect_body(objspace, full_mark, immediate_sweep, reason);
+ during_gc = TRUE;
+ gc_report(1, objspace, "gc_entr: %s [%s]\n", event, gc_current_status(objspace));
+ gc_record(objspace, 0, event);
+ gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_ENTER, 0); /* TODO: which parameter should be passed? */
}
-struct objspace_and_reason {
- rb_objspace_t *objspace;
- int reason;
- int full_mark;
- int immediate_sweep;
-};
+static inline void
+gc_exit(rb_objspace_t *objspace, const char *event)
+{
+ if (RGENGC_CHECK_MODE) assert(during_gc != 0);
+
+ gc_event_hook(objspace, RUBY_INTERNAL_EVENT_GC_EXIT, 0); /* TODO: which parameter should be passsed? */
+ gc_record(objspace, 1, event);
+ gc_report(1, objspace, "gc_exit: %s [%s]\n", event, gc_current_status(objspace));
+ during_gc = FALSE;
+}
static void *
gc_with_gvl(void *ptr)
{
struct objspace_and_reason *oar = (struct objspace_and_reason *)ptr;
- return (void *)(VALUE)garbage_collect(oar->objspace, oar->full_mark, oar->immediate_sweep, oar->reason);
+ return (void *)(VALUE)garbage_collect(oar->objspace, oar->full_mark, oar->immediate_mark, oar->immediate_sweep, oar->reason);
}
static int
-garbage_collect_with_gvl(rb_objspace_t *objspace, int full_mark, int immediate_sweep, int reason)
+garbage_collect_with_gvl(rb_objspace_t *objspace, int full_mark, int immediate_mark, int immediate_sweep, int reason)
{
if (dont_gc) return TRUE;
if (ruby_thread_has_gvl_p()) {
- return garbage_collect(objspace, full_mark, immediate_sweep, reason);
+ return garbage_collect(objspace, full_mark, immediate_mark, immediate_sweep, reason);
}
else {
if (ruby_native_thread_p()) {
@@ -5101,6 +6017,7 @@ garbage_collect_with_gvl(rb_objspace_t *objspace, int full_mark, int immediate_s
oar.objspace = objspace;
oar.reason = reason;
oar.full_mark = full_mark;
+ oar.immediate_mark = immediate_mark;
oar.immediate_sweep = immediate_sweep;
return (int)(VALUE)rb_thread_call_with_gvl(gc_with_gvl, (void *)&oar);
}
@@ -5115,7 +6032,7 @@ garbage_collect_with_gvl(rb_objspace_t *objspace, int full_mark, int immediate_s
int
rb_garbage_collect(void)
{
- return garbage_collect(&rb_objspace, TRUE, TRUE, GPR_FLAG_CAPI);
+ return garbage_collect(&rb_objspace, TRUE, TRUE, TRUE, GPR_FLAG_CAPI);
}
#undef Init_stack
@@ -5130,14 +6047,14 @@ Init_stack(volatile VALUE *addr)
* call-seq:
* GC.start -> nil
* GC.garbage_collect -> nil
- * ObjectSpace.garbage_collect -> nil
- * GC.start(full_mark: false) -> nil
+ * GC.start(full_mark: true, immediate_sweep: true) -> nil
+ * GC.garbage_collect(full_mark: true, immediate_sweep: true) -> nil
*
* Initiates garbage collection, unless manually disabled.
*
* This method is defined with keyword arguments that default to true:
*
- * def GC.start(full_mark: true, immediate_sweep: true) end
+ * def GC.start(full_mark: true, immediate_sweep: true); end
*
* Use full_mark: false to perform a minor GC.
* Use immediate_sweep: false to defer sweeping (use lazy sweep).
@@ -5151,29 +6068,29 @@ static VALUE
gc_start_internal(int argc, VALUE *argv, VALUE self)
{
rb_objspace_t *objspace = &rb_objspace;
- int full_mark = TRUE, immediate_sweep = TRUE;
+ int full_mark = TRUE, immediate_mark = TRUE, immediate_sweep = TRUE;
VALUE opt = Qnil;
- static ID keyword_ids[2];
+ static ID keyword_ids[3];
rb_scan_args(argc, argv, "0:", &opt);
if (!NIL_P(opt)) {
- VALUE kwvals[2];
+ VALUE kwvals[3];
if (!keyword_ids[0]) {
keyword_ids[0] = rb_intern("full_mark");
- keyword_ids[1] = rb_intern("immediate_sweep");
+ keyword_ids[1] = rb_intern("immediate_mark");
+ keyword_ids[2] = rb_intern("immediate_sweep");
}
- rb_get_kwargs(opt, keyword_ids, 0, 2, kwvals);
+ rb_get_kwargs(opt, keyword_ids, 0, 3, kwvals);
- if (kwvals[0] != Qundef)
- full_mark = RTEST(kwvals[0]);
- if (kwvals[1] != Qundef)
- immediate_sweep = RTEST(kwvals[1]);
+ if (kwvals[0] != Qundef) full_mark = RTEST(kwvals[0]);
+ if (kwvals[1] != Qundef) immediate_mark = RTEST(kwvals[1]);
+ if (kwvals[2] != Qundef) immediate_sweep = RTEST(kwvals[2]);
}
- garbage_collect(objspace, full_mark, immediate_sweep, GPR_FLAG_METHOD);
+ garbage_collect(objspace, full_mark, immediate_mark, immediate_sweep, GPR_FLAG_METHOD);
if (!finalizing) finalize_deferred(objspace);
return Qnil;
@@ -5190,7 +6107,7 @@ void
rb_gc(void)
{
rb_objspace_t *objspace = &rb_objspace;
- garbage_collect(objspace, TRUE, TRUE, GPR_FLAG_CAPI);
+ garbage_collect(objspace, TRUE, TRUE, TRUE, GPR_FLAG_CAPI);
if (!finalizing) finalize_deferred(objspace);
}
@@ -5202,6 +6119,9 @@ rb_during_gc(void)
}
#if RGENGC_PROFILE >= 2
+
+static const char *type_name(int type, VALUE obj);
+
static void
gc_count_add_each_types(VALUE hash, const char *name, const size_t *types)
{
@@ -5241,7 +6161,7 @@ static VALUE
gc_info_decode(int flags, VALUE hash_or_key)
{
static VALUE sym_major_by = Qnil, sym_gc_by, sym_immediate_sweep, sym_have_finalizer;
- static VALUE sym_nofree, sym_oldgen, sym_shady, sym_rescan, sym_stress;
+ static VALUE sym_nofree, sym_oldgen, sym_shady, sym_force, sym_stress;
#if RGENGC_ESTIMATE_OLDMALLOC
static VALUE sym_oldmalloc;
#endif
@@ -5262,11 +6182,11 @@ gc_info_decode(int flags, VALUE hash_or_key)
S(gc_by);
S(immediate_sweep);
S(have_finalizer);
+ S(stress);
S(nofree);
S(oldgen);
S(shady);
- S(rescan);
- S(stress);
+ S(force);
#if RGENGC_ESTIMATE_OLDMALLOC
S(oldmalloc);
#endif
@@ -5284,14 +6204,13 @@ gc_info_decode(int flags, VALUE hash_or_key)
rb_hash_aset(hash, sym_##name, (attr));
major_by =
+ (flags & GPR_FLAG_MAJOR_BY_NOFREE) ? sym_nofree :
(flags & GPR_FLAG_MAJOR_BY_OLDGEN) ? sym_oldgen :
(flags & GPR_FLAG_MAJOR_BY_SHADY) ? sym_shady :
- (flags & GPR_FLAG_MAJOR_BY_RESCAN) ? sym_rescan :
- (flags & GPR_FLAG_MAJOR_BY_STRESS) ? sym_stress :
+ (flags & GPR_FLAG_MAJOR_BY_FORCE) ? sym_force :
#if RGENGC_ESTIMATE_OLDMALLOC
(flags & GPR_FLAG_MAJOR_BY_OLDMALLOC) ? sym_oldmalloc :
#endif
- (flags & GPR_FLAG_MAJOR_BY_NOFREE) ? sym_nofree :
Qnil;
SET(major_by, major_by);
@@ -5308,8 +6227,9 @@ gc_info_decode(int flags, VALUE hash_or_key)
SET(immediate_sweep, (flags & GPR_FLAG_IMMEDIATE_SWEEP) ? Qtrue : Qfalse);
#undef SET
- if (key != Qnil) /* matched key should return above */
- rb_raise(rb_eArgError, "unknown key: %s", RSTRING_PTR(rb_id2str(SYM2ID(key))));
+ if (!NIL_P(key)) {/* matched key should return above */
+ rb_raise(rb_eArgError, "unknown key: %"PRIsVALUE, rb_sym2str(key));
+ }
return hash;
}
@@ -5342,151 +6262,159 @@ gc_latest_gc_info(int argc, VALUE *argv, VALUE self)
}
}
- if (arg == Qnil)
- arg = rb_hash_new();
+ if (arg == Qnil) {
+ arg = rb_hash_new();
+ }
return gc_info_decode(objspace->profile.latest_gc_info, arg);
}
-static VALUE
-gc_stat_internal(VALUE hash_or_sym, size_t *out)
+size_t
+gc_stat_internal(VALUE hash_or_sym)
{
static VALUE sym_count;
- static VALUE sym_heap_used, sym_heap_length, sym_heap_increment;
- static VALUE sym_heap_live_slot, sym_heap_free_slot, sym_heap_final_slot, sym_heap_swept_slot;
- static VALUE sym_heap_eden_page_length, sym_heap_tomb_page_length;
- static VALUE sym_total_allocated_object, sym_total_freed_object;
- static VALUE sym_malloc_increase, sym_malloc_limit;
+ static VALUE sym_heap_allocated_pages, sym_heap_sorted_length, sym_heap_allocatable_pages;
+ static VALUE sym_heap_available_slots, sym_heap_live_slots, sym_heap_free_slots, sym_heap_final_slots;
+ static VALUE sym_heap_marked_slots, sym_heap_swept_slots;
+ static VALUE sym_heap_eden_pages, sym_heap_tomb_pages;
+ static VALUE sym_total_allocated_pages, sym_total_freed_pages;
+ static VALUE sym_total_allocated_objects, sym_total_freed_objects;
+ static VALUE sym_malloc_increase_bytes, sym_malloc_increase_bytes_limit;
#if USE_RGENGC
static VALUE sym_minor_gc_count, sym_major_gc_count;
- static VALUE sym_remembered_shady_object, sym_remembered_shady_object_limit;
- static VALUE sym_old_object, sym_old_object_limit;
+ static VALUE sym_remembered_wb_unprotected_objects, sym_remembered_wb_unprotected_objects_limit;
+ static VALUE sym_old_objects, sym_old_objects_limit;
#if RGENGC_ESTIMATE_OLDMALLOC
- static VALUE sym_oldmalloc_increase, sym_oldmalloc_limit;
+ static VALUE sym_oldmalloc_increase_bytes, sym_oldmalloc_increase_bytes_limit;
#endif
#if RGENGC_PROFILE
- static VALUE sym_generated_normal_object_count, sym_generated_shady_object_count;
- static VALUE sym_shade_operation_count, sym_promote_infant_count, sym_promote_young_count;
- static VALUE sym_remembered_normal_object_count, sym_remembered_shady_object_count;
+ static VALUE sym_total_generated_normal_object_count, sym_total_generated_shady_object_count;
+ static VALUE sym_total_shade_operation_count, sym_total_promoted_count;
+ static VALUE sym_total_remembered_normal_object_count, sym_total_remembered_shady_object_count;
#endif /* RGENGC_PROFILE */
#endif /* USE_RGENGC */
rb_objspace_t *objspace = &rb_objspace;
VALUE hash = Qnil, key = Qnil;
- if (RB_TYPE_P(hash_or_sym, T_HASH))
+ if (RB_TYPE_P(hash_or_sym, T_HASH)) {
hash = hash_or_sym;
- else if (SYMBOL_P(hash_or_sym) && out)
+ }
+ else if (SYMBOL_P(hash_or_sym)) {
key = hash_or_sym;
- else
+ }
+ else {
rb_raise(rb_eTypeError, "non-hash or symbol argument");
+ }
if (sym_count == 0) {
#define S(s) sym_##s = ID2SYM(rb_intern_const(#s))
S(count);
- S(heap_used);
- S(heap_length);
- S(heap_increment);
- S(heap_live_slot);
- S(heap_free_slot);
- S(heap_final_slot);
- S(heap_swept_slot);
- S(heap_eden_page_length);
- S(heap_tomb_page_length);
- S(total_allocated_object);
- S(total_freed_object);
- S(malloc_increase);
- S(malloc_limit);
+ S(heap_allocated_pages);
+ S(heap_sorted_length);
+ S(heap_allocatable_pages);
+ S(heap_available_slots);
+ S(heap_live_slots);
+ S(heap_free_slots);
+ S(heap_final_slots);
+ S(heap_marked_slots);
+ S(heap_swept_slots);
+ S(heap_eden_pages);
+ S(heap_tomb_pages);
+ S(total_allocated_pages);
+ S(total_freed_pages);
+ S(total_allocated_objects);
+ S(total_freed_objects);
+ S(malloc_increase_bytes);
+ S(malloc_increase_bytes_limit);
#if USE_RGENGC
S(minor_gc_count);
S(major_gc_count);
- S(remembered_shady_object);
- S(remembered_shady_object_limit);
- S(old_object);
- S(old_object_limit);
+ S(remembered_wb_unprotected_objects);
+ S(remembered_wb_unprotected_objects_limit);
+ S(old_objects);
+ S(old_objects_limit);
#if RGENGC_ESTIMATE_OLDMALLOC
- S(oldmalloc_increase);
- S(oldmalloc_limit);
+ S(oldmalloc_increase_bytes);
+ S(oldmalloc_increase_bytes_limit);
#endif
#if RGENGC_PROFILE
- S(generated_normal_object_count);
- S(generated_shady_object_count);
- S(shade_operation_count);
- S(promote_infant_count);
- S(promote_young_count);
- S(remembered_normal_object_count);
- S(remembered_shady_object_count);
-#endif /* USE_RGENGC */
+ S(total_generated_normal_object_count);
+ S(total_generated_shady_object_count);
+ S(total_shade_operation_count);
+ S(total_promoted_count);
+ S(total_remembered_normal_object_count);
+ S(total_remembered_shady_object_count);
#endif /* RGENGC_PROFILE */
+#endif /* USE_RGENGC */
#undef S
}
#define SET(name, attr) \
if (key == sym_##name) \
- return (*out = attr, Qnil); \
+ return attr; \
else if (hash != Qnil) \
rb_hash_aset(hash, sym_##name, SIZET2NUM(attr));
SET(count, objspace->profile.count);
/* implementation dependent counters */
- SET(heap_used, heap_pages_used);
- SET(heap_length, heap_pages_length);
- SET(heap_increment, heap_pages_increment);
- SET(heap_live_slot, objspace_live_slot(objspace));
- SET(heap_free_slot, objspace_free_slot(objspace));
- SET(heap_final_slot, heap_pages_final_slots);
- SET(heap_swept_slot, heap_pages_swept_slots);
- SET(heap_eden_page_length, heap_eden->page_length);
- SET(heap_tomb_page_length, heap_tomb->page_length);
- SET(total_allocated_object, objspace->profile.total_allocated_object_num);
- SET(total_freed_object, objspace->profile.total_freed_object_num);
- SET(malloc_increase, malloc_increase);
- SET(malloc_limit, malloc_limit);
+ SET(heap_allocated_pages, heap_allocated_pages);
+ SET(heap_sorted_length, heap_pages_sorted_length);
+ SET(heap_allocatable_pages, heap_allocatable_pages);
+ SET(heap_available_slots, objspace_available_slots(objspace));
+ SET(heap_live_slots, objspace_live_slots(objspace));
+ SET(heap_free_slots, objspace_free_slots(objspace));
+ SET(heap_final_slots, heap_pages_final_slots);
+ SET(heap_marked_slots, objspace->marked_slots);
+ SET(heap_swept_slots, heap_pages_swept_slots);
+ SET(heap_eden_pages, heap_eden->page_length);
+ SET(heap_tomb_pages, heap_tomb->page_length);
+ SET(total_allocated_pages, objspace->profile.total_allocated_pages);
+ SET(total_freed_pages, objspace->profile.total_freed_pages);
+ SET(total_allocated_objects, objspace->total_allocated_objects);
+ SET(total_freed_objects, objspace->profile.total_freed_objects);
+ SET(malloc_increase_bytes, malloc_increase);
+ SET(malloc_increase_bytes_limit, malloc_limit);
#if USE_RGENGC
SET(minor_gc_count, objspace->profile.minor_gc_count);
SET(major_gc_count, objspace->profile.major_gc_count);
- SET(remembered_shady_object, objspace->rgengc.remembered_shady_object_count);
- SET(remembered_shady_object_limit, objspace->rgengc.remembered_shady_object_limit);
- SET(old_object, objspace->rgengc.old_object_count);
- SET(old_object_limit, objspace->rgengc.old_object_limit);
+ SET(remembered_wb_unprotected_objects, objspace->rgengc.remembered_wb_unprotected_objects);
+ SET(remembered_wb_unprotected_objects_limit, objspace->rgengc.remembered_wb_unprotected_objects_limit);
+ SET(old_objects, objspace->rgengc.old_objects);
+ SET(old_objects_limit, objspace->rgengc.old_objects_limit);
#if RGENGC_ESTIMATE_OLDMALLOC
- SET(oldmalloc_increase, objspace->rgengc.oldmalloc_increase);
- SET(oldmalloc_limit, objspace->rgengc.oldmalloc_increase_limit);
+ SET(oldmalloc_increase_bytes, objspace->rgengc.oldmalloc_increase);
+ SET(oldmalloc_increase_bytes_limit, objspace->rgengc.oldmalloc_increase_limit);
#endif
#if RGENGC_PROFILE
- SET(generated_normal_object_count, objspace->profile.generated_normal_object_count);
- SET(generated_shady_object_count, objspace->profile.generated_shady_object_count);
- SET(shade_operation_count, objspace->profile.shade_operation_count);
- SET(promote_infant_count, objspace->profile.promote_infant_count);
-#if RGENGC_THREEGEN
- SET(promote_young_count, objspace->profile.promote_young_count);
-#endif
- SET(remembered_normal_object_count, objspace->profile.remembered_normal_object_count);
- SET(remembered_shady_object_count, objspace->profile.remembered_shady_object_count);
+ SET(total_generated_normal_object_count, objspace->profile.total_generated_normal_object_count);
+ SET(total_generated_shady_object_count, objspace->profile.total_generated_shady_object_count);
+ SET(total_shade_operation_count, objspace->profile.total_shade_operation_count);
+ SET(total_promoted_count, objspace->profile.total_promoted_count);
+ SET(total_remembered_normal_object_count, objspace->profile.total_remembered_normal_object_count);
+ SET(total_remembered_shady_object_count, objspace->profile.total_remembered_shady_object_count);
#endif /* RGENGC_PROFILE */
#endif /* USE_RGENGC */
#undef SET
- if (key != Qnil) /* matched key should return above */
- rb_raise(rb_eArgError, "unknown key: %s", RSTRING_PTR(rb_id2str(SYM2ID(key))));
+ if (!NIL_P(key)) { /* matched key should return above */
+ rb_raise(rb_eArgError, "unknown key: %"PRIsVALUE, rb_sym2str(key));
+ }
#if defined(RGENGC_PROFILE) && RGENGC_PROFILE >= 2
if (hash != Qnil) {
gc_count_add_each_types(hash, "generated_normal_object_count_types", objspace->profile.generated_normal_object_count_types);
gc_count_add_each_types(hash, "generated_shady_object_count_types", objspace->profile.generated_shady_object_count_types);
gc_count_add_each_types(hash, "shade_operation_count_types", objspace->profile.shade_operation_count_types);
- gc_count_add_each_types(hash, "promote_infant_types", objspace->profile.promote_infant_types);
-#if RGENGC_THREEGEN
- gc_count_add_each_types(hash, "promote_young_types", objspace->profile.promote_young_types);
-#endif
+ gc_count_add_each_types(hash, "promoted_types", objspace->profile.promoted_types);
gc_count_add_each_types(hash, "remembered_normal_object_count_types", objspace->profile.remembered_normal_object_count_types);
gc_count_add_each_types(hash, "remembered_shady_object_count_types", objspace->profile.remembered_shady_object_count_types);
}
#endif
- return hash;
+ return 0;
}
/*
@@ -5499,28 +6427,34 @@ gc_stat_internal(VALUE hash_or_sym, size_t *out)
*
* The hash includes information about internal statistics about GC such as:
*
- * {
- * :count=>2,
- * :heap_used=>9,
- * :heap_length=>11,
- * :heap_increment=>2,
- * :heap_live_slot=>6836,
- * :heap_free_slot=>519,
- * :heap_final_slot=>0,
- * :heap_swept_slot=>818,
- * :total_allocated_object=>7674,
- * :total_freed_object=>838,
- * :malloc_increase=>181034,
- * :malloc_limit=>16777216,
- * :minor_gc_count=>2,
+ * {
+ * :count=>0,
+ * :heap_allocated_pages=>24,
+ * :heap_sorted_length=>24,
+ * :heap_allocatable_pages=>0,
+ * :heap_available_slots=>9783,
+ * :heap_live_slots=>7713,
+ * :heap_free_slots=>2070,
+ * :heap_final_slots=>0,
+ * :heap_marked_slots=>0,
+ * :heap_swept_slots=>0,
+ * :heap_eden_pages=>24,
+ * :heap_tomb_pages=>0,
+ * :total_allocated_pages=>24,
+ * :total_freed_pages=>0,
+ * :total_allocated_objects=>7796,
+ * :total_freed_objects=>83,
+ * :malloc_increase_bytes=>2389312,
+ * :malloc_increase_bytes_limit=>16777216,
+ * :minor_gc_count=>0,
* :major_gc_count=>0,
- * :remembered_shady_object=>55,
- * :remembered_shady_object_limit=>0,
- * :old_object=>2422,
- * :old_object_limit=>0,
- * :oldmalloc_increase=>277386,
- * :oldmalloc_limit=>16777216
- * }
+ * :remembered_wb_unprotected_objects=>0,
+ * :remembered_wb_unprotected_objects_limit=>0,
+ * :old_objects=>0,
+ * :old_objects_limit=>0,
+ * :oldmalloc_increase_bytes=>2389760,
+ * :oldmalloc_increase_bytes_limit=>16777216
+ * }
*
* The contents of the hash are implementation specific and may be changed in
* the future.
@@ -5536,10 +6470,10 @@ gc_stat(int argc, VALUE *argv, VALUE self)
if (rb_scan_args(argc, argv, "01", &arg) == 1) {
if (SYMBOL_P(arg)) {
- size_t value = 0;
- gc_stat_internal(arg, &value);
+ size_t value = gc_stat_internal(arg);
return SIZET2NUM(value);
- } else if (!RB_TYPE_P(arg, T_HASH)) {
+ }
+ else if (!RB_TYPE_P(arg, T_HASH)) {
rb_raise(rb_eTypeError, "non-hash or symbol given");
}
}
@@ -5547,7 +6481,7 @@ gc_stat(int argc, VALUE *argv, VALUE self)
if (arg == Qnil) {
arg = rb_hash_new();
}
- gc_stat_internal(arg, 0);
+ gc_stat_internal(arg);
return arg;
}
@@ -5555,11 +6489,11 @@ size_t
rb_gc_stat(VALUE key)
{
if (SYMBOL_P(key)) {
- size_t value = 0;
- gc_stat_internal(key, &value);
+ size_t value = gc_stat_internal(key);
return value;
- } else {
- gc_stat_internal(key, 0);
+ }
+ else {
+ gc_stat_internal(key);
return 0;
}
}
@@ -5575,12 +6509,19 @@ static VALUE
gc_stress_get(VALUE self)
{
rb_objspace_t *objspace = &rb_objspace;
- return ruby_gc_stress;
+ return ruby_gc_stress_mode;
+}
+
+static void
+gc_stress_set(rb_objspace_t *objspace, VALUE flag)
+{
+ objspace->flags.gc_stressful = RTEST(flag);
+ objspace->gc_stress_mode = flag;
}
/*
* call-seq:
- * GC.stress = bool -> bool
+ * GC.stress = flag -> flag
*
* Updates the GC stress mode.
*
@@ -5588,14 +6529,19 @@ gc_stress_get(VALUE self)
* all memory and object allocations.
*
* Enabling stress mode will degrade performance, it is only for debugging.
+ *
+ * flag can be true, false, or a fixnum bit-ORed following flags.
+ * 0x01:: no major GC
+ * 0x02:: no immediate sweep
+ * 0x04:: full mark after malloc/calloc/realloc
*/
static VALUE
-gc_stress_set(VALUE self, VALUE flag)
+gc_stress_set_m(VALUE self, VALUE flag)
{
rb_objspace_t *objspace = &rb_objspace;
rb_secure(2);
- ruby_gc_stress = FIXNUM_P(flag) ? flag : (RTEST(flag) ? Qtrue : Qfalse);
+ gc_stress_set(objspace, flag);
return flag;
}
@@ -5640,27 +6586,65 @@ rb_gc_disable(void)
rb_objspace_t *objspace = &rb_objspace;
int old = dont_gc;
- gc_rest_sweep(objspace);
+ gc_rest(objspace);
dont_gc = TRUE;
return old ? Qtrue : Qfalse;
}
static int
-get_envparam_int(const char *name, unsigned int *default_value, int lower_bound)
+get_envparam_size(const char *name, size_t *default_value, size_t lower_bound)
{
char *ptr = getenv(name);
- int val;
+ ssize_t val;
- if (ptr != NULL) {
- val = atoi(ptr);
- if (val > lower_bound) {
- if (RTEST(ruby_verbose)) fprintf(stderr, "%s=%d (default value: %d)\n", name, val, *default_value);
- *default_value = val;
+ if (ptr != NULL && *ptr) {
+ size_t unit = 0;
+ char *end;
+#if SIZEOF_SIZE_T == SIZEOF_LONG_LONG
+ val = strtoll(ptr, &end, 0);
+#else
+ val = strtol(ptr, &end, 0);
+#endif
+ switch (*end) {
+ case 'k': case 'K':
+ unit = 1024;
+ ++end;
+ break;
+ case 'm': case 'M':
+ unit = 1024*1024;
+ ++end;
+ break;
+ case 'g': case 'G':
+ unit = 1024*1024*1024;
+ ++end;
+ break;
+ }
+ while (*end && isspace((unsigned char)*end)) end++;
+ if (*end) {
+ if (RTEST(ruby_verbose)) fprintf(stderr, "invalid string for %s: %s\n", name, ptr);
+ return 0;
+ }
+ if (unit > 0) {
+ if (val < -(ssize_t)(SIZE_MAX / 2 / unit) || (ssize_t)(SIZE_MAX / 2 / unit) < val) {
+ if (RTEST(ruby_verbose)) fprintf(stderr, "%s=%s is ignored because it overflows\n", name, ptr);
+ return 0;
+ }
+ val *= unit;
+ }
+ if (val > 0 && (size_t)val > lower_bound) {
+ if (RTEST(ruby_verbose)) {
+ fprintf(stderr, "%s=%"PRIdSIZE" (default value: %"PRIdSIZE")\n", name, val, *default_value);
+ }
+ *default_value = (size_t)val;
return 1;
}
else {
- if (RTEST(ruby_verbose)) fprintf(stderr, "%s=%d (default value: %d) is ignored because it must be greater than %d.\n", name, val, *default_value, lower_bound);
+ if (RTEST(ruby_verbose)) {
+ fprintf(stderr, "%s=%"PRIdSIZE" (default value: %"PRIdSIZE") is ignored because it must be greater than %"PRIdSIZE".\n",
+ name, val, *default_value, lower_bound);
+ }
+ return 0;
}
}
return 0;
@@ -5672,10 +6656,15 @@ get_envparam_double(const char *name, double *default_value, double lower_bound)
char *ptr = getenv(name);
double val;
- if (ptr != NULL) {
- val = strtod(ptr, NULL);
+ if (ptr != NULL && *ptr) {
+ char *end;
+ val = strtod(ptr, &end);
+ if (!*ptr || *end) {
+ if (RTEST(ruby_verbose)) fprintf(stderr, "invalid string for %s: %s\n", name, ptr);
+ return 0;
+ }
if (val > lower_bound) {
- if (RTEST(ruby_verbose)) fprintf(stderr, "%s=%f (%f)\n", name, val, *default_value);
+ if (RTEST(ruby_verbose)) fprintf(stderr, "%s=%f (default value: %f)\n", name, val, *default_value);
*default_value = val;
return 1;
}
@@ -5704,7 +6693,7 @@ gc_set_initial_pages(void)
* * RUBY_GC_HEAP_INIT_SLOTS
* - Initial allocation slots.
* * RUBY_GC_HEAP_FREE_SLOTS
- * - Prepare at least this ammount of slots after GC.
+ * - Prepare at least this amount of slots after GC.
* - Allocate slots if there are not enough slots.
* * RUBY_GC_HEAP_GROWTH_FACTOR (new from 2.1)
* - Allocate slots by this factor.
@@ -5735,47 +6724,41 @@ ruby_gc_set_params(int safe_level)
if (safe_level > 0) return;
/* RUBY_GC_HEAP_FREE_SLOTS */
- if (get_envparam_int("RUBY_GC_HEAP_FREE_SLOTS", &gc_params.heap_free_slots, 0)) {
+ if (get_envparam_size("RUBY_GC_HEAP_FREE_SLOTS", &gc_params.heap_free_slots, 0)) {
/* ok */
}
- else if (get_envparam_int("RUBY_FREE_MIN", &gc_params.heap_free_slots, 0)) {
+ else if (get_envparam_size("RUBY_FREE_MIN", &gc_params.heap_free_slots, 0)) {
rb_warn("RUBY_FREE_MIN is obsolete. Use RUBY_GC_HEAP_FREE_SLOTS instead.");
}
/* RUBY_GC_HEAP_INIT_SLOTS */
- if (get_envparam_int("RUBY_GC_HEAP_INIT_SLOTS", &gc_params.heap_init_slots, 0)) {
+ if (get_envparam_size("RUBY_GC_HEAP_INIT_SLOTS", &gc_params.heap_init_slots, 0)) {
gc_set_initial_pages();
}
- else if (get_envparam_int("RUBY_HEAP_MIN_SLOTS", &gc_params.heap_init_slots, 0)) {
+ else if (get_envparam_size("RUBY_HEAP_MIN_SLOTS", &gc_params.heap_init_slots, 0)) {
rb_warn("RUBY_HEAP_MIN_SLOTS is obsolete. Use RUBY_GC_HEAP_INIT_SLOTS instead.");
gc_set_initial_pages();
}
get_envparam_double("RUBY_GC_HEAP_GROWTH_FACTOR", &gc_params.growth_factor, 1.0);
- get_envparam_int ("RUBY_GC_HEAP_GROWTH_MAX_SLOTS", &gc_params.growth_max_slots, 0);
+ get_envparam_size ("RUBY_GC_HEAP_GROWTH_MAX_SLOTS", &gc_params.growth_max_slots, 0);
get_envparam_double("RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR", &gc_params.oldobject_limit_factor, 0.0);
- get_envparam_int("RUBY_GC_MALLOC_LIMIT", &gc_params.malloc_limit_min, 0);
- get_envparam_int("RUBY_GC_MALLOC_LIMIT_MAX", &gc_params.malloc_limit_max, 0);
+ get_envparam_size ("RUBY_GC_MALLOC_LIMIT", &gc_params.malloc_limit_min, 0);
+ get_envparam_size ("RUBY_GC_MALLOC_LIMIT_MAX", &gc_params.malloc_limit_max, 0);
get_envparam_double("RUBY_GC_MALLOC_LIMIT_GROWTH_FACTOR", &gc_params.malloc_limit_growth_factor, 1.0);
#if RGENGC_ESTIMATE_OLDMALLOC
- if (get_envparam_int("RUBY_GC_OLDMALLOC_LIMIT", &gc_params.oldmalloc_limit_min, 0)) {
+ if (get_envparam_size("RUBY_GC_OLDMALLOC_LIMIT", &gc_params.oldmalloc_limit_min, 0)) {
rb_objspace_t *objspace = &rb_objspace;
objspace->rgengc.oldmalloc_increase_limit = gc_params.oldmalloc_limit_min;
}
- get_envparam_int("RUBY_GC_OLDMALLOC_LIMIT_MAX", &gc_params.oldmalloc_limit_max, 0);
+ get_envparam_size ("RUBY_GC_OLDMALLOC_LIMIT_MAX", &gc_params.oldmalloc_limit_max, 0);
get_envparam_double("RUBY_GC_OLDMALLOC_LIMIT_GROWTH_FACTOR", &gc_params.oldmalloc_limit_growth_factor, 1.0);
#endif
}
void
-rb_gc_set_params(void)
-{
- ruby_gc_set_params(rb_safe_level());
-}
-
-void
rb_objspace_reachable_objects_from(VALUE obj, void (func)(VALUE, void *), void *data)
{
rb_objspace_t *objspace = &rb_objspace;
@@ -5784,9 +6767,9 @@ rb_objspace_reachable_objects_from(VALUE obj, void (func)(VALUE, void *), void *
struct mark_func_data_struct mfd;
mfd.mark_func = func;
mfd.data = data;
- objspace->mark_func_data = &mfd;
+ PUSH_MARK_FUNC_DATA(&mfd);
gc_mark_children(objspace, obj);
- objspace->mark_func_data = 0;
+ POP_MARK_FUNC_DATA();
}
}
@@ -5816,11 +6799,9 @@ rb_objspace_reachable_objects_from_root(void (func)(const char *category, VALUE,
mfd.mark_func = root_objects_from;
mfd.data = &data;
- objspace->mark_func_data = &mfd;
- {
- gc_mark_roots(objspace, TRUE, &data.category);
- }
- objspace->mark_func_data = 0;
+ PUSH_MARK_FUNC_DATA(&mfd);
+ gc_mark_roots(objspace, &data.category);
+ POP_MARK_FUNC_DATA();
}
/*
@@ -5882,6 +6863,10 @@ void
rb_memerror(void)
{
rb_thread_t *th = GET_THREAD();
+ rb_objspace_t *objspace = &rb_objspace;
+
+ if (during_gc) gc_exit(objspace, "rb_memerror");
+
if (!nomem_error ||
rb_thread_raised_p(th, RAISED_NOMEMORY)) {
fprintf(stderr, "[FATAL] failed to allocate memory\n");
@@ -5975,6 +6960,14 @@ atomic_sub_nounderflow(size_t *var, size_t sub)
}
static void
+objspace_malloc_gc_stress(rb_objspace_t *objspace)
+{
+ if (ruby_gc_stressful && ruby_native_thread_p()) {
+ garbage_collect_with_gvl(objspace, gc_stress_full_mark_after_malloc_p(), TRUE, TRUE, GPR_FLAG_STRESS | GPR_FLAG_MALLOC);
+ }
+}
+
+static void
objspace_malloc_increase(rb_objspace_t *objspace, void *mem, size_t new_size, size_t old_size, enum memop_type type)
{
if (new_size > old_size) {
@@ -5991,18 +6984,13 @@ objspace_malloc_increase(rb_objspace_t *objspace, void *mem, size_t new_size, si
}
if (type == MEMOP_TYPE_MALLOC) {
- if (ruby_gc_stress && !ruby_disable_gc_stress) {
- garbage_collect_with_gvl(objspace, FALSE, TRUE, GPR_FLAG_MALLOC);
- }
- else {
- retry:
- if (malloc_increase > malloc_limit) {
- if (ruby_thread_has_gvl_p() && is_lazy_sweeping(heap_eden)) {
- gc_rest_sweep(objspace); /* rest_sweep can reduce malloc_increase */
- goto retry;
- }
- garbage_collect_with_gvl(objspace, FALSE, TRUE, GPR_FLAG_MALLOC);
+ retry:
+ if (malloc_increase > malloc_limit && ruby_native_thread_p() && !dont_gc) {
+ if (ruby_thread_has_gvl_p() && is_lazy_sweeping(heap_eden)) {
+ gc_rest(objspace); /* gc_rest can reduce malloc_increase */
+ goto retry;
}
+ garbage_collect_with_gvl(objspace, FALSE, TRUE, TRUE, GPR_FLAG_MALLOC);
}
}
@@ -6019,10 +7007,10 @@ objspace_malloc_increase(rb_objspace_t *objspace, void *mem, size_t new_size, si
rb_bug("objspace_malloc_increase: underflow malloc_params.allocated_size.");
}
#endif
- atomic_sub_nounderflow(objspace->malloc_params.allocated_size, dec_size);
+ atomic_sub_nounderflow(&objspace->malloc_params.allocated_size, dec_size);
}
- if (0) fprintf(stderr, "incraese - ptr: %p, type: %s, new_size: %d, old_size: %d\n",
+ if (0) fprintf(stderr, "increase - ptr: %p, type: %s, new_size: %d, old_size: %d\n",
mem,
type == MEMOP_TYPE_MALLOC ? "malloc" :
type == MEMOP_TYPE_FREE ? "free " :
@@ -6037,11 +7025,11 @@ objspace_malloc_increase(rb_objspace_t *objspace, void *mem, size_t new_size, si
{
size_t allocations = objspace->malloc_params.allocations;
if (allocations > 0) {
- atomic_sub_nounderflow(objspace->malloc_params.allocations, 1);
+ atomic_sub_nounderflow(&objspace->malloc_params.allocations, 1);
}
#if MALLOC_ALLOCATED_SIZE_CHECK
else {
- assert(objspace->malloc_params.allocations > 0);
+ if (RGENGC_CHECK_MODE) assert(objspace->malloc_params.allocations > 0);
}
#endif
}
@@ -6078,8 +7066,9 @@ objspace_malloc_fixup(rb_objspace_t *objspace, void *mem, size_t size)
}
#define TRY_WITH_GC(alloc) do { \
+ objspace_malloc_gc_stress(objspace); \
if (!(alloc) && \
- (!garbage_collect_with_gvl(objspace, 1, 1, GPR_FLAG_MALLOC) || /* full mark && immediate sweep */ \
+ (!garbage_collect_with_gvl(objspace, TRUE, TRUE, TRUE, GPR_FLAG_MALLOC) || /* full/immediate mark && immediate sweep */ \
!(alloc))) { \
ruby_memerror(); \
} \
@@ -6121,7 +7110,7 @@ objspace_xrealloc(rb_objspace_t *objspace, void *ptr, size_t new_size, size_t ol
#if CALC_EXACT_MALLOC_SIZE
new_size += sizeof(size_t);
ptr = (size_t *)ptr - 1;
- oldsize = ((size_t *)ptr)[0];
+ old_size = ((size_t *)ptr)[0];
#endif
old_size = objspace_malloc_size(objspace, ptr, old_size);
@@ -6143,7 +7132,7 @@ objspace_xfree(rb_objspace_t *objspace, void *ptr, size_t old_size)
{
#if CALC_EXACT_MALLOC_SIZE
ptr = ((size_t *)ptr) - 1;
- oldsize = ((size_t*)ptr)[0];
+ old_size = ((size_t*)ptr)[0];
#endif
old_size = objspace_malloc_size(objspace, ptr, old_size);
@@ -6184,6 +7173,8 @@ objspace_xcalloc(rb_objspace_t *objspace, size_t count, size_t elsize)
size = objspace_malloc_prepare(objspace, size);
TRY_WITH_GC(mem = calloc(1, size));
+ size = objspace_malloc_size(objspace, mem, size);
+ objspace_malloc_increase(objspace, mem, size, 0, MEMOP_TYPE_MALLOC);
return objspace_malloc_fixup(objspace, mem, size);
}
@@ -6413,7 +7404,7 @@ wmap_final_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing)
return ST_DELETE;
}
if (j < i) {
- ptr = ruby_sized_xrealloc2(ptr, j + 1, sizeof(VALUE), i);
+ ptr = ruby_sized_xrealloc2(ptr, j, sizeof(VALUE), i);
ptr[0] = j;
*value = (st_data_t)ptr;
}
@@ -6702,6 +7693,7 @@ wmap_size(VALUE self)
#define GC_PROFILE_RECORD_DEFAULT_SIZE 100
+/* return sec in user time */
static double
getrusage_time(void)
{
@@ -6731,25 +7723,25 @@ getrusage_time(void)
#ifdef _WIN32
{
- FILETIME creation_time, exit_time, kernel_time, user_time;
- ULARGE_INTEGER ui;
- LONG_LONG q;
- double t;
-
- if (GetProcessTimes(GetCurrentProcess(),
- &creation_time, &exit_time, &kernel_time, &user_time) != 0) {
- memcpy(&ui, &user_time, sizeof(FILETIME));
- q = ui.QuadPart / 10L;
- t = (DWORD)(q % 1000000L) * 1e-6;
- q /= 1000000L;
+ FILETIME creation_time, exit_time, kernel_time, user_time;
+ ULARGE_INTEGER ui;
+ LONG_LONG q;
+ double t;
+
+ if (GetProcessTimes(GetCurrentProcess(),
+ &creation_time, &exit_time, &kernel_time, &user_time) != 0) {
+ memcpy(&ui, &user_time, sizeof(FILETIME));
+ q = ui.QuadPart / 10L;
+ t = (DWORD)(q % 1000000L) * 1e-6;
+ q /= 1000000L;
#ifdef __GNUC__
- t += q;
+ t += q;
#else
- t += (double)(DWORD)(q >> 16) * (1 << 16);
- t += (DWORD)q & ~(~0 << 16);
+ t += (double)(DWORD)(q >> 16) * (1 << 16);
+ t += (DWORD)q & ~(~0 << 16);
#endif
- return t;
- }
+ return t;
+ }
}
#endif
@@ -6781,7 +7773,7 @@ gc_prof_setup_new_record(rb_objspace_t *objspace, int reason)
MEMZERO(record, gc_profile_record, 1);
/* setup before-GC parameter */
- record->flags = reason | ((ruby_gc_stress && !ruby_disable_gc_stress) ? GPR_FLAG_STRESS : 0);
+ record->flags = reason | (ruby_gc_stressful ? GPR_FLAG_STRESS : 0);
#if MALLOC_ALLOCATED_SIZE
record->allocated_size = malloc_allocated_size;
#endif
@@ -6922,7 +7914,7 @@ gc_prof_set_heap_info(rb_objspace_t *objspace)
{
if (gc_prof_enabled(objspace)) {
gc_profile_record *record = gc_prof_record(objspace);
- size_t live = objspace->profile.total_allocated_object_num_at_gc_start - objspace->profile.total_freed_object_num;
+ size_t live = objspace->profile.total_allocated_objects_at_gc_start - objspace->profile.total_freed_objects;
size_t total = objspace->profile.heap_used_at_gc_start * HEAP_OBJ_LIMIT;
#if GC_PROFILE_MORE_DETAIL
@@ -7356,6 +8348,86 @@ obj_type_name(VALUE obj)
return type_name(TYPE(obj), obj);
}
+#if RGENGC_DEBUG || RGENGC_CHECK_MODE
+#define OBJ_INFO_BUFFERS_NUM 10
+#define OBJ_INFO_BUFFERS_SIZE 0x100
+static int obj_info_buffers_index = 0;
+static char obj_info_buffers[OBJ_INFO_BUFFERS_NUM][OBJ_INFO_BUFFERS_SIZE];
+
+/* from array.c */
+# define ARY_SHARED_P(ary) \
+ (assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
+ FL_TEST((ary),ELTS_SHARED)!=0)
+# define ARY_EMBED_P(ary) \
+ (assert(!FL_TEST((ary), ELTS_SHARED) || !FL_TEST((ary), RARRAY_EMBED_FLAG)), \
+ FL_TEST((ary), RARRAY_EMBED_FLAG)!=0)
+
+static const char *
+obj_info(VALUE obj)
+{
+ int index = obj_info_buffers_index++;
+ char *buff = &obj_info_buffers[index][0];
+ int age = RVALUE_FLAGS_AGE(RBASIC(obj)->flags);
+
+ if (obj_info_buffers_index >= OBJ_INFO_BUFFERS_NUM) {
+ obj_info_buffers_index = 0;
+ }
+
+#define TF(c) ((c) != 0 ? "true" : "false")
+#define C(c, s) ((c) != 0 ? (s) : " ")
+ snprintf(buff, OBJ_INFO_BUFFERS_SIZE, "%p [%d%s%s%s%s] %s",
+ (void *)obj, age,
+ C(RVALUE_LONG_LIVED_BITMAP(obj), "L"),
+ C(RVALUE_MARK_BITMAP(obj), "M"),
+ C(RVALUE_MARKING_BITMAP(obj), "R"),
+ C(RVALUE_WB_UNPROTECTED_BITMAP(obj), "U"),
+ obj_type_name(obj));
+
+#ifdef HAVE_VA_ARGS_MACRO
+ switch (BUILTIN_TYPE(obj)) {
+ case T_ARRAY:
+ snprintf(buff, OBJ_INFO_BUFFERS_SIZE, "%s [%s%s] len: %d", buff,
+ C(ARY_EMBED_P(obj), "E"),
+ C(ARY_SHARED_P(obj), "S"),
+ (int)RARRAY_LEN(obj));
+ break;
+ case T_CLASS: {
+ VALUE class_path = rb_class_path_cached(obj);
+ if (!NIL_P(class_path)) {
+ snprintf(buff, OBJ_INFO_BUFFERS_SIZE, "%s %s", buff, RSTRING_PTR(class_path));
+ }
+ break;
+ }
+ case T_DATA: {
+ const char *type_name = rb_objspace_data_type_name(obj);
+ if (type_name && strcmp(type_name, "iseq") == 0) {
+ rb_iseq_t *iseq;
+ GetISeqPtr(obj, iseq);
+ if (iseq->location.label) {
+ snprintf(buff, OBJ_INFO_BUFFERS_SIZE, "%s %s@%s:%d", buff,
+ RSTRING_PTR(iseq->location.label), RSTRING_PTR(iseq->location.path), (int)iseq->location.first_lineno);
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
+#endif
+#undef TF
+#undef C
+
+ return buff;
+}
+
+#else
+static const char *
+obj_info(VALUE obj)
+{
+ return obj_type_name(obj);
+}
+#endif
+
#if GC_DEBUG
void
@@ -7363,7 +8435,7 @@ rb_gcdebug_print_obj_condition(VALUE obj)
{
rb_objspace_t *objspace = &rb_objspace;
- fprintf(stderr, "created at: %s:%d\n", RSTRING_PTR(RANY(obj)->file), FIX2INT(RANY(obj)->line));
+ fprintf(stderr, "created at: %s:%d\n", RANY(obj)->file, RANY(obj)->line);
if (is_pointer_to_heap(objspace, (void *)obj)) {
fprintf(stderr, "pointer to heap?: true\n");
@@ -7375,11 +8447,9 @@ rb_gcdebug_print_obj_condition(VALUE obj)
fprintf(stderr, "marked? : %s\n", MARKED_IN_BITMAP(GET_HEAP_MARK_BITS(obj), obj) ? "true" : "false");
#if USE_RGENGC
-#if RGENGC_THREEGEN
- fprintf(stderr, "young? : %s\n", RVALUE_YOUNG_P(obj) ? "true" : "false");
-#endif
+ fprintf(stderr, "age? : %d\n", RVALUE_AGE(obj));
fprintf(stderr, "old? : %s\n", RVALUE_OLD_P(obj) ? "true" : "false");
- fprintf(stderr, "WB-protected?: %s\n", RVALUE_WB_PROTECTED(obj) ? "true" : "false");
+ fprintf(stderr, "WB-protected?: %s\n", RVALUE_WB_UNPROTECTED(obj) ? "false" : "true");
fprintf(stderr, "remembered? : %s\n", MARKED_IN_BITMAP(GET_HEAP_REMEMBERSET_BITS(obj), obj) ? "true" : "false");
#endif
@@ -7393,7 +8463,7 @@ rb_gcdebug_print_obj_condition(VALUE obj)
}
static VALUE
-gcdebug_sential(VALUE obj, VALUE name)
+gcdebug_sentinel(VALUE obj, VALUE name)
{
fprintf(stderr, "WARNING: object %s(%p) is inadvertently collected\n", (char *)name, (void *)obj);
return Qnil;
@@ -7402,8 +8472,9 @@ gcdebug_sential(VALUE obj, VALUE name)
void
rb_gcdebug_sentinel(VALUE obj, const char *name)
{
- rb_define_finalizer(obj, rb_proc_new(gcdebug_sential, (VALUE)name));
+ rb_define_finalizer(obj, rb_proc_new(gcdebug_sentinel, (VALUE)name));
}
+
#endif /* GC_DEBUG */
/*
@@ -7471,6 +8542,7 @@ rb_gcdebug_sentinel(VALUE obj, const char *name)
void
Init_GC(void)
{
+#undef rb_intern
VALUE rb_mObjSpace;
VALUE rb_mProfiler;
VALUE gc_constants;
@@ -7480,7 +8552,7 @@ Init_GC(void)
rb_define_singleton_method(rb_mGC, "enable", rb_gc_enable, 0);
rb_define_singleton_method(rb_mGC, "disable", rb_gc_disable, 0);
rb_define_singleton_method(rb_mGC, "stress", gc_stress_get, 0);
- rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set, 1);
+ rb_define_singleton_method(rb_mGC, "stress=", gc_stress_set_m, 1);
rb_define_singleton_method(rb_mGC, "count", gc_count, 0);
rb_define_singleton_method(rb_mGC, "stat", gc_stat, -1);
rb_define_singleton_method(rb_mGC, "latest_gc_info", gc_latest_gc_info, -1);
@@ -7513,10 +8585,7 @@ Init_GC(void)
rb_define_module_function(rb_mObjSpace, "_id2ref", id2ref, 1);
- nomem_error = rb_exc_new3(rb_eNoMemError,
- rb_obj_freeze(rb_str_new2("failed to allocate memory")));
- OBJ_TAINT(nomem_error);
- OBJ_FREEZE(nomem_error);
+ rb_vm_register_special_exception(ruby_error_nomemory, rb_eNoMemError, "failed to allocate memory");
rb_define_method(rb_cBasicObject, "__id__", rb_obj_id, 0);
rb_define_method(rb_mKernel, "object_id", rb_obj_id, 0);
@@ -7555,13 +8624,12 @@ Init_GC(void)
{
VALUE opts;
rb_define_const(rb_mGC, "OPTS", opts = rb_ary_new());
-#define OPT(o) if (o) rb_ary_push(opts, rb_str_new2(#o))
+#define OPT(o) if (o) rb_ary_push(opts, rb_fstring_new(#o, strlen(#o)))
OPT(GC_DEBUG);
OPT(USE_RGENGC);
OPT(RGENGC_DEBUG);
OPT(RGENGC_CHECK_MODE);
OPT(RGENGC_PROFILE);
- OPT(RGENGC_THREEGEN);
OPT(RGENGC_ESTIMATE_OLDMALLOC);
OPT(GC_PROFILE_MORE_DETAIL);
OPT(GC_ENABLE_LAZY_SWEEP);
@@ -7570,5 +8638,6 @@ Init_GC(void)
OPT(MALLOC_ALLOCATED_SIZE_CHECK);
OPT(GC_PROFILE_DETAIL_MEMORY);
#undef OPT
+ OBJ_FREEZE(opts);
}
}
diff --git a/gc.h b/gc.h
index 09edafa027..2ba46c9250 100644
--- a/gc.h
+++ b/gc.h
@@ -91,11 +91,17 @@ void rb_objspace_reachable_objects_from(VALUE obj, void (func)(VALUE, void *), v
void rb_objspace_reachable_objects_from_root(void (func)(const char *category, VALUE, void *), void *data);
int rb_objspace_markable_object_p(VALUE obj);
int rb_objspace_internal_object_p(VALUE obj);
+int rb_objspace_marked_object_p(VALUE obj);
+int rb_objspace_garbage_object_p(VALUE obj);
void rb_objspace_each_objects(
int (*callback)(void *start, void *end, size_t stride, void *data),
void *data);
+void rb_objspace_each_objects_without_setup(
+ int (*callback)(void *, void *, size_t, void *),
+ void *data);
+
RUBY_SYMBOL_EXPORT_END
#endif /* RUBY_GC_H */
diff --git a/gems/bundled_gems b/gems/bundled_gems
new file mode 100644
index 0000000000..54d84c87ba
--- /dev/null
+++ b/gems/bundled_gems
@@ -0,0 +1,3 @@
+power_assert 0.1.3
+test-unit 3.0.1
+minitest 5.4.1
diff --git a/goruby.c b/goruby.c
index 8f7cf30be4..99042f8440 100644
--- a/goruby.c
+++ b/goruby.c
@@ -32,12 +32,14 @@ goruby_options(int argc, char **argv)
void *ret;
if ((isatty(0) && isatty(1) && isatty(2)) && (pipe(rw) == 0)) {
+ ssize_t n;
infd = dup(0);
+ if (infd < 0) return NULL;
dup2(rw[0], 0);
close(rw[0]);
- write(rw[1], cmd, sizeof(cmd) - 1);
+ n = write(rw[1], cmd, sizeof(cmd) - 1);
close(rw[1]);
- ret = ruby_options(argc, argv);
+ ret = n > 0 ? ruby_options(argc, argv) : NULL;
dup2(infd, 0);
close(infd);
return ret;
diff --git a/hash.c b/hash.c
index 376f33f1ac..9bfc39611e 100644
--- a/hash.c
+++ b/hash.c
@@ -18,6 +18,7 @@
#include "internal.h"
#include <errno.h>
#include "probes.h"
+#include "id.h"
#ifdef __APPLE__
# ifdef HAVE_CRT_EXTERNS_H
@@ -31,7 +32,6 @@
((klass = has_extra_methods(rb_obj_class(hash))) != 0) || \
FL_TEST((hash), FL_EXIVAR|FL_TAINT|HASH_PROC_DEFAULT) || \
!NIL_P(RHASH_IFNONE(hash)))
-#define HASH_REJECT_COPY_EXTRA_STATES 1
static VALUE
has_extra_methods(VALUE klass)
@@ -70,6 +70,12 @@ static VALUE envtbl;
static ID id_hash, id_yield, id_default, id_flatten_bang;
VALUE
+rb_hash_ifnone(VALUE h)
+{
+ return RHASH_IFNONE(h);
+}
+
+VALUE
rb_hash_set_ifnone(VALUE hash, VALUE ifnone)
{
RB_OBJ_WRITE(hash, (&RHASH(hash)->ifnone), ifnone);
@@ -133,6 +139,7 @@ rb_any_hash(VALUE a)
if (SPECIAL_CONST_P(a)) {
if (a == Qundef) return 0;
+ if (SYMBOL_P(a)) a >>= (RUBY_SPECIAL_SHIFT + ID_SCOPE_SHIFT);
hnum = rb_objid_hash((st_index_t)a);
}
else if (BUILTIN_TYPE(a) == T_STRING) {
@@ -155,6 +162,12 @@ rb_objid_hash(st_index_t index)
return hnum;
}
+int
+rb_hash_iter_lev(VALUE h)
+{
+ return RHASH_ITER_LEV(h);
+}
+
static const struct st_hash_type objhash = {
rb_any_cmp,
rb_any_hash,
@@ -300,7 +313,7 @@ rb_hash_new(void)
return hash_alloc(rb_cHash);
}
-static VALUE
+static inline VALUE
rb_hash_dup_empty(VALUE hash)
{
NEWOBJ_OF(ret, struct RHash,
@@ -486,7 +499,8 @@ rb_hash_initialize(int argc, VALUE *argv, VALUE hash)
FL_SET(hash, HASH_PROC_DEFAULT);
}
else {
- rb_scan_args(argc, argv, "01", &ifnone);
+ rb_check_arity(argc, 0, 1);
+ ifnone = argc == 0 ? Qnil : argv[0];
RHASH_SET_IFNONE(hash, ifnone);
}
@@ -753,11 +767,12 @@ rb_hash_lookup(VALUE hash, VALUE key)
static VALUE
rb_hash_fetch_m(int argc, VALUE *argv, VALUE hash)
{
- VALUE key, if_none;
+ VALUE key;
st_data_t val;
long block_given;
- rb_scan_args(argc, argv, "11", &key, &if_none);
+ rb_check_arity(argc, 1, 2);
+ key = argv[0];
block_given = rb_block_given_p();
if (block_given && argc == 2) {
@@ -773,7 +788,7 @@ rb_hash_fetch_m(int argc, VALUE *argv, VALUE hash)
desc = rb_str_ellipsize(desc, 65);
rb_raise(rb_eKeyError, "key not found: %"PRIsVALUE, desc);
}
- return if_none;
+ return argv[1];
}
return (VALUE)val;
}
@@ -810,7 +825,8 @@ rb_hash_default(int argc, VALUE *argv, VALUE hash)
{
VALUE key, ifnone;
- rb_scan_args(argc, argv, "01", &key);
+ rb_check_arity(argc, 0, 1);
+ key = argv[0];
ifnone = RHASH_IFNONE(hash);
if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
if (argc == 0) return Qnil;
@@ -1067,8 +1083,6 @@ delete_if_i(VALUE key, VALUE value, VALUE hash)
return ST_CONTINUE;
}
-static VALUE rb_hash_size(VALUE hash);
-
static VALUE
hash_enum_size(VALUE hash, VALUE args, VALUE eobj)
{
@@ -1155,34 +1169,10 @@ rb_hash_reject(VALUE hash)
if (RTEST(ruby_verbose)) {
VALUE klass;
if (HAS_EXTRA_STATES(hash, klass)) {
-#if HASH_REJECT_COPY_EXTRA_STATES
- rb_warn("copying extra states: %+"PRIsVALUE, hash);
- rb_warn("following states will not be copied in the future version:");
- if (klass) {
- rb_warn(" subclass: %+"PRIsVALUE, klass);
- }
- if (FL_TEST(hash, FL_EXIVAR)) {
- rb_warn(" instance variables: %+"PRIsVALUE,
- rb_obj_instance_variables(hash));
- }
- if (FL_TEST(hash, FL_TAINT)) {
- rb_warn(" taintedness");
- }
- if (FL_TEST(hash, HASH_PROC_DEFAULT)) {
- rb_warn(" default proc: %+"PRIsVALUE, RHASH_IFNONE(hash));
- }
- else if (!NIL_P(RHASH_IFNONE(hash)))
- rb_warn(" default value: %+"PRIsVALUE, RHASH_IFNONE(hash));
-#else
rb_warn("extra states are no longer copied: %+"PRIsVALUE, hash);
-#endif
}
}
-#if HASH_REJECT_COPY_EXTRA_STATES
- result = rb_hash_dup_empty(hash);
-#else
result = rb_hash_new();
-#endif
if (!RHASH_EMPTY_P(hash)) {
rb_hash_foreach(hash, reject_i, result);
}
@@ -1376,7 +1366,8 @@ NOINSERT_UPDATE_CALLBACK(hash_aset_str);
* h["a"] = 9
* h["c"] = 4
* h #=> {"a"=>9, "b"=>200, "c"=>4}
- * h.store("d", 42) #=> {"a"=>9, "b"=>200, "c"=>4, "d"=>42}
+ * h.store("d", 42) #=> 42
+ * h #=> {"a"=>9, "b"=>200, "c"=>4, "d"=>42}
*
* +key+ should not have its value changed while it is in use as a key (an
* <tt>unfrozen String</tt> passed as a key will be duplicated and frozen).
@@ -1501,7 +1492,7 @@ rb_hash_replace(VALUE hash, VALUE hash2)
* h.length #=> 3
*/
-static VALUE
+VALUE
rb_hash_size(VALUE hash)
{
return INT2FIX(RHASH_SIZE(hash));
@@ -1791,7 +1782,7 @@ rb_hash_keys(VALUE hash)
if (ST_DATA_COMPATIBLE_P(VALUE)) {
st_table *table = RHASH(hash)->ntbl;
- if (OBJ_PROMOTED(keys)) rb_gc_writebarrier_remember_promoted(keys);
+ rb_gc_writebarrier_remember(keys);
RARRAY_PTR_USE(keys, ptr, {
size = st_keys_check(table, ptr, size, Qundef);
});
@@ -1835,7 +1826,7 @@ rb_hash_values(VALUE hash)
if (ST_DATA_COMPATIBLE_P(VALUE)) {
st_table *table = RHASH(hash)->ntbl;
- if (OBJ_PROMOTED(values)) rb_gc_writebarrier_remember_promoted(values);
+ rb_gc_writebarrier_remember(values);
RARRAY_PTR_USE(values, ptr, {
size = st_values_check(table, ptr, size, Qundef);
});
@@ -1953,7 +1944,7 @@ hash_equal(VALUE hash1, VALUE hash2, int eql)
if (hash1 == hash2) return Qtrue;
if (!RB_TYPE_P(hash2, T_HASH)) {
- if (!rb_respond_to(hash2, rb_intern("to_hash"))) {
+ if (!rb_respond_to(hash2, idTo_hash)) {
return Qfalse;
}
if (eql)
@@ -2035,6 +2026,8 @@ hash_i(VALUE key, VALUE val, VALUE arg)
*
* Compute a hash-code for this hash. Two hashes with the same content
* will have the same hash code (and will compare using <code>eql?</code>).
+ *
+ * See also Object#hash.
*/
static VALUE
@@ -2436,7 +2429,7 @@ static VALUE rb_hash_compare_by_id_p(VALUE hash);
* h1["a"] #=> 100
* h1.compare_by_identity
* h1.compare_by_identity? #=> true
- * h1["a"] #=> nil # different objects.
+ * h1["a".dup] #=> nil # different objects.
* h1[:c] #=> "c" # same symbols are all same.
*
*/
@@ -2471,6 +2464,52 @@ rb_hash_compare_by_id_p(VALUE hash)
return Qfalse;
}
+static int
+any_p_i(VALUE key, VALUE value, VALUE arg)
+{
+ VALUE ret = rb_yield(rb_assoc_new(key, value));
+ if (RTEST(ret)) {
+ *(VALUE *)arg = Qtrue;
+ return ST_STOP;
+ }
+ return ST_CONTINUE;
+}
+
+static int
+any_p_i_fast(VALUE key, VALUE value, VALUE arg)
+{
+ VALUE ret = rb_yield_values(2, key, value);
+ if (RTEST(ret)) {
+ *(VALUE *)arg = Qtrue;
+ return ST_STOP;
+ }
+ return ST_CONTINUE;
+}
+
+/*
+ * call-seq:
+ * hsh.any? [{ |(key, value)| block }] -> true or false
+ *
+ * See also Enumerable#any?
+ */
+
+static VALUE
+rb_hash_any_p(VALUE hash)
+{
+ VALUE ret = Qfalse;
+
+ if (RHASH_EMPTY_P(hash)) return Qfalse;
+ if (!rb_block_given_p()) {
+ /* yields pairs, never false */
+ return Qtrue;
+ }
+ if (rb_block_arity() > 1)
+ rb_hash_foreach(hash, any_p_i_fast, (VALUE)&ret);
+ else
+ rb_hash_foreach(hash, any_p_i, (VALUE)&ret);
+ return ret;
+}
+
static int path_tainted = -1;
static char **origenviron;
@@ -2511,11 +2550,20 @@ extern char **environ;
#define ENVNMATCH(s1, s2, n) (memcmp((s1), (s2), (n)) == 0)
#endif
+#ifdef _WIN32
+static VALUE
+env_str_transcode(VALUE str, rb_encoding *enc)
+{
+ return rb_str_conv_enc_opts(str, rb_utf8_encoding(), enc,
+ ECONV_INVALID_REPLACE | ECONV_UNDEF_REPLACE, Qnil);
+}
+#endif
+
static VALUE
env_str_new(const char *ptr, long len)
{
#ifdef _WIN32
- VALUE str = rb_str_conv_enc(rb_str_new(ptr, len), rb_utf8_encoding(), rb_locale_encoding());
+ VALUE str = env_str_transcode(rb_str_new(ptr, len), rb_locale_encoding());
#else
VALUE str = rb_locale_str_new(ptr, len);
#endif
@@ -2525,22 +2573,46 @@ env_str_new(const char *ptr, long len)
}
static VALUE
+env_path_str_new(const char *ptr)
+{
+#ifdef _WIN32
+ VALUE str = env_str_transcode(rb_str_new_cstr(ptr), rb_filesystem_encoding());
+#else
+ VALUE str = rb_filesystem_str_new_cstr(ptr);
+#endif
+
+ rb_obj_freeze(str);
+ return str;
+}
+
+static VALUE
env_str_new2(const char *ptr)
{
if (!ptr) return Qnil;
return env_str_new(ptr, strlen(ptr));
}
+#define get_env_ptr(var, val) \
+ (memchr((var = RSTRING_PTR(val)), '\0', RSTRING_LEN(val)) ? \
+ rb_raise(rb_eArgError, "bad environment variable " #var) : (void)0)
+
+static inline const char *
+env_name(volatile VALUE *s)
+{
+ const char *name;
+ SafeStringValue(*s);
+ get_env_ptr(name, *s);
+ return name;
+}
+
+#define env_name(s) env_name(&(s))
+
static VALUE
env_delete(VALUE obj, VALUE name)
{
- char *nam, *val;
+ const char *nam, *val;
- SafeStringValue(name);
- nam = RSTRING_PTR(name);
- if (memchr(nam, '\0', RSTRING_LEN(name))) {
- rb_raise(rb_eArgError, "bad environment variable name");
- }
+ nam = env_name(name);
val = getenv(nam);
if (val) {
VALUE value = env_str_new2(val);
@@ -2585,24 +2657,13 @@ static int env_path_tainted(const char *);
static VALUE
rb_f_getenv(VALUE obj, VALUE name)
{
- char *nam, *env;
+ const char *nam, *env;
- SafeStringValue(name);
- nam = RSTRING_PTR(name);
- if (memchr(nam, '\0', RSTRING_LEN(name))) {
- rb_raise(rb_eArgError, "bad environment variable name");
- }
+ nam = env_name(name);
env = getenv(nam);
if (env) {
if (ENVMATCH(nam, PATH_ENV) && !env_path_tainted(env)) {
-#ifdef _WIN32
- VALUE str = rb_str_conv_enc(rb_str_new(env, strlen(env)), rb_utf8_encoding(), rb_filesystem_encoding());
-#else
- VALUE str = rb_filesystem_str_new_cstr(env);
-#endif
-
- rb_obj_freeze(str);
- return str;
+ return env_path_str_new(env);
}
return env_str_new2(env);
}
@@ -2626,34 +2687,27 @@ rb_f_getenv(VALUE obj, VALUE name)
static VALUE
env_fetch(int argc, VALUE *argv)
{
- VALUE key, if_none;
+ VALUE key;
long block_given;
- char *nam, *env;
+ const char *nam, *env;
- rb_scan_args(argc, argv, "11", &key, &if_none);
+ rb_check_arity(argc, 1, 2);
+ key = argv[0];
block_given = rb_block_given_p();
if (block_given && argc == 2) {
rb_warn("block supersedes default value argument");
}
- SafeStringValue(key);
- nam = RSTRING_PTR(key);
- if (memchr(nam, '\0', RSTRING_LEN(key))) {
- rb_raise(rb_eArgError, "bad environment variable name");
- }
+ nam = env_name(key);
env = getenv(nam);
if (!env) {
if (block_given) return rb_yield(key);
if (argc == 1) {
rb_raise(rb_eKeyError, "key not found: \"%"PRIsVALUE"\"", key);
}
- return if_none;
+ return argv[1];
}
if (ENVMATCH(nam, PATH_ENV) && !env_path_tainted(env))
-#ifdef _WIN32
- return rb_str_conv_enc(rb_str_new(env, strlen(env)), rb_utf8_encoding(), rb_filesystem_encoding());
-#else
- return rb_filesystem_str_new_cstr(env);
-#endif
+ return env_path_str_new(env);
return env_str_new2(env);
}
@@ -2724,7 +2778,9 @@ getenvblocksize()
}
#endif
-#if !defined(HAVE_SETENV) || !defined(HAVE_UNSETENV)
+#if defined(_WIN32) || \
+ (defined(__sun) && !(defined(HAVE_SETENV) && defined(HAVE_UNSETENV)))
+
NORETURN(static void invalid_envname(const char *name));
static void
@@ -2793,10 +2849,22 @@ ruby_setenv(const char *name, const char *value)
#endif
}
#elif defined __sun
- size_t len;
- char **env_ptr, *str;
+ /* Solaris 9 (or earlier) does not have setenv(3C) and unsetenv(3C). */
+ /* The below code was tested on Solaris 10 by:
+ % ./configure ac_cv_func_setenv=no ac_cv_func_unsetenv=no
+ */
+ size_t len, mem_size;
+ char **env_ptr, *str, *mem_ptr;
+ check_envname(name);
len = strlen(name);
+ if (value) {
+ mem_size = len + strlen(value) + 2;
+ mem_ptr = malloc(mem_size);
+ if (mem_ptr == NULL)
+ rb_sys_fail_str(rb_sprintf("malloc("PRIuSIZE")", mem_size));
+ snprintf(mem_ptr, mem_size, "%s=%s", name, value);
+ }
for (env_ptr = GET_ENVIRON(environ); (str = *env_ptr) != 0; ++env_ptr) {
if (!strncmp(str, name, len) && str[len] == '=') {
if (!in_origenv(str)) free(str);
@@ -2805,10 +2873,10 @@ ruby_setenv(const char *name, const char *value)
}
}
if (value) {
- str = malloc(len += strlen(value) + 2);
- snprintf(str, len, "%s=%s", name, value);
- if (putenv(str))
+ if (putenv(mem_ptr)) {
+ free(mem_ptr);
rb_sys_fail_str(rb_sprintf("putenv(%s)", name));
+ }
}
#else /* WIN32 */
size_t len;
@@ -2878,12 +2946,10 @@ env_aset(VALUE obj, VALUE nm, VALUE val)
}
SafeStringValue(nm);
SafeStringValue(val);
- name = RSTRING_PTR(nm);
- value = RSTRING_PTR(val);
- if (memchr(name, '\0', RSTRING_LEN(nm)))
- rb_raise(rb_eArgError, "bad environment variable name");
- if (memchr(value, '\0', RSTRING_LEN(val)))
- rb_raise(rb_eArgError, "bad environment variable value");
+ /* nm can be modified in `val.to_str`, don't get `name` before
+ * check for `val` */
+ get_env_ptr(name, nm);
+ get_env_ptr(value, val);
ruby_setenv(name, value);
if (ENVMATCH(name, PATH_ENV)) {
@@ -3370,12 +3436,9 @@ env_empty_p(void)
static VALUE
env_has_key(VALUE env, VALUE key)
{
- char *s;
+ const char *s;
- SafeStringValue(key);
- s = RSTRING_PTR(key);
- if (memchr(s, '\0', RSTRING_LEN(key)))
- rb_raise(rb_eArgError, "bad environment variable name");
+ s = env_name(key);
if (getenv(s)) return Qtrue;
return Qfalse;
}
@@ -3390,12 +3453,9 @@ env_has_key(VALUE env, VALUE key)
static VALUE
env_assoc(VALUE env, VALUE key)
{
- char *s, *e;
+ const char *s, *e;
- SafeStringValue(key);
- s = RSTRING_PTR(key);
- if (memchr(s, '\0', RSTRING_LEN(key)))
- rb_raise(rb_eArgError, "bad environment variable name");
+ s = env_name(key);
e = getenv(s);
if (e) return rb_assoc_new(key, rb_tainted_str_new2(e));
return Qnil;
@@ -3848,6 +3908,8 @@ Init_Hash(void)
rb_define_method(rb_cHash,"compare_by_identity", rb_hash_compare_by_id, 0);
rb_define_method(rb_cHash,"compare_by_identity?", rb_hash_compare_by_id_p, 0);
+ rb_define_method(rb_cHash, "any?", rb_hash_any_p, 0);
+
/* Document-class: ENV
*
* ENV is a hash-like accessor for environment variables.
diff --git a/include/ruby/backward/rubysig.h b/include/ruby/backward/rubysig.h
index 945a09a8c8..ade4fe27bd 100644
--- a/include/ruby/backward/rubysig.h
+++ b/include/ruby/backward/rubysig.h
@@ -29,11 +29,6 @@ extern "C" {
RUBY_SYMBOL_EXPORT_BEGIN
-struct rb_blocking_region_buffer;
-DEPRECATED(RUBY_EXTERN struct rb_blocking_region_buffer *rb_thread_blocking_region_begin(void));
-DEPRECATED(RUBY_EXTERN void rb_thread_blocking_region_end(struct rb_blocking_region_buffer *));
-#define TRAP_BEG do {struct rb_blocking_region_buffer *__region = rb_thread_blocking_region_begin();
-#define TRAP_END rb_thread_blocking_region_end(__region);} while (0)
#define RUBY_CRITICAL(statements) do {statements;} while (0)
#define DEFER_INTS (0)
#define ENABLE_INTS (1)
diff --git a/include/ruby/defines.h b/include/ruby/defines.h
index 9659db7ef6..f83ced006c 100644
--- a/include/ruby/defines.h
+++ b/include/ruby/defines.h
@@ -143,60 +143,6 @@ void xfree(void*);
# define SIZEOF_LONG_LONG SIZEOF___INT64
#endif
-#ifndef BDIGIT
-# if SIZEOF_INT*2 <= SIZEOF_LONG_LONG
-# define BDIGIT unsigned int
-# define SIZEOF_BDIGITS SIZEOF_INT
-# define BDIGIT_DBL unsigned LONG_LONG
-# define BDIGIT_DBL_SIGNED LONG_LONG
-# define PRI_BDIGIT_PREFIX ""
-# define PRI_BDIGIT_DBL_PREFIX PRI_LL_PREFIX
-# elif SIZEOF_INT*2 <= SIZEOF_LONG
-# define BDIGIT unsigned int
-# define SIZEOF_BDIGITS SIZEOF_INT
-# define BDIGIT_DBL unsigned long
-# define BDIGIT_DBL_SIGNED long
-# define PRI_BDIGIT_PREFIX ""
-# define PRI_BDIGIT_DBL_PREFIX "l"
-# elif SIZEOF_SHORT*2 <= SIZEOF_LONG
-# define BDIGIT unsigned short
-# define SIZEOF_BDIGITS SIZEOF_SHORT
-# define BDIGIT_DBL unsigned long
-# define BDIGIT_DBL_SIGNED long
-# define PRI_BDIGIT_PREFIX "h"
-# define PRI_BDIGIT_DBL_PREFIX "l"
-# else
-# define BDIGIT unsigned short
-# define SIZEOF_BDIGITS (SIZEOF_LONG/2)
-# define SIZEOF_ACTUAL_BDIGIT SIZEOF_LONG
-# define BDIGIT_DBL unsigned long
-# define BDIGIT_DBL_SIGNED long
-# define PRI_BDIGIT_PREFIX "h"
-# define PRI_BDIGIT_DBL_PREFIX "l"
-# endif
-#endif
-#ifndef SIZEOF_ACTUAL_BDIGIT
-# define SIZEOF_ACTUAL_BDIGIT SIZEOF_BDIGITS
-#endif
-
-#ifdef PRI_BDIGIT_PREFIX
-# define PRIdBDIGIT PRI_BDIGIT_PREFIX"d"
-# define PRIiBDIGIT PRI_BDIGIT_PREFIX"i"
-# define PRIoBDIGIT PRI_BDIGIT_PREFIX"o"
-# define PRIuBDIGIT PRI_BDIGIT_PREFIX"u"
-# define PRIxBDIGIT PRI_BDIGIT_PREFIX"x"
-# define PRIXBDIGIT PRI_BDIGIT_PREFIX"X"
-#endif
-
-#ifdef PRI_BDIGIT_DBL_PREFIX
-# define PRIdBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"d"
-# define PRIiBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"i"
-# define PRIoBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"o"
-# define PRIuBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"u"
-# define PRIxBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"x"
-# define PRIXBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"X"
-#endif
-
#ifdef __CYGWIN__
#undef _WIN32
#endif
@@ -221,11 +167,6 @@ void xfree(void*);
#include <net/socket.h> /* intern.h needs fd_set definition */
#endif
-#ifdef __SYMBIAN32__
-# define FALSE 0
-# define TRUE 1
-#endif
-
#ifdef RUBY_EXPORT
#undef RUBY_EXTERN
@@ -299,9 +240,12 @@ void rb_ia64_flushrs(void);
#define RUBY_PLATFORM "unknown-unknown"
#endif
+#ifndef FUNC_MINIMIZED
+#define FUNC_MINIMIZED(x) x
+#endif
#ifndef RUBY_ALIAS_FUNCTION_TYPE
#define RUBY_ALIAS_FUNCTION_TYPE(type, prot, name, args) \
- type prot {return name args;}
+ FUNC_MINIMIZED(type prot) {return name args;}
#endif
#ifndef RUBY_ALIAS_FUNCTION_VOID
#define RUBY_ALIAS_FUNCTION_VOID(prot, name, args) \
@@ -312,6 +256,27 @@ void rb_ia64_flushrs(void);
RUBY_ALIAS_FUNCTION_TYPE(VALUE, prot, name, args)
#endif
+#ifndef UNALIGNED_WORD_ACCESS
+# if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \
+ defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \
+ defined(__powerpc64__) || \
+ defined(__mc68020__)
+# define UNALIGNED_WORD_ACCESS 1
+# else
+# define UNALIGNED_WORD_ACCESS 0
+# endif
+#endif
+#ifndef PACKED_STRUCT
+# define PACKED_STRUCT(x) x
+#endif
+#ifndef PACKED_STRUCT_UNALIGNED
+# if UNALIGNED_WORD_ACCESS
+# define PACKED_STRUCT_UNALIGNED(x) PACKED_STRUCT(x)
+# else
+# define PACKED_STRUCT_UNALIGNED(x) x
+# endif
+#endif
+
RUBY_SYMBOL_EXPORT_END
#if defined(__cplusplus)
diff --git a/include/ruby/encoding.h b/include/ruby/encoding.h
index 1c5d8da015..4a5324d62e 100644
--- a/include/ruby/encoding.h
+++ b/include/ruby/encoding.h
@@ -68,22 +68,23 @@ RUBY_SYMBOL_EXPORT_BEGIN
ENC_CODERANGE_SET(rb_encoding_coderange_obj, (cr)); \
} while (0)
-typedef OnigEncodingType rb_encoding;
+typedef const OnigEncodingType rb_encoding;
int rb_char_to_option_kcode(int c, int *option, int *kcode);
int rb_enc_replicate(const char *, rb_encoding *);
int rb_define_dummy_encoding(const char *);
-#define rb_enc_to_index(enc) ((enc) ? ENC_TO_ENCINDEX(enc) : 0)
+int rb_enc_dummy_p(rb_encoding *enc);
+int rb_enc_to_index(rb_encoding *enc);
int rb_enc_get_index(VALUE obj);
void rb_enc_set_index(VALUE obj, int encindex);
int rb_enc_find_index(const char *name);
int rb_to_encoding_index(VALUE);
-rb_encoding* rb_to_encoding(VALUE);
-rb_encoding* rb_find_encoding(VALUE);
-rb_encoding* rb_enc_get(VALUE);
-rb_encoding* rb_enc_compatible(VALUE,VALUE);
-rb_encoding* rb_enc_check(VALUE,VALUE);
+rb_encoding *rb_to_encoding(VALUE);
+rb_encoding *rb_find_encoding(VALUE);
+rb_encoding *rb_enc_get(VALUE);
+rb_encoding *rb_enc_compatible(VALUE,VALUE);
+rb_encoding *rb_enc_check(VALUE,VALUE);
VALUE rb_enc_associate_index(VALUE, int);
VALUE rb_enc_associate(VALUE, rb_encoding*);
void rb_enc_copy(VALUE dst, VALUE src);
@@ -116,10 +117,10 @@ VALUE rb_str_conv_enc_opts(VALUE str, rb_encoding *from, rb_encoding *to, int ec
PRINTF_ARGS(NORETURN(void rb_enc_raise(rb_encoding *, VALUE, const char*, ...)), 3, 4);
/* index -> rb_encoding */
-rb_encoding* rb_enc_from_index(int idx);
+rb_encoding *rb_enc_from_index(int idx);
/* name -> rb_encoding */
-rb_encoding * rb_enc_find(const char *name);
+rb_encoding *rb_enc_find(const char *name);
/* rb_encoding * -> name */
#define rb_enc_name(enc) (enc)->name
@@ -231,21 +232,9 @@ char *rb_enc_path_end(const char *,const char *,rb_encoding*);
const char *ruby_enc_find_basename(const char *name, long *baselen, long *alllen, rb_encoding *enc);
const char *ruby_enc_find_extname(const char *name, long *len, rb_encoding *enc);
ID rb_check_id_cstr(const char *ptr, long len, rb_encoding *enc);
+VALUE rb_check_symbol_cstr(const char *ptr, long len, rb_encoding *enc);
RUBY_EXTERN VALUE rb_cEncoding;
-#define ENC_DUMMY_FLAG (1<<24)
-#define ENC_INDEX_MASK (~(~0U<<24))
-
-#define ENC_TO_ENCINDEX(enc) (int)((enc)->ruby_encoding_index & ENC_INDEX_MASK)
-
-#define ENC_DUMMY_P(enc) ((enc)->ruby_encoding_index & ENC_DUMMY_FLAG)
-#define ENC_SET_DUMMY(enc) ((enc)->ruby_encoding_index |= ENC_DUMMY_FLAG)
-
-static inline int
-rb_enc_dummy_p(rb_encoding *enc)
-{
- return ENC_DUMMY_P(enc) != 0;
-}
/* econv stuff */
diff --git a/include/ruby/intern.h b/include/ruby/intern.h
index 46af270bb3..f9858537e1 100644
--- a/include/ruby/intern.h
+++ b/include/ruby/intern.h
@@ -56,7 +56,7 @@ void rb_ary_free(VALUE);
void rb_ary_modify(VALUE);
VALUE rb_ary_freeze(VALUE);
VALUE rb_ary_shared_with_p(VALUE, VALUE);
-VALUE rb_ary_aref(int, VALUE*, VALUE);
+VALUE rb_ary_aref(int, const VALUE*, VALUE);
VALUE rb_ary_subseq(VALUE, long, long);
void rb_ary_store(VALUE, long, VALUE);
VALUE rb_ary_dup(VALUE);
@@ -85,35 +85,31 @@ VALUE rb_ary_rassoc(VALUE, VALUE);
VALUE rb_ary_includes(VALUE, VALUE);
VALUE rb_ary_cmp(VALUE, VALUE);
VALUE rb_ary_replace(VALUE copy, VALUE orig);
-VALUE rb_get_values_at(VALUE, long, int, VALUE*, VALUE(*)(VALUE,long));
+VALUE rb_get_values_at(VALUE, long, int, const VALUE*, VALUE(*)(VALUE,long));
VALUE rb_ary_resize(VALUE ary, long len);
#define rb_ary_new2 rb_ary_new_capa
#define rb_ary_new3 rb_ary_new_from_args
#define rb_ary_new4 rb_ary_new_from_values
/* bignum.c */
-VALUE rb_big_new(long, int);
+VALUE rb_big_new(size_t, int);
int rb_bigzero_p(VALUE x);
VALUE rb_big_clone(VALUE);
void rb_big_2comp(VALUE);
VALUE rb_big_norm(VALUE);
-void rb_big_resize(VALUE big, long len);
+void rb_big_resize(VALUE big, size_t len);
VALUE rb_cstr_to_inum(const char*, int, int);
VALUE rb_str_to_inum(VALUE, int, int);
VALUE rb_cstr2inum(const char*, int);
VALUE rb_str2inum(VALUE, int);
VALUE rb_big2str(VALUE, int);
-DEPRECATED(VALUE rb_big2str0(VALUE, int, int));
-SIGNED_VALUE rb_big2long(VALUE);
+long rb_big2long(VALUE);
#define rb_big2int(x) rb_big2long(x)
-VALUE rb_big2ulong(VALUE);
+unsigned long rb_big2ulong(VALUE);
#define rb_big2uint(x) rb_big2ulong(x)
-DEPRECATED(VALUE rb_big2ulong_pack(VALUE x));
#if HAVE_LONG_LONG
LONG_LONG rb_big2ll(VALUE);
unsigned LONG_LONG rb_big2ull(VALUE);
#endif /* HAVE_LONG_LONG */
-DEPRECATED(void rb_quad_pack(char*,VALUE));
-DEPRECATED(VALUE rb_quad_unpack(const char*,int));
void rb_big_pack(VALUE val, unsigned long *buf, long num_longs);
VALUE rb_big_unpack(unsigned long *buf, long num_longs);
int rb_uv_to_utf8(char[6],unsigned long);
@@ -172,6 +168,8 @@ VALUE rb_rational_new(VALUE, VALUE);
VALUE rb_Rational(VALUE, VALUE);
#define rb_Rational1(x) rb_Rational((x), INT2FIX(1))
#define rb_Rational2(x,y) rb_Rational((x), (y))
+VALUE rb_rational_num(VALUE rat);
+VALUE rb_rational_den(VALUE rat);
VALUE rb_flt_rationalize_with_prec(VALUE, VALUE);
VALUE rb_flt_rationalize(VALUE);
/* complex.c */
@@ -185,6 +183,8 @@ VALUE rb_complex_polar(VALUE, VALUE);
VALUE rb_Complex(VALUE, VALUE);
#define rb_Complex1(x) rb_Complex((x), INT2FIX(0))
#define rb_Complex2(x,y) rb_Complex((x), (y))
+DEPRECATED(VALUE rb_complex_set_real(VALUE, VALUE));
+DEPRECATED(VALUE rb_complex_set_imag(VALUE, VALUE));
/* class.c */
VALUE rb_class_boot(VALUE);
VALUE rb_class_new(VALUE);
@@ -203,11 +203,11 @@ VALUE rb_include_class_new(VALUE, VALUE);
VALUE rb_mod_included_modules(VALUE);
VALUE rb_mod_include_p(VALUE, VALUE);
VALUE rb_mod_ancestors(VALUE);
-VALUE rb_class_instance_methods(int, VALUE*, VALUE);
-VALUE rb_class_public_instance_methods(int, VALUE*, VALUE);
-VALUE rb_class_protected_instance_methods(int, VALUE*, VALUE);
-VALUE rb_class_private_instance_methods(int, VALUE*, VALUE);
-VALUE rb_obj_singleton_methods(int, VALUE*, VALUE);
+VALUE rb_class_instance_methods(int, const VALUE*, VALUE);
+VALUE rb_class_public_instance_methods(int, const VALUE*, VALUE);
+VALUE rb_class_protected_instance_methods(int, const VALUE*, VALUE);
+VALUE rb_class_private_instance_methods(int, const VALUE*, VALUE);
+VALUE rb_obj_singleton_methods(int, const VALUE*, VALUE);
void rb_define_method_id(VALUE, ID, VALUE (*)(ANYARGS), int);
void rb_frozen_class_p(VALUE);
void rb_undef(VALUE, ID);
@@ -220,16 +220,16 @@ int rb_cmpint(VALUE, VALUE, VALUE);
NORETURN(void rb_cmperr(VALUE, VALUE));
/* cont.c */
VALUE rb_fiber_new(VALUE (*)(ANYARGS), VALUE);
-VALUE rb_fiber_resume(VALUE fib, int argc, VALUE *args);
-VALUE rb_fiber_yield(int argc, VALUE *args);
+VALUE rb_fiber_resume(VALUE fib, int argc, const VALUE *argv);
+VALUE rb_fiber_yield(int argc, const VALUE *argv);
VALUE rb_fiber_current(void);
VALUE rb_fiber_alive_p(VALUE);
/* enum.c */
VALUE rb_enum_values_pack(int, const VALUE*);
/* enumerator.c */
-VALUE rb_enumeratorize(VALUE, VALUE, int, VALUE *);
+VALUE rb_enumeratorize(VALUE, VALUE, int, const VALUE *);
typedef VALUE rb_enumerator_size_func(VALUE, VALUE, VALUE);
-VALUE rb_enumeratorize_with_size(VALUE, VALUE, int, VALUE *, rb_enumerator_size_func *);
+VALUE rb_enumeratorize_with_size(VALUE, VALUE, int, const VALUE *, rb_enumerator_size_func *);
#ifndef RUBY_EXPORT
#define rb_enumeratorize_with_size(obj, id, argc, argv, size_fn) \
rb_enumeratorize_with_size(obj, id, argc, argv, (rb_enumerator_size_func *)(size_fn))
@@ -364,8 +364,8 @@ typedef fd_set rb_fdset_t;
NORETURN(void rb_exc_raise(VALUE));
NORETURN(void rb_exc_fatal(VALUE));
-VALUE rb_f_exit(int,VALUE*);
-VALUE rb_f_abort(int,VALUE*);
+VALUE rb_f_exit(int, const VALUE*);
+VALUE rb_f_abort(int, const VALUE*);
void rb_remove_method(VALUE, const char*);
void rb_remove_method_id(VALUE, ID);
#define rb_disable_super(klass, name) ((void)0)
@@ -385,15 +385,15 @@ int rb_method_basic_definition_p(VALUE, ID);
VALUE rb_eval_cmd(VALUE, VALUE, int);
int rb_obj_respond_to(VALUE, ID, int);
int rb_respond_to(VALUE, ID);
-VALUE rb_f_notimplement(int argc, VALUE *argv, VALUE obj);
+VALUE rb_f_notimplement(int argc, const VALUE *argv, VALUE obj);
void rb_interrupt(void);
VALUE rb_apply(VALUE, ID, VALUE);
void rb_backtrace(void);
ID rb_frame_this_func(void);
-VALUE rb_obj_instance_eval(int, VALUE*, VALUE);
-VALUE rb_obj_instance_exec(int, VALUE*, VALUE);
-VALUE rb_mod_module_eval(int, VALUE*, VALUE);
-VALUE rb_mod_module_exec(int, VALUE*, VALUE);
+VALUE rb_obj_instance_eval(int, const VALUE*, VALUE);
+VALUE rb_obj_instance_exec(int, const VALUE*, VALUE);
+VALUE rb_mod_module_eval(int, const VALUE*, VALUE);
+VALUE rb_mod_module_exec(int, const VALUE*, VALUE);
void rb_load(VALUE, int);
void rb_load_protect(VALUE, int, int*);
NORETURN(void rb_jump_tag(int));
@@ -402,8 +402,8 @@ int rb_feature_provided(const char *, const char **);
void rb_provide(const char*);
VALUE rb_f_require(VALUE, VALUE);
VALUE rb_require_safe(VALUE, int);
-void rb_obj_call_init(VALUE, int, VALUE*);
-VALUE rb_class_new_instance(int, VALUE*, VALUE);
+void rb_obj_call_init(VALUE, int, const VALUE*);
+VALUE rb_class_new_instance(int, const VALUE*, VALUE);
VALUE rb_block_proc(void);
VALUE rb_block_lambda(void);
VALUE rb_proc_new(VALUE (*)(ANYARGS/* VALUE yieldarg[, VALUE procarg] */), VALUE);
@@ -415,8 +415,8 @@ VALUE rb_proc_lambda_p(VALUE);
VALUE rb_binding_new(void);
VALUE rb_obj_method(VALUE, VALUE);
VALUE rb_obj_is_method(VALUE);
-VALUE rb_method_call(int, VALUE*, VALUE);
-VALUE rb_method_call_with_block(int, VALUE *, VALUE, VALUE);
+VALUE rb_method_call(int, const VALUE*, VALUE);
+VALUE rb_method_call_with_block(int, const VALUE *, VALUE, VALUE);
int rb_mod_method_arity(VALUE, ID);
int rb_obj_method_arity(VALUE, ID);
VALUE rb_protect(VALUE (*)(VALUE), VALUE, int*);
@@ -427,7 +427,6 @@ void rb_thread_wait_fd(int);
int rb_thread_fd_writable(int);
void rb_thread_fd_close(int);
int rb_thread_alone(void);
-DEPRECATED(void rb_thread_polling(void));
void rb_thread_sleep(int);
void rb_thread_sleep_forever(void);
void rb_thread_sleep_deadly(void);
@@ -437,7 +436,6 @@ VALUE rb_thread_wakeup_alive(VALUE);
VALUE rb_thread_run(VALUE);
VALUE rb_thread_kill(VALUE);
VALUE rb_thread_create(VALUE (*)(ANYARGS), void*);
-DEPRECATED(int rb_thread_select(int, fd_set *, fd_set *, fd_set *, struct timeval *));
int rb_thread_fd_select(int, rb_fdset_t *, rb_fdset_t *, rb_fdset_t *, struct timeval *);
void rb_thread_wait_for(struct timeval);
VALUE rb_thread_current(void);
@@ -453,9 +451,9 @@ VALUE rb_exec_recursive_paired_outer(VALUE(*)(VALUE, VALUE, int),VALUE,VALUE,VAL
/* dir.c */
VALUE rb_dir_getwd(void);
/* file.c */
-VALUE rb_file_s_expand_path(int, VALUE *);
+VALUE rb_file_s_expand_path(int, const VALUE *);
VALUE rb_file_expand_path(VALUE, VALUE);
-VALUE rb_file_s_absolute_path(int, VALUE *);
+VALUE rb_file_s_absolute_path(int, const VALUE *);
VALUE rb_file_absolute_path(VALUE, VALUE);
VALUE rb_file_dirname(VALUE fname);
int rb_find_file_ext_safe(VALUE*, const char* const*, int);
@@ -468,7 +466,7 @@ int rb_is_absolute_path(const char *);
/* gc.c */
NORETURN(void rb_memerror(void));
int rb_during_gc(void);
-void rb_gc_mark_locations(VALUE*, VALUE*);
+void rb_gc_mark_locations(const VALUE*, const VALUE*);
void rb_mark_tbl(struct st_table*);
void rb_mark_set(struct st_table*);
void rb_mark_hash(struct st_table*);
@@ -482,7 +480,6 @@ void rb_gc_call_finalizer_at_exit(void);
VALUE rb_gc_enable(void);
VALUE rb_gc_disable(void);
VALUE rb_gc_start(void);
-DEPRECATED(void rb_gc_set_params(void));
VALUE rb_define_finalizer(VALUE, VALUE);
VALUE rb_undefine_finalizer(VALUE);
size_t rb_gc_count(void);
@@ -511,6 +508,9 @@ struct st_table *rb_hash_tbl(VALUE);
int rb_path_check(const char*);
int rb_env_path_tainted(void);
VALUE rb_env_clear(void);
+VALUE rb_hash_size(VALUE);
+DEPRECATED(int rb_hash_iter_lev(VALUE));
+DEPRECATED(VALUE rb_hash_ifnone(VALUE));
/* io.c */
#define rb_defout rb_stdout
RUBY_EXTERN VALUE rb_fs;
@@ -529,9 +529,9 @@ VALUE rb_io_eof(VALUE);
VALUE rb_io_binmode(VALUE);
VALUE rb_io_ascii8bit_binmode(VALUE);
VALUE rb_io_addstr(VALUE, VALUE);
-VALUE rb_io_printf(int, VALUE*, VALUE);
-VALUE rb_io_print(int, VALUE*, VALUE);
-VALUE rb_io_puts(int, VALUE*, VALUE);
+VALUE rb_io_printf(int, const VALUE*, VALUE);
+VALUE rb_io_print(int, const VALUE*, VALUE);
+VALUE rb_io_puts(int, const VALUE*, VALUE);
VALUE rb_io_fdopen(int, int, const char*);
VALUE rb_io_get_io(VALUE);
VALUE rb_file_open(const char*, const char*);
@@ -623,25 +623,12 @@ VALUE rb_sym_all_symbols(void);
/* process.c */
void rb_last_status_set(int status, rb_pid_t pid);
VALUE rb_last_status_get(void);
-struct rb_exec_arg {
- VALUE execarg_obj;
-};
-DEPRECATED(int rb_proc_exec_n(int, VALUE*, const char*));
int rb_proc_exec(const char*);
-DEPRECATED(VALUE rb_exec_arg_init(int argc, VALUE *argv, int accept_shell, struct rb_exec_arg *e));
-DEPRECATED(int rb_exec_arg_addopt(struct rb_exec_arg *e, VALUE key, VALUE val));
-DEPRECATED(void rb_exec_arg_fixup(struct rb_exec_arg *e));
-DEPRECATED(int rb_run_exec_options(const struct rb_exec_arg *e, struct rb_exec_arg *s));
-DEPRECATED(int rb_run_exec_options_err(const struct rb_exec_arg *e, struct rb_exec_arg *s, char*, size_t));
-DEPRECATED(int rb_exec(const struct rb_exec_arg*));
-DEPRECATED(int rb_exec_err(const struct rb_exec_arg*, char*, size_t));
-DEPRECATED(rb_pid_t rb_fork(int*, int (*)(void*), void*, VALUE));
-DEPRECATED(rb_pid_t rb_fork_err(int*, int (*)(void*, char*, size_t), void*, VALUE, char*, size_t));
-VALUE rb_f_exec(int,VALUE*);
+VALUE rb_f_exec(int, const VALUE*);
rb_pid_t rb_waitpid(rb_pid_t pid, int *status, int flags);
void rb_syswait(rb_pid_t pid);
-rb_pid_t rb_spawn(int, VALUE*);
-rb_pid_t rb_spawn_err(int, VALUE*, char*, size_t);
+rb_pid_t rb_spawn(int, const VALUE*);
+rb_pid_t rb_spawn_err(int, const VALUE*, char*, size_t);
VALUE rb_proc_times(VALUE);
VALUE rb_detach_process(rb_pid_t pid);
/* range.c */
@@ -684,7 +671,7 @@ VALUE rb_get_argv(void);
void *rb_load_file(const char*);
void *rb_load_file_str(VALUE);
/* signal.c */
-VALUE rb_f_kill(int, VALUE*);
+VALUE rb_f_kill(int, const VALUE*);
#ifdef POSIX_SIGNAL
#define posix_signal ruby_posix_signal
RETSIGTYPE (*posix_signal(int, RETSIGTYPE (*)(int)))(int);
@@ -747,6 +734,7 @@ VALUE rb_str_freeze(VALUE);
void rb_str_set_len(VALUE, long);
VALUE rb_str_resize(VALUE, long);
VALUE rb_str_cat(VALUE, const char*, long);
+VALUE rb_str_cat_cstr(VALUE, const char*);
VALUE rb_str_cat2(VALUE, const char*);
VALUE rb_str_append(VALUE, VALUE);
VALUE rb_str_concat(VALUE, VALUE);
@@ -769,8 +757,8 @@ VALUE rb_str_replace(VALUE, VALUE);
VALUE rb_str_inspect(VALUE);
VALUE rb_str_dump(VALUE);
VALUE rb_str_split(VALUE, const char*);
-void rb_str_associate(VALUE, VALUE);
-VALUE rb_str_associated(VALUE);
+DEPRECATED(void rb_str_associate(VALUE, VALUE));
+DEPRECATED(VALUE rb_str_associated(VALUE));
void rb_str_setter(VALUE, ID, VALUE*);
VALUE rb_str_intern(VALUE);
VALUE rb_sym_to_s(VALUE);
@@ -818,17 +806,11 @@ VALUE rb_str_scrub(VALUE, VALUE);
(str), (long)strlen(str)) : \
rb_str_buf_new_cstr(str); \
})
-#define rb_str_buf_cat2(str, ptr) __extension__ ( \
-{ \
- (__builtin_constant_p(ptr)) ? \
- rb_str_buf_cat((str), (ptr), (long)strlen(ptr)) : \
- rb_str_buf_cat2((str), (ptr)); \
-})
-#define rb_str_cat2(str, ptr) __extension__ ( \
+#define rb_str_cat_cstr(str, ptr) __extension__ ( \
{ \
(__builtin_constant_p(ptr)) ? \
rb_str_cat((str), (ptr), (long)strlen(ptr)) : \
- rb_str_cat2((str), (ptr)); \
+ rb_str_cat_cstr((str), (ptr)); \
})
#define rb_exc_new_cstr(klass, ptr) __extension__ ( \
{ \
@@ -844,6 +826,9 @@ VALUE rb_str_scrub(VALUE, VALUE);
#define rb_tainted_str_new2 rb_tainted_str_new_cstr
#define rb_str_buf_new2 rb_str_buf_new_cstr
#define rb_usascii_str_new2 rb_usascii_str_new_cstr
+#define rb_str_buf_cat rb_str_cat
+#define rb_str_buf_cat2 rb_str_cat_cstr
+#define rb_str_cat2 rb_str_cat_cstr
/* struct.c */
VALUE rb_struct_new(VALUE, ...);
VALUE rb_struct_define(const char*, ...);
@@ -853,7 +838,6 @@ VALUE rb_struct_initialize(VALUE, VALUE);
VALUE rb_struct_aref(VALUE, VALUE);
VALUE rb_struct_aset(VALUE, VALUE, VALUE);
VALUE rb_struct_getmember(VALUE, ID);
-DEPRECATED(VALUE rb_struct_iv_get(VALUE, const char*));
VALUE rb_struct_s_members(VALUE);
VALUE rb_struct_members(VALUE);
VALUE rb_struct_alloc_noinit(VALUE);
@@ -866,9 +850,6 @@ typedef VALUE rb_blocking_function_t(void *);
void rb_thread_check_ints(void);
int rb_thread_interrupted(VALUE thval);
-/* Use rb_thread_call_without_gvl family instead. */
-DEPRECATED(VALUE rb_thread_blocking_region(rb_blocking_function_t *func, void *data1,
- rb_unblock_function_t *ubf, void *data2));
#define RUBY_UBF_IO ((rb_unblock_function_t *)-1)
#define RUBY_UBF_PROCESS ((rb_unblock_function_t *)-1)
VALUE rb_mutex_new(void);
@@ -898,8 +879,8 @@ VALUE rb_class_name(VALUE);
void rb_autoload(VALUE, ID, const char*);
VALUE rb_autoload_load(VALUE, ID);
VALUE rb_autoload_p(VALUE, ID);
-VALUE rb_f_trace_var(int, VALUE*);
-VALUE rb_f_untrace_var(int, VALUE*);
+VALUE rb_f_trace_var(int, const VALUE*);
+VALUE rb_f_untrace_var(int, const VALUE*);
VALUE rb_f_global_variables(void);
void rb_alias_variable(ID, ID);
struct st_table* rb_generic_ivar_table(VALUE);
@@ -916,7 +897,7 @@ VALUE rb_obj_remove_instance_variable(VALUE, VALUE);
void *rb_mod_const_at(VALUE, void*);
void *rb_mod_const_of(VALUE, void*);
VALUE rb_const_list(void*);
-VALUE rb_mod_constants(int, VALUE *, VALUE);
+VALUE rb_mod_constants(int, const VALUE *, VALUE);
VALUE rb_mod_remove_const(VALUE, VALUE);
int rb_const_defined(VALUE, ID);
int rb_const_defined_at(VALUE, ID);
@@ -933,7 +914,7 @@ VALUE rb_cvar_get(VALUE, ID);
void rb_cv_set(VALUE, const char*, VALUE);
VALUE rb_cv_get(VALUE, const char*);
void rb_define_class_variable(VALUE, const char*, VALUE);
-VALUE rb_mod_class_variables(int, VALUE*, VALUE);
+VALUE rb_mod_class_variables(int, const VALUE*, VALUE);
VALUE rb_mod_remove_cvar(VALUE, VALUE);
ID rb_frame_callee(void);
@@ -941,7 +922,7 @@ VALUE rb_str_succ(VALUE);
VALUE rb_time_succ(VALUE);
int rb_frame_method_id_and_class(ID *idp, VALUE *klassp);
VALUE rb_make_backtrace(void);
-VALUE rb_make_exception(int, VALUE*);
+VALUE rb_make_exception(int, const VALUE*);
/* deprecated */
DEPRECATED(void rb_frame_pop(void));
diff --git a/include/ruby/io.h b/include/ruby/io.h
index 23337679f0..cc3f5e60b1 100644
--- a/include/ruby/io.h
+++ b/include/ruby/io.h
@@ -51,16 +51,17 @@ extern "C" {
RUBY_SYMBOL_EXPORT_BEGIN
-typedef struct {
+PACKED_STRUCT_UNALIGNED(struct rb_io_buffer_t {
char *ptr; /* off + len <= capa */
int off;
int len;
int capa;
-} rb_io_buffer_t;
+});
+typedef struct rb_io_buffer_t rb_io_buffer_t;
typedef struct rb_io_t {
- int fd; /* file descriptor */
FILE *stdio_file; /* stdio ptr for read/write if available */
+ int fd; /* file descriptor */
int mode; /* mode flags: FMODE_XXXs */
rb_pid_t pid; /* child's pid (for pipes) */
int lineno; /* number of lines read */
@@ -89,9 +90,9 @@ typedef struct rb_io_t {
rb_econv_t *writeconv;
VALUE writeconv_asciicompat;
+ int writeconv_initialized;
int writeconv_pre_ecflags;
VALUE writeconv_pre_ecopts;
- int writeconv_initialized;
VALUE write_lock;
} rb_io_t;
@@ -195,7 +196,6 @@ NORETURN(void rb_eof_error(void));
void rb_io_read_check(rb_io_t*);
int rb_io_read_pending(rb_io_t*);
-DEPRECATED(void rb_read_check(FILE*));
struct stat;
VALUE rb_stat_new(const struct stat *);
diff --git a/include/ruby/missing.h b/include/ruby/missing.h
index 5dba4edda7..161d95430a 100644
--- a/include/ruby/missing.h
+++ b/include/ruby/missing.h
@@ -21,6 +21,9 @@ extern "C" {
#include "ruby/config.h"
#include <stddef.h>
#include <math.h> /* for INFINITY and NAN */
+#ifdef RUBY_ALTERNATIVE_MALLOC_HEADER
+# include RUBY_ALTERNATIVE_MALLOC_HEADER
+#endif
#ifdef RUBY_EXTCONF_H
#include RUBY_EXTCONF_H
#endif
@@ -168,6 +171,10 @@ RUBY_EXTERN int isnan(double);
# endif
#endif
+#ifndef HAVE_NEXTAFTER
+RUBY_EXTERN double nextafter(double x, double y);
+#endif
+
/*
#ifndef HAVE_MEMCMP
RUBY_EXTERN int memcmp(const void *, const void *, size_t);
diff --git a/include/ruby/oniguruma.h b/include/ruby/oniguruma.h
index d533a05b66..2530f61427 100644
--- a/include/ruby/oniguruma.h
+++ b/include/ruby/oniguruma.h
@@ -5,7 +5,7 @@
**********************************************************************/
/*-
* Copyright (c) 2002-2009 K.Kosako <sndgk393 AT ybb DOT ne DOT jp>
- * Copyright (c) 2011-2013 K.Takata <kentkt AT csc 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
@@ -39,8 +39,8 @@ extern "C" {
#define ONIGURUMA
#define ONIGURUMA_VERSION_MAJOR 5
-#define ONIGURUMA_VERSION_MINOR 13
-#define ONIGURUMA_VERSION_TEENY 5
+#define ONIGURUMA_VERSION_MINOR 15
+#define ONIGURUMA_VERSION_TEENY 0
#ifdef __cplusplus
# ifndef HAVE_PROTOTYPES
@@ -156,29 +156,29 @@ typedef struct {
typedef int (*OnigApplyAllCaseFoldFunc)(OnigCodePoint from, OnigCodePoint* to, int to_len, void* arg);
typedef struct OnigEncodingTypeST {
- int (*precise_mbc_enc_len)(const OnigUChar* p,const OnigUChar* e, struct OnigEncodingTypeST* enc);
+ int (*precise_mbc_enc_len)(const OnigUChar* p,const OnigUChar* e, const struct OnigEncodingTypeST* enc);
const char* name;
int max_enc_len;
int min_enc_len;
- int (*is_mbc_newline)(const OnigUChar* p, const OnigUChar* end, struct OnigEncodingTypeST* enc);
- OnigCodePoint (*mbc_to_code)(const OnigUChar* p, const OnigUChar* end, struct OnigEncodingTypeST* enc);
- int (*code_to_mbclen)(OnigCodePoint code, struct OnigEncodingTypeST* enc);
- int (*code_to_mbc)(OnigCodePoint code, OnigUChar *buf, struct OnigEncodingTypeST* enc);
- int (*mbc_case_fold)(OnigCaseFoldType flag, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to, struct OnigEncodingTypeST* enc);
- int (*apply_all_case_fold)(OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg, struct OnigEncodingTypeST* enc);
- int (*get_case_fold_codes_by_str)(OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem acs[], struct OnigEncodingTypeST* enc);
- int (*property_name_to_ctype)(struct OnigEncodingTypeST* enc, OnigUChar* p, OnigUChar* end);
- int (*is_code_ctype)(OnigCodePoint code, OnigCtype ctype, struct OnigEncodingTypeST* enc);
- int (*get_ctype_code_range)(OnigCtype ctype, OnigCodePoint* sb_out, const OnigCodePoint* ranges[], struct OnigEncodingTypeST* enc);
- OnigUChar* (*left_adjust_char_head)(const OnigUChar* start, const OnigUChar* p, const OnigUChar* end, struct OnigEncodingTypeST* enc);
- int (*is_allowed_reverse_match)(const OnigUChar* p, const OnigUChar* end, struct OnigEncodingTypeST* enc);
+ int (*is_mbc_newline)(const OnigUChar* p, const OnigUChar* end, const struct OnigEncodingTypeST* enc);
+ OnigCodePoint (*mbc_to_code)(const OnigUChar* p, const OnigUChar* end, const struct OnigEncodingTypeST* enc);
+ int (*code_to_mbclen)(OnigCodePoint code, const struct OnigEncodingTypeST* enc);
+ int (*code_to_mbc)(OnigCodePoint code, OnigUChar *buf, const struct OnigEncodingTypeST* enc);
+ int (*mbc_case_fold)(OnigCaseFoldType flag, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to, const struct OnigEncodingTypeST* enc);
+ int (*apply_all_case_fold)(OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg, const struct OnigEncodingTypeST* enc);
+ int (*get_case_fold_codes_by_str)(OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem acs[], const struct OnigEncodingTypeST* enc);
+ int (*property_name_to_ctype)(const struct OnigEncodingTypeST* enc, OnigUChar* p, OnigUChar* end);
+ int (*is_code_ctype)(OnigCodePoint code, OnigCtype ctype, const struct OnigEncodingTypeST* enc);
+ int (*get_ctype_code_range)(OnigCtype ctype, OnigCodePoint* sb_out, const OnigCodePoint* ranges[], const struct OnigEncodingTypeST* enc);
+ OnigUChar* (*left_adjust_char_head)(const OnigUChar* start, const OnigUChar* p, const OnigUChar* end, const struct OnigEncodingTypeST* enc);
+ int (*is_allowed_reverse_match)(const OnigUChar* p, const OnigUChar* end, const struct OnigEncodingTypeST* enc);
int ruby_encoding_index;
unsigned int flags;
} OnigEncodingType;
-typedef OnigEncodingType* OnigEncoding;
+typedef const OnigEncodingType* OnigEncoding;
-ONIG_EXTERN OnigEncodingType OnigEncodingASCII;
+ONIG_EXTERN const OnigEncodingType OnigEncodingASCII;
#define ONIG_ENCODING_ASCII (&OnigEncodingASCII)
@@ -256,7 +256,7 @@ ONIG_EXTERN OnigEncodingType OnigEncodingASCII;
#define ONIGENC_PRECISE_MBC_ENC_LEN(enc,p,e) (enc)->precise_mbc_enc_len(p,e,enc)
ONIG_EXTERN
-int onigenc_mbclen_approximate P_((const OnigUChar* p,const OnigUChar* e, struct OnigEncodingTypeST* enc));
+int onigenc_mbclen_approximate P_((const OnigUChar* p,const OnigUChar* e, const struct OnigEncodingTypeST* enc));
#define ONIGENC_MBC_ENC_LEN(enc,p,e) onigenc_mbclen_approximate(p,e,enc)
#define ONIGENC_MBC_MAXLEN(enc) ((enc)->max_enc_len)
@@ -370,7 +370,9 @@ typedef unsigned int OnigOptionType;
#define ONIG_OPTION_WORD_BOUND_ALL_RANGE (ONIG_OPTION_POSIX_BRACKET_ALL_RANGE << 1)
/* options (newline) */
#define ONIG_OPTION_NEWLINE_CRLF (ONIG_OPTION_WORD_BOUND_ALL_RANGE << 1)
-#define ONIG_OPTION_MAXBIT ONIG_OPTION_NEWLINE_CRLF /* limit */
+#define ONIG_OPTION_NOTBOS (ONIG_OPTION_NEWLINE_CRLF << 1)
+#define ONIG_OPTION_NOTEOS (ONIG_OPTION_NOTBOS << 1)
+#define ONIG_OPTION_MAXBIT ONIG_OPTION_NOTEOS /* limit */
#define ONIG_OPTION_ON(options,regopt) ((options) |= (regopt))
#define ONIG_OPTION_OFF(options,regopt) ((options) &= ~(regopt))
@@ -672,13 +674,15 @@ typedef struct re_pattern_buffer {
unsigned int bt_mem_end; /* need backtrack flag */
int stack_pop_level;
int repeat_range_alloc;
+
+ OnigOptionType options;
+
OnigRepeatRange* repeat_range;
OnigEncoding enc;
- OnigOptionType options;
const OnigSyntaxType* syntax;
- OnigCaseFoldType case_fold_flag;
void* name_table;
+ OnigCaseFoldType case_fold_flag;
/* optimization info (string search, char-map and anchors) */
int optimize; /* optimize flag */
@@ -710,7 +714,7 @@ typedef struct {
int num_of_elements;
OnigEncoding pattern_enc;
OnigEncoding target_enc;
- OnigSyntaxType* syntax;
+ const OnigSyntaxType* syntax;
OnigOptionType option;
OnigCaseFoldType case_fold_flag;
} OnigCompileInfo;
@@ -809,7 +813,7 @@ void onig_set_syntax_options P_((OnigSyntaxType* syntax, OnigOptionType options)
ONIG_EXTERN
int onig_set_meta_char P_((OnigSyntaxType* syntax, unsigned int what, OnigCodePoint code));
ONIG_EXTERN
-void onig_copy_encoding P_((OnigEncoding to, OnigEncoding from));
+void onig_copy_encoding P_((OnigEncodingType *to, OnigEncoding from));
ONIG_EXTERN
OnigCaseFoldType onig_get_default_case_fold_flag P_((void));
ONIG_EXTERN
diff --git a/include/ruby/ruby.h b/include/ruby/ruby.h
index 95965d6b6a..4b57e7848b 100644
--- a/include/ruby/ruby.h
+++ b/include/ruby/ruby.h
@@ -351,9 +351,13 @@ rb_long2int_inline(long n)
#define IMMEDIATE_P(x) ((VALUE)(x) & IMMEDIATE_MASK)
-#define SYMBOL_P(x) (((VALUE)(x)&~((~(VALUE)0)<<RUBY_SPECIAL_SHIFT))==SYMBOL_FLAG)
-#define ID2SYM(x) (((VALUE)(x)<<RUBY_SPECIAL_SHIFT)|SYMBOL_FLAG)
-#define SYM2ID(x) RSHIFT((unsigned long)(x),RUBY_SPECIAL_SHIFT)
+ID rb_sym2id(VALUE);
+VALUE rb_id2sym(ID);
+#define STATIC_SYM_P(x) (((VALUE)(x)&~((~(VALUE)0)<<RUBY_SPECIAL_SHIFT))==SYMBOL_FLAG)
+#define DYNAMIC_SYM_P(x) (!SPECIAL_CONST_P(x) && BUILTIN_TYPE(x) == (T_SYMBOL))
+#define SYMBOL_P(x) (STATIC_SYM_P(x)||DYNAMIC_SYM_P(x))
+#define ID2SYM(x) (rb_id2sym(x))
+#define SYM2ID(x) (rb_sym2id(x))
#ifndef USE_FLONUM
#if SIZEOF_VALUE >= SIZEOF_DOUBLE
@@ -372,54 +376,32 @@ rb_long2int_inline(long n)
/* Module#methods, #singleton_methods and so on return Symbols */
#define USE_SYMBOL_AS_METHOD_NAME 1
-/*
-!USE_FLONUM
--------------------------
-...xxxx xxx1 Fixnum
-...0000 1110 Symbol
-...0000 0000 Qfalse
-...0000 0010 Qtrue
-...0000 0100 Qnil
-...0000 0110 Qundef
-
-USE_FLONUM
--------------------------
-...xxxx xxx1 Fixnum
-...xxxx xx10 Flonum
-...0000 1100 Symbol
-...0000 0000 Qfalse 0x00 = 0
-...0000 1000 Qnil 0x08 = 8
-...0001 0100 Qtrue 0x14 = 20
-...0011 0100 Qundef 0x34 = 52
- */
-
/* special constants - i.e. non-zero and non-fixnum constants */
enum ruby_special_consts {
#if USE_FLONUM
- RUBY_Qfalse = 0x00,
- RUBY_Qtrue = 0x14,
- RUBY_Qnil = 0x08,
- RUBY_Qundef = 0x34,
+ RUBY_Qfalse = 0x00, /* ...0000 0000 */
+ RUBY_Qtrue = 0x14, /* ...0001 0100 */
+ RUBY_Qnil = 0x08, /* ...0000 1000 */
+ RUBY_Qundef = 0x34, /* ...0011 0100 */
RUBY_IMMEDIATE_MASK = 0x07,
- RUBY_FIXNUM_FLAG = 0x01,
+ RUBY_FIXNUM_FLAG = 0x01, /* ...xxxx xxx1 */
RUBY_FLONUM_MASK = 0x03,
- RUBY_FLONUM_FLAG = 0x02,
- RUBY_SYMBOL_FLAG = 0x0c,
- RUBY_SPECIAL_SHIFT = 8
+ RUBY_FLONUM_FLAG = 0x02, /* ...xxxx xx10 */
+ RUBY_SYMBOL_FLAG = 0x0c, /* ...0000 1100 */
#else
- RUBY_Qfalse = 0,
- RUBY_Qtrue = 2,
- RUBY_Qnil = 4,
- RUBY_Qundef = 6,
+ RUBY_Qfalse = 0, /* ...0000 0000 */
+ RUBY_Qtrue = 2, /* ...0000 0010 */
+ RUBY_Qnil = 4, /* ...0000 0100 */
+ RUBY_Qundef = 6, /* ...0000 0110 */
RUBY_IMMEDIATE_MASK = 0x03,
- RUBY_FIXNUM_FLAG = 0x01,
+ RUBY_FIXNUM_FLAG = 0x01, /* ...xxxx xxx1 */
RUBY_FLONUM_MASK = 0x00, /* any values ANDed with FLONUM_MASK cannot be FLONUM_FLAG */
RUBY_FLONUM_FLAG = 0x02,
- RUBY_SYMBOL_FLAG = 0x0e,
- RUBY_SPECIAL_SHIFT = 8
+ RUBY_SYMBOL_FLAG = 0x0e, /* ...0000 1110 */
#endif
+ RUBY_SPECIAL_SHIFT = 8
};
#define Qfalse ((VALUE)RUBY_Qfalse)
@@ -515,12 +497,16 @@ static inline int rb_type(VALUE obj);
static inline volatile VALUE *rb_gc_guarded_ptr(volatile VALUE *ptr) {return ptr;}
#pragma optimize("", on)
#else
-volatile VALUE *rb_gc_guarded_ptr(volatile VALUE *ptr);
-#define HAVE_RB_GC_GUARDED_PTR 1
+volatile VALUE *rb_gc_guarded_ptr_val(volatile VALUE *ptr, VALUE val);
+#define HAVE_RB_GC_GUARDED_PTR_VAL 1
+#define RB_GC_GUARD(v) (*rb_gc_guarded_ptr_val(&(v),(v)))
#endif
#define RB_GC_GUARD_PTR(ptr) rb_gc_guarded_ptr(ptr)
#endif
+
+#ifndef RB_GC_GUARD
#define RB_GC_GUARD(v) (*RB_GC_GUARD_PTR(&(v)))
+#endif
#ifdef __GNUC__
#define RB_UNUSED_VAR(x) x __attribute__ ((unused))
@@ -541,13 +527,10 @@ char *rb_string_value_cstr(volatile VALUE*);
#define StringValueCStr(v) rb_string_value_cstr(&(v))
void rb_check_safe_obj(VALUE);
-DEPRECATED(void rb_check_safe_str(VALUE));
#define SafeStringValue(v) do {\
StringValue(v);\
rb_check_safe_obj(v);\
} while (0)
-/* obsolete macro - use SafeStringValue(v) */
-#define Check_SafeStr(v) rb_check_safe_str((VALUE)(v))
VALUE rb_str_export(VALUE);
#define ExportStringValue(v) do {\
@@ -587,15 +570,15 @@ NORETURN(void rb_insecure_operation(void));
VALUE rb_errinfo(void);
void rb_set_errinfo(VALUE);
-SIGNED_VALUE rb_num2long(VALUE);
-VALUE rb_num2ulong(VALUE);
+long rb_num2long(VALUE);
+unsigned long rb_num2ulong(VALUE);
static inline long
rb_num2long_inline(VALUE x)
{
if (FIXNUM_P(x))
return FIX2LONG(x);
else
- return (long)rb_num2long(x);
+ return rb_num2long(x);
}
#define NUM2LONG(x) rb_num2long_inline(x)
static inline unsigned long
@@ -604,7 +587,7 @@ rb_num2ulong_inline(VALUE x)
if (FIXNUM_P(x))
return (unsigned long)FIX2LONG(x);
else
- return (unsigned long)rb_num2ulong(x);
+ return rb_num2ulong(x);
}
#define NUM2ULONG(x) rb_num2ulong_inline(x)
#if SIZEOF_INT < SIZEOF_LONG
@@ -705,6 +688,13 @@ VALUE rb_obj_setup(VALUE obj, VALUE klass, VALUE type);
#ifndef USE_RGENGC
#define USE_RGENGC 1
+#ifndef USE_RINCGC
+#define USE_RINCGC 1
+#endif
+#endif
+
+#if USE_RGENGC == 0
+#define USE_RINCGC 0
#endif
#ifndef RGENGC_WB_PROTECTED_ARRAY
@@ -763,7 +753,7 @@ struct RObject {
struct RBasic basic;
union {
struct {
- long numiv;
+ long numiv; /* only uses 32-bits */
VALUE *ivptr;
struct st_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
} heap;
@@ -802,11 +792,6 @@ struct RClass {
#define RMODULE_IS_REFINEMENT FL_USER3
#define RMODULE_INCLUDED_INTO_REFINEMENT FL_USER4
-struct RFloat {
- struct RBasic basic;
- double float_value;
-};
-
double rb_float_value(VALUE);
VALUE rb_float_new(double);
VALUE rb_float_new_in_heap(double);
@@ -900,8 +885,10 @@ struct RArray {
#define RARRAY_AREF(a, i) (RARRAY_CONST_PTR(a)[i])
#define RARRAY_ASET(a, i, v) do { \
- const VALUE _ary_ = (a); \
- RB_OBJ_WRITE(_ary_, &RARRAY_CONST_PTR(_ary_)[i], (v)); \
+ const VALUE _ary = (a); \
+ VALUE *ptr = (VALUE *)RARRAY_PTR_USE_START(_ary); \
+ RB_OBJ_WRITE(_ary, &ptr[i], (v)); \
+ RARRAY_PTR_USE_END(_ary); \
} while (0)
#define RARRAY_PTR(a) ((VALUE *)RARRAY_CONST_PTR(RGENGC_WB_PROTECTED_ARRAY ? OBJ_WB_UNPROTECT((VALUE)a) : ((VALUE)a)))
@@ -917,17 +904,11 @@ struct RRegexp {
#define RREGEXP_SRC_LEN(r) RSTRING_LEN(RREGEXP(r)->src)
#define RREGEXP_SRC_END(r) RSTRING_END(RREGEXP(r)->src)
-struct RHash {
- struct RBasic basic;
- struct st_table *ntbl; /* possibly 0 */
- int iter_lev;
- const VALUE ifnone;
-};
/* RHASH_TBL allocates st_table if not available. */
#define RHASH_TBL(h) rb_hash_tbl(h)
-#define RHASH_ITER_LEV(h) (RHASH(h)->iter_lev)
-#define RHASH_IFNONE(h) (RHASH(h)->ifnone)
-#define RHASH_SIZE(h) (RHASH(h)->ntbl ? (st_index_t)RHASH(h)->ntbl->num_entries : 0)
+#define RHASH_ITER_LEV(h) rb_hash_iter_lev(h)
+#define RHASH_IFNONE(h) rb_hash_ifnone(h)
+#define RHASH_SIZE(h) NUM2SIZET(rb_hash_size(h))
#define RHASH_EMPTY_P(h) (RHASH_SIZE(h) == 0)
#define RHASH_SET_IFNONE(h, ifnone) rb_hash_set_ifnone((VALUE)h, ifnone)
@@ -936,21 +917,6 @@ struct RFile {
struct rb_io_t *fptr;
};
-struct RRational {
- struct RBasic basic;
- const VALUE num;
- const VALUE den;
-};
-
-#define RRATIONAL_SET_NUM(rat, n) RB_OBJ_WRITE((rat), &((struct RRational *)(rat))->num,(n))
-#define RRATIONAL_SET_DEN(rat, d) RB_OBJ_WRITE((rat), &((struct RRational *)(rat))->den,(d))
-
-struct RComplex {
- struct RBasic basic;
- const VALUE real;
- const VALUE imag;
-};
-
#define RCOMPLEX_SET_REAL(cmp, r) RB_OBJ_WRITE((cmp), &((struct RComplex *)(cmp))->real,(r))
#define RCOMPLEX_SET_IMAG(cmp, i) RB_OBJ_WRITE((cmp), &((struct RComplex *)(cmp))->imag,(i))
@@ -1019,8 +985,7 @@ void *rb_check_typeddata(VALUE, const rb_data_type_t *);
rb_data_object_alloc((klass),(sval),(RUBY_DATA_FUNC)(mark),(RUBY_DATA_FUNC)(free))
#define Data_Make_Struct(klass,type,mark,free,sval) (\
- (sval) = ALLOC(type),\
- memset((sval), 0, sizeof(type)),\
+ (sval) = ZALLOC(type),\
Data_Wrap_Struct((klass),(mark),(free),(sval))\
)
@@ -1028,8 +993,7 @@ void *rb_check_typeddata(VALUE, const rb_data_type_t *);
rb_data_typed_object_alloc((klass),(sval),(data_type))
#define TypedData_Make_Struct(klass, type, data_type, sval) (\
- (sval) = ALLOC(type),\
- memset((sval), 0, sizeof(type)),\
+ (sval) = ZALLOC(type),\
TypedData_Wrap_Struct((klass),(data_type),(sval))\
)
@@ -1070,69 +1034,27 @@ struct RStruct {
#define RSTRUCT_SET(st, idx, v) RB_OBJ_WRITE(st, &RSTRUCT_CONST_PTR(st)[idx], (v))
#define RSTRUCT_GET(st, idx) (RSTRUCT_CONST_PTR(st)[idx])
-#define RBIGNUM_EMBED_LEN_NUMBITS 3
-#ifndef RBIGNUM_EMBED_LEN_MAX
-# if (SIZEOF_VALUE*3/SIZEOF_ACTUAL_BDIGIT) < (1 << RBIGNUM_EMBED_LEN_NUMBITS)-1
-# define RBIGNUM_EMBED_LEN_MAX (SIZEOF_VALUE*3/SIZEOF_ACTUAL_BDIGIT)
-# else
-# define RBIGNUM_EMBED_LEN_MAX ((1 << RBIGNUM_EMBED_LEN_NUMBITS)-1)
-# endif
-#endif
-struct RBignum {
- struct RBasic basic;
- union {
- struct {
- long len;
- BDIGIT *digits;
- } heap;
- BDIGIT ary[RBIGNUM_EMBED_LEN_MAX];
- } as;
-};
-#define RBIGNUM_SIGN_BIT FL_USER1
-/* sign: positive:1, negative:0 */
-#define RBIGNUM_SIGN(b) ((RBASIC(b)->flags & RBIGNUM_SIGN_BIT) != 0)
-#define RBIGNUM_SET_SIGN(b,sign) \
- ((sign) ? (RBASIC(b)->flags |= RBIGNUM_SIGN_BIT) \
- : (RBASIC(b)->flags &= ~RBIGNUM_SIGN_BIT))
-#define RBIGNUM_POSITIVE_P(b) RBIGNUM_SIGN(b)
-#define RBIGNUM_NEGATIVE_P(b) (!RBIGNUM_SIGN(b))
-
-#define RBIGNUM_EMBED_FLAG FL_USER2
-#define RBIGNUM_EMBED_LEN_MASK (FL_USER5|FL_USER4|FL_USER3)
-#define RBIGNUM_EMBED_LEN_SHIFT (FL_USHIFT+RBIGNUM_EMBED_LEN_NUMBITS)
-#define RBIGNUM_LEN(b) \
- ((RBASIC(b)->flags & RBIGNUM_EMBED_FLAG) ? \
- (long)((RBASIC(b)->flags >> RBIGNUM_EMBED_LEN_SHIFT) & \
- (RBIGNUM_EMBED_LEN_MASK >> RBIGNUM_EMBED_LEN_SHIFT)) : \
- RBIGNUM(b)->as.heap.len)
-/* LSB:RBIGNUM_DIGITS(b)[0], MSB:RBIGNUM_DIGITS(b)[RBIGNUM_LEN(b)-1] */
-#define RBIGNUM_DIGITS(b) \
- ((RBASIC(b)->flags & RBIGNUM_EMBED_FLAG) ? \
- RBIGNUM(b)->as.ary : \
- RBIGNUM(b)->as.heap.digits)
-#define RBIGNUM_LENINT(b) rb_long2int(RBIGNUM_LEN(b))
+#define RBIGNUM_SIGN(b) (FIX2LONG(rb_big_cmp((b), INT2FIX(0))) >= 0)
+#define RBIGNUM_POSITIVE_P(b) (FIX2LONG(rb_big_cmp((b), INT2FIX(0))) >= 0)
+#define RBIGNUM_NEGATIVE_P(b) (FIX2LONG(rb_big_cmp((b), INT2FIX(0))) < 0)
#define R_CAST(st) (struct st*)
#define RBASIC(obj) (R_CAST(RBasic)(obj))
#define ROBJECT(obj) (R_CAST(RObject)(obj))
#define RCLASS(obj) (R_CAST(RClass)(obj))
#define RMODULE(obj) RCLASS(obj)
-#define RFLOAT(obj) (R_CAST(RFloat)(obj))
#define RSTRING(obj) (R_CAST(RString)(obj))
#define RREGEXP(obj) (R_CAST(RRegexp)(obj))
#define RARRAY(obj) (R_CAST(RArray)(obj))
-#define RHASH(obj) (R_CAST(RHash)(obj))
#define RDATA(obj) (R_CAST(RData)(obj))
#define RTYPEDDATA(obj) (R_CAST(RTypedData)(obj))
#define RSTRUCT(obj) (R_CAST(RStruct)(obj))
-#define RBIGNUM(obj) (R_CAST(RBignum)(obj))
#define RFILE(obj) (R_CAST(RFile)(obj))
-#define RRATIONAL(obj) (R_CAST(RRational)(obj))
-#define RCOMPLEX(obj) (R_CAST(RComplex)(obj))
#define FL_SINGLETON FL_USER0
#define FL_WB_PROTECTED (((VALUE)1)<<5)
-#define FL_PROMOTED (((VALUE)1)<<6)
+#define FL_PROMOTED0 (((VALUE)1)<<5)
+#define FL_PROMOTED1 (((VALUE)1)<<6)
#define FL_FINALIZE (((VALUE)1)<<7)
#define FL_TAINT (((VALUE)1)<<8)
#define FL_UNTRUSTED FL_TAINT
@@ -1173,29 +1095,46 @@ struct RBignum {
#define FL_UNSET(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags &= ~(f);} while (0)
#define FL_REVERSE(x,f) do {if (FL_ABLE(x)) RBASIC(x)->flags ^= (f);} while (0)
+#define OBJ_TAINTABLE(x) (FL_ABLE(x) && BUILTIN_TYPE(x) != T_BIGNUM && BUILTIN_TYPE(x) != T_FLOAT)
#define OBJ_TAINTED(x) (!!FL_TEST((x), FL_TAINT))
-#define OBJ_TAINT(x) FL_SET((x), FL_TAINT)
+#define OBJ_TAINT(x) (OBJ_TAINTABLE(x) ? (RBASIC(x)->flags |= FL_TAINT) : 0)
#define OBJ_UNTRUSTED(x) OBJ_TAINTED(x)
#define OBJ_UNTRUST(x) OBJ_TAINT(x)
-#define OBJ_INFECT(x,s) do { \
- if (FL_ABLE(x) && FL_ABLE(s)) \
- RBASIC(x)->flags |= RBASIC(s)->flags & FL_TAINT; \
-} while (0)
+#define OBJ_INFECT(x,s) ( \
+ (OBJ_TAINTABLE(x) && FL_ABLE(s)) ? \
+ RBASIC(x)->flags |= RBASIC(s)->flags & FL_TAINT : 0)
-#define OBJ_FROZEN(x) (!!(FL_ABLE(x)?(RBASIC(x)->flags&(FL_FREEZE)):(FIXNUM_P(x)||FLONUM_P(x)||SYMBOL_P(x))))
-#define OBJ_FREEZE(x) FL_SET((x), FL_FREEZE)
+#define OBJ_FROZEN(x) (FL_ABLE(x) ? !!(RBASIC(x)->flags&FL_FREEZE) : 1)
+#define OBJ_FREEZE_RAW(x) (RBASIC(x)->flags |= FL_FREEZE)
+#define OBJ_FREEZE(x) rb_obj_freeze_inline((VALUE)x)
+
+static inline void
+rb_obj_freeze_inline(VALUE x)
+{
+ if (FL_ABLE(x)) {
+ VALUE klass = RBASIC_CLASS(x);
+ OBJ_FREEZE_RAW(x);
+ if (FL_TEST(klass, (FL_SINGLETON|FL_FREEZE)) == FL_SINGLETON) {
+ OBJ_FREEZE_RAW(klass);
+ }
+ }
+}
#if USE_RGENGC
-#define OBJ_PROMOTED(x) (SPECIAL_CONST_P(x) ? 0 : FL_TEST_RAW((x), FL_PROMOTED))
-#define OBJ_WB_PROTECTED(x) (SPECIAL_CONST_P(x) ? 1 : FL_TEST_RAW((x), FL_WB_PROTECTED))
+#define OBJ_PROMOTED_RAW(x) ((RBASIC(x)->flags & (FL_PROMOTED0|FL_PROMOTED1)) == (FL_PROMOTED0|FL_PROMOTED1))
+#define OBJ_PROMOTED(x) (SPECIAL_CONST_P(x) ? 0 : OBJ_PROMOTED_RAW(x))
#define OBJ_WB_UNPROTECT(x) rb_obj_wb_unprotect(x, __FILE__, __LINE__)
-void rb_gc_writebarrier(VALUE a, VALUE b);
-void rb_gc_writebarrier_unprotect_promoted(VALUE obj);
+#if USE_RINCGC
+int rb_gc_writebarrier_incremental(VALUE a, VALUE b);
+#else
+#define rb_gc_writebarrier_incremental(a, b) 0
+#endif
+void rb_gc_writebarrier_generational(VALUE a, VALUE b);
+void rb_gc_writebarrier_unprotect(VALUE obj);
#else /* USE_RGENGC */
#define OBJ_PROMOTED(x) 0
-#define OBJ_WB_PROTECTED(x) 0
#define OBJ_WB_UNPROTECT(x) rb_obj_wb_unprotect(x, __FILE__, __LINE__)
#endif
@@ -1205,7 +1144,7 @@ void rb_gc_writebarrier_unprotect_promoted(VALUE obj);
* - RB_OBJ_WRITTEN(a, oldv, b): WB for new reference from `a' to `b'.
* This doesn't write any values, but only a WB declaration.
* `oldv' is replaced value with `b' (not used in current Ruby).
- *
+ *
* NOTE: The following core interfaces can be changed in the future.
* Please catch up if you want to insert WB into C-extensions
* correctly.
@@ -1228,15 +1167,8 @@ rb_obj_wb_unprotect(VALUE x, RB_UNUSED_VAR(const char *filename), RB_UNUSED_VAR(
#ifdef RGENGC_LOGGING_WB_UNPROTECT
RGENGC_LOGGING_WB_UNPROTECT((void *)x, filename, line);
#endif
-
#if USE_RGENGC
- /* `x' should be an RVALUE object */
- if (FL_TEST_RAW((x), FL_WB_PROTECTED)) {
- if (FL_TEST_RAW((x), FL_PROMOTED)) {
- rb_gc_writebarrier_unprotect_promoted(x);
- }
- RBASIC(x)->flags &= ~FL_WB_PROTECTED;
- }
+ rb_gc_writebarrier_unprotect(x);
#endif
return x;
}
@@ -1249,9 +1181,12 @@ rb_obj_written(VALUE a, RB_UNUSED_VAR(VALUE oldv), VALUE b, RB_UNUSED_VAR(const
#endif
#if USE_RGENGC
- /* `a' should be an RVALUE object */
- if (FL_TEST_RAW((a), FL_PROMOTED) && !SPECIAL_CONST_P(b)) {
- rb_gc_writebarrier(a, b);
+ if (!SPECIAL_CONST_P(b)) {
+ if (rb_gc_writebarrier_incremental(a, b) == 0) {
+ if (OBJ_PROMOTED_RAW(a) && !OBJ_PROMOTED_RAW(b)) {
+ rb_gc_writebarrier_generational(a, b);
+ }
+ }
}
#endif
@@ -1332,6 +1267,8 @@ rb_num2char_inline(VALUE x)
#define ALLOC_N(type,n) ((type*)xmalloc2((n),sizeof(type)))
#define ALLOC(type) ((type*)xmalloc(sizeof(type)))
+#define ZALLOC_N(type,n) ((type*)xcalloc((n),sizeof(type)))
+#define ZALLOC(type) (ZALLOC_N(type,1))
#define REALLOC_N(var,type,n) ((var)=(type*)xrealloc2((char*)(var),(n),sizeof(type)))
#define ALLOCA_N(type,n) ((type*)alloca(sizeof(type)*(n)))
@@ -1392,7 +1329,7 @@ void rb_gvar_readonly_setter(VALUE val, ID id, void *data, struct rb_global_var
void rb_define_variable(const char*,VALUE*);
void rb_define_virtual_variable(const char*,VALUE(*)(ANYARGS),void(*)(ANYARGS));
void rb_define_hooked_variable(const char*,VALUE*,VALUE(*)(ANYARGS),void(*)(ANYARGS));
-void rb_define_readonly_variable(const char*,VALUE*);
+void rb_define_readonly_variable(const char*,const VALUE*);
void rb_define_const(VALUE,const char*,VALUE);
void rb_define_global_const(const char*,VALUE);
@@ -1417,6 +1354,9 @@ const char *rb_id2name(ID);
ID rb_check_id(volatile VALUE *);
ID rb_to_id(VALUE);
VALUE rb_id2str(ID);
+VALUE rb_sym2str(VALUE);
+VALUE rb_to_symbol(VALUE name);
+VALUE rb_check_symbol(volatile VALUE *namep);
#define CONST_ID_CACHE(result, str) \
{ \
@@ -1633,7 +1573,7 @@ rb_class_of(VALUE obj)
if (FIXNUM_P(obj)) return rb_cFixnum;
if (FLONUM_P(obj)) return rb_cFloat;
if (obj == Qtrue) return rb_cTrueClass;
- if (SYMBOL_P(obj)) return rb_cSymbol;
+ if (STATIC_SYM_P(obj)) return rb_cSymbol;
}
else if (!RTEST(obj)) {
if (obj == Qnil) return rb_cNilClass;
@@ -1649,7 +1589,7 @@ rb_type(VALUE obj)
if (FIXNUM_P(obj)) return T_FIXNUM;
if (FLONUM_P(obj)) return T_FLOAT;
if (obj == Qtrue) return T_TRUE;
- if (SYMBOL_P(obj)) return T_SYMBOL;
+ if (STATIC_SYM_P(obj)) return T_SYMBOL;
if (obj == Qundef) return T_UNDEF;
}
else if (!RTEST(obj)) {
@@ -1734,7 +1674,9 @@ int ruby_native_thread_p(void);
#define RUBY_INTERNAL_EVENT_GC_START 0x400000
#define RUBY_INTERNAL_EVENT_GC_END_MARK 0x800000
#define RUBY_INTERNAL_EVENT_GC_END_SWEEP 0x1000000
-#define RUBY_INTERNAL_EVENT_OBJSPACE_MASK 0x1f00000
+#define RUBY_INTERNAL_EVENT_GC_ENTER 0x2000000
+#define RUBY_INTERNAL_EVENT_GC_EXIT 0x4000000
+#define RUBY_INTERNAL_EVENT_OBJSPACE_MASK 0x7f00000
#define RUBY_INTERNAL_EVENT_MASK 0xfffe0000
typedef unsigned long rb_event_flag_t;
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 975da655bf..0ef499944a 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -115,6 +115,9 @@ int st_insert2(st_table *, st_data_t, st_data_t, st_data_t (*)(st_data_t));
int st_lookup(st_table *, st_data_t, st_data_t *);
int st_get_key(st_table *, st_data_t, st_data_t *);
typedef int st_update_callback_func(st_data_t *key, st_data_t *value, st_data_t arg, int existing);
+/* *key may be altered, but must equal to the old key, i.e., the
+ * results of hash() are same and compare() returns 0, otherwise the
+ * behavior is undefined */
int st_update(st_table *table, st_data_t key, st_update_callback_func *func, st_data_t arg);
int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t);
diff --git a/include/ruby/thread_native.h b/include/ruby/thread_native.h
new file mode 100644
index 0000000000..8e500c5a13
--- /dev/null
+++ b/include/ruby/thread_native.h
@@ -0,0 +1,56 @@
+/**********************************************************************
+
+ thread_native.h -
+
+ $Author: ko1 $
+ created at: Wed May 14 19:37:31 2014
+
+ Copyright (C) 2014 Yukihiro Matsumoto
+
+**********************************************************************/
+
+#ifndef RUBY_THREAD_NATIVE_H
+#define RUBY_THREAD_NATIVE_H 1
+
+/*
+ * This file contains wrapper APIs for native thread primitives
+ * which Ruby interpreter uses.
+ *
+ * Now, we only suppors pthread and Windows threads.
+ *
+ * If you want to use Ruby's Mutex and so on to synchronize Ruby Threads,
+ * please use Mutex directly.
+ */
+
+
+#if defined(_WIN32)
+#include <windows.h>
+typedef HANDLE rb_nativethread_id_t;
+
+typedef union rb_thread_lock_union {
+ HANDLE mutex;
+ CRITICAL_SECTION crit;
+} rb_nativethread_lock_t;
+
+#elif defined(HAVE_PTHREAD_H)
+#include <pthread.h>
+typedef pthread_t rb_nativethread_id_t;
+typedef pthread_mutex_t rb_nativethread_lock_t;
+
+#else
+#error "unsupported thread type"
+
+#endif
+
+RUBY_SYMBOL_EXPORT_BEGIN
+
+rb_nativethread_id_t rb_nativethread_self();
+
+void rb_nativethread_lock_initialize(rb_nativethread_lock_t *lock);
+void rb_nativethread_lock_destroy(rb_nativethread_lock_t *lock);
+void rb_nativethread_lock_lock(rb_nativethread_lock_t *lock);
+void rb_nativethread_lock_unlock(rb_nativethread_lock_t *lock);
+
+RUBY_SYMBOL_EXPORT_END
+
+#endif
diff --git a/include/ruby/util.h b/include/ruby/util.h
index 5be5f2e0b4..74cdd0ffd1 100644
--- a/include/ruby/util.h
+++ b/include/ruby/util.h
@@ -47,13 +47,20 @@ extern "C" {
RUBY_SYMBOL_EXPORT_BEGIN
+#define DECIMAL_SIZE_OF_BITS(n) (((n) * 3010 + 9998) / 9999)
+/* an approximation of ceil(n * log10(2)), upto 65536 at least */
+
#define scan_oct(s,l,e) ((int)ruby_scan_oct((s),(l),(e)))
unsigned long ruby_scan_oct(const char *, size_t, size_t *);
#define scan_hex(s,l,e) ((int)ruby_scan_hex((s),(l),(e)))
unsigned long ruby_scan_hex(const char *, size_t, size_t *);
+#ifdef HAVE_GNU_QSORT_R
+# define ruby_qsort qsort_r
+#else
void ruby_qsort(void *, const size_t, const size_t,
int (*)(const void *, const void *, void *), void *);
+#endif
void ruby_setenv(const char *, const char *);
void ruby_unsetenv(const char *);
diff --git a/include/ruby/version.h b/include/ruby/version.h
index 4ffcc7a9ad..1e3ff2e6a3 100644
--- a/include/ruby/version.h
+++ b/include/ruby/version.h
@@ -31,7 +31,7 @@
/* API version */
#define RUBY_API_VERSION_MAJOR 2
-#define RUBY_API_VERSION_MINOR 1
+#define RUBY_API_VERSION_MINOR 2
#define RUBY_API_VERSION_TEENY 0
#define RUBY_API_VERSION_CODE (RUBY_API_VERSION_MAJOR*10000+RUBY_API_VERSION_MINOR*100+RUBY_API_VERSION_TEENY)
diff --git a/include/ruby/win32.h b/include/ruby/win32.h
index 64fbdf2744..a6996bc95a 100644
--- a/include/ruby/win32.h
+++ b/include/ruby/win32.h
@@ -263,7 +263,6 @@ struct ifaddrs {
#endif
extern DWORD rb_w32_osid(void);
-extern int rb_w32_cmdvector(const char *, char ***);
extern rb_pid_t rb_w32_pipe_exec(const char *, const char *, int, int *, int *);
extern int flock(int fd, int oper);
extern int rb_w32_io_cancelable_p(int);
@@ -464,6 +463,11 @@ extern int rb_w32_truncate(const char *path, off_t length);
#define truncate rb_w32_truncate
#endif
+#if defined(_MSC_VER) && _MSC_VER >= 1400 && _MSC_VER < 1800
+#define strtoll _strtoi64
+#define strtoull _strtoui64
+#endif
+
/*
* stubs
*/
@@ -783,7 +787,7 @@ char *rb_w32_wstr_to_mbstr(UINT, const WCHAR *, int, long *);
== ***CAUTION***
Since this function is very dangerous, ((*NEVER*))
* lock any HANDLEs(i.e. Mutex, Semaphore, CriticalSection and so on) or,
-* use anything like TRAP_BEG...TRAP_END block structure,
+* use anything like rb_thread_call_without_gvl,
in asynchronous_func_t.
*/
typedef uintptr_t (*asynchronous_func_t)(uintptr_t self, int argc, uintptr_t* argv);
diff --git a/inits.c b/inits.c
index fe0aade090..da8cfb1ed9 100644
--- a/inits.c
+++ b/inits.c
@@ -46,7 +46,6 @@ rb_call_inits(void)
CALL(Time);
CALL(Random);
CALL(signal);
- CALL(process);
CALL(load);
CALL(Proc);
CALL(Binding);
@@ -56,6 +55,7 @@ rb_call_inits(void)
CALL(VM);
CALL(ISeq);
CALL(Thread);
+ CALL(process);
CALL(Cont);
CALL(Rational);
CALL(Complex);
diff --git a/insns.def b/insns.def
index ad4bba6912..bfa11a9b8d 100644
--- a/insns.def
+++ b/insns.def
@@ -875,7 +875,7 @@ trace
/**
@c class/module
@e
- enter class definition scope. if super is Qfalse, and clsas
+ enter class definition scope. if super is Qfalse, and class
"klass" is defined, it's redefine. otherwise, define "klass" class.
@j クラス定義スコープã¸ç§»è¡Œã™ã‚‹ã€‚
ã‚‚ã— super ㌠Qfalse ã§ klassクラスãŒå®šç¾©ã•れã¦ã„れã°å†å®šç¾©ã§ã‚る。
@@ -1239,28 +1239,27 @@ once
{
union iseq_inline_storage_entry *is = (union iseq_inline_storage_entry *)ic;
+#define RUNNING_THREAD_ONCE_DONE ((rb_thread_t *)(0x1))
retry:
- if (is->once.done == Qfalse) {
- if (is->once.running_thread == NULL) {
- is->once.running_thread = th;
- val = is->once.value = rb_ensure(vm_once_exec, (VALUE)iseq, vm_once_clear, (VALUE)is);
- /* is->once.running_thread is cleared by vm_once_clear() */
- is->once.done = Qtrue;
- rb_iseq_add_mark_object(GET_ISEQ(), val);
- }
- else if (is->once.running_thread == th) {
- /* recursive once */
- val = vm_once_exec(iseq);
- }
- else {
- /* waiting for finish */
- RUBY_VM_CHECK_INTS(th);
- rb_thread_schedule();
- goto retry;
- }
+ if (is->once.running_thread == RUNNING_THREAD_ONCE_DONE) {
+ val = is->once.value;
+ }
+ else if (is->once.running_thread == NULL) {
+ is->once.running_thread = th;
+ val = is->once.value = rb_ensure(vm_once_exec, (VALUE)iseq, vm_once_clear, (VALUE)is);
+ /* is->once.running_thread is cleared by vm_once_clear() */
+ is->once.running_thread = RUNNING_THREAD_ONCE_DONE; /* success */
+ rb_iseq_add_mark_object(GET_ISEQ(), val);
+ }
+ else if (is->once.running_thread == th) {
+ /* recursive once */
+ val = vm_once_exec((VALUE)iseq);
}
else {
- val = is->once.value;
+ /* waiting for finish */
+ RUBY_VM_CHECK_INTS(th);
+ rb_thread_schedule();
+ goto retry;
}
}
@@ -1550,7 +1549,8 @@ opt_mod
y = FIX2LONG(obj);
if (x > 0 && y > 0) {
val = LONG2FIX(x % y);
- } else {
+ }
+ else {
/* copied from numeric.c#fixdivmod */
long div, mod;
@@ -1903,6 +1903,49 @@ opt_aset
/**
@c optimize
+ @e recv[str] = set
+ @j 最é©åŒ–ã•れ㟠recv[str] = set。
+ */
+DEFINE_INSN
+opt_aset_with
+(CALL_INFO ci, VALUE key)
+(VALUE recv, VALUE val)
+(VALUE val)
+{
+ if (!SPECIAL_CONST_P(recv) && RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_ASET, HASH_REDEFINED_OP_FLAG)) {
+ rb_hash_aset(recv, key, val);
+ }
+ else {
+ PUSH(recv);
+ PUSH(rb_str_resurrect(key));
+ PUSH(val);
+ CALL_SIMPLE_METHOD(recv);
+ }
+}
+
+/**
+ @c optimize
+ @e recv[str]
+ @j 最é©åŒ–ã•れ㟠recv[str]。
+ */
+DEFINE_INSN
+opt_aref_with
+(CALL_INFO ci, VALUE key)
+(VALUE recv)
+(VALUE val)
+{
+ if (!SPECIAL_CONST_P(recv) && RBASIC_CLASS(recv) == rb_cHash && BASIC_OP_UNREDEFINED_P(BOP_AREF, HASH_REDEFINED_OP_FLAG)) {
+ val = rb_hash_aref(recv, key);
+ }
+ else {
+ PUSH(recv);
+ PUSH(rb_str_resurrect(key));
+ CALL_SIMPLE_METHOD(recv);
+ }
+}
+
+/**
+ @c optimize
@e optimized length
@j 最é©åŒ–ã•れ㟠recv.length()。
*/
@@ -2093,7 +2136,8 @@ opt_regexpmatch1
{
if (BASIC_OP_UNREDEFINED_P(BOP_MATCH, REGEXP_REDEFINED_OP_FLAG)) {
val = rb_reg_match(r, obj);
- } else {
+ }
+ else {
val = rb_funcall(r, idEqTilde, 1, obj);
}
}
@@ -2109,7 +2153,7 @@ opt_regexpmatch2
(VALUE obj2, VALUE obj1)
(VALUE val)
{
- if (RB_TYPE_P(obj2, T_STRING) &&
+ if (CLASS_OF(obj2) == rb_cString &&
BASIC_OP_UNREDEFINED_P(BOP_MATCH, STRING_REDEFINED_OP_FLAG)) {
val = rb_reg_match(obj1, obj2);
}
diff --git a/internal.h b/internal.h
index 1f41d23b1b..1a9be71c31 100644
--- a/internal.h
+++ b/internal.h
@@ -19,6 +19,35 @@ extern "C" {
#endif
#endif
+/* likely */
+#if __GNUC__ >= 3
+#define LIKELY(x) (__builtin_expect((x), 1))
+#define UNLIKELY(x) (__builtin_expect((x), 0))
+#else /* __GNUC__ >= 3 */
+#define LIKELY(x) (x)
+#define UNLIKELY(x) (x)
+#endif /* __GNUC__ >= 3 */
+
+#ifndef __has_attribute
+# define __has_attribute(x) 0
+#endif
+
+#if __has_attribute(unused)
+#define UNINITIALIZED_VAR(x) x __attribute__((unused))
+#elif defined(__GNUC__) && __GNUC__ >= 3
+#define UNINITIALIZED_VAR(x) x = x
+#else
+#define UNINITIALIZED_VAR(x) x
+#endif
+
+#if __has_attribute(warn_unused_result)
+#define WARN_UNUSED_RESULT(x) x __attribute__((warn_unused_result))
+#elif defined(__GNUC__) && (__GNUC__ * 1000 + __GNUC_MINOR__) >= 3004
+#define WARN_UNUSED_RESULT(x) x __attribute__((warn_unused_result))
+#else
+#define WARN_UNUSED_RESULT(x) x
+#endif
+
#ifdef HAVE_VALGRIND_MEMCHECK_H
# include <valgrind/memcheck.h>
# ifndef VALGRIND_MAKE_MEM_DEFINED
@@ -284,6 +313,159 @@ struct method_table_wrapper {
size_t serial;
};
+#ifndef BDIGIT
+# if SIZEOF_INT*2 <= SIZEOF_LONG_LONG
+# define BDIGIT unsigned int
+# define SIZEOF_BDIGIT SIZEOF_INT
+# define BDIGIT_DBL unsigned LONG_LONG
+# define BDIGIT_DBL_SIGNED LONG_LONG
+# define PRI_BDIGIT_PREFIX ""
+# define PRI_BDIGIT_DBL_PREFIX PRI_LL_PREFIX
+# elif SIZEOF_INT*2 <= SIZEOF_LONG
+# define BDIGIT unsigned int
+# define SIZEOF_BDIGIT SIZEOF_INT
+# define BDIGIT_DBL unsigned long
+# define BDIGIT_DBL_SIGNED long
+# define PRI_BDIGIT_PREFIX ""
+# define PRI_BDIGIT_DBL_PREFIX "l"
+# elif SIZEOF_SHORT*2 <= SIZEOF_LONG
+# define BDIGIT unsigned short
+# define SIZEOF_BDIGIT SIZEOF_SHORT
+# define BDIGIT_DBL unsigned long
+# define BDIGIT_DBL_SIGNED long
+# define PRI_BDIGIT_PREFIX "h"
+# define PRI_BDIGIT_DBL_PREFIX "l"
+# else
+# define BDIGIT unsigned short
+# define SIZEOF_BDIGIT (SIZEOF_LONG/2)
+# define SIZEOF_ACTUAL_BDIGIT SIZEOF_LONG
+# define BDIGIT_DBL unsigned long
+# define BDIGIT_DBL_SIGNED long
+# define PRI_BDIGIT_PREFIX "h"
+# define PRI_BDIGIT_DBL_PREFIX "l"
+# endif
+#endif
+#ifndef SIZEOF_ACTUAL_BDIGIT
+# define SIZEOF_ACTUAL_BDIGIT SIZEOF_BDIGIT
+#endif
+
+#ifdef PRI_BDIGIT_PREFIX
+# define PRIdBDIGIT PRI_BDIGIT_PREFIX"d"
+# define PRIiBDIGIT PRI_BDIGIT_PREFIX"i"
+# define PRIoBDIGIT PRI_BDIGIT_PREFIX"o"
+# define PRIuBDIGIT PRI_BDIGIT_PREFIX"u"
+# define PRIxBDIGIT PRI_BDIGIT_PREFIX"x"
+# define PRIXBDIGIT PRI_BDIGIT_PREFIX"X"
+#endif
+
+#ifdef PRI_BDIGIT_DBL_PREFIX
+# define PRIdBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"d"
+# define PRIiBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"i"
+# define PRIoBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"o"
+# define PRIuBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"u"
+# define PRIxBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"x"
+# define PRIXBDIGIT_DBL PRI_BDIGIT_DBL_PREFIX"X"
+#endif
+
+#define BIGNUM_EMBED_LEN_NUMBITS 3
+#ifndef BIGNUM_EMBED_LEN_MAX
+# if (SIZEOF_VALUE*3/SIZEOF_ACTUAL_BDIGIT) < (1 << BIGNUM_EMBED_LEN_NUMBITS)-1
+# define BIGNUM_EMBED_LEN_MAX (SIZEOF_VALUE*3/SIZEOF_ACTUAL_BDIGIT)
+# else
+# define BIGNUM_EMBED_LEN_MAX ((1 << BIGNUM_EMBED_LEN_NUMBITS)-1)
+# endif
+#endif
+
+struct RBignum {
+ struct RBasic basic;
+ union {
+ struct {
+ size_t len;
+ BDIGIT *digits;
+ } heap;
+ BDIGIT ary[BIGNUM_EMBED_LEN_MAX];
+ } as;
+};
+#define BIGNUM_SIGN_BIT FL_USER1
+/* sign: positive:1, negative:0 */
+#define BIGNUM_SIGN(b) ((RBASIC(b)->flags & BIGNUM_SIGN_BIT) != 0)
+#define BIGNUM_SET_SIGN(b,sign) \
+ ((sign) ? (RBASIC(b)->flags |= BIGNUM_SIGN_BIT) \
+ : (RBASIC(b)->flags &= ~BIGNUM_SIGN_BIT))
+#define BIGNUM_POSITIVE_P(b) BIGNUM_SIGN(b)
+#define BIGNUM_NEGATIVE_P(b) (!BIGNUM_SIGN(b))
+
+#define BIGNUM_EMBED_FLAG FL_USER2
+#define BIGNUM_EMBED_LEN_MASK (FL_USER5|FL_USER4|FL_USER3)
+#define BIGNUM_EMBED_LEN_SHIFT (FL_USHIFT+BIGNUM_EMBED_LEN_NUMBITS)
+#define BIGNUM_LEN(b) \
+ ((RBASIC(b)->flags & BIGNUM_EMBED_FLAG) ? \
+ (long)((RBASIC(b)->flags >> BIGNUM_EMBED_LEN_SHIFT) & \
+ (BIGNUM_EMBED_LEN_MASK >> BIGNUM_EMBED_LEN_SHIFT)) : \
+ RBIGNUM(b)->as.heap.len)
+/* LSB:BIGNUM_DIGITS(b)[0], MSB:BIGNUM_DIGITS(b)[BIGNUM_LEN(b)-1] */
+#define BIGNUM_DIGITS(b) \
+ ((RBASIC(b)->flags & BIGNUM_EMBED_FLAG) ? \
+ RBIGNUM(b)->as.ary : \
+ RBIGNUM(b)->as.heap.digits)
+#define BIGNUM_LENINT(b) rb_long2int(BIGNUM_LEN(b))
+
+#define RBIGNUM(obj) (R_CAST(RBignum)(obj))
+
+struct RRational {
+ struct RBasic basic;
+ const VALUE num;
+ const VALUE den;
+};
+
+#define RRATIONAL(obj) (R_CAST(RRational)(obj))
+
+struct RSymbol {
+ struct RBasic basic;
+ VALUE fstr;
+ ID type;
+};
+
+struct RFloat {
+ struct RBasic basic;
+ double float_value;
+};
+
+#define RFLOAT(obj) (R_CAST(RFloat)(obj))
+
+struct RComplex {
+ struct RBasic basic;
+ const VALUE real;
+ const VALUE imag;
+};
+
+#define RCOMPLEX(obj) (R_CAST(RComplex)(obj))
+
+#ifdef RCOMPLEX_SET_REAL /* shortcut macro for internal only */
+#undef RCOMPLEX_SET_REAL
+#undef RCOMPLEX_SET_REAL
+#define RCOMPLEX_SET_REAL(cmp, r) RB_OBJ_WRITE((cmp), &((struct RComplex *)(cmp))->real,(r))
+#define RCOMPLEX_SET_IMAG(cmp, i) RB_OBJ_WRITE((cmp), &((struct RComplex *)(cmp))->imag,(i))
+#endif
+
+struct RHash {
+ struct RBasic basic;
+ struct st_table *ntbl; /* possibly 0 */
+ int iter_lev;
+ const VALUE ifnone;
+};
+
+#define RHASH(obj) (R_CAST(RHash)(obj))
+
+#ifdef RHASH_ITER_LEV
+#undef RHASH_ITER_LEV
+#undef RHASH_IFNONE
+#undef RHASH_SIZE
+#define RHASH_ITER_LEV(h) (RHASH(h)->iter_lev)
+#define RHASH_IFNONE(h) (RHASH(h)->ifnone)
+#define RHASH_SIZE(h) (RHASH(h)->ntbl ? (st_index_t)RHASH(h)->ntbl->num_entries : 0)
+#endif
+
/* class.c */
void rb_class_subclass_add(VALUE super, VALUE klass);
void rb_class_remove_from_super_subclasses(VALUE);
@@ -329,9 +511,10 @@ RCLASS_SET_SUPER(VALUE klass, VALUE super)
struct vtm; /* defined by timev.h */
/* array.c */
-VALUE rb_ary_last(int, VALUE *, VALUE);
+VALUE rb_ary_last(int, const VALUE *, VALUE);
void rb_ary_set_len(VALUE, long);
void rb_ary_delete_same(VALUE, VALUE);
+VALUE rb_ary_tmp_new_fill(long capa);
/* bignum.c */
VALUE rb_big_fdiv(VALUE x, VALUE y);
@@ -344,10 +527,10 @@ void rb_class_foreach_subclass(VALUE klass, void(*f)(VALUE));
void rb_class_detach_subclasses(VALUE);
void rb_class_detach_module_subclasses(VALUE);
void rb_class_remove_from_module_subclasses(VALUE);
-VALUE rb_obj_methods(int argc, VALUE *argv, VALUE obj);
-VALUE rb_obj_protected_methods(int argc, VALUE *argv, VALUE obj);
-VALUE rb_obj_private_methods(int argc, VALUE *argv, VALUE obj);
-VALUE rb_obj_public_methods(int argc, VALUE *argv, VALUE obj);
+VALUE rb_obj_methods(int argc, const VALUE *argv, VALUE obj);
+VALUE rb_obj_protected_methods(int argc, const VALUE *argv, VALUE obj);
+VALUE rb_obj_private_methods(int argc, const VALUE *argv, VALUE obj);
+VALUE rb_obj_public_methods(int argc, const VALUE *argv, VALUE obj);
int rb_obj_basic_to_s_p(VALUE);
VALUE rb_special_singleton_class(VALUE);
VALUE rb_singleton_class_clone_and_attach(VALUE obj, VALUE attach);
@@ -456,7 +639,11 @@ void Init_heap(void);
void *ruby_mimmalloc(size_t size);
void ruby_mimfree(void *ptr);
void rb_objspace_set_event_hook(const rb_event_flag_t event);
-void rb_gc_writebarrier_remember_promoted(VALUE obj);
+#if USE_RGENGC
+void rb_gc_writebarrier_remember(VALUE obj);
+#else
+#define rb_gc_writebarrier_remember(obj) 0
+#endif
void ruby_gc_set_params(int safe_level);
#if defined(HAVE_MALLOC_USABLE_SIZE) || defined(HAVE_MALLOC_SIZE) || defined(_WIN32)
@@ -513,10 +700,12 @@ VALUE rb_math_cos(VALUE);
VALUE rb_math_cosh(VALUE);
VALUE rb_math_exp(VALUE);
VALUE rb_math_hypot(VALUE, VALUE);
-VALUE rb_math_log(int argc, VALUE *argv);
+VALUE rb_math_log(int argc, const VALUE *argv);
VALUE rb_math_sin(VALUE);
VALUE rb_math_sinh(VALUE);
+#if 0
VALUE rb_math_sqrt(VALUE);
+#endif
/* newline.c */
void Init_newline(void);
@@ -612,6 +801,9 @@ struct RBasicRaw {
} while (0)
/* parse.y */
+#ifndef USE_SYMBOL_GC
+#define USE_SYMBOL_GC 1
+#endif
VALUE rb_parser_get_yydebug(VALUE);
VALUE rb_parser_set_yydebug(VALUE, VALUE);
int rb_is_const_name(VALUE name);
@@ -622,13 +814,16 @@ int rb_is_attrset_name(VALUE name);
int rb_is_local_name(VALUE name);
int rb_is_method_name(VALUE name);
int rb_is_junk_name(VALUE name);
-void rb_gc_mark_parser(void);
-void rb_gc_mark_symbols(int full_mark);
+ID rb_make_internal_id(void);
+void rb_gc_free_dsymbol(VALUE);
+VALUE rb_str_dynamic_intern(VALUE);
+ID rb_id_attrget(ID id);
/* proc.c */
VALUE rb_proc_location(VALUE self);
st_index_t rb_hash_proc(st_index_t hash, VALUE proc);
int rb_block_arity(void);
+VALUE rb_block_clear_env_self(VALUE proc);
/* process.c */
#define RB_MAX_GROUPS (65536)
@@ -692,6 +887,8 @@ VALUE rb_rational_reciprocal(VALUE x);
/* re.c */
VALUE rb_reg_compile(VALUE str, int options, const char *sourcefile, int sourceline);
VALUE rb_reg_check_preprocess(VALUE);
+long rb_reg_search0(VALUE, VALUE, long, int, int);
+void rb_backref_set_string(VALUE string, long pos, long len);
/* signal.c */
int rb_get_next_signal(void);
@@ -706,7 +903,9 @@ size_t rb_strftime(char *s, size_t maxsize, const char *format, rb_encoding *enc
#endif
/* string.c */
+void Init_frozen_strings(void);
VALUE rb_fstring(VALUE);
+VALUE rb_fstring_new(const char *ptr, long len);
int rb_str_buf_cat_escaped_char(VALUE result, unsigned int c, int unicode_p);
int rb_str_symname_p(VALUE);
VALUE rb_str_quote_unprintable(VALUE);
@@ -718,14 +917,10 @@ VALUE rb_str_locktmp_ensure(VALUE str, VALUE (*func)(VALUE), VALUE arg);
#ifdef RUBY_ENCODING_H
VALUE rb_external_str_with_enc(VALUE str, rb_encoding *eenc);
#endif
-#define STR_NOEMBED FL_USER1
-#define STR_SHARED FL_USER2 /* = ELTS_SHARED */
-#define STR_ASSOC FL_USER3
-#define STR_SHARED_P(s) FL_ALL((s), STR_NOEMBED|ELTS_SHARED)
-#define STR_ASSOC_P(s) FL_ALL((s), STR_NOEMBED|STR_ASSOC)
-#define STR_NOCAPA (STR_NOEMBED|ELTS_SHARED|STR_ASSOC)
-#define STR_NOCAPA_P(s) (FL_TEST((s),STR_NOEMBED) && FL_ANY((s),ELTS_SHARED|STR_ASSOC))
+#define STR_NOEMBED FL_USER1
+#define STR_SHARED FL_USER2 /* = ELTS_SHARED */
#define STR_EMBED_P(str) (!FL_TEST((str), STR_NOEMBED))
+#define STR_SHARED_P(s) FL_ALL((s), STR_NOEMBED|ELTS_SHARED)
#define is_ascii_string(str) (rb_enc_str_coderange(str) == ENC_CODERANGE_7BIT)
#define is_broken_string(str) (rb_enc_str_coderange(str) == ENC_CODERANGE_BROKEN)
@@ -760,6 +955,7 @@ rb_serial_t rb_next_class_serial(void);
VALUE rb_obj_is_thread(VALUE obj);
void rb_vm_mark(void *ptr);
void Init_BareVM(void);
+void Init_vm_objects(void);
VALUE rb_vm_top_self(void);
void rb_thread_recycle_stack_release(VALUE *);
void rb_vm_change_state(void);
@@ -770,7 +966,6 @@ VALUE rb_sourcefilename(void);
void rb_vm_pop_cfunc_frame(void);
/* vm_dump.c */
-void rb_vm_bugreport(void);
void rb_print_backtrace(void);
/* vm_eval.c */
@@ -796,8 +991,8 @@ void Init_prelude(void);
/* vm_backtrace.c */
void Init_vm_backtrace(void);
-VALUE rb_vm_thread_backtrace(int argc, VALUE *argv, VALUE thval);
-VALUE rb_vm_thread_backtrace_locations(int argc, VALUE *argv, VALUE thval);
+VALUE rb_vm_thread_backtrace(int argc, const VALUE *argv, VALUE thval);
+VALUE rb_vm_thread_backtrace_locations(int argc, const VALUE *argv, VALUE thval);
VALUE rb_make_backtrace(void);
void rb_backtrace_print_as_bugreport(void);
@@ -849,9 +1044,9 @@ VALUE rb_int_positive_pow(long x, unsigned long y);
/* process.c */
int rb_exec_async_signal_safe(const struct rb_execarg *e, char *errmsg, size_t errmsg_buflen);
rb_pid_t rb_fork_async_signal_safe(int *status, int (*chfunc)(void*, char *, size_t), void *charg, VALUE fds, char *errmsg, size_t errmsg_buflen);
-VALUE rb_execarg_new(int argc, VALUE *argv, int accept_shell);
+VALUE rb_execarg_new(int argc, const VALUE *argv, int accept_shell);
struct rb_execarg *rb_execarg_get(VALUE execarg_obj); /* dangerous. needs GC guard. */
-VALUE rb_execarg_init(int argc, VALUE *argv, int accept_shell, VALUE execarg_obj);
+VALUE rb_execarg_init(int argc, const VALUE *argv, int accept_shell, VALUE execarg_obj);
int rb_execarg_addopt(VALUE execarg_obj, VALUE key, VALUE val);
void rb_execarg_fixup(VALUE execarg_obj);
int rb_execarg_run_options(const struct rb_execarg *e, struct rb_execarg *s, char* errmsg, size_t errmsg_buflen);
@@ -864,6 +1059,12 @@ VALUE rb_gcd_normal(VALUE self, VALUE other);
VALUE rb_gcd_gmp(VALUE x, VALUE y);
#endif
+/* string.c */
+#ifdef RUBY_ENCODING_H
+/* internal use */
+VALUE rb_setup_fake_str(struct RString *fake_str, const char *name, long len, rb_encoding *enc);
+#endif
+
/* util.c */
extern const signed char ruby_digit36_to_number_table[];
@@ -879,6 +1080,7 @@ st_table *rb_st_copy(VALUE obj, struct st_table *orig_tbl);
size_t rb_obj_memsize_of(VALUE);
#define RB_OBJ_GC_FLAGS_MAX 5
size_t rb_obj_gc_flags(VALUE, ID[], size_t);
+void rb_gc_mark_values(long n, const VALUE *values);
RUBY_SYMBOL_EXPORT_END
diff --git a/io.c b/io.c
index 95229903ca..5909a0be50 100644
--- a/io.c
+++ b/io.c
@@ -21,6 +21,7 @@
#include <errno.h>
#include "ruby_atomic.h"
+#undef free
#define free(x) xfree(x)
#if defined(DOSISH) || defined(__CYGWIN__)
@@ -64,6 +65,13 @@
#if !HAVE_OFF_T && !defined(off_t)
# define off_t long
#endif
+#if SIZEOF_OFF_T > SIZEOF_LONG && defined(HAVE_LONG_LONG)
+# define PRI_OFF_T_PREFIX "ll"
+#elif SIZEOF_OFF_T == SIZEOF_LONG
+# define PRI_OFF_T_PREFIX "l"
+#else
+# define PRI_OFF_T_PREFIX ""
+#endif
#include <sys/stat.h>
@@ -86,6 +94,10 @@
#include <sys/syscall.h>
#endif
+#ifdef HAVE_SYS_UIO_H
+#include <sys/uio.h>
+#endif
+
#if defined(__BEOS__) || defined(__HAIKU__)
# ifndef NOFILE
# define NOFILE (OPEN_MAX)
@@ -185,6 +197,9 @@ rb_update_max_fd(int fd)
struct stat buf;
rb_atomic_t afd = (rb_atomic_t)fd;
+ if (afd <= max_file_descriptor)
+ return;
+
if (fstat(fd, &buf) != 0 && errno == EBADF) {
rb_bug("rb_update_max_fd: invalid fd (%d) given.", fd);
}
@@ -224,10 +239,29 @@ rb_fd_fix_cloexec(int fd)
rb_update_max_fd(fd);
}
+/* this is only called once */
+static int
+rb_fix_detect_o_cloexec(int fd)
+{
+#ifdef O_CLOEXEC
+ int flags = fcntl(fd, F_GETFD);
+
+ if (flags == -1)
+ rb_bug("rb_fix_detect_o_cloexec: fcntl(%d, F_GETFD) failed: %s", fd, strerror(errno));
+
+ if (flags & FD_CLOEXEC)
+ return 1;
+#endif /* fall through if O_CLOEXEC does not work: */
+ rb_maygvl_fd_fix_cloexec(fd);
+ return 0;
+}
+
int
rb_cloexec_open(const char *pathname, int flags, mode_t mode)
{
int ret;
+ static int o_cloexec_state = -1; /* <0: unknown, 0: ignored, >0: working */
+
#ifdef O_CLOEXEC
/* O_CLOEXEC is available since Linux 2.6.23. Linux 2.6.18 silently ignore it. */
flags |= O_CLOEXEC;
@@ -236,7 +270,15 @@ rb_cloexec_open(const char *pathname, int flags, mode_t mode)
#endif
ret = open(pathname, flags, mode);
if (ret == -1) return -1;
- rb_maygvl_fd_fix_cloexec(ret);
+ if (ret <= 2 || o_cloexec_state == 0) {
+ rb_maygvl_fd_fix_cloexec(ret);
+ }
+ else if (o_cloexec_state > 0) {
+ return ret;
+ }
+ else {
+ o_cloexec_state = rb_fix_detect_o_cloexec(ret);
+ }
return ret;
}
@@ -365,22 +407,6 @@ rb_cloexec_fcntl_dupfd(int fd, int minfd)
#define argf_of(obj) (*(struct argf *)DATA_PTR(obj))
#define ARGF argf_of(argf)
-#ifdef _STDIO_USES_IOSTREAM /* GNU libc */
-# ifdef _IO_fpos_t
-# define STDIO_READ_DATA_PENDING(fp) ((fp)->_IO_read_ptr != (fp)->_IO_read_end)
-# else
-# define STDIO_READ_DATA_PENDING(fp) ((fp)->_gptr < (fp)->_egptr)
-# endif
-#elif defined(FILE_COUNT)
-# define STDIO_READ_DATA_PENDING(fp) ((fp)->FILE_COUNT > 0)
-#elif defined(FILE_READEND)
-# define STDIO_READ_DATA_PENDING(fp) ((fp)->FILE_READPTR < (fp)->FILE_READEND)
-#elif defined(__BEOS__) || defined(__HAIKU__)
-# define STDIO_READ_DATA_PENDING(fp) ((fp)->_state._eof == 0)
-#else
-# define STDIO_READ_DATA_PENDING(fp) (!feof(fp))
-#endif
-
#define GetWriteIO(io) rb_io_get_write_io(io)
#define READ_DATA_PENDING(fptr) ((fptr)->rbuf.len)
@@ -836,14 +862,6 @@ rb_io_read_pending(rb_io_t *fptr)
}
void
-rb_read_check(FILE *fp)
-{
- if (!STDIO_READ_DATA_PENDING(fp)) {
- rb_thread_wait_fd(fileno(fp));
- }
-}
-
-void
rb_io_read_check(rb_io_t *fptr)
{
if (!READ_DATA_PENDING(fptr)) {
@@ -920,6 +938,14 @@ struct io_internal_write_struct {
size_t capa;
};
+#ifdef HAVE_WRITEV
+struct io_internal_writev_struct {
+ int fd;
+ int iovcnt;
+ const struct iovec *iov;
+};
+#endif
+
static VALUE
internal_read_func(void *ptr)
{
@@ -941,6 +967,15 @@ internal_write_func2(void *ptr)
return (void*)(intptr_t)write(iis->fd, iis->buf, iis->capa);
}
+#ifdef HAVE_WRITEV
+static VALUE
+internal_writev_func(void *ptr)
+{
+ struct io_internal_writev_struct *iis = ptr;
+ return writev(iis->fd, iis->iov, iis->iovcnt);
+}
+#endif
+
static ssize_t
rb_read_internal(int fd, void *buf, size_t count)
{
@@ -975,6 +1010,19 @@ rb_write_internal2(int fd, const void *buf, size_t count)
RUBY_UBF_IO, NULL);
}
+#ifdef HAVE_WRITEV
+static ssize_t
+rb_writev_internal(int fd, const struct iovec *iov, int iovcnt)
+{
+ struct io_internal_writev_struct iis;
+ iis.fd = fd;
+ iis.iov = iov;
+ iis.iovcnt = iovcnt;
+
+ return (ssize_t)rb_thread_io_blocking_region(internal_writev_func, &iis, fd);
+}
+#endif
+
static long
io_writable_length(rb_io_t *fptr, long l)
{
@@ -1038,10 +1086,11 @@ io_flush_buffer_async2(VALUE arg)
/* pending async interrupt is there. */
errno = EAGAIN;
return -1;
- } else if (ret == 1) {
+ }
+ else if (ret == 1) {
return 0;
- } else
- return ret;
+ }
+ return ret;
}
static inline int
@@ -1203,13 +1252,75 @@ struct write_arg {
int nosync;
};
+#ifdef HAVE_WRITEV
static VALUE
io_binwrite_string(VALUE arg)
{
struct binwrite_arg *p = (struct binwrite_arg *)arg;
- long l = io_writable_length(p->fptr, p->length);
- return rb_write_internal2(p->fptr->fd, p->ptr, l);
+ rb_io_t *fptr = p->fptr;
+ long r;
+
+ if (fptr->wbuf.len) {
+ struct iovec iov[2];
+
+ iov[0].iov_base = fptr->wbuf.ptr+fptr->wbuf.off;
+ iov[0].iov_len = fptr->wbuf.len;
+ iov[1].iov_base = (char *)p->ptr;
+ iov[1].iov_len = p->length;
+
+ r = rb_writev_internal(fptr->fd, iov, 2);
+
+ if (fptr->wbuf.len <= r) {
+ r -= fptr->wbuf.len;
+ fptr->wbuf.off = 0;
+ fptr->wbuf.len = 0;
+ }
+ else {
+ fptr->wbuf.off += (int)r;
+ fptr->wbuf.len -= (int)r;
+ r = 0L;
+ }
+ }
+ else {
+ long l = io_writable_length(fptr, p->length);
+ r = rb_write_internal(fptr->fd, p->ptr, l);
+ }
+
+ return r;
}
+#else
+static VALUE
+io_binwrite_string(VALUE arg)
+{
+ struct binwrite_arg *p = (struct binwrite_arg *)arg;
+ rb_io_t *fptr = p->fptr;
+ long l, len;
+
+ l = len = p->length;
+
+ if (fptr->wbuf.len) {
+ if (fptr->wbuf.len+len <= fptr->wbuf.capa) {
+ if (fptr->wbuf.capa < fptr->wbuf.off+fptr->wbuf.len+len) {
+ MEMMOVE(fptr->wbuf.ptr, fptr->wbuf.ptr+fptr->wbuf.off, char, fptr->wbuf.len);
+ fptr->wbuf.off = 0;
+ }
+ MEMMOVE(fptr->wbuf.ptr+fptr->wbuf.off+fptr->wbuf.len, p->ptr, char, len);
+ fptr->wbuf.len += (int)len;
+ l = 0;
+ }
+ if (io_fflush(fptr) < 0)
+ return -2L; /* fail in fflush */
+ if (l == 0)
+ return len;
+ }
+
+ if (fptr->stdio_file != stderr && !rb_thread_fd_writable(fptr->fd))
+ rb_io_check_closed(fptr);
+
+ l = io_writable_length(p->fptr, p->length);
+ return rb_write_internal(p->fptr->fd, p->ptr, l);
+}
+#endif
static long
io_binwrite(VALUE str, const char *ptr, long len, rb_io_t *fptr, int nosync)
@@ -1232,27 +1343,6 @@ io_binwrite(VALUE str, const char *ptr, long len, rb_io_t *fptr, int nosync)
(fptr->wbuf.ptr && fptr->wbuf.capa <= fptr->wbuf.len + len)) {
struct binwrite_arg arg;
- /*
- * xxx: use writev to avoid double write if available
- * writev may help avoid context switch between "a" and "\n" in
- * STDERR.puts "a" [ruby-dev:25080] (rebroken since native threads
- * introduced in 1.9)
- */
- if (fptr->wbuf.len && fptr->wbuf.len+len <= fptr->wbuf.capa) {
- if (fptr->wbuf.capa < fptr->wbuf.off+fptr->wbuf.len+len) {
- MEMMOVE(fptr->wbuf.ptr, fptr->wbuf.ptr+fptr->wbuf.off, char, fptr->wbuf.len);
- fptr->wbuf.off = 0;
- }
- MEMMOVE(fptr->wbuf.ptr+fptr->wbuf.off+fptr->wbuf.len, ptr+offset, char, len);
- fptr->wbuf.len += (int)len;
- n = 0;
- }
- if (io_fflush(fptr) < 0)
- return -1L;
- if (n == 0)
- return len;
-
- rb_io_check_closed(fptr);
arg.fptr = fptr;
arg.str = str;
retry:
@@ -1262,8 +1352,7 @@ io_binwrite(VALUE str, const char *ptr, long len, rb_io_t *fptr, int nosync)
r = rb_mutex_synchronize(fptr->write_lock, io_binwrite_string, (VALUE)&arg);
}
else {
- long l = io_writable_length(fptr, n);
- r = rb_write_internal(fptr->fd, ptr+offset, l);
+ r = io_binwrite_string((VALUE)&arg);
}
/* xxx: other threads may modify given string. */
if (r == n) return len;
@@ -1271,7 +1360,9 @@ io_binwrite(VALUE str, const char *ptr, long len, rb_io_t *fptr, int nosync)
offset += r;
n -= r;
errno = EAGAIN;
- }
+ }
+ if (r == -2L)
+ return -1L;
if (rb_io_wait_writable(fptr->fd)) {
rb_io_check_closed(fptr);
if (offset < len)
@@ -1293,7 +1384,7 @@ io_binwrite(VALUE str, const char *ptr, long len, rb_io_t *fptr, int nosync)
# define MODE_BTMODE(a,b,c) ((fmode & FMODE_BINMODE) ? (b) : \
(fmode & FMODE_TEXTMODE) ? (c) : (a))
static VALUE
-do_writeconv(VALUE str, rb_io_t *fptr)
+do_writeconv(VALUE str, rb_io_t *fptr, int *converted)
{
if (NEED_WRITECONV(fptr)) {
VALUE common_encoding = Qnil;
@@ -1321,10 +1412,12 @@ do_writeconv(VALUE str, rb_io_t *fptr)
if (!NIL_P(common_encoding)) {
str = rb_str_encode(str, common_encoding,
fptr->writeconv_pre_ecflags, fptr->writeconv_pre_ecopts);
+ *converted = 1;
}
if (fptr->writeconv) {
str = rb_econv_str_convert(fptr->writeconv, str, ECONV_PARTIAL_INPUT);
+ *converted = 1;
}
}
#if defined(RUBY_TEST_CRLF_ENVIRONMENT) || defined(_WIN32)
@@ -1350,13 +1443,19 @@ do_writeconv(VALUE str, rb_io_t *fptr)
static long
io_fwrite(VALUE str, rb_io_t *fptr, int nosync)
{
+ int converted = 0;
#ifdef _WIN32
if (fptr->mode & FMODE_TTY) {
long len = rb_w32_write_console(str, fptr->fd);
if (len > 0) return len;
}
#endif
- str = do_writeconv(str, fptr);
+ str = do_writeconv(str, fptr, &converted);
+ if (converted)
+ OBJ_FREEZE(str);
+ else
+ str = rb_str_new_frozen(str);
+
return io_binwrite(str, RSTRING_PTR(str), RSTRING_LEN(str),
fptr, nosync);
}
@@ -1388,8 +1487,6 @@ io_write(VALUE io, VALUE str, int nosync)
io = tmp;
if (RSTRING_LEN(str) == 0) return INT2FIX(0);
- str = rb_str_new_frozen(str);
-
GetOpenFile(io, fptr);
rb_io_check_writable(fptr);
@@ -1477,11 +1574,6 @@ rb_io_flush_raw(VALUE io, int sync)
if (fptr->mode & FMODE_WRITABLE) {
if (io_fflush(fptr) < 0)
rb_sys_fail(0);
-#ifdef _WIN32
- if (sync && GetFileType((HANDLE)rb_w32_get_osfhandle(fptr->fd)) == FILE_TYPE_DISK) {
- rb_thread_io_blocking_region(nogvl_fsync, fptr, fptr->fd);
- }
-#endif
}
if (fptr->mode & FMODE_READABLE) {
io_unread(fptr);
@@ -1843,10 +1935,8 @@ rb_io_fsync(VALUE io)
if (io_fflush(fptr) < 0)
rb_sys_fail(0);
-# ifndef _WIN32 /* already called in io_fflush() */
if ((int)rb_thread_io_blocking_region(nogvl_fsync, fptr, fptr->fd) < 0)
rb_sys_fail_path(fptr->pathv);
-# endif
return INT2FIX(0);
}
#else
@@ -2100,8 +2190,6 @@ rb_io_bufread(VALUE io, void *buf, size_t size)
return (ssize_t)io_bufread(buf, (long)size, fptr);
}
-#define SMALLBUF 100
-
static long
remain_size(rb_io_t *fptr)
{
@@ -2538,6 +2626,19 @@ io_readpartial(int argc, VALUE *argv, VALUE io)
return ret;
}
+static VALUE
+get_kwargs_exception(VALUE opts)
+{
+ static ID ids[1];
+ VALUE except;
+
+ if (!ids[0])
+ ids[0] = sym_exception;
+
+ rb_get_kwargs(opts, ids, 0, 1, &except);
+ return except;
+}
+
/*
* call-seq:
* ios.read_nonblock(maxlen) -> string
@@ -2598,7 +2699,7 @@ io_read_nonblock(int argc, VALUE *argv, VALUE io)
rb_scan_args(argc, argv, "11:", NULL, NULL, &opts);
- if (!NIL_P(opts) && Qfalse == rb_hash_aref(opts, sym_exception))
+ if (!NIL_P(opts) && Qfalse == get_kwargs_exception(opts))
no_exception = 1;
ret = io_getpartial(argc, argv, io, 1, no_exception);
@@ -2635,7 +2736,8 @@ io_write_nonblock(VALUE io, VALUE str, int no_exception)
if (errno == EWOULDBLOCK || errno == EAGAIN) {
if (no_exception) {
return ID2SYM(rb_intern("wait_writable"));
- } else {
+ }
+ else {
rb_readwrite_sys_fail(RB_IO_WAIT_WRITABLE, "write would block");
}
}
@@ -2712,7 +2814,7 @@ rb_io_write_nonblock(int argc, VALUE *argv, VALUE io)
rb_scan_args(argc, argv, "10:", &str, &opts);
- if (!NIL_P(opts) && Qfalse == rb_hash_aref(opts, sym_exception))
+ if (!NIL_P(opts) && Qfalse == get_kwargs_exception(opts))
no_exceptions = 1;
return io_write_nonblock(io, str, no_exceptions);
@@ -5092,9 +5194,9 @@ rb_io_extract_encoding_option(VALUE opt, rb_encoding **enc_p, rb_encoding **enc2
if ((extenc != Qundef || intenc != Qundef) && !NIL_P(encoding)) {
if (!NIL_P(ruby_verbose)) {
int idx = rb_to_encoding_index(encoding);
- rb_warn("Ignoring encoding parameter '%s': %s_encoding is used",
- idx < 0 ? StringValueCStr(encoding) : rb_enc_name(rb_enc_from_index(idx)),
- extenc == Qundef ? "internal" : "external");
+ if (idx >= 0) encoding = rb_enc_from_encoding(rb_enc_from_index(idx));
+ rb_warn("Ignoring encoding parameter '%"PRIsVALUE"': %s_encoding is used",
+ encoding, extenc == Qundef ? "internal" : "external");
}
encoding = Qnil;
}
@@ -5563,7 +5665,7 @@ rb_file_open(const char *fname, const char *modestr)
return rb_file_open_internal(io_alloc(rb_cFile), rb_str_new_cstr(fname), modestr);
}
-#if defined(__CYGWIN__) || !defined(HAVE_FORK)
+#if defined(__CYGWIN__) || !defined(HAVE_WORKING_FORK)
static struct pipe_list {
rb_io_t *fptr;
struct pipe_list *next;
@@ -5619,7 +5721,7 @@ pipe_atexit(void)
static void
pipe_finalize(rb_io_t *fptr, int noraise)
{
-#if !defined(HAVE_FORK) && !defined(_WIN32)
+#if !defined(HAVE_WORKING_FORK) && !defined(_WIN32)
int status = 0;
if (fptr->stdio_file) {
status = pclose(fptr->stdio_file);
@@ -5671,7 +5773,7 @@ rb_pipe(int *pipes)
#define spawn(mode, cmd) rb_w32_uspawn((mode), (cmd), 0)
#endif
-#if defined(HAVE_FORK) || defined(HAVE_SPAWNV)
+#if defined(HAVE_WORKING_FORK) || defined(HAVE_SPAWNV)
struct popen_arg {
VALUE execarg_obj;
struct rb_execarg *eargp;
@@ -5681,7 +5783,7 @@ struct popen_arg {
};
#endif
-#ifdef HAVE_FORK
+#ifdef HAVE_WORKING_FORK
static void
popen_redirect(struct popen_arg *p)
{
@@ -5800,6 +5902,13 @@ popen_exec(void *pp, char *errmsg, size_t errmsg_len)
#endif
static VALUE
+rb_execarg_fixup_v(VALUE execarg_obj)
+{
+ rb_execarg_fixup(execarg_obj);
+ return Qnil;
+}
+
+static VALUE
pipe_open(VALUE execarg_obj, const char *modestr, int fmode, convconfig_t *convconfig)
{
struct rb_execarg *eargp = NIL_P(execarg_obj) ? NULL : rb_execarg_get(execarg_obj);
@@ -5809,11 +5918,12 @@ pipe_open(VALUE execarg_obj, const char *modestr, int fmode, convconfig_t *convc
VALUE port;
rb_io_t *write_fptr;
VALUE write_port;
-#if defined(HAVE_FORK)
+#if defined(HAVE_WORKING_FORK)
int status;
char errmsg[80] = { '\0' };
#endif
-#if defined(HAVE_FORK) || defined(HAVE_SPAWNV)
+#if defined(HAVE_WORKING_FORK) || defined(HAVE_SPAWNV)
+ int state;
struct popen_arg arg;
int e = 0;
#endif
@@ -5827,20 +5937,20 @@ pipe_open(VALUE execarg_obj, const char *modestr, int fmode, convconfig_t *convc
spawnv(P_NOWAIT, (cmd), (args)) : \
spawn(P_NOWAIT, (cmd)))
# endif
-# if !defined(HAVE_FORK)
+# if !defined(HAVE_WORKING_FORK)
char **args = NULL;
# if defined(HAVE_SPAWNVE)
char **envp = NULL;
# endif
# endif
#endif
-#if !defined(HAVE_FORK)
+#if !defined(HAVE_WORKING_FORK)
struct rb_execarg sarg, *sargp = &sarg;
#endif
FILE *fp = 0;
int fd = -1;
int write_fd = -1;
-#if !defined(HAVE_FORK)
+#if !defined(HAVE_WORKING_FORK)
const char *cmd = 0;
#if !defined(HAVE_SPAWNV)
int argc;
@@ -5851,13 +5961,13 @@ pipe_open(VALUE execarg_obj, const char *modestr, int fmode, convconfig_t *convc
cmd = StringValueCStr(prog);
#endif
-#if defined(HAVE_FORK) || defined(HAVE_SPAWNV)
+#if defined(HAVE_WORKING_FORK) || defined(HAVE_SPAWNV)
arg.execarg_obj = execarg_obj;
arg.eargp = eargp;
arg.modef = fmode;
arg.pair[0] = arg.pair[1] = -1;
arg.write_pair[0] = arg.write_pair[1] = -1;
-# if !defined(HAVE_FORK)
+# if !defined(HAVE_WORKING_FORK)
if (eargp && !eargp->use_shell) {
args = ARGVSTR2ARGV(eargp->invoke.cmd.argv_str);
}
@@ -5894,8 +6004,16 @@ pipe_open(VALUE execarg_obj, const char *modestr, int fmode, convconfig_t *convc
rb_sys_fail_str(prog);
}
if (!NIL_P(execarg_obj)) {
- rb_execarg_fixup(execarg_obj);
-# if defined(HAVE_FORK)
+ rb_protect(rb_execarg_fixup_v, execarg_obj, &state);
+ if (state) {
+ if (0 <= arg.write_pair[0]) close(arg.write_pair[0]);
+ if (0 <= arg.write_pair[1]) close(arg.write_pair[1]);
+ if (0 <= arg.pair[0]) close(arg.pair[0]);
+ if (0 <= arg.pair[1]) close(arg.pair[1]);
+ rb_jump_tag(state);
+ }
+
+# if defined(HAVE_WORKING_FORK)
pid = rb_fork_async_signal_safe(&status, popen_exec, &arg, arg.eargp->redirect_fds, errmsg, sizeof(errmsg));
# else
rb_execarg_run_options(eargp, sargp, NULL, 0);
@@ -5919,7 +6037,7 @@ pipe_open(VALUE execarg_obj, const char *modestr, int fmode, convconfig_t *convc
# endif
}
else {
-# if defined(HAVE_FORK)
+# if defined(HAVE_WORKING_FORK)
pid = rb_fork_ruby(&status);
if (pid == 0) { /* child */
rb_thread_atfork();
@@ -5935,7 +6053,7 @@ pipe_open(VALUE execarg_obj, const char *modestr, int fmode, convconfig_t *convc
/* parent */
if (pid == -1) {
-# if defined(HAVE_FORK)
+# if defined(HAVE_WORKING_FORK)
e = errno;
# endif
close(arg.pair[0]);
@@ -5945,7 +6063,7 @@ pipe_open(VALUE execarg_obj, const char *modestr, int fmode, convconfig_t *convc
close(arg.write_pair[1]);
}
errno = e;
-# if defined(HAVE_FORK)
+# if defined(HAVE_WORKING_FORK)
if (errmsg[0])
rb_sys_fail(errmsg);
# endif
@@ -6016,7 +6134,7 @@ pipe_open(VALUE execarg_obj, const char *modestr, int fmode, convconfig_t *convc
rb_ivar_set(port, rb_intern("@tied_io_for_writing"), write_port);
}
-#if defined (__CYGWIN__) || !defined(HAVE_FORK)
+#if defined (__CYGWIN__) || !defined(HAVE_WORKING_FORK)
fptr->finalize = pipe_finalize;
pipe_add_fptr(fptr);
#endif
@@ -6027,7 +6145,7 @@ static int
is_popen_fork(VALUE prog)
{
if (RSTRING_LEN(prog) == 1 && RSTRING_PTR(prog)[0] == '-') {
-#if !defined(HAVE_FORK)
+#if !defined(HAVE_WORKING_FORK)
rb_raise(rb_eNotImpError,
"fork() function is unimplemented on this machine");
#else
@@ -6168,10 +6286,8 @@ rb_io_s_popen(int argc, VALUE *argv, VALUE klass)
rb_raise(rb_eArgError, "too many arguments");
}
#endif
- tmp = rb_ary_dup(tmp);
- RBASIC_CLEAR_CLASS(tmp);
- execarg_obj = rb_execarg_new((int)len, RARRAY_PTR(tmp), FALSE);
- rb_ary_clear(tmp);
+ execarg_obj = rb_execarg_new((int)len, RARRAY_CONST_PTR(tmp), FALSE);
+ RB_GC_GUARD(tmp);
}
else {
SafeStringValue(pname);
@@ -6553,7 +6669,7 @@ io_reopen(VALUE io, VALUE nfile)
if (RTEST(orig->pathv)) fptr->pathv = orig->pathv;
else if (!IS_PREP_STDIO(fptr)) fptr->pathv = Qnil;
fptr->finalize = orig->finalize;
-#if defined (__CYGWIN__) || !defined(HAVE_FORK)
+#if defined (__CYGWIN__) || !defined(HAVE_WORKING_FORK)
if (fptr->finalize == pipe_finalize)
pipe_add_fptr(fptr);
#endif
@@ -6629,8 +6745,7 @@ rb_io_reopen(int argc, VALUE *argv, VALUE file)
rb_io_taint_check(file);
fptr = RFILE(file)->fptr;
if (!fptr) {
- fptr = RFILE(file)->fptr = ALLOC(rb_io_t);
- MEMZERO(fptr, rb_io_t, 1);
+ fptr = RFILE(file)->fptr = ZALLOC(rb_io_t);
}
if (!NIL_P(nmode) || !NIL_P(opt)) {
@@ -6722,7 +6837,7 @@ rb_io_init_copy(VALUE dest, VALUE io)
fptr->lineno = orig->lineno;
if (!NIL_P(orig->pathv)) fptr->pathv = orig->pathv;
fptr->finalize = orig->finalize;
-#if defined (__CYGWIN__) || !defined(HAVE_FORK)
+#if defined (__CYGWIN__) || !defined(HAVE_WORKING_FORK)
if (fptr->finalize == pipe_finalize)
pipe_add_fptr(fptr);
#endif
@@ -6756,7 +6871,7 @@ rb_io_init_copy(VALUE dest, VALUE io)
*/
VALUE
-rb_io_printf(int argc, VALUE *argv, VALUE out)
+rb_io_printf(int argc, const VALUE *argv, VALUE out)
{
rb_io_write(out, rb_f_sprintf(argc, argv));
return Qnil;
@@ -6815,7 +6930,7 @@ rb_f_printf(int argc, VALUE *argv)
*/
VALUE
-rb_io_print(int argc, VALUE *argv, VALUE out)
+rb_io_print(int argc, const VALUE *argv, VALUE out)
{
int i;
VALUE line;
@@ -6863,7 +6978,7 @@ rb_io_print(int argc, VALUE *argv, VALUE out)
*/
static VALUE
-rb_f_print(int argc, VALUE *argv)
+rb_f_print(int argc, const VALUE *argv)
{
rb_io_print(argc, argv, rb_stdout);
return Qnil;
@@ -6980,7 +7095,7 @@ io_puts_ary(VALUE ary, VALUE out, int recur)
*/
VALUE
-rb_io_puts(int argc, VALUE *argv, VALUE out)
+rb_io_puts(int argc, const VALUE *argv, VALUE out)
{
int i;
VALUE line;
@@ -7503,9 +7618,9 @@ static VALUE
rb_io_s_new(int argc, VALUE *argv, VALUE klass)
{
if (rb_block_given_p()) {
- const char *cname = rb_class2name(klass);
+ VALUE cname = rb_obj_as_string(klass);
- rb_warn("%s::new() does not take block; use %s::open() instead",
+ rb_warn("%"PRIsVALUE"::new() does not take block; use %"PRIsVALUE"::open() instead",
cname, cname);
}
return rb_class_new_instance(argc, argv, klass);
@@ -7763,7 +7878,7 @@ argf_next_argv(VALUE argf)
if (ARGF.next_p == 1) {
retry:
if (RARRAY_LEN(ARGF.argv) > 0) {
- ARGF.filename = rb_ary_shift(ARGF.argv);
+ ARGF.filename = rb_str_encode_ospath(rb_ary_shift(ARGF.argv));
fn = StringValueCStr(ARGF.filename);
if (strlen(fn) == 1 && fn[0] == '-') {
ARGF.current_file = rb_stdin;
@@ -7788,22 +7903,24 @@ argf_next_argv(VALUE argf)
rb_io_close(rb_stdout);
}
fstat(fr, &st);
+ str = ARGF.filename;
if (*ARGF.inplace) {
- str = rb_str_new2(fn);
+ str = rb_str_dup(str);
rb_str_cat2(str, ARGF.inplace);
+ /* TODO: encoding of ARGF.inplace */
#ifdef NO_SAFE_RENAME
(void)close(fr);
(void)unlink(RSTRING_PTR(str));
if (rename(fn, RSTRING_PTR(str)) < 0) {
- rb_warn("Can't rename %s to %s: %s, skipping file",
- fn, RSTRING_PTR(str), strerror(errno));
+ rb_warn("Can't rename %"PRIsVALUE" to %"PRIsVALUE": %s, skipping file",
+ ARGF.filename, str, strerror(errno));
goto retry;
}
fr = rb_sysopen(str, O_RDONLY, 0);
#else
if (rename(fn, RSTRING_PTR(str)) < 0) {
- rb_warn("Can't rename %s to %s: %s, skipping file",
- fn, RSTRING_PTR(str), strerror(errno));
+ rb_warn("Can't rename %"PRIsVALUE" to %"PRIsVALUE": %s, skipping file",
+ ARGF.filename, str, strerror(errno));
close(fr);
goto retry;
}
@@ -7814,8 +7931,8 @@ argf_next_argv(VALUE argf)
rb_fatal("Can't do inplace edit without backup");
#else
if (unlink(fn) < 0) {
- rb_warn("Can't remove %s: %s, skipping file",
- fn, strerror(errno));
+ rb_warn("Can't remove %"PRIsVALUE": %s, skipping file",
+ ARGF.filename, strerror(errno));
close(fr);
goto retry;
}
@@ -7838,8 +7955,8 @@ argf_next_argv(VALUE argf)
#endif
if (err && getuid() == 0 && st2.st_uid == 0) {
const char *wkfn = RSTRING_PTR(ARGF.filename);
- rb_warn("Can't set owner/group of %s to same as %s: %s, skipping file",
- wkfn, fn, strerror(errno));
+ rb_warn("Can't set owner/group of %"PRIsVALUE" to same as %"PRIsVALUE": %s, skipping file",
+ ARGF.filename, str, strerror(errno));
(void)close(fr);
(void)close(fw);
(void)unlink(wkfn);
@@ -8167,7 +8284,7 @@ argf_readlines(int argc, VALUE *argv, VALUE argf)
static VALUE
rb_f_backquote(VALUE obj, VALUE str)
{
- volatile VALUE port;
+ VALUE port;
VALUE result;
rb_io_t *fptr;
@@ -8179,6 +8296,8 @@ rb_f_backquote(VALUE obj, VALUE str)
GetOpenFile(port, fptr);
result = read_all(fptr, remain_size(fptr), Qnil);
rb_io_close(port);
+ rb_io_fptr_finalize(fptr);
+ rb_gc_force_recycle(port); /* also guards from premature GC */
return result;
}
@@ -8343,9 +8462,9 @@ static VALUE sym_normal, sym_sequential, sym_random,
#ifdef HAVE_POSIX_FADVISE
struct io_advise_struct {
int fd;
+ int advice;
off_t offset;
off_t len;
- int advice;
};
static VALUE
@@ -8416,7 +8535,12 @@ do_io_advise(rb_io_t *fptr, VALUE advice, off_t offset, off_t len)
if (rv) {
/* posix_fadvise(2) doesn't set errno. On success it returns 0; otherwise
it returns the error code. */
- rb_syserr_fail_str(rv, fptr->pathv);
+ VALUE message = rb_sprintf("%"PRIsVALUE" "
+ "(%"PRI_OFF_T_PREFIX"d, "
+ "%"PRI_OFF_T_PREFIX"d, "
+ "%"PRIsVALUE")",
+ fptr->pathv, offset, len, advice);
+ rb_syserr_fail_str(rv, message);
}
return Qnil;
@@ -8436,9 +8560,7 @@ advice_arg_check(VALUE advice)
advice != sym_willneed &&
advice != sym_dontneed &&
advice != sym_noreuse) {
- VALUE symname = rb_inspect(advice);
- rb_raise(rb_eNotImpError, "Unsupported advice: %s",
- StringValuePtr(symname));
+ rb_raise(rb_eNotImpError, "Unsupported advice: %+"PRIsVALUE, advice);
}
}
@@ -9314,6 +9436,21 @@ io_encoding_set(rb_io_t *fptr, VALUE v1, VALUE v2, VALUE opt)
}
+struct io_encoding_set_args {
+ rb_io_t *fptr;
+ VALUE v1;
+ VALUE v2;
+ VALUE opt;
+};
+
+static VALUE
+io_encoding_set_v(VALUE v)
+{
+ struct io_encoding_set_args *arg = (struct io_encoding_set_args *)v;
+ io_encoding_set(arg->fptr, arg->v1, arg->v2, arg->opt);
+ return Qnil;
+}
+
static VALUE
pipe_pair_close(VALUE rw)
{
@@ -9388,6 +9525,7 @@ rb_io_s_pipe(int argc, VALUE *argv, VALUE klass)
VALUE r, w, args[3], v1, v2;
VALUE opt;
rb_io_t *fptr, *fptr2;
+ struct io_encoding_set_args ies_args;
int fmode = 0;
VALUE ret;
@@ -9405,7 +9543,18 @@ rb_io_s_pipe(int argc, VALUE *argv, VALUE klass)
rb_jump_tag(state);
}
GetOpenFile(r, fptr);
- io_encoding_set(fptr, v1, v2, opt);
+
+ ies_args.fptr = fptr;
+ ies_args.v1 = v1;
+ ies_args.v2 = v2;
+ ies_args.opt = opt;
+ rb_protect(io_encoding_set_v, (VALUE)&ies_args, &state);
+ if (state) {
+ close(pipes[1]);
+ io_close(r);
+ rb_jump_tag(state);
+ }
+
args[1] = INT2NUM(pipes[1]);
args[2] = INT2FIX(O_WRONLY);
w = rb_protect(io_new_instance, (VALUE)args, &state);
@@ -9600,38 +9749,41 @@ seek_before_access(VALUE argp)
/*
* call-seq:
- * IO.read(name, [length [, offset]] ) -> string
- * IO.read(name, [length [, offset]], open_args) -> string
+ * IO.read(name, [length [, offset]] [, opt] ) -> string
*
* Opens the file, optionally seeks to the given +offset+, then returns
* +length+ bytes (defaulting to the rest of the file). <code>read</code>
* ensures the file is closed before returning.
*
- * If the last argument is a hash, it specifies option for internal
- * open(). The key would be the following. open_args: is exclusive
- * to others.
+ * === Options
+ *
+ * The options hash accepts the following keys:
*
* encoding::
* string or encoding
*
- * specifies encoding of the read string. +encoding+ will be ignored
- * if length is specified.
+ * Specifies the encoding of the read string. +encoding:+ will be ignored
+ * if +length+ is specified. See Encoding.aliases for possible encodings.
*
* mode::
* string
*
- * specifies mode argument for open(). It should start with "r"
- * otherwise it will cause an error.
+ * Specifies the mode argument for open(). It must start with an "r"
+ * otherwise it will cause an error. See IO.new for the list of possible
+ * modes.
*
- * open_args:: array of strings
+ * open_args::
+ * array of strings
*
- * specifies arguments for open() as an array.
+ * Specifies arguments for open() as an array. This key can not be used
+ * in combination with either +encoding:+ or +mode:+.
*
* Examples:
*
- * IO.read("testfile") #=> "This is line one\nThis is line two\nThis is line three\nAnd so on...\n"
- * IO.read("testfile", 20) #=> "This is line one\nThi"
- * IO.read("testfile", 20, 10) #=> "ne one\nThis is line "
+ * IO.read("testfile") #=> "This is line one\nThis is line two\nThis is line three\nAnd so on...\n"
+ * IO.read("testfile", 20) #=> "This is line one\nThi"
+ * IO.read("testfile", 20, 10) #=> "ne one\nThis is line "
+ * IO.read("binfile", mode: "rb") #=> "\xF7\x00\x00\x0E\x12"
*/
static VALUE
@@ -9924,10 +10076,6 @@ simple_sendfile(int out_fd, int in_fd, off_t *offset, off_t count)
*/
# define USE_SENDFILE
-# ifdef HAVE_SYS_UIO_H
-# include <sys/uio.h>
-# endif
-
static ssize_t
simple_sendfile(int out_fd, int in_fd, off_t *offset, off_t count)
{
@@ -9981,8 +10129,10 @@ nogvl_copy_stream_sendfile(struct copy_stream_struct *stp)
stp->error_no = errno;
return -1;
}
+#ifndef __linux__
if ((dst_stat.st_mode & S_IFMT) != S_IFSOCK)
- return 0;
+ return 0;
+#endif
src_offset = stp->src_offset;
use_pread = src_offset != (off_t)-1;
@@ -11196,7 +11346,7 @@ argf_block_call(ID mid, int argc, VALUE *argv, VALUE argf)
* For example, the following code prints out each line of each named file
* prefixed with its line number, displaying the filename once per file:
*
- * ARGF.lines do |line|
+ * ARGF.each_line do |line|
* puts ARGF.filename if ARGF.lineno == 1
* puts "#{ARGF.lineno}: #{line}"
* end
@@ -11564,7 +11714,7 @@ opt_i_get(ID id, VALUE *var)
* $ ruby argf.rb file.txt
*
* ARGF.inplace_mode = '.bak'
- * ARGF.lines do |line|
+ * ARGF.each_line do |line|
* print line.sub("foo","bar")
* end
*
diff --git a/iseq.c b/iseq.c
index 700a161f6b..b6bdc261b4 100644
--- a/iseq.c
+++ b/iseq.c
@@ -10,6 +10,7 @@
**********************************************************************/
#include "ruby/ruby.h"
+#include "ruby/util.h"
#include "internal.h"
#include "eval_intern.h"
@@ -74,11 +75,7 @@ iseq_free(void *ptr)
RSTRING_PTR(iseq->location.path));
}
- if (iseq->iseq != iseq->iseq_encoded) {
- RUBY_FREE_UNLESS_NULL(iseq->iseq_encoded);
- }
-
- RUBY_FREE_UNLESS_NULL(iseq->iseq);
+ RUBY_FREE_UNLESS_NULL(iseq->iseq_encoded);
RUBY_FREE_UNLESS_NULL(iseq->line_info_table);
RUBY_FREE_UNLESS_NULL(iseq->local_table);
RUBY_FREE_UNLESS_NULL(iseq->is_entries);
@@ -87,6 +84,7 @@ iseq_free(void *ptr)
RUBY_FREE_UNLESS_NULL(iseq->arg_opt_table);
RUBY_FREE_UNLESS_NULL(iseq->arg_keyword_table);
compile_data_free(iseq->compile_data);
+ RUBY_FREE_UNLESS_NULL(iseq->iseq);
}
ruby_xfree(ptr);
}
@@ -133,14 +131,12 @@ iseq_memsize(const void *ptr)
if (ptr) {
iseq = ptr;
if (!iseq->orig) {
- if (iseq->iseq != iseq->iseq_encoded) {
- size += iseq->iseq_size * sizeof(VALUE);
- }
-
size += iseq->iseq_size * sizeof(VALUE);
size += iseq->line_info_size * sizeof(struct iseq_line_info_entry);
size += iseq->local_table_size * sizeof(ID);
- size += iseq->catch_table_size * sizeof(struct iseq_catch_table_entry);
+ if (iseq->catch_table) {
+ size += iseq_catch_table_bytes(iseq->catch_table->size);
+ }
size += iseq->arg_opts * sizeof(VALUE);
size += iseq->is_size * sizeof(union iseq_inline_storage_entry);
size += iseq->callinfo_size * sizeof(rb_call_info_t);
@@ -150,11 +146,14 @@ iseq_memsize(const void *ptr)
cur = iseq->compile_data->storage_head;
while (cur) {
- size += cur->size + sizeof(struct iseq_compile_data_storage);
+ size += cur->size + SIZEOF_ISEQ_COMPILE_DATA_STORAGE;
cur = cur->next;
}
size += sizeof(struct iseq_compile_data);
}
+ if (iseq->iseq) {
+ size += iseq->iseq_size * sizeof(VALUE);
+ }
}
}
@@ -180,7 +179,7 @@ iseq_alloc(VALUE klass)
}
static rb_iseq_location_t *
-iseq_location_setup(rb_iseq_t *iseq, VALUE path, VALUE absolute_path, VALUE name, size_t first_lineno)
+iseq_location_setup(rb_iseq_t *iseq, VALUE path, VALUE absolute_path, VALUE name, VALUE first_lineno)
{
rb_iseq_location_t *loc = &iseq->location;
RB_OBJ_WRITE(iseq->self, &loc->path, path);
@@ -283,23 +282,20 @@ prepare_iseq_build(rb_iseq_t *iseq,
* iseq->cached_special_block = 0;
*/
- iseq->compile_data = ALLOC(struct iseq_compile_data);
- MEMZERO(iseq->compile_data, struct iseq_compile_data, 1);
+ iseq->compile_data = ZALLOC(struct iseq_compile_data);
RB_OBJ_WRITE(iseq->self, &iseq->compile_data->err_info, Qnil);
RB_OBJ_WRITE(iseq->self, &iseq->compile_data->mark_ary, rb_ary_tmp_new(3));
iseq->compile_data->storage_head = iseq->compile_data->storage_current =
(struct iseq_compile_data_storage *)
ALLOC_N(char, INITIAL_ISEQ_COMPILE_DATA_STORAGE_BUFF_SIZE +
- sizeof(struct iseq_compile_data_storage));
+ SIZEOF_ISEQ_COMPILE_DATA_STORAGE);
RB_OBJ_WRITE(iseq->self, &iseq->compile_data->catch_table_ary, rb_ary_new());
iseq->compile_data->storage_head->pos = 0;
iseq->compile_data->storage_head->next = 0;
iseq->compile_data->storage_head->size =
INITIAL_ISEQ_COMPILE_DATA_STORAGE_BUFF_SIZE;
- iseq->compile_data->storage_head->buff =
- (char *)(&iseq->compile_data->storage_head->buff + 1);
iseq->compile_data->option = option;
iseq->compile_data->last_coverable_line = -1;
@@ -473,6 +469,34 @@ rb_iseq_new_with_bopt(NODE *node, VALUE name, VALUE path, VALUE absolute_path, V
#define CHECK_STRING(v) rb_convert_type((v), T_STRING, "String", "to_str")
#define CHECK_SYMBOL(v) rb_convert_type((v), T_SYMBOL, "Symbol", "to_sym")
static inline VALUE CHECK_INTEGER(VALUE v) {(void)NUM2LONG(v); return v;}
+
+static enum iseq_type
+iseq_type_from_sym(VALUE type)
+{
+ const ID id_top = rb_intern("top");
+ const ID id_method = rb_intern("method");
+ const ID id_block = rb_intern("block");
+ const ID id_class = rb_intern("class");
+ const ID id_rescue = rb_intern("rescue");
+ const ID id_ensure = rb_intern("ensure");
+ const ID id_eval = rb_intern("eval");
+ const ID id_main = rb_intern("main");
+ const ID id_defined_guard = rb_intern("defined_guard");
+ /* ensure all symbols are static or pinned down before
+ * conversion */
+ const ID typeid = rb_check_id(&type);
+ if (typeid == id_top) return ISEQ_TYPE_TOP;
+ if (typeid == id_method) return ISEQ_TYPE_METHOD;
+ if (typeid == id_block) return ISEQ_TYPE_BLOCK;
+ if (typeid == id_class) return ISEQ_TYPE_CLASS;
+ if (typeid == id_rescue) return ISEQ_TYPE_RESCUE;
+ if (typeid == id_ensure) return ISEQ_TYPE_ENSURE;
+ if (typeid == id_eval) return ISEQ_TYPE_EVAL;
+ if (typeid == id_main) return ISEQ_TYPE_MAIN;
+ if (typeid == id_defined_guard) return ISEQ_TYPE_DEFINED_GUARD;
+ return (enum iseq_type)-1;
+}
+
static VALUE
iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt)
{
@@ -483,8 +507,6 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt)
VALUE type, body, locals, args, exception;
st_data_t iseq_type;
- static struct st_table *type_map_cache = 0;
- struct st_table *type_map = 0;
rb_iseq_t *iseq;
rb_compile_option_t option;
int i = 0;
@@ -524,33 +546,9 @@ iseq_load(VALUE self, VALUE data, VALUE parent, VALUE opt)
iseq->self = iseqval;
iseq->local_iseq = iseq;
- type_map = type_map_cache;
- if (type_map == 0) {
- struct st_table *cached_map;
- type_map = st_init_numtable();
- st_insert(type_map, ID2SYM(rb_intern("top")), ISEQ_TYPE_TOP);
- st_insert(type_map, ID2SYM(rb_intern("method")), ISEQ_TYPE_METHOD);
- st_insert(type_map, ID2SYM(rb_intern("block")), ISEQ_TYPE_BLOCK);
- st_insert(type_map, ID2SYM(rb_intern("class")), ISEQ_TYPE_CLASS);
- st_insert(type_map, ID2SYM(rb_intern("rescue")), ISEQ_TYPE_RESCUE);
- st_insert(type_map, ID2SYM(rb_intern("ensure")), ISEQ_TYPE_ENSURE);
- st_insert(type_map, ID2SYM(rb_intern("eval")), ISEQ_TYPE_EVAL);
- st_insert(type_map, ID2SYM(rb_intern("main")), ISEQ_TYPE_MAIN);
- st_insert(type_map, ID2SYM(rb_intern("defined_guard")), ISEQ_TYPE_DEFINED_GUARD);
- cached_map = ATOMIC_PTR_CAS(type_map_cache, (struct st_table *)0, type_map);
- if (cached_map) {
- st_free_table(type_map);
- type_map = cached_map;
- }
- }
-
- if (st_lookup(type_map, type, &iseq_type) == 0) {
- ID typeid = SYM2ID(type);
- VALUE typename = rb_id2str(typeid);
- if (typename)
- rb_raise(rb_eTypeError, "unsupport type: :%"PRIsVALUE, typename);
- else
- rb_raise(rb_eTypeError, "unsupport type: %p", (void *)typeid);
+ iseq_type = iseq_type_from_sym(type);
+ if (iseq_type == (enum iseq_type)-1) {
+ rb_raise(rb_eTypeError, "unsupport type: :%"PRIsVALUE, rb_sym2str(type));
}
if (parent == Qnil) {
@@ -1155,9 +1153,9 @@ id_to_name(ID id, VALUE default_value)
}
VALUE
-rb_insn_operand_intern(rb_iseq_t *iseq,
+rb_insn_operand_intern(const rb_iseq_t *iseq,
VALUE insn, int op_no, VALUE op,
- int len, size_t pos, VALUE *pnop, VALUE child)
+ int len, size_t pos, const VALUE *pnop, VALUE child)
{
const char *types = insn_op_types(insn);
char type = types[op_no];
@@ -1175,7 +1173,7 @@ rb_insn_operand_intern(rb_iseq_t *iseq,
case TS_LINDEX:{
if (insn == BIN(getlocal) || insn == BIN(setlocal)) {
if (pnop) {
- rb_iseq_t *diseq = iseq;
+ const rb_iseq_t *diseq = iseq;
VALUE level = *pnop, i;
for (i = 0; i < level; i++) {
@@ -1283,8 +1281,8 @@ rb_insn_operand_intern(rb_iseq_t *iseq,
* Iseq -> Iseq inspect object
*/
int
-rb_iseq_disasm_insn(VALUE ret, VALUE *iseq, size_t pos,
- rb_iseq_t *iseqdat, VALUE child)
+rb_iseq_disasm_insn(VALUE ret, const VALUE *iseq, size_t pos,
+ const rb_iseq_t *iseqdat, VALUE child)
{
VALUE insn = iseq[pos];
int len = insn_len(insn);
@@ -1381,7 +1379,7 @@ rb_iseq_disasm(VALUE self)
VALUE *iseq;
VALUE str = rb_str_new(0, 0);
VALUE child = rb_ary_new();
- unsigned long size;
+ unsigned int size;
int i;
long l;
ID *tbl;
@@ -1390,7 +1388,6 @@ rb_iseq_disasm(VALUE self)
rb_secure(1);
- iseq = iseqdat->iseq;
size = iseqdat->iseq_size;
rb_str_cat2(str, "== disasm: ");
@@ -1403,11 +1400,11 @@ rb_iseq_disasm(VALUE self)
rb_str_cat2(str, "\n");
/* show catch table information */
- if (iseqdat->catch_table_size != 0) {
+ if (iseqdat->catch_table) {
rb_str_cat2(str, "== catch table\n");
}
- for (i = 0; i < iseqdat->catch_table_size; i++) {
- struct iseq_catch_table_entry *entry = &iseqdat->catch_table[i];
+ if (iseqdat->catch_table) for (i = 0; i < iseqdat->catch_table->size; i++) {
+ struct iseq_catch_table_entry *entry = &iseqdat->catch_table->entries[i];
rb_str_catf(str,
"| catch type: %-6s st: %04d ed: %04d sp: %04d cont: %04d\n",
catch_type((int)entry->type), (int)entry->start,
@@ -1416,7 +1413,7 @@ rb_iseq_disasm(VALUE self)
rb_str_concat(str, rb_iseq_disasm(entry->iseq));
}
}
- if (iseqdat->catch_table_size != 0) {
+ if (iseqdat->catch_table) {
rb_str_cat2(str, "|-------------------------------------"
"-----------------------------------\n");
}
@@ -1470,6 +1467,7 @@ rb_iseq_disasm(VALUE self)
}
/* show each line */
+ iseq = rb_iseq_original_iseq(iseqdat);
for (n = 0; n < size;) {
n += rb_iseq_disasm_insn(str, iseq, n, iseqdat, child);
}
@@ -1619,11 +1617,7 @@ ruby_node_name(int node)
static VALUE
register_label(struct st_table *table, unsigned long idx)
{
- VALUE sym;
- char buff[8 + (sizeof(idx) * CHAR_BIT * 32 / 100)];
-
- snprintf(buff, sizeof(buff), "label_%lu", idx);
- sym = ID2SYM(rb_intern(buff));
+ VALUE sym = rb_str_dynamic_intern(rb_sprintf("label_%lu", idx));
st_insert(table, idx, sym);
return sym;
}
@@ -1660,7 +1654,7 @@ iseq_data_to_ary(rb_iseq_t *iseq)
size_t ti;
unsigned int pos;
unsigned int line = 0;
- VALUE *seq;
+ VALUE *seq, *iseq_original;
VALUE val = rb_ary_new();
VALUE type; /* Symbol */
@@ -1761,7 +1755,9 @@ iseq_data_to_ary(rb_iseq_t *iseq)
}
/* body */
- for (seq = iseq->iseq; seq < iseq->iseq + iseq->iseq_size; ) {
+ iseq_original = rb_iseq_original_iseq(iseq);
+
+ for (seq = iseq_original; seq < iseq_original + iseq->iseq_size; ) {
VALUE insn = *seq++;
int j, len = insn_len(insn);
VALUE *nseq = seq + len - 1;
@@ -1771,7 +1767,7 @@ iseq_data_to_ary(rb_iseq_t *iseq)
for (j=0; j<len-1; j++, seq++) {
switch (insn_op_type(insn, j)) {
case TS_OFFSET: {
- unsigned long idx = nseq - iseq->iseq + *seq;
+ unsigned long idx = nseq - iseq_original + *seq;
rb_ary_push(ary, register_label(labels_table, idx));
break;
}
@@ -1830,7 +1826,7 @@ iseq_data_to_ary(rb_iseq_t *iseq)
for (i=0; i<RARRAY_LEN(val); i+=2) {
VALUE pos = FIX2INT(rb_ary_entry(val, i+1));
- unsigned long idx = nseq - iseq->iseq + pos;
+ unsigned long idx = nseq - iseq_original + pos;
rb_ary_store(val, i+1,
register_label(labels_table, idx));
@@ -1848,9 +1844,9 @@ iseq_data_to_ary(rb_iseq_t *iseq)
nbody = body;
/* exception */
- for (i=0; i<iseq->catch_table_size; i++) {
+ if (iseq->catch_table) for (i=0; i<iseq->catch_table->size; i++) {
VALUE ary = rb_ary_new();
- struct iseq_catch_table_entry *entry = &iseq->catch_table[i];
+ struct iseq_catch_table_entry *entry = &iseq->catch_table->entries[i];
rb_ary_push(ary, exception_type2symbol(entry->type));
if (entry->iseq) {
rb_iseq_t *eiseq;
@@ -2070,6 +2066,7 @@ rb_iseq_defined_string(enum defined_type type)
str = rb_str_new_cstr(estr);;
OBJ_FREEZE(str);
defs[type-1] = str;
+ rb_gc_register_mark_object(str);
}
return str;
}
@@ -2097,15 +2094,15 @@ rb_iseq_build_for_ruby2cext(
MEMCPY(iseq, iseq_template, rb_iseq_t, 1); /* TODO: write barrier, *iseq = *iseq_template; */
RB_OBJ_WRITE(iseq->self, &iseq->location.label, rb_str_new2(name));
RB_OBJ_WRITE(iseq->self, &iseq->location.path, rb_str_new2(path));
- iseq->location.first_lineno = first_lineno;
+ iseq->location.first_lineno = UINT2NUM(first_lineno);
RB_OBJ_WRITE(iseq->self, &iseq->mark_ary, 0);
iseq->self = iseqval;
- iseq->iseq = ALLOC_N(VALUE, iseq->iseq_size);
+ iseq->iseq_encoded = ALLOC_N(VALUE, iseq->iseq_size);
for (i=0; i<iseq->iseq_size; i+=2) {
- iseq->iseq[i] = BIN(opt_call_c_function);
- iseq->iseq[i+1] = (VALUE)func;
+ iseq->iseq_encoded[i] = BIN(opt_call_c_function);
+ iseq->iseq_encoded[i+1] = (VALUE)func;
}
rb_iseq_translate_threaded_code(iseq);
@@ -2120,8 +2117,14 @@ rb_iseq_build_for_ruby2cext(
ALLOC_AND_COPY(iseq->line_info_table, line_info_table,
struct iseq_line_info_entry, iseq->line_info_size);
- ALLOC_AND_COPY(iseq->catch_table, catch_table,
- struct iseq_catch_table_entry, iseq->catch_table_size);
+ /*
+ * FIXME: probably broken, but this function is probably unused
+ * and should be removed
+ */
+ if (iseq->catch_table) {
+ MEMCPY(&iseq->catch_table->entries, catch_table,
+ struct iseq_catch_table_entry, iseq->catch_table->size);
+ }
ALLOC_AND_COPY(iseq->arg_opt_table, arg_opt_table,
VALUE, iseq->arg_opts);
@@ -2139,16 +2142,19 @@ int
rb_iseq_line_trace_each(VALUE iseqval, int (*func)(int line, rb_event_flag_t *events_ptr, void *d), void *data)
{
int trace_num = 0;
- size_t pos, insn;
+ unsigned int pos;
+ size_t insn;
rb_iseq_t *iseq;
int cont = 1;
+ VALUE *iseq_original;
GetISeqPtr(iseqval, iseq);
+ iseq_original = rb_iseq_original_iseq(iseq);
for (pos = 0; cont && pos < iseq->iseq_size; pos += insn_len(insn)) {
- insn = iseq->iseq[pos];
+ insn = iseq_original[pos];
if (insn == BIN(trace)) {
- rb_event_flag_t current_events = (VALUE)iseq->iseq[pos+1];
+ rb_event_flag_t current_events = (VALUE)iseq_original[pos+1];
if (current_events & RUBY_EVENT_LINE) {
rb_event_flag_t events = current_events & RUBY_EVENT_SPECIFIED_LINE;
@@ -2159,7 +2165,7 @@ rb_iseq_line_trace_each(VALUE iseqval, int (*func)(int line, rb_event_flag_t *ev
/* printf("line: %d\n", line); */
cont = (*func)(line, &events, data);
if (current_events != events) {
- iseq->iseq[pos+1] = iseq->iseq_encoded[pos+1] =
+ iseq_original[pos+1] = iseq->iseq_encoded[pos+1] =
(VALUE)(current_events | (events & RUBY_EVENT_SPECIFIED_LINE));
}
}
diff --git a/iseq.h b/iseq.h
index 5487d86f7b..bf3a714e9d 100644
--- a/iseq.h
+++ b/iseq.h
@@ -17,6 +17,7 @@ RUBY_SYMBOL_EXPORT_BEGIN
/* compile.c */
VALUE rb_iseq_compile_node(VALUE self, NODE *node);
int rb_iseq_translate_threaded_code(rb_iseq_t *iseq);
+VALUE *rb_iseq_original_iseq(rb_iseq_t *iseq);
VALUE rb_iseq_build_from_ary(rb_iseq_t *iseq, VALUE locals, VALUE args,
VALUE exception, VALUE body);
@@ -62,21 +63,41 @@ struct iseq_catch_table_entry {
CATCH_TYPE_NEXT = INT2FIX(6)
} type;
VALUE iseq;
- unsigned long start;
- unsigned long end;
- unsigned long cont;
- unsigned long sp;
+ unsigned int start;
+ unsigned int end;
+ unsigned int cont;
+ unsigned int sp;
};
+PACKED_STRUCT_UNALIGNED(struct iseq_catch_table {
+ int size;
+ struct iseq_catch_table_entry entries[1]; /* flexible array */
+});
+
+static inline int
+iseq_catch_table_bytes(int n)
+{
+ enum {
+ catch_table_entries_max = (INT_MAX - sizeof(struct iseq_catch_table)) / sizeof(struct iseq_catch_table_entry)
+ };
+ if (n > catch_table_entries_max) rb_fatal("too large iseq_catch_table - %d", n);
+ return (int)(sizeof(struct iseq_catch_table) +
+ (n - 1) * sizeof(struct iseq_catch_table_entry));
+}
+
#define INITIAL_ISEQ_COMPILE_DATA_STORAGE_BUFF_SIZE (512)
struct iseq_compile_data_storage {
struct iseq_compile_data_storage *next;
- unsigned long pos;
- unsigned long size;
- char *buff;
+ unsigned int pos;
+ unsigned int size;
+ char buff[1]; /* flexible array */
};
+/* account for flexible array */
+#define SIZEOF_ISEQ_COMPILE_DATA_STORAGE \
+ (sizeof(struct iseq_compile_data_storage) - 1)
+
struct iseq_compile_data {
/* GC is needed */
const VALUE err_info;
diff --git a/lib/English.rb b/lib/English.rb
index 32769fb18b..838e5afc74 100644
--- a/lib/English.rb
+++ b/lib/English.rb
@@ -6,7 +6,7 @@
#
# $\ = ' -- '
# "waterbuffalo" =~ /buff/
-# print $", $', $$, "\n"
+# print $', $$, "\n"
#
# With English:
#
@@ -14,7 +14,7 @@
#
# $OUTPUT_FIELD_SEPARATOR = ' -- '
# "waterbuffalo" =~ /buff/
-# print $LOADED_FEATURES, $POSTMATCH, $PID, "\n"
+# print $POSTMATCH, $PID, "\n"
#
# Below is a full list of descriptive aliases and their associated global
# variable:
diff --git a/lib/abbrev.rb b/lib/abbrev.rb
index 841f6d980e..2c07fb5cf9 100755..100644
--- a/lib/abbrev.rb
+++ b/lib/abbrev.rb
@@ -1,4 +1,3 @@
-#!/usr/bin/env ruby
#--
# Copyright (c) 2001,2003 Akinori MUSHA <knu@iDaemons.org>
#
@@ -11,43 +10,46 @@
#++
##
-# Calculates the set of unique abbreviations for a given set of strings.
+# Calculates the set of unambiguous abbreviations for a given set of strings.
#
# require 'abbrev'
# require 'pp'
#
-# pp Abbrev.abbrev(['ruby', 'rules'])
+# pp Abbrev.abbrev(['ruby'])
+# #=> {"ruby"=>"ruby", "rub"=>"ruby", "ru"=>"ruby", "r"=>"ruby"}
#
-# Generates:
+# pp Abbrev.abbrev(%w{ ruby rules })
#
-# { "rub" => "ruby",
-# "ruby" => "ruby",
-# "rul" => "rules",
+# _Generates:_
+# { "ruby" => "ruby",
+# "rub" => "ruby",
+# "rules" => "rules",
# "rule" => "rules",
-# "rules" => "rules" }
+# "rul" => "rules" }
#
# It also provides an array core extension, Array#abbrev.
#
-# pp %w{summer winter}.abbrev
-# #=> {"summe"=>"summer",
-# "summ"=>"summer",
-# "sum"=>"summer",
-# "su"=>"summer",
-# "s"=>"summer",
-# "winte"=>"winter",
-# "wint"=>"winter",
-# "win"=>"winter",
-# "wi"=>"winter",
-# "w"=>"winter",
-# "summer"=>"summer",
-# "winter"=>"winter"}
+# pp %w{ summer winter }.abbrev
+#
+# _Generates:_
+# { "summer" => "summer",
+# "summe" => "summer",
+# "summ" => "summer",
+# "sum" => "summer",
+# "su" => "summer",
+# "s" => "summer",
+# "winter" => "winter",
+# "winte" => "winter",
+# "wint" => "winter",
+# "win" => "winter",
+# "wi" => "winter",
+# "w" => "winter" }
module Abbrev
- # Given a set of strings, calculate the set of unambiguous
- # abbreviations for those strings, and return a hash where the keys
- # are all the possible abbreviations and the values are the full
- # strings.
+ # Given a set of strings, calculate the set of unambiguous abbreviations for
+ # those strings, and return a hash where the keys are all the possible
+ # abbreviations and the values are the full strings.
#
# Thus, given +words+ is "car" and "cone", the keys pointing to "car" would
# be "ca" and "car", while those pointing to "cone" would be "co", "con", and
@@ -55,15 +57,18 @@ module Abbrev
#
# require 'abbrev'
#
- # Abbrev.abbrev(['car', 'cone'])
+ # Abbrev.abbrev(%w{ car cone })
# #=> {"ca"=>"car", "con"=>"cone", "co"=>"cone", "car"=>"car", "cone"=>"cone"}
#
- # The optional +pattern+ parameter is a pattern or a string. Only
- # input strings that match the pattern or start with the string
- # are included in the output hash.
+ # The optional +pattern+ parameter is a pattern or a string. Only input
+ # strings that match the pattern or start with the string are included in the
+ # output hash.
+ #
+ # Abbrev.abbrev(%w{car box cone crab}, /b/)
+ # #=> {"box"=>"box", "bo"=>"box", "b"=>"box", "crab" => "crab"}
#
- # Abbrev.abbrev(%w{car box cone}, /b/)
- # #=> {"bo"=>"box", "b"=>"box", "box"=>"box"}
+ # Abbrev.abbrev(%w{car box cone}, 'ca')
+ # #=> {"car"=>"car", "ca"=>"car"}
def abbrev(words, pattern = nil)
table = {}
seen = Hash.new(0)
@@ -103,34 +108,24 @@ module Abbrev
end
class Array
- # Calculates the set of unambiguous abbreviations for the strings in
- # +self+.
+ # Calculates the set of unambiguous abbreviations for the strings in +self+.
#
# require 'abbrev'
# %w{ car cone }.abbrev
- # #=> {"ca" => "car", "con"=>"cone", "co" => "cone",
- # "car"=>"car", "cone" => "cone"}
+ # #=> {"car"=>"car", "ca"=>"car", "cone"=>"cone", "con"=>"cone", "co"=>"cone"}
#
- # The optional +pattern+ parameter is a pattern or a string. Only
- # input strings that match the pattern or start with the string
- # are included in the output hash.
+ # The optional +pattern+ parameter is a pattern or a string. Only input
+ # strings that match the pattern or start with the string are included in the
+ # output hash.
#
# %w{ fast boat day }.abbrev(/^.a/)
- # #=> {"fas"=>"fast", "fa"=>"fast", "da"=>"day",
- # "fast"=>"fast", "day"=>"day"}
+ # #=> {"fast"=>"fast", "fas"=>"fast", "fa"=>"fast", "day"=>"day", "da"=>"day"}
+ #
+ # Abbrev.abbrev(%w{car box cone}, "ca")
+ # #=> {"car"=>"car", "ca"=>"car"}
#
# See also Abbrev.abbrev
def abbrev(pattern = nil)
Abbrev::abbrev(self, pattern)
end
end
-
-if $0 == __FILE__
- while line = gets
- hash = line.split.abbrev
-
- hash.sort.each do |k, v|
- puts "#{k} => #{v}"
- end
- end
-end
diff --git a/lib/benchmark.rb b/lib/benchmark.rb
index 81ca0bcede..690dff1c28 100644
--- a/lib/benchmark.rb
+++ b/lib/benchmark.rb
@@ -270,14 +270,23 @@ module Benchmark
STDOUT.sync = sync unless sync.nil?
end
+ # :stopdoc:
+ case
+ when defined?(Process::CLOCK_MONOTONIC)
+ BENCHMARK_CLOCK = Process::CLOCK_MONOTONIC
+ else
+ BENCHMARK_CLOCK = Process::CLOCK_REALTIME
+ end
+ # :startdoc:
+
#
# Returns the time used to execute the given block as a
# Benchmark::Tms object.
#
def measure(label = "") # :yield:
- t0, r0 = Process.times, Time.now
+ t0, r0 = Process.times, Process.clock_gettime(BENCHMARK_CLOCK)
yield
- t1, r1 = Process.times, Time.now
+ t1, r1 = Process.times, Process.clock_gettime(BENCHMARK_CLOCK)
Benchmark::Tms.new(t1.utime - t0.utime,
t1.stime - t0.stime,
t1.cutime - t0.cutime,
@@ -290,9 +299,9 @@ module Benchmark
# Returns the elapsed real time used to execute the given block.
#
def realtime # :yield:
- r0 = Time.now
+ r0 = Process.clock_gettime(BENCHMARK_CLOCK)
yield
- Time.now - r0
+ Process.clock_gettime(BENCHMARK_CLOCK) - r0
end
module_function :benchmark, :measure, :realtime, :bm, :bmbm
@@ -546,23 +555,3 @@ module Benchmark
# The default format string used to display times. See also Benchmark::Tms#format.
FORMAT = Benchmark::Tms::FORMAT
end
-
-if __FILE__ == $0
- include Benchmark
-
- n = ARGV[0].to_i.nonzero? || 50000
- puts %Q([#{n} times iterations of `a = "1"'])
- benchmark(CAPTION, 7, FORMAT) do |x|
- x.report("for:") {for _ in 1..n; _ = "1"; end} # Benchmark.measure
- x.report("times:") {n.times do ; _ = "1"; end}
- x.report("upto:") {1.upto(n) do ; _ = "1"; end}
- end
-
- benchmark do
- [
- measure{for _ in 1..n; _ = "1"; end}, # Benchmark.measure
- measure{n.times do ; _ = "1"; end},
- measure{1.upto(n) do ; _ = "1"; end}
- ]
- end
-end
diff --git a/lib/cgi.rb b/lib/cgi.rb
index 15676eab5f..ae73fe37f6 100644
--- a/lib/cgi.rb
+++ b/lib/cgi.rb
@@ -10,8 +10,6 @@
# Documentation: Wakou Aoyama (RDoc'd and embellished by William Webber)
#
-raise "Please, use ruby 1.9.0 or later." if RUBY_VERSION < "1.9.0"
-
# == Overview
#
# The Common Gateway Interface (CGI) is a simple protocol for passing an HTTP
diff --git a/lib/cgi/core.rb b/lib/cgi/core.rb
index 241f817278..b81f915379 100644
--- a/lib/cgi/core.rb
+++ b/lib/cgi/core.rb
@@ -389,9 +389,6 @@ class CGI
# Maximum content length of post data
##MAX_CONTENT_LENGTH = 2 * 1024 * 1024
- # Maximum content length of multipart data
- MAX_MULTIPART_LENGTH = 128 * 1024 * 1024
-
# Maximum number of request parameters when multipart
MAX_MULTIPART_COUNT = 128
@@ -482,7 +479,6 @@ class CGI
@files = {}
boundary_rexp = /--#{Regexp.quote(boundary)}(#{EOL}|--)/
boundary_size = "#{EOL}--#{boundary}#{EOL}".bytesize
- boundary_end = nil
buf = ''
bufsize = 10 * 1024
max_count = MAX_MULTIPART_COUNT
@@ -550,7 +546,7 @@ class CGI
name = $1 || $2 || ''
if body.original_filename.empty?
value=body.read.dup.force_encoding(@accept_charset)
- body.unlink if defined?(Tempfile) && body.kind_of?(Tempfile)
+ body.close! if defined?(Tempfile) && body.kind_of?(Tempfile)
(params[name] ||= []) << value
unless value.valid_encoding?
if @accept_charset_error_block
@@ -578,7 +574,7 @@ class CGI
if tempfiles
tempfiles.each {|t|
if t.path
- t.unlink
+ t.close!
end
}
end
@@ -644,8 +640,9 @@ class CGI
# Reads query parameters in the @params field, and cookies into @cookies.
def initialize_query()
if ("POST" == env_table['REQUEST_METHOD']) and
- %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|.match(env_table['CONTENT_TYPE'])
- raise StandardError.new("too large multipart data.") if env_table['CONTENT_LENGTH'].to_i > MAX_MULTIPART_LENGTH
+ %r|\Amultipart/form-data.*boundary=\"?([^\";,]+)\"?|.match(env_table['CONTENT_TYPE'])
+ current_max_multipart_length = @max_multipart_length.respond_to?(:call) ? @max_multipart_length.call : @max_multipart_length
+ raise StandardError.new("too large multipart data.") if env_table['CONTENT_LENGTH'].to_i > current_max_multipart_length
boundary = $1.dup
@multipart = true
@params = read_multipart(boundary, Integer(env_table['CONTENT_LENGTH']))
@@ -751,6 +748,16 @@ class CGI
# Return the accept character set for this CGI instance.
attr_reader :accept_charset
+ # @@max_multipart_length is the maximum length of multipart data.
+ # The default value is 128 * 1024 * 1024 bytes
+ #
+ # The default can be set to something else in the CGI constructor,
+ # via the :max_multipart_length key in the option hash.
+ #
+ # See CGI.new documentation.
+ #
+ @@max_multipart_length= 128 * 1024 * 1024
+
# Create a new CGI instance.
#
# :call-seq:
@@ -764,7 +771,7 @@ class CGI
# +options_hash+ form, since it also allows you specify the charset you
# will accept.
# <tt>options_hash</tt>::
- # A Hash that recognizes two options:
+ # A Hash that recognizes three options:
#
# <tt>:accept_charset</tt>::
# specifies encoding of received query string. If omitted,
@@ -793,6 +800,18 @@ class CGI
# "html4Fr":: HTML 4.0 with Framesets
# "html5":: HTML 5
#
+ # <tt>:max_multipart_length</tt>::
+ # Specifies maximum length of multipart data. Can be an Integer scalar or
+ # a lambda, that will be evaluated when the request is parsed. This
+ # allows more complex logic to be set when determining whether to accept
+ # multipart data (e.g. consult a registered users upload allowance)
+ #
+ # Default is 128 * 1024 * 1024 bytes
+ #
+ # cgi=CGI.new(:max_multipart_length => 268435456) # simple scalar
+ #
+ # cgi=CGI.new(:max_multipart_length => -> {check_filesystem}) # lambda
+ #
# <tt>block</tt>::
# If provided, the block is called when an invalid encoding is
# encountered. For example:
@@ -810,7 +829,10 @@ class CGI
# CGI locations, which varies according to the REQUEST_METHOD.
def initialize(options = {}, &block) # :yields: name, value
@accept_charset_error_block = block_given? ? block : nil
- @options={:accept_charset=>@@accept_charset}
+ @options={
+ :accept_charset=>@@accept_charset,
+ :max_multipart_length=>@@max_multipart_length
+ }
case options
when Hash
@options.merge!(options)
@@ -818,6 +840,7 @@ class CGI
@options[:tag_maker]=options
end
@accept_charset=@options[:accept_charset]
+ @max_multipart_length=@options[:max_multipart_length]
if defined?(MOD_RUBY) && !ENV.key?("GATEWAY_INTERFACE")
Apache.request.setup_cgi_env
end
@@ -855,5 +878,3 @@ class CGI
end
end # class CGI
-
-
diff --git a/lib/cgi/html.rb b/lib/cgi/html.rb
index 4c4f698a2b..db47bb8266 100644
--- a/lib/cgi/html.rb
+++ b/lib/cgi/html.rb
@@ -865,7 +865,7 @@ class CGI
%|<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">|
end
- # Initialise the HTML generation methods for this version.
+ # Initialize the HTML generation methods for this version.
# - -
instance_method(:nn_element_def).tap do |m|
for element in %w[ TT I B BIG SMALL EM STRONG DFN CODE SAMP KBD
diff --git a/lib/cgi/session.rb b/lib/cgi/session.rb
index 606d5bc541..63c5003526 100644
--- a/lib/cgi/session.rb
+++ b/lib/cgi/session.rb
@@ -453,7 +453,7 @@ class CGI
#
# +session+ is the session this instance is associated with.
# +option+ is a list of initialisation options. None are
- # currently recognised.
+ # currently recognized.
def initialize(session, option=nil)
@session_id = session.session_id
unless GLOBAL_HASH_TABLE.key?(@session_id)
diff --git a/lib/cgi/session/pstore.rb b/lib/cgi/session/pstore.rb
index a63d7d3984..75343149e1 100644
--- a/lib/cgi/session/pstore.rb
+++ b/lib/cgi/session/pstore.rb
@@ -97,15 +97,4 @@ class CGI
end
end
end
-
-if $0 == __FILE__
- # :enddoc:
- STDIN.reopen("/dev/null")
- cgi = CGI.new
- session = CGI::Session.new(cgi, 'database_manager' => CGI::Session::PStore)
- session['key'] = {'k' => 'v'}
- puts session['key'].class
- fail unless Hash === session['key']
- puts session['key'].inspect
- fail unless session['key'].inspect == '{"k"=>"v"}'
-end
+# :enddoc:
diff --git a/lib/cgi/util.rb b/lib/cgi/util.rb
index 199e17bbbc..3d7db8f2c8 100644
--- a/lib/cgi/util.rb
+++ b/lib/cgi/util.rb
@@ -90,14 +90,10 @@ module CGI::Util
end
# Synonym for CGI::escapeHTML(str)
- def escape_html(str)
- escapeHTML(str)
- end
+ alias escape_html escapeHTML
# Synonym for CGI::unescapeHTML(str)
- def unescape_html(str)
- unescapeHTML(str)
- end
+ alias unescape_html unescapeHTML
# Escape only the tags of certain HTML elements in +string+.
#
@@ -144,14 +140,10 @@ module CGI::Util
end
# Synonym for CGI::escapeElement(str)
- def escape_element(str)
- escapeElement(str)
- end
+ alias escape_element escapeElement
# Synonym for CGI::unescapeElement(str)
- def unescape_element(str)
- unescapeElement(str)
- end
+ alias unescape_element unescapeElement
# Abbreviated day-of-week names specified by RFC 822
RFC822_DAYS = %w[ Sun Mon Tue Wed Thu Fri Sat ]
diff --git a/lib/cmath.rb b/lib/cmath.rb
index 337c2e063a..aee577c97c 100644
--- a/lib/cmath.rb
+++ b/lib/cmath.rb
@@ -50,11 +50,11 @@ module CMath
def exp(z)
begin
if z.real?
- exp!(z)
+ exp!(z)
else
- ere = exp!(z.real)
- Complex(ere * cos!(z.imag),
- ere * sin!(z.imag))
+ ere = exp!(z.real)
+ Complex(ere * cos!(z.imag),
+ ere * sin!(z.imag))
end
rescue NoMethodError
handle_no_method_error
@@ -70,14 +70,14 @@ module CMath
begin
z, b = args
unless b.nil? || b.kind_of?(Numeric)
- raise TypeError, "Numeric Number required"
+ raise TypeError, "Numeric Number required"
end
if z.real? and z >= 0 and (b.nil? or b >= 0)
- log!(*args)
+ log!(*args)
else
- a = Complex(log!(z.abs), z.arg)
- if b
- a /= log(b)
+ a = Complex(log!(z.abs), z.arg)
+ if b
+ a /= log(b)
end
a
end
@@ -91,9 +91,9 @@ module CMath
def log2(z)
begin
if z.real? and z >= 0
- log2!(z)
+ log2!(z)
else
- log(z) / log!(2)
+ log(z) / log!(2)
end
rescue NoMethodError
handle_no_method_error
@@ -105,9 +105,9 @@ module CMath
def log10(z)
begin
if z.real? and z >= 0
- log10!(z)
+ log10!(z)
else
- log(z) / log!(10)
+ log(z) / log!(10)
end
rescue NoMethodError
handle_no_method_error
@@ -122,20 +122,20 @@ module CMath
def sqrt(z)
begin
if z.real?
- if z < 0
- Complex(0, sqrt!(-z))
- else
- sqrt!(z)
- end
+ if z < 0
+ Complex(0, sqrt!(-z))
+ else
+ sqrt!(z)
+ end
else
- if z.imag < 0 ||
- (z.imag == 0 && z.imag.to_s[0] == '-')
- sqrt(z.conjugate).conjugate
- else
- r = z.abs
- x = z.real
- Complex(sqrt!((r + x) / 2.0), sqrt!((r - x) / 2.0))
- end
+ if z.imag < 0 ||
+ (z.imag == 0 && z.imag.to_s[0] == '-')
+ sqrt(z.conjugate).conjugate
+ else
+ r = z.abs
+ x = z.real
+ Complex(sqrt!((r + x) / 2.0), sqrt!((r - x) / 2.0))
+ end
end
rescue NoMethodError
handle_no_method_error
@@ -153,10 +153,10 @@ module CMath
def sin(z)
begin
if z.real?
- sin!(z)
+ sin!(z)
else
- Complex(sin!(z.real) * cosh!(z.imag),
- cos!(z.real) * sinh!(z.imag))
+ Complex(sin!(z.real) * cosh!(z.imag),
+ cos!(z.real) * sinh!(z.imag))
end
rescue NoMethodError
handle_no_method_error
@@ -168,10 +168,10 @@ module CMath
def cos(z)
begin
if z.real?
- cos!(z)
+ cos!(z)
else
- Complex(cos!(z.real) * cosh!(z.imag),
- -sin!(z.real) * sinh!(z.imag))
+ Complex(cos!(z.real) * cosh!(z.imag),
+ -sin!(z.real) * sinh!(z.imag))
end
rescue NoMethodError
handle_no_method_error
@@ -183,9 +183,9 @@ module CMath
def tan(z)
begin
if z.real?
- tan!(z)
+ tan!(z)
else
- sin(z) / cos(z)
+ sin(z) / cos(z)
end
rescue NoMethodError
handle_no_method_error
@@ -197,10 +197,10 @@ module CMath
def sinh(z)
begin
if z.real?
- sinh!(z)
+ sinh!(z)
else
- Complex(sinh!(z.real) * cos!(z.imag),
- cosh!(z.real) * sin!(z.imag))
+ Complex(sinh!(z.real) * cos!(z.imag),
+ cosh!(z.real) * sin!(z.imag))
end
rescue NoMethodError
handle_no_method_error
@@ -212,10 +212,10 @@ module CMath
def cosh(z)
begin
if z.real?
- cosh!(z)
+ cosh!(z)
else
- Complex(cosh!(z.real) * cos!(z.imag),
- sinh!(z.real) * sin!(z.imag))
+ Complex(cosh!(z.real) * cos!(z.imag),
+ sinh!(z.real) * sin!(z.imag))
end
rescue NoMethodError
handle_no_method_error
@@ -227,9 +227,9 @@ module CMath
def tanh(z)
begin
if z.real?
- tanh!(z)
+ tanh!(z)
else
- sinh(z) / cosh(z)
+ sinh(z) / cosh(z)
end
rescue NoMethodError
handle_no_method_error
@@ -241,9 +241,9 @@ module CMath
def asin(z)
begin
if z.real? and z >= -1 and z <= 1
- asin!(z)
+ asin!(z)
else
- (-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z))
+ (-1.0).i * log(1.0.i * z + sqrt(1.0 - z * z))
end
rescue NoMethodError
handle_no_method_error
@@ -255,9 +255,9 @@ module CMath
def acos(z)
begin
if z.real? and z >= -1 and z <= 1
- acos!(z)
+ acos!(z)
else
- (-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z))
+ (-1.0).i * log(z + 1.0.i * sqrt(1.0 - z * z))
end
rescue NoMethodError
handle_no_method_error
@@ -269,9 +269,9 @@ module CMath
def atan(z)
begin
if z.real?
- atan!(z)
+ atan!(z)
else
- 1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0
+ 1.0.i * log((1.0.i + z) / (1.0.i - z)) / 2.0
end
rescue NoMethodError
handle_no_method_error
@@ -284,9 +284,9 @@ module CMath
def atan2(y,x)
begin
if y.real? and x.real?
- atan2!(y,x)
+ atan2!(y,x)
else
- (-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y))
+ (-1.0).i * log((x + 1.0.i * y) / sqrt(x * x + y * y))
end
rescue NoMethodError
handle_no_method_error
@@ -298,9 +298,9 @@ module CMath
def asinh(z)
begin
if z.real?
- asinh!(z)
+ asinh!(z)
else
- log(z + sqrt(1.0 + z * z))
+ log(z + sqrt(1.0 + z * z))
end
rescue NoMethodError
handle_no_method_error
@@ -312,9 +312,9 @@ module CMath
def acosh(z)
begin
if z.real? and z >= 1
- acosh!(z)
+ acosh!(z)
else
- log(z + sqrt(z * z - 1.0))
+ log(z + sqrt(z * z - 1.0))
end
rescue NoMethodError
handle_no_method_error
@@ -326,9 +326,9 @@ module CMath
def atanh(z)
begin
if z.real? and z >= -1 and z <= 1
- atanh!(z)
+ atanh!(z)
else
- log((1.0 + z) / (1.0 - z)) / 2.0
+ log((1.0 + z) / (1.0 - z)) / 2.0
end
rescue NoMethodError
handle_no_method_error
diff --git a/lib/complex.rb b/lib/complex.rb
deleted file mode 100644
index 9c57ecdf7a..0000000000
--- a/lib/complex.rb
+++ /dev/null
@@ -1,28 +0,0 @@
-# :enddoc:
-
-warn('lib/complex.rb is deprecated') if $VERBOSE
-
-require 'cmath'
-
-unless defined?(Math.exp!)
- Object.instance_eval{remove_const :Math}
- Math = CMath
-end
-
-def Complex.generic? (other)
- other.kind_of?(Integer) ||
- other.kind_of?(Float) ||
- other.kind_of?(Rational)
-end
-
-class Complex
-
- alias image imag
-
-end
-
-class Numeric
-
- def im() Complex(0, self) end
-
-end
diff --git a/lib/csv.rb b/lib/csv.rb
index b8a9b97f16..60b22e76ba 100644
--- a/lib/csv.rb
+++ b/lib/csv.rb
@@ -992,8 +992,8 @@ class CSV
HeaderConverters = {
downcase: lambda { |h| h.encode(ConverterEncoding).downcase },
symbol: lambda { |h|
- h.encode(ConverterEncoding).downcase.gsub(/\s+/, "_").
- gsub(/\W+/, "").to_sym
+ h.encode(ConverterEncoding).downcase.strip.gsub(/\s+/, "_").
+ gsub(/\W+/, "").to_sym
}
}
@@ -1260,7 +1260,12 @@ class CSV
file_opts = {encoding: Encoding.default_external}.merge(file_opts)
retry
end
- csv = new(f, options)
+ begin
+ csv = new(f, options)
+ rescue Exception
+ f.close
+ raise
+ end
# handle blocks like Ruby's open(), not like the CSV library
if block_given?
@@ -1396,7 +1401,7 @@ class CSV
# <tt>'</tt> as the quote character
# instead of the correct <tt>"</tt>.
# CSV will always consider a double
- # sequence this character to be an
+ # sequence of this character to be an
# escaped quote. This String will be
# transcoded into the data's Encoding
# before parsing.
@@ -1484,6 +1489,10 @@ class CSV
# so be sure to set what you want here.
#
def initialize(data, options = Hash.new)
+ if data.nil?
+ raise ArgumentError.new("Cannot parse nil as CSV")
+ end
+
# build the options for this read/write
options = DEFAULT_OPTIONS.merge(options)
@@ -2171,6 +2180,7 @@ class CSV
fields.map.with_index do |field, index|
converters.each do |converter|
+ break if field.nil?
field = if converter.arity == 1 # straight field converter
converter[field]
else # FieldInfo converter
diff --git a/lib/delegate.rb b/lib/delegate.rb
index d7902292f0..f2b1388107 100644
--- a/lib/delegate.rb
+++ b/lib/delegate.rb
@@ -62,6 +62,12 @@ class Delegator < BasicObject
end
# :startdoc:
+ ##
+ # :method: raise
+ # Use __raise__ if your Delegator does not have a object to delegate the
+ # raise method call.
+ #
+
#
# Pass in the _obj_ to delegate method calls to. All methods supported by
# _obj_ will be delegated to.
@@ -248,7 +254,7 @@ end
#
# class User
# def born_on
-# Date.new(1989, 09, 10)
+# Date.new(1989, 9, 10)
# end
# end
#
@@ -409,37 +415,3 @@ def DelegateClass(superclass)
end
return klass
end
-
-# :enddoc:
-
-if __FILE__ == $0
- class ExtArray<DelegateClass(Array)
- def initialize()
- super([])
- end
- end
-
- ary = ExtArray.new
- p ary.class
- ary.push 25
- p ary
- ary.push 42
- ary.each {|x| p x}
-
- foo = Object.new
- def foo.test
- 25
- end
- def foo.iter
- yield self
- end
- def foo.error
- raise 'this is OK'
- end
- foo2 = SimpleDelegator.new(foo)
- p foo2
- foo2.instance_eval{print "foo\n"}
- p foo.test == foo2.test # => true
- p foo2.iter{[55,true]} # => true
- foo2.error # raise error!
-end
diff --git a/lib/drb/acl.rb b/lib/drb/acl.rb
index 29a378199f..72e034e960 100644
--- a/lib/drb/acl.rb
+++ b/lib/drb/acl.rb
@@ -223,28 +223,10 @@ class ACL
when 'deny'
@deny.add(domain)
else
- raise "Invalid ACL entry #{list.to_s}"
+ raise "Invalid ACL entry #{list}"
end
i += 2
end
end
end
-
-if __FILE__ == $0
- # example
- list = %w(deny all
- allow 192.168.1.1
- allow ::ffff:192.168.1.2
- allow 192.168.1.3
- )
-
- addr = ["AF_INET", 10, "lc630", "192.168.1.3"]
-
- acl = ACL.new
- p acl.allow_addr?(addr)
-
- acl = ACL.new(list, ACL::DENY_ALLOW)
- p acl.allow_addr?(addr)
-end
-
diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb
index 97965228bb..26f39b789f 100644
--- a/lib/drb/drb.rb
+++ b/lib/drb/drb.rb
@@ -177,6 +177,9 @@ require 'drb/eq'
# # Not necessary for this small example, but will be required
# # as soon as we pass a non-marshallable object as an argument
# # to a dRuby call.
+# #
+# # Note: this must be called at least once per process to take any effect.
+# # This is particularly important if your application forks.
# DRb.start_service
#
# timeserver = DRbObject.new_with_uri(SERVER_URI)
@@ -992,7 +995,7 @@ module DRb
def initialize(option)
@option = option.to_s
end
- attr :option
+ attr_reader :option
def to_s; @option; end
def ==(other)
@@ -1591,16 +1594,9 @@ module DRb
end
- if RUBY_VERSION >= '1.8'
- require 'drb/invokemethod'
- class InvokeMethod
- include InvokeMethod18Mixin
- end
- else
- require 'drb/invokemethod16'
- class InvokeMethod
- include InvokeMethod16Mixin
- end
+ require 'drb/invokemethod'
+ class InvokeMethod
+ include InvokeMethod18Mixin
end
# The main loop performed by a DRbServer's internal thread.
diff --git a/lib/drb/extserv.rb b/lib/drb/extserv.rb
index c70ced877c..327b553a25 100644
--- a/lib/drb/extserv.rb
+++ b/lib/drb/extserv.rb
@@ -41,33 +41,3 @@ module DRb
end
end
end
-
-# :stopdoc:
-
-if __FILE__ == $0
- class Foo
- include DRbUndumped
-
- def initialize(str)
- @str = str
- end
-
- def hello(it)
- "#{it}: #{self}"
- end
-
- def to_s
- @str
- end
- end
-
- cmd = ARGV.shift
- case cmd
- when 'itest1', 'itest2'
- front = Foo.new(cmd)
- manager = DRb::DRbServer.new(nil, front)
- es = DRb::ExtServ.new(ARGV.shift, ARGV.shift, manager)
- es.server.thread.join
- end
-end
-
diff --git a/lib/drb/ssl.rb b/lib/drb/ssl.rb
index 78c0038abc..dd4df4e129 100644
--- a/lib/drb/ssl.rb
+++ b/lib/drb/ssl.rb
@@ -327,7 +327,7 @@ module DRb
soc.close
end
begin
- ssl = @config.accept(soc)
+ ssl = @config.accept(soc)
rescue Exception
soc.close
raise
diff --git a/lib/e2mmap.rb b/lib/e2mmap.rb
index b75c431f92..1eb5b51678 100644
--- a/lib/e2mmap.rb
+++ b/lib/e2mmap.rb
@@ -52,7 +52,6 @@
#
#
module Exception2MessageMapper
- @RCS_ID='-$Id: e2mmap.rb,v 1.10 1999/02/17 12:33:17 keiju Exp keiju $-'
E2MM = Exception2MessageMapper # :nodoc:
@@ -142,8 +141,6 @@ module Exception2MessageMapper
def E2MM.Raise(klass = E2MM, err = nil, *rest)
if form = e2mm_message(klass, err)
b = $@.nil? ? caller(1) : $@
- #p $@
- #p __FILE__
b.shift if b[0] =~ /^#{Regexp.quote(__FILE__)}:/
raise err, sprintf(form, *rest), b
else
@@ -157,7 +154,6 @@ module Exception2MessageMapper
def E2MM.e2mm_message(klass, exp)
for c in klass.ancestors
if mes = @MessageMap[[c,exp]]
- #p mes
m = klass.instance_eval('"' + mes + '"')
return m
end
diff --git a/lib/erb.rb b/lib/erb.rb
index 3c3cabe209..c372f56da8 100644
--- a/lib/erb.rb
+++ b/lib/erb.rb
@@ -68,7 +68,7 @@ require "cgi/util"
# a magic comment, however, it returns a string in the encoding specified
# by the magic comment.
#
-# # -*- coding: UTF-8 -*-
+# # -*- coding: utf-8 -*-
# require 'erb'
#
# template = ERB.new <<EOF
@@ -548,7 +548,7 @@ class ERB
def initialize(compiler, enc=nil)
@compiler = compiler
@line = []
- @script = enc ? "#coding:#{enc.to_s}\n" : ""
+ @script = enc ? "#coding:#{enc}\n" : ""
@compiler.pre_cmd.each do |x|
push(x)
end
@@ -717,7 +717,7 @@ class ERB
comment = $1 if comment[/-\*-\s*(.*?)\s*-*-$/]
if %r"coding\s*[=:]\s*([[:alnum:]\-_]+)" =~ comment
enc = $1.sub(/-(?:mac|dos|unix)/i, '')
- enc = Encoding.find(enc)
+ Encoding.find(enc)
end
end
end
diff --git a/lib/fileutils.rb b/lib/fileutils.rb
index 335d60d4a2..23fd19310a 100644
--- a/lib/fileutils.rb
+++ b/lib/fileutils.rb
@@ -12,35 +12,37 @@
#
# === Module Functions
#
-# cd(dir, options)
-# cd(dir, options) {|dir| .... }
-# pwd()
-# mkdir(dir, options)
-# mkdir(list, options)
-# mkdir_p(dir, options)
-# mkdir_p(list, options)
-# rmdir(dir, options)
-# rmdir(list, options)
-# ln(old, new, options)
-# ln(list, destdir, options)
-# ln_s(old, new, options)
-# ln_s(list, destdir, options)
-# ln_sf(src, dest, options)
-# cp(src, dest, options)
-# cp(list, dir, options)
-# cp_r(src, dest, options)
-# cp_r(list, dir, options)
-# mv(src, dest, options)
-# mv(list, dir, options)
-# rm(list, options)
-# rm_r(list, options)
-# rm_rf(list, options)
-# install(src, dest, mode = <src's>, options)
-# chmod(mode, list, options)
-# chmod_R(mode, list, options)
-# chown(user, group, list, options)
-# chown_R(user, group, list, options)
-# touch(list, options)
+# require 'fileutils'
+#
+# FileUtils.cd(dir, options)
+# FileUtils.cd(dir, options) {|dir| .... }
+# FileUtils.pwd()
+# FileUtils.mkdir(dir, options)
+# FileUtils.mkdir(list, options)
+# FileUtils.mkdir_p(dir, options)
+# FileUtils.mkdir_p(list, options)
+# FileUtils.rmdir(dir, options)
+# FileUtils.rmdir(list, options)
+# FileUtils.ln(old, new, options)
+# FileUtils.ln(list, destdir, options)
+# FileUtils.ln_s(old, new, options)
+# FileUtils.ln_s(list, destdir, options)
+# FileUtils.ln_sf(src, dest, options)
+# FileUtils.cp(src, dest, options)
+# FileUtils.cp(list, dir, options)
+# FileUtils.cp_r(src, dest, options)
+# FileUtils.cp_r(list, dir, options)
+# FileUtils.mv(src, dest, options)
+# FileUtils.mv(list, dir, options)
+# FileUtils.rm(list, options)
+# FileUtils.rm_r(list, options)
+# FileUtils.rm_rf(list, options)
+# FileUtils.install(src, dest, mode = <src's>, options)
+# FileUtils.chmod(mode, list, options)
+# FileUtils.chmod_R(mode, list, options)
+# FileUtils.chown(user, group, list, options)
+# FileUtils.chown_R(user, group, list, options)
+# FileUtils.touch(list, options)
#
# The <tt>options</tt> parameter is a hash of options, taken from the list
# <tt>:force</tt>, <tt>:noop</tt>, <tt>:preserve</tt>, and <tt>:verbose</tt>.
@@ -53,15 +55,15 @@
#
# There are some `low level' methods, which do not accept any option:
#
-# copy_entry(src, dest, preserve = false, dereference = false)
-# copy_file(src, dest, preserve = false, dereference = true)
-# copy_stream(srcstream, deststream)
-# remove_entry(path, force = false)
-# remove_entry_secure(path, force = false)
-# remove_file(path, force = false)
-# compare_file(path_a, path_b)
-# compare_stream(stream_a, stream_b)
-# uptodate?(file, cmp_list)
+# FileUtils.copy_entry(src, dest, preserve = false, dereference = false)
+# FileUtils.copy_file(src, dest, preserve = false, dereference = true)
+# FileUtils.copy_stream(srcstream, deststream)
+# FileUtils.remove_entry(path, force = false)
+# FileUtils.remove_entry_secure(path, force = false)
+# FileUtils.remove_file(path, force = false)
+# FileUtils.compare_file(path_a, path_b)
+# FileUtils.compare_stream(stream_a, stream_b)
+# FileUtils.uptodate?(file, cmp_list)
#
# == module FileUtils::Verbose
#
@@ -136,7 +138,7 @@ module FileUtils
#
# Options: (none)
#
- # Returns true if +newer+ is newer than all +old_list+.
+ # Returns true if +new+ is newer than all +old_list+.
# Non-existent files are older than any file.
#
# FileUtils.uptodate?('hello.o', %w(hello.c hello.h)) or \
@@ -253,7 +255,7 @@ module FileUtils
private_module_function :fu_mkdir
#
- # Options: noop, verbose
+ # Options: parents, noop, verbose
#
# Removes one or more directories.
#
@@ -1098,49 +1100,37 @@ module FileUtils
begin
require 'etc'
+ rescue LoadError # rescue LoadError for miniruby
+ end
- def fu_get_uid(user) #:nodoc:
- return nil unless user
- case user
- when Integer
- user
- when /\A\d+\z/
- user.to_i
- else
- Etc.getpwnam(user).uid
- end
- end
- private_module_function :fu_get_uid
-
- def fu_get_gid(group) #:nodoc:
- return nil unless group
- case group
- when Integer
- group
- when /\A\d+\z/
- group.to_i
- else
- Etc.getgrnam(group).gid
- end
- end
- private_module_function :fu_get_gid
-
- rescue LoadError
- # need Win32 support???
-
- def fu_get_uid(user) #:nodoc:
- user # FIXME
+ def fu_get_uid(user) #:nodoc:
+ return nil unless user
+ case user
+ when Integer
+ user
+ when /\A\d+\z/
+ user.to_i
+ else
+ Etc.getpwnam(user) ? Etc.getpwnam(user).uid : nil
end
- private_module_function :fu_get_uid
-
- def fu_get_gid(group) #:nodoc:
- group # FIXME
+ end
+ private_module_function :fu_get_uid
+
+ def fu_get_gid(group) #:nodoc:
+ return nil unless group
+ case group
+ when Integer
+ group
+ when /\A\d+\z/
+ group.to_i
+ else
+ Etc.getgrnam(group) ? Etc.getgrnam(group).gid : nil
end
- private_module_function :fu_get_gid
end
+ private_module_function :fu_get_gid
#
- # Options: noop verbose
+ # Options: noop verbose mtime nocreate
#
# Updates modification time (mtime) and access time (atime) of file(s) in
# +list+. Files are created if they don't exist.
@@ -1368,7 +1358,7 @@ module FileUtils
when file?
copy_file dest
when directory?
- if !File.exist?(dest) and descendant_diretory?(dest, path)
+ if !File.exist?(dest) and descendant_directory?(dest, path)
raise ArgumentError, "cannot copy directory %s to itself %s" % [path, dest]
end
begin
@@ -1499,6 +1489,7 @@ module FileUtils
end
end
end
+ ensure
yield self
end
@@ -1563,7 +1554,7 @@ module FileUtils
end
SYSCASE = File::FNM_SYSCASE.nonzero? ? "-i" : ""
- def descendant_diretory?(descendant, ascendant)
+ def descendant_directory?(descendant, ascendant)
/\A(?#{SYSCASE}:#{Regexp.quote(ascendant)})#{DIRECTORY_TERM}/ =~ File.dirname(descendant)
end
end # class Entry_
@@ -1665,7 +1656,7 @@ module FileUtils
#
# Returns an Array of option names of the method +mid+.
#
- # p FileUtils.options(:rm) #=> ["noop", "verbose", "force"]
+ # p FileUtils.options_of(:rm) #=> ["noop", "verbose", "force"]
#
def FileUtils.options_of(mid)
OPT_TABLE[mid.to_s].map {|sym| sym.to_s }
diff --git a/lib/find.rb b/lib/find.rb
index d33c8bb16b..46e2512b9e 100644
--- a/lib/find.rb
+++ b/lib/find.rb
@@ -34,13 +34,12 @@ module Find
#
# See the +Find+ module documentation for an example.
#
- def find(*paths) # :yield: path
- block_given? or return enum_for(__method__, *paths)
+ def find(*paths, ignore_error: true) # :yield: path
+ block_given? or return enum_for(__method__, *paths, ignore_error: ignore_error)
fs_encoding = Encoding.find("filesystem")
paths.collect!{|d| raise Errno::ENOENT unless File.exist?(d); d.dup}.each do |path|
- path = path.to_path if path.respond_to? :to_path
enc = path.encoding == Encoding::US_ASCII ? fs_encoding : path.encoding
ps = [path]
while file = ps.shift
@@ -49,12 +48,14 @@ module Find
begin
s = File.lstat(file)
rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
+ raise unless ignore_error
next
end
if s.directory? then
begin
fs = Dir.entries(file, encoding: enc)
rescue Errno::ENOENT, Errno::EACCES, Errno::ENOTDIR, Errno::ELOOP, Errno::ENAMETOOLONG
+ raise unless ignore_error
next
end
fs.sort!
diff --git a/lib/gserver.rb b/lib/gserver.rb
deleted file mode 100644
index d7b4a0783e..0000000000
--- a/lib/gserver.rb
+++ /dev/null
@@ -1,310 +0,0 @@
-#
-# Copyright (C) 2001 John W. Small All Rights Reserved
-#
-# Author:: John W. Small
-# Documentation:: Gavin Sinclair
-# Licence:: Ruby License
-
-require "socket"
-require "thread"
-
-#
-# GServer implements a generic server, featuring thread pool management,
-# simple logging, and multi-server management. See HttpServer in
-# <tt>xmlrpc/httpserver.rb</tt> in the Ruby standard library for an example of
-# GServer in action.
-#
-# Any kind of application-level server can be implemented using this class.
-# It accepts multiple simultaneous connections from clients, up to an optional
-# maximum number. Several _services_ (i.e. one service per TCP port) can be
-# run simultaneously, and stopped at any time through the class method
-# <tt>GServer.stop(port)</tt>. All the threading issues are handled, saving
-# you the effort. All events are optionally logged, but you can provide your
-# own event handlers if you wish.
-#
-# == Example
-#
-# Using GServer is simple. Below we implement a simple time server, run it,
-# query it, and shut it down. Try this code in +irb+:
-#
-# require 'gserver'
-#
-# #
-# # A server that returns the time in seconds since 1970.
-# #
-# class TimeServer < GServer
-# def initialize(port=10001, *args)
-# super(port, *args)
-# end
-# def serve(io)
-# io.puts(Time.now.to_i)
-# end
-# end
-#
-# # Run the server with logging enabled (it's a separate thread).
-# server = TimeServer.new
-# server.audit = true # Turn logging on.
-# server.start
-#
-# # *** Now point your browser to http://localhost:10001 to see it working ***
-#
-# # See if it's still running.
-# GServer.in_service?(10001) # -> true
-# server.stopped? # -> false
-#
-# # Shut the server down gracefully.
-# server.shutdown
-#
-# # Alternatively, stop it immediately.
-# GServer.stop(10001)
-# # or, of course, "server.stop".
-#
-# All the business of accepting connections and exception handling is taken
-# care of. All we have to do is implement the method that actually serves the
-# client.
-#
-# === Advanced
-#
-# As the example above shows, the way to use GServer is to subclass it to
-# create a specific server, overriding the +serve+ method. You can override
-# other methods as well if you wish, perhaps to collect statistics, or emit
-# more detailed logging.
-#
-# * #connecting
-# * #disconnecting
-# * #starting
-# * #stopping
-#
-# The above methods are only called if auditing is enabled, via #audit=.
-#
-# You can also override #log and #error if, for example, you wish to use a
-# more sophisticated logging system.
-#
-class GServer
-
- DEFAULT_HOST = "127.0.0.1"
-
- def serve(io)
- end
-
- @@services = {} # Hash of opened ports, i.e. services
- @@servicesMutex = Mutex.new
-
- # Stop the server running on the given port, bound to the given host
- #
- # +port+:: port, as a Fixnum, of the server to stop
- # +host+:: host on which to find the server to stop
- def GServer.stop(port, host = DEFAULT_HOST)
- @@servicesMutex.synchronize {
- @@services[host][port].stop
- }
- end
-
- # Check if a server is running on the given port and host
- #
- # +port+:: port, as a Fixnum, of the server to check
- # +host+:: host on which to find the server to check
- #
- # Returns true if a server is running on that port and host.
- def GServer.in_service?(port, host = DEFAULT_HOST)
- @@services.has_key?(host) and
- @@services[host].has_key?(port)
- end
-
- # Stop the server
- def stop
- @connectionsMutex.synchronize {
- if @tcpServerThread
- @tcpServerThread.raise "stop"
- end
- }
- end
-
- # Returns true if the server has stopped.
- def stopped?
- @tcpServerThread == nil
- end
-
- # Schedule a shutdown for the server
- def shutdown
- @shutdown = true
- end
-
- # Return the current number of connected clients
- def connections
- @connections.size
- end
-
- # Join with the server thread
- def join
- @tcpServerThread.join if @tcpServerThread
- end
-
- # Port on which to listen, as a Fixnum
- attr_reader :port
- # Host on which to bind, as a String
- attr_reader :host
- # Maximum number of connections to accept at a time, as a Fixnum
- attr_reader :maxConnections
- # IO Device on which log messages should be written
- attr_accessor :stdlog
- # Set to true to cause the callbacks #connecting, #disconnecting, #starting,
- # and #stopping to be called during the server's lifecycle
- attr_accessor :audit
- # Set to true to show more detailed logging
- attr_accessor :debug
-
- # Called when a client connects, if auditing is enabled.
- #
- # +client+:: a TCPSocket instance representing the client that connected
- #
- # Return true to allow this client to connect, false to prevent it.
- def connecting(client)
- addr = client.peeraddr
- log("#{self.class.to_s} #{@host}:#{@port} client:#{addr[1]} " +
- "#{addr[2]}<#{addr[3]}> connect")
- true
- end
-
-
- # Called when a client disconnects, if audition is enabled.
- #
- # +clientPort+:: the port of the client that is connecting
- def disconnecting(clientPort)
- log("#{self.class.to_s} #{@host}:#{@port} " +
- "client:#{clientPort} disconnect")
- end
-
- protected :connecting, :disconnecting
-
- # Called when the server is starting up, if auditing is enabled.
- def starting()
- log("#{self.class.to_s} #{@host}:#{@port} start")
- end
-
- # Called when the server is shutting down, if auditing is enabled.
- def stopping()
- log("#{self.class.to_s} #{@host}:#{@port} stop")
- end
-
- protected :starting, :stopping
-
- # Called if #debug is true whenever an unhandled exception is raised.
- # This implementation simply logs the backtrace.
- #
- # +detail+:: the Exception that was caught
- def error(detail)
- log(detail.backtrace.join("\n"))
- end
-
- # Log a message to #stdlog, if it's defined. This implementation
- # outputs the timestamp and message to the log.
- #
- # +msg+:: the message to log
- def log(msg)
- if @stdlog
- @stdlog.puts("[#{Time.new.ctime}] %s" % msg)
- @stdlog.flush
- end
- end
-
- protected :error, :log
-
- # Create a new server
- #
- # +port+:: the port, as a Fixnum, on which to listen
- # +host+:: the host to bind to
- # +maxConnections+:: the maximum number of simultaneous connections to
- # accept
- # +stdlog+:: IO device on which to log messages
- # +audit+:: if true, lifecycle callbacks will be called. See #audit
- # +debug+:: if true, error messages are logged. See #debug
- def initialize(port, host = DEFAULT_HOST, maxConnections = 4,
- stdlog = $stderr, audit = false, debug = false)
- @tcpServerThread = nil
- @port = port
- @host = host
- @maxConnections = maxConnections
- @connections = []
- @connectionsMutex = Mutex.new
- @connectionsCV = ConditionVariable.new
- @stdlog = stdlog
- @audit = audit
- @debug = debug
- end
-
- # Start the server if it isn't already running
- #
- # +maxConnections+::
- # override +maxConnections+ given to the constructor. A negative
- # value indicates that the value from the constructor should be used.
- def start(maxConnections = -1)
- raise "server is already running" if !stopped?
- @shutdown = false
- @maxConnections = maxConnections if maxConnections > 0
- @@servicesMutex.synchronize {
- if GServer.in_service?(@port,@host)
- raise "Port already in use: #{host}:#{@port}!"
- end
- @tcpServer = TCPServer.new(@host,@port)
- @port = @tcpServer.addr[1]
- @@services[@host] = {} unless @@services.has_key?(@host)
- @@services[@host][@port] = self;
- }
- @tcpServerThread = Thread.new {
- begin
- starting if @audit
- while !@shutdown
- @connectionsMutex.synchronize {
- while @connections.size >= @maxConnections
- @connectionsCV.wait(@connectionsMutex)
- end
- }
- client = @tcpServer.accept
- Thread.new(client) { |myClient|
- @connections << Thread.current
- begin
- myPort = myClient.peeraddr[1]
- serve(myClient) if !@audit or connecting(myClient)
- rescue => detail
- error(detail) if @debug
- ensure
- begin
- myClient.close
- rescue
- end
- @connectionsMutex.synchronize {
- @connections.delete(Thread.current)
- @connectionsCV.signal
- }
- disconnecting(myPort) if @audit
- end
- }
- end
- rescue => detail
- error(detail) if @debug
- ensure
- begin
- @tcpServer.close
- rescue
- end
- if @shutdown
- @connectionsMutex.synchronize {
- while @connections.size > 0
- @connectionsCV.wait(@connectionsMutex)
- end
- }
- else
- @connections.each { |c| c.raise "stop" }
- end
- @tcpServerThread = nil
- @@servicesMutex.synchronize {
- @@services[@host].delete(@port)
- }
- stopping if @audit
- end
- }
- self
- end
-
-end
diff --git a/lib/ipaddr.rb b/lib/ipaddr.rb
index 13016fcbba..4b5f784ae0 100644
--- a/lib/ipaddr.rb
+++ b/lib/ipaddr.rb
@@ -656,280 +656,3 @@ unless Socket.const_defined? :AF_INET6
end
end
end
-
-if $0 == __FILE__
- eval DATA.read, nil, $0, __LINE__+4
-end
-
-__END__
-
-require 'test/unit'
-
-class TC_IPAddr < Test::Unit::TestCase
- def test_s_new
- [
- ["3FFE:505:ffff::/48"],
- ["0:0:0:1::"],
- ["2001:200:300::/48"],
- ["2001:200:300::192.168.1.2/48"],
- ["1:2:3:4:5:6:7::"],
- ["::2:3:4:5:6:7:8"],
- ].each { |args|
- assert_nothing_raised {
- IPAddr.new(*args)
- }
- }
-
- a = IPAddr.new
- assert_equal("::", a.to_s)
- assert_equal("0000:0000:0000:0000:0000:0000:0000:0000", a.to_string)
- assert_equal(Socket::AF_INET6, a.family)
-
- a = IPAddr.new("0123:4567:89ab:cdef:0ABC:DEF0:1234:5678")
- assert_equal("123:4567:89ab:cdef:abc:def0:1234:5678", a.to_s)
- assert_equal("0123:4567:89ab:cdef:0abc:def0:1234:5678", a.to_string)
- assert_equal(Socket::AF_INET6, a.family)
-
- a = IPAddr.new("3ffe:505:2::/48")
- assert_equal("3ffe:505:2::", a.to_s)
- assert_equal("3ffe:0505:0002:0000:0000:0000:0000:0000", a.to_string)
- assert_equal(Socket::AF_INET6, a.family)
- assert_equal(false, a.ipv4?)
- assert_equal(true, a.ipv6?)
- assert_equal("#<IPAddr: IPv6:3ffe:0505:0002:0000:0000:0000:0000:0000/ffff:ffff:ffff:0000:0000:0000:0000:0000>", a.inspect)
-
- a = IPAddr.new("3ffe:505:2::/ffff:ffff:ffff::")
- assert_equal("3ffe:505:2::", a.to_s)
- assert_equal("3ffe:0505:0002:0000:0000:0000:0000:0000", a.to_string)
- assert_equal(Socket::AF_INET6, a.family)
-
- a = IPAddr.new("0.0.0.0")
- assert_equal("0.0.0.0", a.to_s)
- assert_equal("0.0.0.0", a.to_string)
- assert_equal(Socket::AF_INET, a.family)
-
- a = IPAddr.new("192.168.1.2")
- assert_equal("192.168.1.2", a.to_s)
- assert_equal("192.168.1.2", a.to_string)
- assert_equal(Socket::AF_INET, a.family)
- assert_equal(true, a.ipv4?)
- assert_equal(false, a.ipv6?)
-
- a = IPAddr.new("192.168.1.2/24")
- assert_equal("192.168.1.0", a.to_s)
- assert_equal("192.168.1.0", a.to_string)
- assert_equal(Socket::AF_INET, a.family)
- assert_equal("#<IPAddr: IPv4:192.168.1.0/255.255.255.0>", a.inspect)
-
- a = IPAddr.new("192.168.1.2/255.255.255.0")
- assert_equal("192.168.1.0", a.to_s)
- assert_equal("192.168.1.0", a.to_string)
- assert_equal(Socket::AF_INET, a.family)
-
- assert_equal("0:0:0:1::", IPAddr.new("0:0:0:1::").to_s)
- assert_equal("2001:200:300::", IPAddr.new("2001:200:300::/48").to_s)
-
- assert_equal("2001:200:300::", IPAddr.new("[2001:200:300::]/48").to_s)
- assert_equal("1:2:3:4:5:6:7:0", IPAddr.new("1:2:3:4:5:6:7::").to_s)
- assert_equal("0:2:3:4:5:6:7:8", IPAddr.new("::2:3:4:5:6:7:8").to_s)
-
- assert_raises(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.256") }
- assert_raises(IPAddr::InvalidAddressError) { IPAddr.new("192.168.0.011") }
- assert_raises(IPAddr::InvalidAddressError) { IPAddr.new("fe80::1%fxp0") }
- assert_raises(IPAddr::InvalidAddressError) { IPAddr.new("[192.168.1.2]/120") }
- assert_raises(IPAddr::InvalidPrefixError) { IPAddr.new("::1/255.255.255.0") }
- assert_raises(IPAddr::InvalidPrefixError) { IPAddr.new("::1/129") }
- assert_raises(IPAddr::InvalidPrefixError) { IPAddr.new("192.168.0.1/33") }
- assert_raises(IPAddr::AddressFamilyError) { IPAddr.new(1) }
- assert_raises(IPAddr::AddressFamilyError) { IPAddr.new("::ffff:192.168.1.2/120", Socket::AF_INET) }
- end
-
- def test_s_new_ntoh
- addr = ''
- IPAddr.new("1234:5678:9abc:def0:1234:5678:9abc:def0").hton.each_byte { |c|
- addr += sprintf("%02x", c)
- }
- assert_equal("123456789abcdef0123456789abcdef0", addr)
- addr = ''
- IPAddr.new("123.45.67.89").hton.each_byte { |c|
- addr += sprintf("%02x", c)
- }
- assert_equal(sprintf("%02x%02x%02x%02x", 123, 45, 67, 89), addr)
- a = IPAddr.new("3ffe:505:2::")
- assert_equal("3ffe:505:2::", IPAddr.new_ntoh(a.hton).to_s)
- a = IPAddr.new("192.168.2.1")
- assert_equal("192.168.2.1", IPAddr.new_ntoh(a.hton).to_s)
- end
-
- def test_ipv4_compat
- a = IPAddr.new("::192.168.1.2")
- assert_equal("::192.168.1.2", a.to_s)
- assert_equal("0000:0000:0000:0000:0000:0000:c0a8:0102", a.to_string)
- assert_equal(Socket::AF_INET6, a.family)
- assert_equal(true, a.ipv4_compat?)
- b = a.native
- assert_equal("192.168.1.2", b.to_s)
- assert_equal(Socket::AF_INET, b.family)
- assert_equal(false, b.ipv4_compat?)
-
- a = IPAddr.new("192.168.1.2")
- b = a.ipv4_compat
- assert_equal("::192.168.1.2", b.to_s)
- assert_equal(Socket::AF_INET6, b.family)
- end
-
- def test_ipv4_mapped
- a = IPAddr.new("::ffff:192.168.1.2")
- assert_equal("::ffff:192.168.1.2", a.to_s)
- assert_equal("0000:0000:0000:0000:0000:ffff:c0a8:0102", a.to_string)
- assert_equal(Socket::AF_INET6, a.family)
- assert_equal(true, a.ipv4_mapped?)
- b = a.native
- assert_equal("192.168.1.2", b.to_s)
- assert_equal(Socket::AF_INET, b.family)
- assert_equal(false, b.ipv4_mapped?)
-
- a = IPAddr.new("192.168.1.2")
- b = a.ipv4_mapped
- assert_equal("::ffff:192.168.1.2", b.to_s)
- assert_equal(Socket::AF_INET6, b.family)
- end
-
- def test_reverse
- assert_equal("f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.ip6.arpa", IPAddr.new("3ffe:505:2::f").reverse)
- assert_equal("1.2.168.192.in-addr.arpa", IPAddr.new("192.168.2.1").reverse)
- end
-
- def test_ip6_arpa
- assert_equal("f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.ip6.arpa", IPAddr.new("3ffe:505:2::f").ip6_arpa)
- assert_raises(IPAddr::InvalidAddressError) {
- IPAddr.new("192.168.2.1").ip6_arpa
- }
- end
-
- def test_ip6_int
- assert_equal("f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.2.0.0.0.5.0.5.0.e.f.f.3.ip6.int", IPAddr.new("3ffe:505:2::f").ip6_int)
- assert_raises(IPAddr::InvalidAddressError) {
- IPAddr.new("192.168.2.1").ip6_int
- }
- end
-
- def test_to_s
- assert_equal("3ffe:0505:0002:0000:0000:0000:0000:0001", IPAddr.new("3ffe:505:2::1").to_string)
- assert_equal("3ffe:505:2::1", IPAddr.new("3ffe:505:2::1").to_s)
- end
-end
-
-class TC_Operator < Test::Unit::TestCase
-
- IN6MASK32 = "ffff:ffff::"
- IN6MASK128 = "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"
-
- def setup
- @in6_addr_any = IPAddr.new()
- @a = IPAddr.new("3ffe:505:2::/48")
- @b = IPAddr.new("0:0:0:1::")
- @c = IPAddr.new(IN6MASK32)
- end
- alias set_up setup
-
- def test_or
- assert_equal("3ffe:505:2:1::", (@a | @b).to_s)
- a = @a
- a |= @b
- assert_equal("3ffe:505:2:1::", a.to_s)
- assert_equal("3ffe:505:2::", @a.to_s)
- assert_equal("3ffe:505:2:1::",
- (@a | 0x00000000000000010000000000000000).to_s)
- end
-
- def test_and
- assert_equal("3ffe:505::", (@a & @c).to_s)
- a = @a
- a &= @c
- assert_equal("3ffe:505::", a.to_s)
- assert_equal("3ffe:505:2::", @a.to_s)
- assert_equal("3ffe:505::", (@a & 0xffffffff000000000000000000000000).to_s)
- end
-
- def test_shift_right
- assert_equal("0:3ffe:505:2::", (@a >> 16).to_s)
- a = @a
- a >>= 16
- assert_equal("0:3ffe:505:2::", a.to_s)
- assert_equal("3ffe:505:2::", @a.to_s)
- end
-
- def test_shift_left
- assert_equal("505:2::", (@a << 16).to_s)
- a = @a
- a <<= 16
- assert_equal("505:2::", a.to_s)
- assert_equal("3ffe:505:2::", @a.to_s)
- end
-
- def test_carrot
- a = ~@in6_addr_any
- assert_equal(IN6MASK128, a.to_s)
- assert_equal("::", @in6_addr_any.to_s)
- end
-
- def test_equal
- assert_equal(true, @a == IPAddr.new("3FFE:505:2::"))
- assert_equal(true, @a == IPAddr.new("3ffe:0505:0002::"))
- assert_equal(true, @a == IPAddr.new("3ffe:0505:0002:0:0:0:0:0"))
- assert_equal(false, @a == IPAddr.new("3ffe:505:3::"))
- assert_equal(true, @a != IPAddr.new("3ffe:505:3::"))
- assert_equal(false, @a != IPAddr.new("3ffe:505:2::"))
- end
-
- def test_mask
- a = @a.mask(32)
- assert_equal("3ffe:505::", a.to_s)
- assert_equal("3ffe:505:2::", @a.to_s)
- end
-
- def test_include?
- assert_equal(true, @a.include?(IPAddr.new("3ffe:505:2::")))
- assert_equal(true, @a.include?(IPAddr.new("3ffe:505:2::1")))
- assert_equal(false, @a.include?(IPAddr.new("3ffe:505:3::")))
- net1 = IPAddr.new("192.168.2.0/24")
- assert_equal(true, net1.include?(IPAddr.new("192.168.2.0")))
- assert_equal(true, net1.include?(IPAddr.new("192.168.2.255")))
- assert_equal(false, net1.include?(IPAddr.new("192.168.3.0")))
- # test with integer parameter
- int = (192 << 24) + (168 << 16) + (2 << 8) + 13
-
- assert_equal(true, net1.include?(int))
- assert_equal(false, net1.include?(int+255))
-
- end
-
- def test_hash
- a1 = IPAddr.new('192.168.2.0')
- a2 = IPAddr.new('192.168.2.0')
- a3 = IPAddr.new('3ffe:505:2::1')
- a4 = IPAddr.new('3ffe:505:2::1')
- a5 = IPAddr.new('127.0.0.1')
- a6 = IPAddr.new('::1')
- a7 = IPAddr.new('192.168.2.0/25')
- a8 = IPAddr.new('192.168.2.0/25')
-
- h = { a1 => 'ipv4', a2 => 'ipv4', a3 => 'ipv6', a4 => 'ipv6', a5 => 'ipv4', a6 => 'ipv6', a7 => 'ipv4', a8 => 'ipv4'}
- assert_equal(5, h.size)
- assert_equal('ipv4', h[a1])
- assert_equal('ipv4', h[a2])
- assert_equal('ipv6', h[a3])
- assert_equal('ipv6', h[a4])
-
- require 'set'
- s = Set[a1, a2, a3, a4, a5, a6, a7, a8]
- assert_equal(5, s.size)
- assert_equal(true, s.include?(a1))
- assert_equal(true, s.include?(a2))
- assert_equal(true, s.include?(a3))
- assert_equal(true, s.include?(a4))
- assert_equal(true, s.include?(a5))
- assert_equal(true, s.include?(a6))
- end
-end
diff --git a/lib/irb.rb b/lib/irb.rb
index 20390d2205..09556c8bc5 100644
--- a/lib/irb.rb
+++ b/lib/irb.rb
@@ -13,7 +13,6 @@ require "e2mmap"
require "irb/init"
require "irb/context"
require "irb/extend-command"
-#require "irb/workspace"
require "irb/ruby-lex"
require "irb/input-method"
@@ -138,8 +137,8 @@ STDOUT.sync = true
# This example can be used in your +.irbrc+
#
# IRB.conf[:PROMPT][:MY_PROMPT] = { # name of prompt mode
-# :AUTO_INDENT => true # enables auto-indent mode
-# :PROMPT_I => nil, # normal prompt
+# :AUTO_INDENT => true, # enables auto-indent mode
+# :PROMPT_I => ">> ", # simple prompt
# :PROMPT_S => nil, # prompt for continuated strings
# :PROMPT_C => nil, # prompt for continuated statement
# :RETURN => " ==>%s\n" # format to return value
@@ -158,7 +157,7 @@ STDOUT.sync = true
# %m # to_s of main object (self)
# %M # inspect of main object (self)
# %l # type of string(", ', /, ]), `]' is inner %w[...]
-# %NNi # indent level. NN is degits and means as same as printf("%NNd").
+# %NNi # indent level. NN is digits and means as same as printf("%NNd").
# # It can be ommited
# %NNn # line number.
# %% # %
@@ -337,7 +336,6 @@ STDOUT.sync = true
# # quit irb
# irb(main):010:0> exit
module IRB
- @RCS_ID='-$Id$-'
# An exception raised by IRB.irb_abort
class Abort < Exception;end
@@ -399,7 +397,6 @@ module IRB
ensure
irb_at_exit
end
-# print "\n"
end
# Calls each event hook of IRB.conf[:AT_EXIT] when the current session quits.
@@ -499,7 +496,7 @@ module IRB
end
if exc
print exc.class, ": ", exc, "\n"
- if exc.backtrace[0] =~ /irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/ &&
+ if exc.backtrace && exc.backtrace[0] =~ /irb(2)?(\/.*|-.*|\.rb)?:/ && exc.class.to_s !~ /^IRB/ &&
!(SyntaxError === exc)
irb_bug = true
else
@@ -509,16 +506,18 @@ module IRB
messages = []
lasts = []
levels = 0
- for m in exc.backtrace
- m = @context.workspace.filter_backtrace(m) unless irb_bug
- if m
- if messages.size < @context.back_trace_limit
- messages.push "\tfrom "+m
- else
- lasts.push "\tfrom "+m
- if lasts.size > @context.back_trace_limit
- lasts.shift
- levels += 1
+ if exc.backtrace
+ for m in exc.backtrace
+ m = @context.workspace.filter_backtrace(m) unless irb_bug
+ if m
+ if messages.size < @context.back_trace_limit
+ messages.push "\tfrom "+m
+ else
+ lasts.push "\tfrom "+m
+ if lasts.size > @context.back_trace_limit
+ lasts.shift
+ levels += 1
+ end
end
end
end
diff --git a/lib/irb/cmd/chws.rb b/lib/irb/cmd/chws.rb
index 1889e75d5e..8c0260627e 100644
--- a/lib/irb/cmd/chws.rb
+++ b/lib/irb/cmd/chws.rb
@@ -18,14 +18,14 @@ module IRB
class CurrentWorkingWorkspace<Nop
def execute(*obj)
- irb_context.main
+ irb_context.main
end
end
class ChangeWorkspace<Nop
def execute(*obj)
- irb_context.change_workspace(*obj)
- irb_context.main
+ irb_context.change_workspace(*obj)
+ irb_context.main
end
end
end
diff --git a/lib/irb/cmd/fork.rb b/lib/irb/cmd/fork.rb
index fbe5126c85..1e02edac63 100644
--- a/lib/irb/cmd/fork.rb
+++ b/lib/irb/cmd/fork.rb
@@ -9,27 +9,26 @@
#
#
-@RCS_ID='-$Id$-'
# :stopdoc:
module IRB
module ExtendCommand
class Fork<Nop
def execute
- pid = send ExtendCommand.irb_original_method_name("fork")
- unless pid
- class << self
- alias_method :exit, ExtendCommand.irb_original_method_name('exit')
- end
- if iterator?
- begin
- yield
- ensure
- exit
- end
- end
- end
- pid
+ pid = send ExtendCommand.irb_original_method_name("fork")
+ unless pid
+ class << self
+ alias_method :exit, ExtendCommand.irb_original_method_name('exit')
+ end
+ if iterator?
+ begin
+ yield
+ ensure
+ exit
+ end
+ end
+ end
+ pid
end
end
end
diff --git a/lib/irb/cmd/load.rb b/lib/irb/cmd/load.rb
index 6c9e9f67ce..acda9d0c8c 100644
--- a/lib/irb/cmd/load.rb
+++ b/lib/irb/cmd/load.rb
@@ -19,8 +19,7 @@ module IRB
include IrbLoader
def execute(file_name, priv = nil)
-# return ruby_load(file_name) unless IRB.conf[:USE_LOADER]
- return irb_load(file_name, priv)
+ return irb_load(file_name, priv)
end
end
@@ -28,38 +27,37 @@ module IRB
include IrbLoader
def execute(file_name)
-# return ruby_require(file_name) unless IRB.conf[:USE_LOADER]
- rex = Regexp.new("#{Regexp.quote(file_name)}(\.o|\.rb)?")
- return false if $".find{|f| f =~ rex}
+ rex = Regexp.new("#{Regexp.quote(file_name)}(\.o|\.rb)?")
+ return false if $".find{|f| f =~ rex}
- case file_name
- when /\.rb$/
- begin
- if irb_load(file_name)
- $".push file_name
- return true
- end
- rescue LoadError
- end
- when /\.(so|o|sl)$/
- return ruby_require(file_name)
- end
+ case file_name
+ when /\.rb$/
+ begin
+ if irb_load(file_name)
+ $".push file_name
+ return true
+ end
+ rescue LoadError
+ end
+ when /\.(so|o|sl)$/
+ return ruby_require(file_name)
+ end
- begin
- irb_load(f = file_name + ".rb")
- $".push f
- return true
- rescue LoadError
- return ruby_require(file_name)
- end
+ begin
+ irb_load(f = file_name + ".rb")
+ $".push f
+ return true
+ rescue LoadError
+ return ruby_require(file_name)
+ end
end
end
class Source<Nop
include IrbLoader
def execute(file_name)
- source_file(file_name)
+ source_file(file_name)
end
end
end
diff --git a/lib/irb/cmd/nop.rb b/lib/irb/cmd/nop.rb
index 7bd443121e..60379f016a 100644
--- a/lib/irb/cmd/nop.rb
+++ b/lib/irb/cmd/nop.rb
@@ -13,25 +13,24 @@ module IRB
module ExtendCommand
class Nop
- @RCS_ID='-$Id$-'
def self.execute(conf, *opts)
- command = new(conf)
- command.execute(*opts)
+ command = new(conf)
+ command.execute(*opts)
end
def initialize(conf)
- @irb_context = conf
+ @irb_context = conf
end
attr_reader :irb_context
def irb
- @irb_context.irb
+ @irb_context.irb
end
def execute(*opts)
- #nop
+ #nop
end
end
end
diff --git a/lib/irb/cmd/pushws.rb b/lib/irb/cmd/pushws.rb
index cee8538e3e..0726a4377e 100644
--- a/lib/irb/cmd/pushws.rb
+++ b/lib/irb/cmd/pushws.rb
@@ -17,21 +17,21 @@ module IRB
module ExtendCommand
class Workspaces<Nop
def execute(*obj)
- irb_context.workspaces.collect{|ws| ws.main}
+ irb_context.workspaces.collect{|ws| ws.main}
end
end
class PushWorkspace<Workspaces
def execute(*obj)
- irb_context.push_workspace(*obj)
- super
+ irb_context.push_workspace(*obj)
+ super
end
end
class PopWorkspace<Workspaces
def execute(*obj)
- irb_context.pop_workspace(*obj)
- super
+ irb_context.pop_workspace(*obj)
+ super
end
end
end
diff --git a/lib/irb/cmd/subirb.rb b/lib/irb/cmd/subirb.rb
index 7363d64769..ccf4fc4bcd 100644
--- a/lib/irb/cmd/subirb.rb
+++ b/lib/irb/cmd/subirb.rb
@@ -16,25 +16,25 @@ module IRB
module ExtendCommand
class IrbCommand<Nop
def execute(*obj)
- IRB.irb(nil, *obj)
+ IRB.irb(nil, *obj)
end
end
class Jobs<Nop
def execute
- IRB.JobManager
+ IRB.JobManager
end
end
class Foreground<Nop
def execute(key)
- IRB.JobManager.switch(key)
+ IRB.JobManager.switch(key)
end
end
class Kill<Nop
def execute(*keys)
- IRB.JobManager.kill(*keys)
+ IRB.JobManager.kill(*keys)
end
end
end
diff --git a/lib/irb/completion.rb b/lib/irb/completion.rb
index c6f8a5889f..2d47f33d66 100644
--- a/lib/irb/completion.rb
+++ b/lib/irb/completion.rb
@@ -11,7 +11,6 @@ require "readline"
module IRB
module InputCompletor # :nodoc:
- @RCS_ID='-$Id$-'
# Set of reserved words used by Ruby, you should not use these for
# constants or variables
@@ -38,175 +37,169 @@ module IRB
CompletionProc = proc { |input|
bind = IRB.conf[:MAIN_CONTEXT].workspace.binding
-# puts "input: #{input}"
-
case input
when /^((["'`]).*\2)\.([^.]*)$/
- # String
- receiver = $1
- message = Regexp.quote($3)
+ # String
+ receiver = $1
+ message = Regexp.quote($3)
- candidates = String.instance_methods.collect{|m| m.to_s}
- select_message(receiver, message, candidates)
+ candidates = String.instance_methods.collect{|m| m.to_s}
+ select_message(receiver, message, candidates)
when /^(\/[^\/]*\/)\.([^.]*)$/
- # Regexp
- receiver = $1
- message = Regexp.quote($2)
+ # Regexp
+ receiver = $1
+ message = Regexp.quote($2)
- candidates = Regexp.instance_methods.collect{|m| m.to_s}
- select_message(receiver, message, candidates)
+ candidates = Regexp.instance_methods.collect{|m| m.to_s}
+ select_message(receiver, message, candidates)
when /^([^\]]*\])\.([^.]*)$/
- # Array
- receiver = $1
- message = Regexp.quote($2)
+ # Array
+ receiver = $1
+ message = Regexp.quote($2)
- candidates = Array.instance_methods.collect{|m| m.to_s}
- select_message(receiver, message, candidates)
+ candidates = Array.instance_methods.collect{|m| m.to_s}
+ select_message(receiver, message, candidates)
when /^([^\}]*\})\.([^.]*)$/
- # Proc or Hash
- receiver = $1
- message = Regexp.quote($2)
+ # Proc or Hash
+ receiver = $1
+ message = Regexp.quote($2)
- candidates = Proc.instance_methods.collect{|m| m.to_s}
- candidates |= Hash.instance_methods.collect{|m| m.to_s}
- select_message(receiver, message, candidates)
+ candidates = Proc.instance_methods.collect{|m| m.to_s}
+ candidates |= Hash.instance_methods.collect{|m| m.to_s}
+ select_message(receiver, message, candidates)
when /^(:[^:.]*)$/
- # Symbol
- if Symbol.respond_to?(:all_symbols)
- sym = $1
- candidates = Symbol.all_symbols.collect{|s| ":" + s.id2name}
- candidates.grep(/^#{Regexp.quote(sym)}/)
- else
- []
- end
+ # Symbol
+ if Symbol.respond_to?(:all_symbols)
+ sym = $1
+ candidates = Symbol.all_symbols.collect{|s| ":" + s.id2name}
+ candidates.grep(/^#{Regexp.quote(sym)}/)
+ else
+ []
+ end
when /^::([A-Z][^:\.\(]*)$/
- # Absolute Constant or class methods
- receiver = $1
- candidates = Object.constants.collect{|m| m.to_s}
- candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
+ # Absolute Constant or class methods
+ receiver = $1
+ candidates = Object.constants.collect{|m| m.to_s}
+ candidates.grep(/^#{receiver}/).collect{|e| "::" + e}
-# when /^(((::)?[A-Z][^:.\(]*)+)::?([^:.]*)$/
when /^([A-Z].*)::([^:.]*)$/
- # Constant or class methods
- receiver = $1
- message = Regexp.quote($2)
- begin
- candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
- candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
- rescue Exception
- candidates = []
- end
- select_message(receiver, message, candidates, "::")
+ # Constant or class methods
+ receiver = $1
+ message = Regexp.quote($2)
+ begin
+ candidates = eval("#{receiver}.constants.collect{|m| m.to_s}", bind)
+ candidates |= eval("#{receiver}.methods.collect{|m| m.to_s}", bind)
+ rescue Exception
+ candidates = []
+ end
+ select_message(receiver, message, candidates, "::")
when /^(:[^:.]+)(\.|::)([^.]*)$/
- # Symbol
- receiver = $1
- sep = $2
- message = Regexp.quote($3)
+ # Symbol
+ receiver = $1
+ sep = $2
+ message = Regexp.quote($3)
- candidates = Symbol.instance_methods.collect{|m| m.to_s}
- select_message(receiver, message, candidates, sep)
+ candidates = Symbol.instance_methods.collect{|m| m.to_s}
+ select_message(receiver, message, candidates, sep)
when /^(-?(0[dbo])?[0-9_]+(\.[0-9_]+)?([eE]-?[0-9]+)?)(\.|::)([^.]*)$/
- # Numeric
- receiver = $1
- sep = $5
- message = Regexp.quote($6)
-
- begin
- candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
- rescue Exception
- candidates = []
- end
- select_message(receiver, message, candidates, sep)
+ # Numeric
+ receiver = $1
+ sep = $5
+ message = Regexp.quote($6)
+
+ begin
+ candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
+ rescue Exception
+ candidates = []
+ end
+ select_message(receiver, message, candidates, sep)
when /^(-?0x[0-9a-fA-F_]+)(\.|::)([^.]*)$/
- # Numeric(0xFFFF)
- receiver = $1
- sep = $2
- message = Regexp.quote($3)
-
- begin
- candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
- rescue Exception
- candidates = []
- end
- select_message(receiver, message, candidates, sep)
+ # Numeric(0xFFFF)
+ receiver = $1
+ sep = $2
+ message = Regexp.quote($3)
+
+ begin
+ candidates = eval(receiver, bind).methods.collect{|m| m.to_s}
+ rescue Exception
+ candidates = []
+ end
+ select_message(receiver, message, candidates, sep)
when /^(\$[^.]*)$/
- # global var
- regmessage = Regexp.new(Regexp.quote($1))
- candidates = global_variables.collect{|m| m.to_s}.grep(regmessage)
+ # global var
+ regmessage = Regexp.new(Regexp.quote($1))
+ candidates = global_variables.collect{|m| m.to_s}.grep(regmessage)
-# when /^(\$?(\.?[^.]+)+)\.([^.]*)$/
-# when /^((\.?[^.]+)+)\.([^.]*)$/
-# when /^([^."].*)\.([^.]*)$/
when /^([^."].*)(\.|::)([^.]*)$/
- # variable.func or func.func
- receiver = $1
- sep = $2
- message = Regexp.quote($3)
-
- gv = eval("global_variables", bind).collect{|m| m.to_s}
- lv = eval("local_variables", bind).collect{|m| m.to_s}
- iv = eval("instance_variables", bind).collect{|m| m.to_s}
- cv = eval("self.class.constants", bind).collect{|m| m.to_s}
-
- if (gv | lv | iv | cv).include?(receiver) or /^[A-Z]/ =~ receiver && /\./ !~ receiver
- # foo.func and foo is var. OR
- # foo::func and foo is var. OR
- # foo::Const and foo is var. OR
- # Foo::Bar.func
- begin
- candidates = []
- rec = eval(receiver, bind)
- if sep == "::" and rec.kind_of?(Module)
- candidates = rec.constants.collect{|m| m.to_s}
- end
- candidates |= rec.methods.collect{|m| m.to_s}
- rescue Exception
- candidates = []
- end
- else
- # func1.func2
- candidates = []
- ObjectSpace.each_object(Module){|m|
- begin
- name = m.name
- rescue Exception
- name = ""
- end
+ # variable.func or func.func
+ receiver = $1
+ sep = $2
+ message = Regexp.quote($3)
+
+ gv = eval("global_variables", bind).collect{|m| m.to_s}
+ lv = eval("local_variables", bind).collect{|m| m.to_s}
+ iv = eval("instance_variables", bind).collect{|m| m.to_s}
+ cv = eval("self.class.constants", bind).collect{|m| m.to_s}
+
+ if (gv | lv | iv | cv).include?(receiver) or /^[A-Z]/ =~ receiver && /\./ !~ receiver
+ # foo.func and foo is var. OR
+ # foo::func and foo is var. OR
+ # foo::Const and foo is var. OR
+ # Foo::Bar.func
+ begin
+ candidates = []
+ rec = eval(receiver, bind)
+ if sep == "::" and rec.kind_of?(Module)
+ candidates = rec.constants.collect{|m| m.to_s}
+ end
+ candidates |= rec.methods.collect{|m| m.to_s}
+ rescue Exception
+ candidates = []
+ end
+ else
+ # func1.func2
+ candidates = []
+ ObjectSpace.each_object(Module){|m|
+ begin
+ name = m.name
+ rescue Exception
+ name = ""
+ end
begin
next if name != "IRB::Context" and
/^(IRB|SLex|RubyLex|RubyToken)/ =~ name
rescue Exception
next
end
- candidates.concat m.instance_methods(false).collect{|x| x.to_s}
- }
- candidates.sort!
- candidates.uniq!
- end
- select_message(receiver, message, candidates, sep)
+ candidates.concat m.instance_methods(false).collect{|x| x.to_s}
+ }
+ candidates.sort!
+ candidates.uniq!
+ end
+ select_message(receiver, message, candidates, sep)
when /^\.([^.]*)$/
- # unknown(maybe String)
+ # unknown(maybe String)
- receiver = ""
- message = Regexp.quote($1)
+ receiver = ""
+ message = Regexp.quote($1)
- candidates = String.instance_methods(true).collect{|m| m.to_s}
- select_message(receiver, message, candidates)
+ candidates = String.instance_methods(true).collect{|m| m.to_s}
+ select_message(receiver, message, candidates)
else
- candidates = eval("methods | private_methods | local_variables | instance_variables | self.class.constants", bind).collect{|m| m.to_s}
+ candidates = eval("methods | private_methods | local_variables | instance_variables | self.class.constants", bind).collect{|m| m.to_s}
- (candidates|ReservedWords).grep(/^#{Regexp.quote(input)}/)
+ (candidates|ReservedWords).grep(/^#{Regexp.quote(input)}/)
end
}
@@ -215,20 +208,19 @@ module IRB
def self.select_message(receiver, message, candidates, sep = ".")
candidates.grep(/^#{message}/).collect do |e|
- case e
- when /^[a-zA-Z_]/
- receiver + sep + e
- when /^[0-9]/
- when *Operators
- #receiver + " " + e
- end
+ case e
+ when /^[a-zA-Z_]/
+ receiver + sep + e
+ when /^[0-9]/
+ when *Operators
+ #receiver + " " + e
+ end
end
end
end
end
if Readline.respond_to?("basic_word_break_characters=")
-# Readline.basic_word_break_characters= " \t\n\"\\'`><=;|&{("
Readline.basic_word_break_characters= " \t\n`><=;|&{("
end
Readline.completion_append_character = nil
diff --git a/lib/irb/context.rb b/lib/irb/context.rb
index 72b36307d5..9cf9600f02 100644
--- a/lib/irb/context.rb
+++ b/lib/irb/context.rb
@@ -25,12 +25,11 @@ module IRB
def initialize(irb, workspace = nil, input_method = nil, output_method = nil)
@irb = irb
if workspace
- @workspace = workspace
+ @workspace = workspace
else
- @workspace = WorkSpace.new
+ @workspace = WorkSpace.new
end
@thread = Thread.current if defined? Thread
-# @irb_level = 0
# copy of default configuration
@ap_name = IRB.conf[:AP_NAME]
@@ -55,50 +54,50 @@ module IRB
self.prompt_mode = IRB.conf[:PROMPT_MODE]
if IRB.conf[:SINGLE_IRB] or !defined?(IRB::JobManager)
- @irb_name = IRB.conf[:IRB_NAME]
+ @irb_name = IRB.conf[:IRB_NAME]
else
- @irb_name = IRB.conf[:IRB_NAME]+"#"+IRB.JobManager.n_jobs.to_s
+ @irb_name = IRB.conf[:IRB_NAME]+"#"+IRB.JobManager.n_jobs.to_s
end
@irb_path = "(" + @irb_name + ")"
case input_method
when nil
- case use_readline?
- when nil
- if (defined?(ReadlineInputMethod) && STDIN.tty? &&
- IRB.conf[:PROMPT_MODE] != :INF_RUBY)
- @io = ReadlineInputMethod.new
- else
- @io = StdioInputMethod.new
- end
- when false
- @io = StdioInputMethod.new
- when true
- if defined?(ReadlineInputMethod)
- @io = ReadlineInputMethod.new
- else
- @io = StdioInputMethod.new
- end
- end
+ case use_readline?
+ when nil
+ if (defined?(ReadlineInputMethod) && STDIN.tty? &&
+ IRB.conf[:PROMPT_MODE] != :INF_RUBY)
+ @io = ReadlineInputMethod.new
+ else
+ @io = StdioInputMethod.new
+ end
+ when false
+ @io = StdioInputMethod.new
+ when true
+ if defined?(ReadlineInputMethod)
+ @io = ReadlineInputMethod.new
+ else
+ @io = StdioInputMethod.new
+ end
+ end
when String
- @io = FileInputMethod.new(input_method)
- @irb_name = File.basename(input_method)
- @irb_path = input_method
+ @io = FileInputMethod.new(input_method)
+ @irb_name = File.basename(input_method)
+ @irb_path = input_method
else
- @io = input_method
+ @io = input_method
end
self.save_history = IRB.conf[:SAVE_HISTORY] if IRB.conf[:SAVE_HISTORY]
if output_method
- @output_method = output_method
+ @output_method = output_method
else
- @output_method = StdioOutputMethod.new
+ @output_method = StdioOutputMethod.new
end
@echo = IRB.conf[:ECHO]
if @echo.nil?
- @echo = true
+ @echo = true
end
self.debug_level = IRB.conf[:DEBUG_LEVEL]
end
@@ -235,15 +234,15 @@ module IRB
# Returns whether messages are displayed or not.
def verbose?
if @verbose.nil?
- if defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)
- false
- elsif !STDIN.tty? or @io.kind_of?(FileInputMethod)
- true
- else
- false
- end
+ if defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)
+ false
+ elsif !STDIN.tty? or @io.kind_of?(FileInputMethod)
+ true
+ else
+ false
+ end
else
- @verbose
+ @verbose
end
end
@@ -251,7 +250,7 @@ module IRB
# StdioInputMethod or ReadlineInputMethod, see #io for more information.
def prompting?
verbose? || (STDIN.tty? && @io.kind_of?(StdioInputMethod) ||
- (defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)))
+ (defined?(ReadlineInputMethod) && @io.kind_of?(ReadlineInputMethod)))
end
# The return value of the last statement evaluated.
@@ -276,9 +275,9 @@ module IRB
@prompt_n = pconf[:PROMPT_N]
@return_format = pconf[:RETURN]
if ai = pconf.include?(:AUTO_INDENT)
- @auto_indent_mode = ai
+ @auto_indent_mode = ai
else
- @auto_indent_mode = IRB.conf[:AUTO_INDENT]
+ @auto_indent_mode = IRB.conf[:AUTO_INDENT]
end
end
@@ -309,41 +308,41 @@ module IRB
def inspect_mode=(opt)
if i = Inspector::INSPECTORS[opt]
- @inspect_mode = opt
- @inspect_method = i
- i.init
+ @inspect_mode = opt
+ @inspect_method = i
+ i.init
else
- case opt
- when nil
- if Inspector.keys_with_inspector(Inspector::INSPECTORS[true]).include?(@inspect_mode)
- self.inspect_mode = false
- elsif Inspector.keys_with_inspector(Inspector::INSPECTORS[false]).include?(@inspect_mode)
- self.inspect_mode = true
- else
- puts "Can't switch inspect mode."
- return
- end
- when /^\s*\{.*\}\s*$/
- begin
- inspector = eval "proc#{opt}"
- rescue Exception
- puts "Can't switch inspect mode(#{opt})."
- return
- end
- self.inspect_mode = inspector
- when Proc
- self.inspect_mode = IRB::Inspector(opt)
- when Inspector
- prefix = "usr%d"
- i = 1
- while Inspector::INSPECTORS[format(prefix, i)]; i += 1; end
- @inspect_mode = format(prefix, i)
- @inspect_method = opt
- Inspector.def_inspector(format(prefix, i), @inspect_method)
- else
- puts "Can't switch inspect mode(#{opt})."
- return
- end
+ case opt
+ when nil
+ if Inspector.keys_with_inspector(Inspector::INSPECTORS[true]).include?(@inspect_mode)
+ self.inspect_mode = false
+ elsif Inspector.keys_with_inspector(Inspector::INSPECTORS[false]).include?(@inspect_mode)
+ self.inspect_mode = true
+ else
+ puts "Can't switch inspect mode."
+ return
+ end
+ when /^\s*\{.*\}\s*$/
+ begin
+ inspector = eval "proc#{opt}"
+ rescue Exception
+ puts "Can't switch inspect mode(#{opt})."
+ return
+ end
+ self.inspect_mode = inspector
+ when Proc
+ self.inspect_mode = IRB::Inspector(opt)
+ when Inspector
+ prefix = "usr%d"
+ i = 1
+ while Inspector::INSPECTORS[format(prefix, i)]; i += 1; end
+ @inspect_mode = format(prefix, i)
+ @inspect_method = opt
+ Inspector.def_inspector(format(prefix, i), @inspect_method)
+ else
+ puts "Can't switch inspect mode(#{opt})."
+ return
+ end
end
print "Switch to#{unless @inspect_mode; ' non';end} inspect mode.\n" if verbose?
@inspect_mode
@@ -378,8 +377,6 @@ module IRB
def evaluate(line, line_no) # :nodoc:
@line_no = line_no
set_last_value(@workspace.evaluate(self, line, irb_path, line_no))
-# @workspace.evaluate("_ = IRB.conf[:MAIN_CONTEXT]._")
-# @_ = @workspace.evaluate(line, irb_path, line_no)
end
def inspect_last_value # :nodoc:
@@ -400,19 +397,19 @@ module IRB
def inspect # :nodoc:
array = []
for ivar in instance_variables.sort{|e1, e2| e1 <=> e2}
- ivar = ivar.to_s
- name = ivar.sub(/^@(.*)$/, '\1')
- val = instance_eval(ivar)
- case ivar
- when *NOPRINTING_IVARS
- array.push format("conf.%s=%s", name, "...")
- when *NO_INSPECTING_IVARS
- array.push format("conf.%s=%s", name, val.to_s)
- when *IDNAME_IVARS
- array.push format("conf.%s=:%s", name, val.id2name)
- else
- array.push format("conf.%s=%s", name, val.inspect)
- end
+ ivar = ivar.to_s
+ name = ivar.sub(/^@(.*)$/, '\1')
+ val = instance_eval(ivar)
+ case ivar
+ when *NOPRINTING_IVARS
+ array.push format("conf.%s=%s", name, "...")
+ when *NO_INSPECTING_IVARS
+ array.push format("conf.%s=%s", name, val.to_s)
+ when *IDNAME_IVARS
+ array.push format("conf.%s=:%s", name, val.id2name)
+ else
+ array.push format("conf.%s=%s", name, val.inspect)
+ end
end
array.join("\n")
end
diff --git a/lib/irb/ext/change-ws.rb b/lib/irb/ext/change-ws.rb
index ce921eb5e3..0ae9097285 100644
--- a/lib/irb/ext/change-ws.rb
+++ b/lib/irb/ext/change-ws.rb
@@ -15,9 +15,9 @@ module IRB # :nodoc:
# Inherited from +TOPLEVEL_BINDING+.
def home_workspace
if defined? @home_workspace
- @home_workspace
+ @home_workspace
else
- @home_workspace = @workspace
+ @home_workspace = @workspace
end
end
@@ -30,40 +30,16 @@ module IRB # :nodoc:
# See IRB::WorkSpace.new for more information.
def change_workspace(*_main)
if _main.empty?
- @workspace = home_workspace
- return main
+ @workspace = home_workspace
+ return main
end
@workspace = WorkSpace.new(_main[0])
if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
- main.extend ExtendCommandBundle
+ main.extend ExtendCommandBundle
end
end
-
-# def change_binding(*_main)
-# back = @workspace
-# @workspace = WorkSpace.new(*_main)
-# unless _main.empty?
-# begin
-# main.extend ExtendCommandBundle
-# rescue
-# print "can't change binding to: ", main.inspect, "\n"
-# @workspace = back
-# return nil
-# end
-# end
-# @irb_level += 1
-# begin
-# catch(:SU_EXIT) do
-# @irb.eval_input
-# end
-# ensure
-# @irb_level -= 1
-# @workspace = back
-# end
-# end
-# alias change_workspace change_binding
end
end
diff --git a/lib/irb/ext/history.rb b/lib/irb/ext/history.rb
index 3239c57a6c..d8378753f2 100644
--- a/lib/irb/ext/history.rb
+++ b/lib/irb/ext/history.rb
@@ -21,10 +21,9 @@ module IRB # :nodoc:
def set_last_value(value)
_set_last_value(value)
-# @workspace.evaluate self, "_ = IRB.CurrentContext.last_value"
- if @eval_history #and !@eval_history_values.equal?(llv)
- @eval_history_values.push @line_no, @last_value
- @workspace.evaluate self, "__ = IRB.CurrentContext.instance_eval{@eval_history_values}"
+ if @eval_history
+ @eval_history_values.push @line_no, @last_value
+ @workspace.evaluate self, "__ = IRB.CurrentContext.instance_eval{@eval_history_values}"
end
@last_value
@@ -43,23 +42,22 @@ module IRB # :nodoc:
# If +no+ is +nil+, execution result history isn't used (default).
def eval_history=(no)
if no
- if defined?(@eval_history) && @eval_history
- @eval_history_values.size(no)
- else
- @eval_history_values = History.new(no)
- IRB.conf[:__TMP__EHV__] = @eval_history_values
- @workspace.evaluate(self, "__ = IRB.conf[:__TMP__EHV__]")
- IRB.conf.delete(:__TMP_EHV__)
- end
+ if defined?(@eval_history) && @eval_history
+ @eval_history_values.size(no)
+ else
+ @eval_history_values = History.new(no)
+ IRB.conf[:__TMP__EHV__] = @eval_history_values
+ @workspace.evaluate(self, "__ = IRB.conf[:__TMP__EHV__]")
+ IRB.conf.delete(:__TMP_EHV__)
+ end
else
- @eval_history_values = nil
+ @eval_history_values = nil
end
@eval_history = no
end
end
class History # :nodoc:
- @RCS_ID='-$Id$-'
def initialize(size = 16)
@size = size
@@ -68,20 +66,20 @@ module IRB # :nodoc:
def size(size)
if size != 0 && size < @size
- @contents = @contents[@size - size .. @size]
+ @contents = @contents[@size - size .. @size]
end
@size = size
end
def [](idx)
begin
- if idx >= 0
- @contents.find{|no, val| no == idx}[1]
- else
- @contents[idx][1]
- end
+ if idx >= 0
+ @contents.find{|no, val| no == idx}[1]
+ else
+ @contents[idx][1]
+ end
rescue NameError
- nil
+ nil
end
end
@@ -94,22 +92,22 @@ module IRB # :nodoc:
def inspect
if @contents.empty?
- return real_inspect
+ return real_inspect
end
unless (last = @contents.pop)[1].equal?(self)
- @contents.push last
- last = nil
+ @contents.push last
+ last = nil
end
str = @contents.collect{|no, val|
- if val.equal?(self)
- "#{no} ...self-history..."
- else
- "#{no} #{val.inspect}"
- end
+ if val.equal?(self)
+ "#{no} ...self-history..."
+ else
+ "#{no} #{val.inspect}"
+ end
}.join("\n")
if str == ""
- str = "Empty."
+ str = "Empty."
end
@contents.push last if last
str
diff --git a/lib/irb/ext/loader.rb b/lib/irb/ext/loader.rb
index 6cdc8ec898..821538cd44 100644
--- a/lib/irb/ext/loader.rb
+++ b/lib/irb/ext/loader.rb
@@ -18,7 +18,6 @@ module IRB # :nodoc:
#
# See ExtendCommandBundle for more information.
module IrbLoader
- @RCS_ID='-$Id$-'
alias ruby_load load
alias ruby_require require
@@ -33,14 +32,14 @@ module IRB # :nodoc:
def search_file_from_ruby_path(fn) # :nodoc:
if /^#{Regexp.quote(File::Separator)}/ =~ fn
- return fn if File.exist?(fn)
- return nil
+ return fn if File.exist?(fn)
+ return nil
end
for path in $:
- if File.exist?(f = File.join(path, fn))
- return f
- end
+ if File.exist?(f = File.join(path, fn))
+ return f
+ end
end
return nil
end
@@ -50,20 +49,20 @@ module IRB # :nodoc:
# See Irb#suspend_input_method for more information.
def source_file(path)
irb.suspend_name(path, File.basename(path)) do
- irb.suspend_input_method(FileInputMethod.new(path)) do
- |back_io|
- irb.signal_status(:IN_LOAD) do
- if back_io.kind_of?(FileInputMethod)
- irb.eval_input
- else
- begin
- irb.eval_input
- rescue LoadAbort
- print "load abort!!\n"
- end
- end
- end
- end
+ irb.suspend_input_method(FileInputMethod.new(path)) do
+ |back_io|
+ irb.signal_status(:IN_LOAD) do
+ if back_io.kind_of?(FileInputMethod)
+ irb.eval_input
+ else
+ begin
+ irb.eval_input
+ rescue LoadAbort
+ print "load abort!!\n"
+ end
+ end
+ end
+ end
end
end
@@ -73,28 +72,27 @@ module IRB # :nodoc:
def load_file(path, priv = nil)
irb.suspend_name(path, File.basename(path)) do
- if priv
- ws = WorkSpace.new(Module.new)
- else
- ws = WorkSpace.new
- end
- irb.suspend_workspace(ws) do
- irb.suspend_input_method(FileInputMethod.new(path)) do
- |back_io|
- irb.signal_status(:IN_LOAD) do
-# p irb.conf
- if back_io.kind_of?(FileInputMethod)
- irb.eval_input
- else
- begin
- irb.eval_input
- rescue LoadAbort
- print "load abort!!\n"
- end
- end
- end
- end
- end
+ if priv
+ ws = WorkSpace.new(Module.new)
+ else
+ ws = WorkSpace.new
+ end
+ irb.suspend_workspace(ws) do
+ irb.suspend_input_method(FileInputMethod.new(path)) do
+ |back_io|
+ irb.signal_status(:IN_LOAD) do
+ if back_io.kind_of?(FileInputMethod)
+ irb.eval_input
+ else
+ begin
+ irb.eval_input
+ rescue LoadAbort
+ print "load abort!!\n"
+ end
+ end
+ end
+ end
+ end
end
end
@@ -104,25 +102,25 @@ module IRB # :nodoc:
back_name = @irb_name
back_scanner = @irb.scanner
begin
- @io = FileInputMethod.new(path)
- @irb_name = File.basename(path)
- @irb_path = path
- @irb.signal_status(:IN_LOAD) do
- if back_io.kind_of?(FileInputMethod)
- @irb.eval_input
- else
- begin
- @irb.eval_input
- rescue LoadAbort
- print "load abort!!\n"
- end
- end
- end
+ @io = FileInputMethod.new(path)
+ @irb_name = File.basename(path)
+ @irb_path = path
+ @irb.signal_status(:IN_LOAD) do
+ if back_io.kind_of?(FileInputMethod)
+ @irb.eval_input
+ else
+ begin
+ @irb.eval_input
+ rescue LoadAbort
+ print "load abort!!\n"
+ end
+ end
+ end
ensure
- @io = back_io
- @irb_name = back_name
- @irb_path = back_path
- @irb.scanner = back_scanner
+ @io = back_io
+ @irb_name = back_name
+ @irb_path = back_path
+ @irb.scanner = back_scanner
end
end
end
diff --git a/lib/irb/ext/math-mode.rb b/lib/irb/ext/math-mode.rb
index 067eb1e7fa..01bd24a157 100644
--- a/lib/irb/ext/math-mode.rb
+++ b/lib/irb/ext/math-mode.rb
@@ -28,14 +28,14 @@ module IRB
# more information.
def math_mode=(opt)
if @math_mode == true && !opt
- IRB.fail CantReturnToNormalMode
- return
+ IRB.fail CantReturnToNormalMode
+ return
end
@math_mode = opt
if math_mode
- main.extend Math
- print "start math mode\n" if verbose?
+ main.extend Math
+ print "start math mode\n" if verbose?
end
end
diff --git a/lib/irb/ext/multi-irb.rb b/lib/irb/ext/multi-irb.rb
index e49a158fa3..52f6fda733 100644
--- a/lib/irb/ext/multi-irb.rb
+++ b/lib/irb/ext/multi-irb.rb
@@ -13,11 +13,9 @@ require "thread"
module IRB
class JobManager
- @RCS_ID='-$Id$-'
# Creates a new JobManager object
def initialize
- # @jobs = [[thread, irb],...]
@jobs = []
@current_job = nil
end
@@ -85,9 +83,9 @@ module IRB
# See Thread#exit for more information.
def kill(*keys)
for key in keys
- th, _ = search(key)
- IRB.fail IrbAlreadyDead unless th.alive?
- th.exit
+ th, _ = search(key)
+ IRB.fail IrbAlreadyDead unless th.alive?
+ th.exit
end
end
@@ -107,15 +105,15 @@ module IRB
# Raises a NoSuchJob exception if no job can be found with the given +key+.
def search(key)
job = case key
- when Integer
- @jobs[key]
- when Irb
- @jobs.find{|k, v| v.equal?(key)}
- when Thread
- @jobs.assoc(key)
- else
- @jobs.find{|k, v| v.context.main.equal?(key)}
- end
+ when Integer
+ @jobs[key]
+ when Irb
+ @jobs.find{|k, v| v.equal?(key)}
+ when Thread
+ @jobs.assoc(key)
+ else
+ @jobs.find{|k, v| v.context.main.equal?(key)}
+ end
IRB.fail NoSuchJob, key if job.nil?
job
end
@@ -124,21 +122,21 @@ module IRB
def delete(key)
case key
when Integer
- IRB.fail NoSuchJob, key unless @jobs[key]
- @jobs[key] = nil
+ IRB.fail NoSuchJob, key unless @jobs[key]
+ @jobs[key] = nil
else
- catch(:EXISTS) do
- @jobs.each_index do
- |i|
- if @jobs[i] and (@jobs[i][0] == key ||
- @jobs[i][1] == key ||
- @jobs[i][1].context.main.equal?(key))
- @jobs[i] = nil
- throw :EXISTS
- end
- end
- IRB.fail NoSuchJob, key
- end
+ catch(:EXISTS) do
+ @jobs.each_index do
+ |i|
+ if @jobs[i] and (@jobs[i][0] == key ||
+ @jobs[i][1] == key ||
+ @jobs[i][1].context.main.equal?(key))
+ @jobs[i] = nil
+ throw :EXISTS
+ end
+ end
+ IRB.fail NoSuchJob, key
+ end
end
until assoc = @jobs.pop; end unless @jobs.empty?
@jobs.push assoc
@@ -148,25 +146,25 @@ module IRB
def inspect
ary = []
@jobs.each_index do
- |i|
- th, irb = @jobs[i]
- next if th.nil?
+ |i|
+ th, irb = @jobs[i]
+ next if th.nil?
- if th.alive?
- if th.stop?
- t_status = "stop"
- else
- t_status = "running"
- end
- else
- t_status = "exited"
- end
- ary.push format("#%d->%s on %s (%s: %s)",
- i,
- irb.context.irb_name,
- irb.context.main,
- th,
- t_status)
+ if th.alive?
+ if th.stop?
+ t_status = "stop"
+ else
+ t_status = "running"
+ end
+ else
+ t_status = "exited"
+ end
+ ary.push format("#%d->%s on %s (%s: %s)",
+ i,
+ irb.context.irb_name,
+ irb.context.main,
+ th,
+ t_status)
end
ary.join("\n")
end
@@ -193,64 +191,45 @@ module IRB
parent_thread = Thread.current
Thread.start do
begin
- irb = Irb.new(workspace, file)
+ irb = Irb.new(workspace, file)
rescue
- print "Subirb can't start with context(self): ", workspace.main.inspect, "\n"
- print "return to main irb\n"
- Thread.pass
- Thread.main.wakeup
- Thread.exit
+ print "Subirb can't start with context(self): ", workspace.main.inspect, "\n"
+ print "return to main irb\n"
+ Thread.pass
+ Thread.main.wakeup
+ Thread.exit
end
@CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC]
@JobManager.insert(irb)
@JobManager.current_job = irb
begin
- system_exit = false
- catch(:IRB_EXIT) do
- irb.eval_input
- end
+ system_exit = false
+ catch(:IRB_EXIT) do
+ irb.eval_input
+ end
rescue SystemExit
- system_exit = true
- raise
- #fail
+ system_exit = true
+ raise
+ #fail
ensure
- unless system_exit
- @JobManager.delete(irb)
- if @JobManager.current_job == irb
- if parent_thread.alive?
- @JobManager.current_job = @JobManager.irb(parent_thread)
- parent_thread.run
- else
- @JobManager.current_job = @JobManager.main_irb
- @JobManager.main_thread.run
- end
- end
- end
+ unless system_exit
+ @JobManager.delete(irb)
+ if @JobManager.current_job == irb
+ if parent_thread.alive?
+ @JobManager.current_job = @JobManager.irb(parent_thread)
+ parent_thread.run
+ else
+ @JobManager.current_job = @JobManager.main_irb
+ @JobManager.main_thread.run
+ end
+ end
+ end
end
end
Thread.stop
@JobManager.current_job = @JobManager.irb(Thread.current)
end
-# class Context
-# def set_last_value(value)
-# @last_value = value
-# @workspace.evaluate "_ = IRB.JobManager.irb(Thread.current).context.last_value"
-# if @eval_history #and !@__.equal?(@last_value)
-# @eval_history_values.push @line_no, @last_value
-# @workspace.evaluate "__ = IRB.JobManager.irb(Thread.current).context.instance_eval{@eval_history_values}"
-# end
-# @last_value
-# end
-# end
-
-# module ExtendCommand
-# def irb_context
-# IRB.JobManager.irb(Thread.current).context
-# end
-# # alias conf irb_context
-# end
-
@CONF[:SINGLE_IRB_MODE] = false
@JobManager.insert(@CONF[:MAIN_CONTEXT].irb)
@JobManager.current_job = @CONF[:MAIN_CONTEXT].irb
@@ -258,22 +237,22 @@ module IRB
class Irb
def signal_handle
unless @context.ignore_sigint?
- print "\nabort!!\n" if @context.verbose?
- exit
+ print "\nabort!!\n" if @context.verbose?
+ exit
end
case @signal_status
when :IN_INPUT
- print "^C\n"
- IRB.JobManager.thread(self).raise RubyLex::TerminateLineInput
+ print "^C\n"
+ IRB.JobManager.thread(self).raise RubyLex::TerminateLineInput
when :IN_EVAL
- IRB.irb_abort(self)
+ IRB.irb_abort(self)
when :IN_LOAD
- IRB.irb_abort(self, LoadAbort)
+ IRB.irb_abort(self, LoadAbort)
when :IN_IRB
- # ignore
+ # ignore
else
- # ignore other cases as well
+ # ignore other cases as well
end
end
end
diff --git a/lib/irb/ext/save-history.rb b/lib/irb/ext/save-history.rb
index 7b3fcbbeec..4477d18e1a 100644
--- a/lib/irb/ext/save-history.rb
+++ b/lib/irb/ext/save-history.rb
@@ -12,13 +12,12 @@ require "readline"
module IRB
module HistorySavingAbility # :nodoc:
- @RCS_ID='-$Id$-'
end
class Context
def init_save_history# :nodoc:
unless (class<<@io;self;end).include?(HistorySavingAbility)
- @io.extend(HistorySavingAbility)
+ @io.extend(HistorySavingAbility)
end
end
@@ -39,9 +38,9 @@ module IRB
def save_history=(val)
IRB.conf[:SAVE_HISTORY] = val
if val
- main_context = IRB.conf[:MAIN_CONTEXT]
- main_context = self unless main_context
- main_context.init_save_history
+ main_context = IRB.conf[:MAIN_CONTEXT]
+ main_context = self unless main_context
+ main_context.init_save_history
end
end
@@ -59,23 +58,7 @@ module IRB
module HistorySavingAbility # :nodoc:
include Readline
-# def HistorySavingAbility.create_finalizer
-# proc do
-# if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) > 0
-# if hf = IRB.conf[:HISTORY_FILE]
-# file = File.expand_path(hf)
-# end
-# file = IRB.rc_file("_history") unless file
-# open(file, 'w' ) do |f|
-# hist = HISTORY.to_a
-# f.puts(hist[-num..-1] || hist)
-# end
-# end
-# end
-# end
-
def HistorySavingAbility.extended(obj)
-# ObjectSpace.define_finalizer(obj, HistorySavingAbility.create_finalizer)
IRB.conf[:AT_EXIT].push proc{obj.save_history}
obj.load_history
obj
@@ -83,37 +66,37 @@ module IRB
def load_history
if history_file = IRB.conf[:HISTORY_FILE]
- history_file = File.expand_path(history_file)
+ history_file = File.expand_path(history_file)
end
history_file = IRB.rc_file("_history") unless history_file
if File.exist?(history_file)
- open(history_file) do |f|
- f.each {|l| HISTORY << l.chomp}
- end
+ open(history_file) do |f|
+ f.each {|l| HISTORY << l.chomp}
+ end
end
end
def save_history
if num = IRB.conf[:SAVE_HISTORY] and (num = num.to_i) > 0
- if history_file = IRB.conf[:HISTORY_FILE]
- history_file = File.expand_path(history_file)
- end
- history_file = IRB.rc_file("_history") unless history_file
+ if history_file = IRB.conf[:HISTORY_FILE]
+ history_file = File.expand_path(history_file)
+ end
+ history_file = IRB.rc_file("_history") unless history_file
- # Change the permission of a file that already exists[BUG #7694]
- begin
- if File.stat(history_file).mode & 066 != 0
- File.chmod(0600, history_file)
- end
- rescue Errno::ENOENT
- rescue
- raise
- end
+ # Change the permission of a file that already exists[BUG #7694]
+ begin
+ if File.stat(history_file).mode & 066 != 0
+ File.chmod(0600, history_file)
+ end
+ rescue Errno::ENOENT
+ rescue
+ raise
+ end
- open(history_file, 'w', 0600 ) do |f|
- hist = HISTORY.to_a
- f.puts(hist[-num..-1] || hist)
- end
+ open(history_file, 'w', 0600 ) do |f|
+ hist = HISTORY.to_a
+ f.puts(hist[-num..-1] || hist)
+ end
end
end
end
diff --git a/lib/irb/ext/tracer.rb b/lib/irb/ext/tracer.rb
index 8c9083dbad..c145cf5b4f 100644
--- a/lib/irb/ext/tracer.rb
+++ b/lib/irb/ext/tracer.rb
@@ -18,7 +18,7 @@ module IRB
Tracer.add_filter {
|event, file, line, id, binding, *rests|
/^#{Regexp.quote(@CONF[:IRB_LIB_PATH])}/ !~ file and
- File::basename(file) != "irb.rb"
+ File::basename(file) != "irb.rb"
}
end
@@ -35,12 +35,12 @@ module IRB
# See +lib/tracer.rb+ for more information.
def use_tracer=(opt)
if opt
- Tracer.set_get_line_procs(@irb_path) {
- |line_no, *rests|
- @io.line(line_no)
- }
+ Tracer.set_get_line_procs(@irb_path) {
+ |line_no, *rests|
+ @io.line(line_no)
+ }
elsif !opt && @use_tracer
- Tracer.off
+ Tracer.off
end
@use_tracer=opt
end
@@ -54,14 +54,14 @@ module IRB
# See +lib/tracer.rb+ for more information.
def evaluate(context, statements, file = nil, line = nil)
if context.use_tracer? && file != nil && line != nil
- Tracer.on
- begin
- __evaluate__(context, statements, file, line)
- ensure
- Tracer.off
- end
+ Tracer.on
+ begin
+ __evaluate__(context, statements, file, line)
+ ensure
+ Tracer.off
+ end
else
- __evaluate__(context, statements, file || __FILE__, line || __LINE__)
+ __evaluate__(context, statements, file || __FILE__, line || __LINE__)
end
end
end
diff --git a/lib/irb/ext/use-loader.rb b/lib/irb/ext/use-loader.rb
index 4e98f5b7a2..99e76b722f 100644
--- a/lib/irb/ext/use-loader.rb
+++ b/lib/irb/ext/use-loader.rb
@@ -49,20 +49,20 @@ module IRB
def use_loader=(opt)
if IRB.conf[:USE_LOADER] != opt
- IRB.conf[:USE_LOADER] = opt
- if opt
- if !$".include?("irb/cmd/load")
- end
- (class<<@workspace.main;self;end).instance_eval {
- alias_method :load, :irb_load
- alias_method :require, :irb_require
- }
- else
- (class<<@workspace.main;self;end).instance_eval {
- alias_method :load, :__original__load__IRB_use_loader__
- alias_method :require, :__original__require__IRB_use_loader__
- }
- end
+ IRB.conf[:USE_LOADER] = opt
+ if opt
+ if !$".include?("irb/cmd/load")
+ end
+ (class<<@workspace.main;self;end).instance_eval {
+ alias_method :load, :irb_load
+ alias_method :require, :irb_require
+ }
+ else
+ (class<<@workspace.main;self;end).instance_eval {
+ alias_method :load, :__original__load__IRB_use_loader__
+ alias_method :require, :__original__require__IRB_use_loader__
+ }
+ end
end
print "Switch to load/require#{unless use_loader; ' non';end} trace mode.\n" if verbose?
opt
diff --git a/lib/irb/ext/workspaces.rb b/lib/irb/ext/workspaces.rb
index 641befbdf3..4237037271 100644
--- a/lib/irb/ext/workspaces.rb
+++ b/lib/irb/ext/workspaces.rb
@@ -20,9 +20,9 @@ module IRB # :nodoc:
# WorkSpaces in the current stack
def workspaces
if defined? @workspaces
- @workspaces
+ @workspaces
else
- @workspaces = []
+ @workspaces = []
end
end
@@ -33,20 +33,20 @@ module IRB # :nodoc:
# information.
def push_workspace(*_main)
if _main.empty?
- if workspaces.empty?
- print "No other workspace\n"
- return nil
- end
- ws = workspaces.pop
- workspaces.push @workspace
- @workspace = ws
- return workspaces
+ if workspaces.empty?
+ print "No other workspace\n"
+ return nil
+ end
+ ws = workspaces.pop
+ workspaces.push @workspace
+ @workspace = ws
+ return workspaces
end
workspaces.push @workspace
@workspace = WorkSpace.new(@workspace.binding, _main[0])
if !(class<<main;ancestors;end).include?(ExtendCommandBundle)
- main.extend ExtendCommandBundle
+ main.extend ExtendCommandBundle
end
end
@@ -56,8 +56,8 @@ module IRB # :nodoc:
# Also, see #push_workspace.
def pop_workspace
if workspaces.empty?
- print "workspace stack empty\n"
- return
+ print "workspace stack empty\n"
+ return
end
@workspace = workspaces.pop
end
diff --git a/lib/irb/extend-command.rb b/lib/irb/extend-command.rb
index 487c0bbeff..a9326272ff 100644
--- a/lib/irb/extend-command.rb
+++ b/lib/irb/extend-command.rb
@@ -46,71 +46,57 @@ module IRB # :nodoc:
@EXTEND_COMMANDS = [
[:irb_current_working_workspace, :CurrentWorkingWorkspace, "irb/cmd/chws",
- [:irb_print_working_workspace, OVERRIDE_ALL],
- [:irb_cwws, OVERRIDE_ALL],
- [:irb_pwws, OVERRIDE_ALL],
-# [:irb_cww, OVERRIDE_ALL],
-# [:irb_pww, OVERRIDE_ALL],
- [:cwws, NO_OVERRIDE],
- [:pwws, NO_OVERRIDE],
-# [:cww, NO_OVERRIDE],
-# [:pww, NO_OVERRIDE],
- [:irb_current_working_binding, OVERRIDE_ALL],
- [:irb_print_working_binding, OVERRIDE_ALL],
- [:irb_cwb, OVERRIDE_ALL],
- [:irb_pwb, OVERRIDE_ALL],
-# [:cwb, NO_OVERRIDE],
-# [:pwb, NO_OVERRIDE]
- ],
- [:irb_change_workspace, :ChangeWorkspace, "irb/cmd/chws",
- [:irb_chws, OVERRIDE_ALL],
-# [:irb_chw, OVERRIDE_ALL],
- [:irb_cws, OVERRIDE_ALL],
-# [:irb_cw, OVERRIDE_ALL],
- [:chws, NO_OVERRIDE],
-# [:chw, NO_OVERRIDE],
- [:cws, NO_OVERRIDE],
-# [:cw, NO_OVERRIDE],
- [:irb_change_binding, OVERRIDE_ALL],
- [:irb_cb, OVERRIDE_ALL],
- [:cb, NO_OVERRIDE]],
+ [:irb_print_working_workspace, OVERRIDE_ALL],
+ [:irb_cwws, OVERRIDE_ALL],
+ [:irb_pwws, OVERRIDE_ALL],
+ [:cwws, NO_OVERRIDE],
+ [:pwws, NO_OVERRIDE],
+ [:irb_current_working_binding, OVERRIDE_ALL],
+ [:irb_print_working_binding, OVERRIDE_ALL],
+ [:irb_cwb, OVERRIDE_ALL],
+ [:irb_pwb, OVERRIDE_ALL],
+ ],
+ [:irb_change_workspace, :ChangeWorkspace, "irb/cmd/chws",
+ [:irb_chws, OVERRIDE_ALL],
+ [:irb_cws, OVERRIDE_ALL],
+ [:chws, NO_OVERRIDE],
+ [:cws, NO_OVERRIDE],
+ [:irb_change_binding, OVERRIDE_ALL],
+ [:irb_cb, OVERRIDE_ALL],
+ [:cb, NO_OVERRIDE]],
- [:irb_workspaces, :Workspaces, "irb/cmd/pushws",
- [:workspaces, NO_OVERRIDE],
- [:irb_bindings, OVERRIDE_ALL],
- [:bindings, NO_OVERRIDE]],
- [:irb_push_workspace, :PushWorkspace, "irb/cmd/pushws",
- [:irb_pushws, OVERRIDE_ALL],
-# [:irb_pushw, OVERRIDE_ALL],
- [:pushws, NO_OVERRIDE],
-# [:pushw, NO_OVERRIDE],
- [:irb_push_binding, OVERRIDE_ALL],
- [:irb_pushb, OVERRIDE_ALL],
- [:pushb, NO_OVERRIDE]],
- [:irb_pop_workspace, :PopWorkspace, "irb/cmd/pushws",
- [:irb_popws, OVERRIDE_ALL],
-# [:irb_popw, OVERRIDE_ALL],
- [:popws, NO_OVERRIDE],
-# [:popw, NO_OVERRIDE],
- [:irb_pop_binding, OVERRIDE_ALL],
- [:irb_popb, OVERRIDE_ALL],
- [:popb, NO_OVERRIDE]],
+ [:irb_workspaces, :Workspaces, "irb/cmd/pushws",
+ [:workspaces, NO_OVERRIDE],
+ [:irb_bindings, OVERRIDE_ALL],
+ [:bindings, NO_OVERRIDE]],
+ [:irb_push_workspace, :PushWorkspace, "irb/cmd/pushws",
+ [:irb_pushws, OVERRIDE_ALL],
+ [:pushws, NO_OVERRIDE],
+ [:irb_push_binding, OVERRIDE_ALL],
+ [:irb_pushb, OVERRIDE_ALL],
+ [:pushb, NO_OVERRIDE]],
+ [:irb_pop_workspace, :PopWorkspace, "irb/cmd/pushws",
+ [:irb_popws, OVERRIDE_ALL],
+ [:popws, NO_OVERRIDE],
+ [:irb_pop_binding, OVERRIDE_ALL],
+ [:irb_popb, OVERRIDE_ALL],
+ [:popb, NO_OVERRIDE]],
- [:irb_load, :Load, "irb/cmd/load"],
- [:irb_require, :Require, "irb/cmd/load"],
- [:irb_source, :Source, "irb/cmd/load",
- [:source, NO_OVERRIDE]],
+ [:irb_load, :Load, "irb/cmd/load"],
+ [:irb_require, :Require, "irb/cmd/load"],
+ [:irb_source, :Source, "irb/cmd/load",
+ [:source, NO_OVERRIDE]],
- [:irb, :IrbCommand, "irb/cmd/subirb"],
- [:irb_jobs, :Jobs, "irb/cmd/subirb",
- [:jobs, NO_OVERRIDE]],
- [:irb_fg, :Foreground, "irb/cmd/subirb",
- [:fg, NO_OVERRIDE]],
- [:irb_kill, :Kill, "irb/cmd/subirb",
- [:kill, OVERRIDE_PRIVATE_ONLY]],
+ [:irb, :IrbCommand, "irb/cmd/subirb"],
+ [:irb_jobs, :Jobs, "irb/cmd/subirb",
+ [:jobs, NO_OVERRIDE]],
+ [:irb_fg, :Foreground, "irb/cmd/subirb",
+ [:fg, NO_OVERRIDE]],
+ [:irb_kill, :Kill, "irb/cmd/subirb",
+ [:kill, OVERRIDE_PRIVATE_ONLY]],
- [:irb_help, :Help, "irb/cmd/help",
- [:help, NO_OVERRIDE]],
+ [:irb_help, :Help, "irb/cmd/help",
+ [:help, NO_OVERRIDE]],
]
@@ -131,7 +117,7 @@ module IRB # :nodoc:
# +irb_help+:: IRB@Command+line+options
def self.install_extend_commands
for args in @EXTEND_COMMANDS
- def_extend_command(*args)
+ def_extend_command(*args)
end
end
@@ -144,39 +130,39 @@ module IRB # :nodoc:
def self.def_extend_command(cmd_name, cmd_class, load_file = nil, *aliases)
case cmd_class
when Symbol
- cmd_class = cmd_class.id2name
+ cmd_class = cmd_class.id2name
when String
when Class
- cmd_class = cmd_class.name
+ cmd_class = cmd_class.name
end
if load_file
- line = __LINE__; eval %[
- def #{cmd_name}(*opts, &b)
- require "#{load_file}"
- arity = ExtendCommand::#{cmd_class}.instance_method(:execute).arity
- args = (1..(arity < 0 ? ~arity : arity)).map {|i| "arg" + i.to_s }
- args << "*opts" if arity < 0
- args << "&block"
- args = args.join(", ")
- line = __LINE__; eval %[
- def #{cmd_name}(\#{args})
- ExtendCommand::#{cmd_class}.execute(irb_context, \#{args})
- end
- ], nil, __FILE__, line
- send :#{cmd_name}, *opts, &b
- end
- ], nil, __FILE__, line
+ line = __LINE__; eval %[
+ def #{cmd_name}(*opts, &b)
+ require "#{load_file}"
+ arity = ExtendCommand::#{cmd_class}.instance_method(:execute).arity
+ args = (1..(arity < 0 ? ~arity : arity)).map {|i| "arg" + i.to_s }
+ args << "*opts" if arity < 0
+ args << "&block"
+ args = args.join(", ")
+ line = __LINE__; eval %[
+ def #{cmd_name}(\#{args})
+ ExtendCommand::#{cmd_class}.execute(irb_context, \#{args})
+ end
+ ], nil, __FILE__, line
+ send :#{cmd_name}, *opts, &b
+ end
+ ], nil, __FILE__, line
else
- line = __LINE__; eval %[
- def #{cmd_name}(*opts, &b)
- ExtendCommand::#{cmd_class}.execute(irb_context, *opts, &b)
- end
- ], nil, __FILE__, line
+ line = __LINE__; eval %[
+ def #{cmd_name}(*opts, &b)
+ ExtendCommand::#{cmd_class}.execute(irb_context, *opts, &b)
+ end
+ ], nil, __FILE__, line
end
for ali, flag in aliases
- @ALIASES.push [ali, cmd_name, flag]
+ @ALIASES.push [ali, cmd_name, flag]
end
end
@@ -187,18 +173,18 @@ module IRB # :nodoc:
from = from.id2name unless from.kind_of?(String)
if override == OVERRIDE_ALL or
- (override == OVERRIDE_PRIVATE_ONLY) && !respond_to?(to) or
- (override == NO_OVERRIDE) && !respond_to?(to, true)
- target = self
- (class << self; self; end).instance_eval{
- if target.respond_to?(to, true) &&
- !target.respond_to?(EXCB.irb_original_method_name(to), true)
- alias_method(EXCB.irb_original_method_name(to), to)
- end
- alias_method to, from
- }
+ (override == OVERRIDE_PRIVATE_ONLY) && !respond_to?(to) or
+ (override == NO_OVERRIDE) && !respond_to?(to, true)
+ target = self
+ (class << self; self; end).instance_eval{
+ if target.respond_to?(to, true) &&
+ !target.respond_to?(EXCB.irb_original_method_name(to), true)
+ alias_method(EXCB.irb_original_method_name(to), to)
+ end
+ alias_method to, from
+ }
else
- print "irb: warn: can't alias #{to} from #{from}.\n"
+ print "irb: warn: can't alias #{to} from #{from}.\n"
end
end
@@ -210,10 +196,10 @@ module IRB # :nodoc:
# using #install_alias_method.
def self.extend_object(obj)
unless (class << obj; ancestors; end).include?(EXCB)
- super
- for ali, com, flg in @ALIASES
- obj.install_alias_method(ali, com, flg)
- end
+ super
+ for ali, com, flg in @ALIASES
+ obj.install_alias_method(ali, com, flg)
+ end
end
end
@@ -241,7 +227,7 @@ module IRB # :nodoc:
# Context#save_history=:: +irb/ext/save-history.rb+
def self.install_extend_commands
for args in @EXTEND_COMMANDS
- def_extend_command(*args)
+ def_extend_command(*args)
end
end
@@ -252,13 +238,13 @@ module IRB # :nodoc:
def self.def_extend_command(cmd_name, load_file, *aliases)
line = __LINE__; Context.module_eval %[
def #{cmd_name}(*opts, &b)
- Context.module_eval {remove_method(:#{cmd_name})}
- require "#{load_file}"
- send :#{cmd_name}, *opts, &b
- end
- for ali in aliases
- alias_method ali, cmd_name
- end
+ Context.module_eval {remove_method(:#{cmd_name})}
+ require "#{load_file}"
+ send :#{cmd_name}, *opts, &b
+ end
+ for ali in aliases
+ alias_method ali, cmd_name
+ end
], __FILE__, line
end
@@ -277,9 +263,9 @@ module IRB # :nodoc:
module_eval %[
alias_method alias_name, base_method
def #{base_method}(*opts)
- send :#{extend_method}, *opts
- send :#{alias_name}, *opts
- end
+ send :#{extend_method}, *opts
+ send :#{alias_name}, *opts
+ end
]
end
@@ -293,9 +279,9 @@ module IRB # :nodoc:
module_eval %[
alias_method alias_name, base_method
def #{base_method}(*opts)
- send :#{alias_name}, *opts
- send :#{extend_method}, *opts
- end
+ send :#{alias_name}, *opts
+ send :#{extend_method}, *opts
+ end
]
end
@@ -313,7 +299,7 @@ module IRB # :nodoc:
return base_name if same_methods.empty?
no = same_methods.size
while !same_methods.include?(alias_name = base_name + no)
- no += 1
+ no += 1
end
alias_name
end
diff --git a/lib/irb/frame.rb b/lib/irb/frame.rb
index bcfa3a3140..64dd63dddf 100644
--- a/lib/irb/frame.rb
+++ b/lib/irb/frame.rb
@@ -31,9 +31,9 @@ module IRB
def trace_func(event, file, line, id, binding)
case event
when 'call', 'class'
- @frames.push binding
+ @frames.push binding
when 'return', 'end'
- @frames.pop
+ @frames.pop
end
end
diff --git a/lib/irb/help.rb b/lib/irb/help.rb
index 9fd734038f..b9ebfb1ae5 100644
--- a/lib/irb/help.rb
+++ b/lib/irb/help.rb
@@ -19,16 +19,16 @@ module IRB
space_line = false
IRB::MagicFile.open(path){|f|
f.each_line do |l|
- if /^\s*$/ =~ l
- lc.puts l unless space_line
- space_line = true
- next
- end
- space_line = false
+ if /^\s*$/ =~ l
+ lc.puts l unless space_line
+ space_line = true
+ next
+ end
+ space_line = false
- l.sub!(/#.*$/, "")
- next if /^\s*$/ =~ l
- lc.puts l
+ l.sub!(/#.*$/, "")
+ next if /^\s*$/ =~ l
+ lc.puts l
end
}
end
diff --git a/lib/irb/init.rb b/lib/irb/init.rb
index 826bcaf3ac..af9c363a97 100644
--- a/lib/irb/init.rb
+++ b/lib/irb/init.rb
@@ -59,48 +59,47 @@ module IRB # :nodoc:
@CONF[:PROMPT] = {
:NULL => {
- :PROMPT_I => nil,
- :PROMPT_N => nil,
- :PROMPT_S => nil,
- :PROMPT_C => nil,
- :RETURN => "%s\n"
+ :PROMPT_I => nil,
+ :PROMPT_N => nil,
+ :PROMPT_S => nil,
+ :PROMPT_C => nil,
+ :RETURN => "%s\n"
},
:DEFAULT => {
- :PROMPT_I => "%N(%m):%03n:%i> ",
- :PROMPT_N => "%N(%m):%03n:%i> ",
- :PROMPT_S => "%N(%m):%03n:%i%l ",
- :PROMPT_C => "%N(%m):%03n:%i* ",
- :RETURN => "=> %s\n"
+ :PROMPT_I => "%N(%m):%03n:%i> ",
+ :PROMPT_N => "%N(%m):%03n:%i> ",
+ :PROMPT_S => "%N(%m):%03n:%i%l ",
+ :PROMPT_C => "%N(%m):%03n:%i* ",
+ :RETURN => "=> %s\n"
},
:CLASSIC => {
- :PROMPT_I => "%N(%m):%03n:%i> ",
- :PROMPT_N => "%N(%m):%03n:%i> ",
- :PROMPT_S => "%N(%m):%03n:%i%l ",
- :PROMPT_C => "%N(%m):%03n:%i* ",
- :RETURN => "%s\n"
+ :PROMPT_I => "%N(%m):%03n:%i> ",
+ :PROMPT_N => "%N(%m):%03n:%i> ",
+ :PROMPT_S => "%N(%m):%03n:%i%l ",
+ :PROMPT_C => "%N(%m):%03n:%i* ",
+ :RETURN => "%s\n"
},
:SIMPLE => {
- :PROMPT_I => ">> ",
- :PROMPT_N => ">> ",
- :PROMPT_S => nil,
- :PROMPT_C => "?> ",
- :RETURN => "=> %s\n"
+ :PROMPT_I => ">> ",
+ :PROMPT_N => ">> ",
+ :PROMPT_S => nil,
+ :PROMPT_C => "?> ",
+ :RETURN => "=> %s\n"
},
:INF_RUBY => {
- :PROMPT_I => "%N(%m):%03n:%i> ",
-# :PROMPT_N => "%N(%m):%03n:%i> ",
- :PROMPT_N => nil,
- :PROMPT_S => nil,
- :PROMPT_C => nil,
- :RETURN => "%s\n",
- :AUTO_INDENT => true
+ :PROMPT_I => "%N(%m):%03n:%i> ",
+ :PROMPT_N => nil,
+ :PROMPT_S => nil,
+ :PROMPT_C => nil,
+ :RETURN => "%s\n",
+ :AUTO_INDENT => true
},
:XMP => {
- :PROMPT_I => nil,
- :PROMPT_N => nil,
- :PROMPT_S => nil,
- :PROMPT_C => nil,
- :RETURN => " ==>%s\n"
+ :PROMPT_I => nil,
+ :PROMPT_N => nil,
+ :PROMPT_S => nil,
+ :PROMPT_C => nil,
+ :RETURN => " ==>%s\n"
}
}
@@ -110,7 +109,6 @@ module IRB # :nodoc:
@CONF[:CONTEXT_MODE] = 3 # use binding in function on TOPLEVEL_BINDING
@CONF[:SINGLE_IRB] = false
-# @CONF[:LC_MESSAGES] = "en"
@CONF[:LC_MESSAGES] = Locale.new
@CONF[:AT_EXIT] = []
@@ -122,108 +120,104 @@ module IRB # :nodoc:
@CONF[:LC_MESSAGES].load("irb/error.rb")
end
- FEATURE_IOPT_CHANGE_VERSION = "1.9.0"
-
# option analyzing
def IRB.parse_opts
load_path = []
while opt = ARGV.shift
case opt
when "-f"
- @CONF[:RC] = false
+ @CONF[:RC] = false
when "-m"
- @CONF[:MATH_MODE] = true
+ @CONF[:MATH_MODE] = true
when "-d"
- $DEBUG = true
- $VERBOSE = true
+ $DEBUG = true
+ $VERBOSE = true
when "-w"
- $VERBOSE = true
+ $VERBOSE = true
when /^-W(.+)?/
- opt = $1 || ARGV.shift
- case opt
- when "0"
- $VERBOSE = nil
- when "1"
- $VERBOSE = false
- else
- $VERBOSE = true
- end
+ opt = $1 || ARGV.shift
+ case opt
+ when "0"
+ $VERBOSE = nil
+ when "1"
+ $VERBOSE = false
+ else
+ $VERBOSE = true
+ end
when /^-r(.+)?/
- opt = $1 || ARGV.shift
- @CONF[:LOAD_MODULES].push opt if opt
+ opt = $1 || ARGV.shift
+ @CONF[:LOAD_MODULES].push opt if opt
when /^-I(.+)?/
opt = $1 || ARGV.shift
- load_path.concat(opt.split(File::PATH_SEPARATOR)) if opt
+ load_path.concat(opt.split(File::PATH_SEPARATOR)) if opt
when '-U'
- set_encoding("UTF-8", "UTF-8")
+ set_encoding("UTF-8", "UTF-8")
when /^-E(.+)?/, /^--encoding(?:=(.+))?/
- opt = $1 || ARGV.shift
- set_encoding(*opt.split(':', 2))
+ opt = $1 || ARGV.shift
+ set_encoding(*opt.split(':', 2))
when "--inspect"
- if /^-/ !~ ARGV.first
- @CONF[:INSPECT_MODE] = ARGV.shift
- else
- @CONF[:INSPECT_MODE] = true
- end
+ if /^-/ !~ ARGV.first
+ @CONF[:INSPECT_MODE] = ARGV.shift
+ else
+ @CONF[:INSPECT_MODE] = true
+ end
when "--noinspect"
- @CONF[:INSPECT_MODE] = false
+ @CONF[:INSPECT_MODE] = false
when "--readline"
- @CONF[:USE_READLINE] = true
+ @CONF[:USE_READLINE] = true
when "--noreadline"
- @CONF[:USE_READLINE] = false
+ @CONF[:USE_READLINE] = false
when "--echo"
- @CONF[:ECHO] = true
+ @CONF[:ECHO] = true
when "--noecho"
- @CONF[:ECHO] = false
+ @CONF[:ECHO] = false
when "--verbose"
- @CONF[:VERBOSE] = true
+ @CONF[:VERBOSE] = true
when "--noverbose"
- @CONF[:VERBOSE] = false
+ @CONF[:VERBOSE] = false
when /^--prompt-mode(?:=(.+))?/, /^--prompt(?:=(.+))?/
- opt = $1 || ARGV.shift
- prompt_mode = opt.upcase.tr("-", "_").intern
- @CONF[:PROMPT_MODE] = prompt_mode
+ opt = $1 || ARGV.shift
+ prompt_mode = opt.upcase.tr("-", "_").intern
+ @CONF[:PROMPT_MODE] = prompt_mode
when "--noprompt"
- @CONF[:PROMPT_MODE] = :NULL
+ @CONF[:PROMPT_MODE] = :NULL
when "--inf-ruby-mode"
- @CONF[:PROMPT_MODE] = :INF_RUBY
+ @CONF[:PROMPT_MODE] = :INF_RUBY
when "--sample-book-mode", "--simple-prompt"
- @CONF[:PROMPT_MODE] = :SIMPLE
+ @CONF[:PROMPT_MODE] = :SIMPLE
when "--tracer"
- @CONF[:USE_TRACER] = true
+ @CONF[:USE_TRACER] = true
when /^--back-trace-limit(?:=(.+))?/
- @CONF[:BACK_TRACE_LIMIT] = ($1 || ARGV.shift).to_i
+ @CONF[:BACK_TRACE_LIMIT] = ($1 || ARGV.shift).to_i
when /^--context-mode(?:=(.+))?/
- @CONF[:CONTEXT_MODE] = ($1 || ARGV.shift).to_i
+ @CONF[:CONTEXT_MODE] = ($1 || ARGV.shift).to_i
when "--single-irb"
- @CONF[:SINGLE_IRB] = true
+ @CONF[:SINGLE_IRB] = true
when /^--irb_debug(?:=(.+))?/
- @CONF[:DEBUG_LEVEL] = ($1 || ARGV.shift).to_i
+ @CONF[:DEBUG_LEVEL] = ($1 || ARGV.shift).to_i
when "-v", "--version"
- print IRB.version, "\n"
- exit 0
+ print IRB.version, "\n"
+ exit 0
when "-h", "--help"
- require "irb/help"
- IRB.print_usage
- exit 0
+ require "irb/help"
+ IRB.print_usage
+ exit 0
when "--"
- if opt = ARGV.shift
- @CONF[:SCRIPT] = opt
- $0 = opt
- end
+ if opt = ARGV.shift
+ @CONF[:SCRIPT] = opt
+ $0 = opt
+ end
break
when /^-/
- IRB.fail UnrecognizedSwitch, opt
+ IRB.fail UnrecognizedSwitch, opt
else
- @CONF[:SCRIPT] = opt
- $0 = opt
- break
+ @CONF[:SCRIPT] = opt
+ $0 = opt
+ break
end
end
- if RUBY_VERSION >= FEATURE_IOPT_CHANGE_VERSION
- load_path.collect! do |path|
- /\A\.\// =~ path ? path : File.expand_path(path)
- end
+ load_path.collect! do |path|
+ /\A\.\// =~ path ? path : File.expand_path(path)
end
$LOAD_PATH.unshift(*load_path)
@@ -233,14 +227,14 @@ module IRB # :nodoc:
def IRB.run_config
if @CONF[:RC]
begin
- load rc_file
+ load rc_file
rescue LoadError, Errno::ENOENT
rescue # StandardError, ScriptError
- print "load error: #{rc_file}\n"
- print $!.class, ": ", $!, "\n"
- for err in $@[0, $@.size - 2]
- print "\t", err, "\n"
- end
+ print "load error: #{rc_file}\n"
+ print $!.class, ": ", $!, "\n"
+ for err in $@[0, $@.size - 2]
+ print "\t", err, "\n"
+ end
end
end
end
@@ -249,11 +243,11 @@ module IRB # :nodoc:
def IRB.rc_file(ext = IRBRC_EXT)
if !@CONF[:RC_NAME_GENERATOR]
rc_file_generators do |rcgen|
- @CONF[:RC_NAME_GENERATOR] ||= rcgen
- if File.exist?(rcgen.call(IRBRC_EXT))
- @CONF[:RC_NAME_GENERATOR] = rcgen
- break
- end
+ @CONF[:RC_NAME_GENERATOR] ||= rcgen
+ if File.exist?(rcgen.call(IRBRC_EXT))
+ @CONF[:RC_NAME_GENERATOR] = rcgen
+ break
+ end
end
end
case rc_file = @CONF[:RC_NAME_GENERATOR].call(ext)
@@ -283,9 +277,9 @@ module IRB # :nodoc:
def IRB.load_modules
for m in @CONF[:LOAD_MODULES]
begin
- require m
+ require m
rescue LoadError => err
- warn err.backtrace[0] << ":#{err.class}: #{err}"
+ warn err.backtrace[0] << ":#{err.class}: #{err}"
end
end
end
@@ -300,7 +294,7 @@ module IRB # :nodoc:
Encoding.default_internal = intern unless intern.nil? || intern.empty?
@CONF[:ENCODINGS] = IRB::DefaultEncodings.new(extern, intern)
[$stdin, $stdout, $stderr].each do |io|
- io.set_encoding(extern, intern)
+ io.set_encoding(extern, intern)
end
@CONF[:LC_MESSAGES].instance_variable_set(:@encoding, extern)
ensure
diff --git a/lib/irb/input-method.rb b/lib/irb/input-method.rb
index 55363fe0c4..4ea3f585f8 100644
--- a/lib/irb/input-method.rb
+++ b/lib/irb/input-method.rb
@@ -14,7 +14,6 @@ require 'irb/magic-file'
module IRB
STDIN_FILE_NAME = "(line)" # :nodoc:
class InputMethod
- @RCS_ID='-$Id$-'
# Creates a new input method object
def initialize(file = STDIN_FILE_NAME)
@@ -117,7 +116,6 @@ module IRB
def gets
print @prompt
l = @io.gets
-# print @prompt, l
l
end
@@ -133,14 +131,14 @@ module IRB
include Readline
# Creates a new input method object using Readline
def initialize
- super
+ super
- @line_no = 0
- @line = []
- @eof = false
+ @line_no = 0
+ @line = []
+ @eof = false
- @stdin = IO.open(STDIN.to_i, :external_encoding => IRB.conf[:LC_MESSAGES].encoding, :internal_encoding => "-")
- @stdout = IO.open(STDOUT.to_i, 'w', :external_encoding => IRB.conf[:LC_MESSAGES].encoding, :internal_encoding => "-")
+ @stdin = IO.open(STDIN.to_i, :external_encoding => IRB.conf[:LC_MESSAGES].encoding, :internal_encoding => "-")
+ @stdout = IO.open(STDOUT.to_i, 'w', :external_encoding => IRB.conf[:LC_MESSAGES].encoding, :internal_encoding => "-")
end
# Reads the next line from this input method.
@@ -149,13 +147,13 @@ module IRB
def gets
Readline.input = @stdin
Readline.output = @stdout
- if l = readline(@prompt, false)
- HISTORY.push(l) if !l.empty?
- @line[@line_no += 1] = l + "\n"
- else
- @eof = true
- l
- end
+ if l = readline(@prompt, false)
+ HISTORY.push(l) if !l.empty?
+ @line[@line_no += 1] = l + "\n"
+ else
+ @eof = true
+ l
+ end
end
# Whether the end of this input method has been reached, returns +true+
@@ -163,7 +161,7 @@ module IRB
#
# See IO#eof? for more information.
def eof?
- @eof
+ @eof
end
# Whether this input method is still readable when there is no more data to
@@ -171,7 +169,7 @@ module IRB
#
# See IO#eof for more information.
def readable_after_eof?
- true
+ true
end
# Returns the current line number for #io.
@@ -180,12 +178,12 @@ module IRB
#
# See IO#lineno for more information.
def line(line_no)
- @line[line_no]
+ @line[line_no]
end
# The external encoding for standard input.
def encoding
- @stdin.external_encoding
+ @stdin.external_encoding
end
end
rescue LoadError
diff --git a/lib/irb/inspector.rb b/lib/irb/inspector.rb
index cdd90d4081..f09b12927a 100644
--- a/lib/irb/inspector.rb
+++ b/lib/irb/inspector.rb
@@ -61,20 +61,6 @@ module IRB # :nodoc:
# Inspector.def_inspector(key, inspector)
# Inspector.def_inspector([key1,...], inspector)
def self.def_inspector(key, arg=nil, &block)
- # if !block_given?
- # case arg
- # when nil, Proc
- # inspector = IRB::Inspector(init_p)
- # when Inspector
- # inspector = init_p
- # else
- # IRB.Raise IllegalParameter, init_p
- # end
- # init_p = nil
- # else
- # inspector = IRB::Inspector(block, init_p)
- # end
-
if block_given?
inspector = IRB::Inspector(block, arg)
else
diff --git a/lib/irb/locale.rb b/lib/irb/locale.rb
index accce9e13f..9f40188171 100644
--- a/lib/irb/locale.rb
+++ b/lib/irb/locale.rb
@@ -10,7 +10,6 @@
#
module IRB # :nodoc:
class Locale
- @RCS_ID='-$Id$-'
LOCALE_NAME_RE = %r[
(?<language>[[:alpha:]]{2,3})
@@ -26,27 +25,27 @@ module IRB # :nodoc:
@lang = @territory = @encoding_name = @modifier = nil
@locale = locale || ENV["IRB_LANG"] || ENV["LC_MESSAGES"] || ENV["LC_ALL"] || ENV["LANG"] || "C"
if m = LOCALE_NAME_RE.match(@locale)
- @lang, @territory, @encoding_name, @modifier = m[:language], m[:territory], m[:codeset], m[:modifier]
-
- if @encoding_name
- begin load 'irb/encoding_aliases.rb'; rescue LoadError; end
- if @encoding = @@legacy_encoding_alias_map[@encoding_name]
- warn "%s is obsolete. use %s" % ["#{@lang}_#{@territory}.#{@encoding_name}", "#{@lang}_#{@territory}.#{@encoding.name}"]
- end
- @encoding = Encoding.find(@encoding_name) rescue nil
- end
+ @lang, @territory, @encoding_name, @modifier = m[:language], m[:territory], m[:codeset], m[:modifier]
+
+ if @encoding_name
+ begin load 'irb/encoding_aliases.rb'; rescue LoadError; end
+ if @encoding = @@legacy_encoding_alias_map[@encoding_name]
+ warn "%s is obsolete. use %s" % ["#{@lang}_#{@territory}.#{@encoding_name}", "#{@lang}_#{@territory}.#{@encoding.name}"]
+ end
+ @encoding = Encoding.find(@encoding_name) rescue nil
+ end
end
@encoding ||= (Encoding.find('locale') rescue Encoding::ASCII_8BIT)
end
- attr_reader :lang, :territory, :encoding, :modifieer
+ attr_reader :lang, :territory, :encoding, :modifier
def String(mes)
mes = super(mes)
if @encoding
- mes.encode(@encoding, undef: :replace)
+ mes.encode(@encoding, undef: :replace)
else
- mes
+ mes
end
end
@@ -83,22 +82,22 @@ module IRB # :nodoc:
case file
when /\.rb$/
- begin
- load(file, priv)
- $".push file
- return true
- rescue LoadError
- end
+ begin
+ load(file, priv)
+ $".push file
+ return true
+ rescue LoadError
+ end
when /\.(so|o|sl)$/
- return super
+ return super
end
begin
- load(f = file + ".rb")
- $".push f #"
- return true
+ load(f = file + ".rb")
+ $".push f #"
+ return true
rescue LoadError
- return ruby_require(file)
+ return ruby_require(file)
end
end
@@ -129,9 +128,9 @@ module IRB # :nodoc:
def real_load(path, priv)
src = MagicFile.open(path){|f| f.read}
if priv
- eval("self", TOPLEVEL_BINDING).extend(Module.new {eval(src, nil, path)})
+ eval("self", TOPLEVEL_BINDING).extend(Module.new {eval(src, nil, path)})
else
- eval(src, TOPLEVEL_BINDING, path)
+ eval(src, TOPLEVEL_BINDING, path)
end
end
@@ -161,20 +160,20 @@ module IRB # :nodoc:
def each_sublocale
if @lang
- if @territory
- if @encoding_name
- yield "#{@lang}_#{@territory}.#{@encoding_name}@#{@modifier}" if @modifier
- yield "#{@lang}_#{@territory}.#{@encoding_name}"
- end
- yield "#{@lang}_#{@territory}@#{@modifier}" if @modifier
- yield "#{@lang}_#{@territory}"
- end
+ if @territory
+ if @encoding_name
+ yield "#{@lang}_#{@territory}.#{@encoding_name}@#{@modifier}" if @modifier
+ yield "#{@lang}_#{@territory}.#{@encoding_name}"
+ end
+ yield "#{@lang}_#{@territory}@#{@modifier}" if @modifier
+ yield "#{@lang}_#{@territory}"
+ end
if @encoding_name
yield "#{@lang}.#{@encoding_name}@#{@modifier}" if @modifier
yield "#{@lang}.#{@encoding_name}"
end
- yield "#{@lang}@#{@modifier}" if @modifier
- yield "#{@lang}"
+ yield "#{@lang}@#{@modifier}" if @modifier
+ yield "#{@lang}"
end
yield nil
end
diff --git a/lib/irb/notifier.rb b/lib/irb/notifier.rb
index 8207c6c06a..d5981df2bf 100644
--- a/lib/irb/notifier.rb
+++ b/lib/irb/notifier.rb
@@ -40,8 +40,8 @@ module IRB
class AbstractNotifier
# Creates a new Notifier object
def initialize(prefix, base_notifier)
- @prefix = prefix
- @base_notifier = base_notifier
+ @prefix = prefix
+ @base_notifier = base_notifier
end
# The +prefix+ for this Notifier, which is appended to all objects being
@@ -52,38 +52,38 @@ module IRB
#
# Defaults to +true+.
def notify?
- true
+ true
end
# See OutputMethod#print for more detail.
def print(*opts)
- @base_notifier.print prefix, *opts if notify?
+ @base_notifier.print prefix, *opts if notify?
end
# See OutputMethod#printn for more detail.
def printn(*opts)
- @base_notifier.printn prefix, *opts if notify?
+ @base_notifier.printn prefix, *opts if notify?
end
# See OutputMethod#printf for more detail.
def printf(format, *opts)
- @base_notifier.printf(prefix + format, *opts) if notify?
+ @base_notifier.printf(prefix + format, *opts) if notify?
end
# See OutputMethod#puts for more detail.
def puts(*objs)
- if notify?
- @base_notifier.puts(*objs.collect{|obj| prefix + obj.to_s})
- end
+ if notify?
+ @base_notifier.puts(*objs.collect{|obj| prefix + obj.to_s})
+ end
end
# Same as #ppx, except it uses the #prefix given during object
# initialization.
# See OutputMethod#ppx for more detail.
def pp(*objs)
- if notify?
- @base_notifier.ppx @prefix, *objs
- end
+ if notify?
+ @base_notifier.ppx @prefix, *objs
+ end
end
# Same as #pp, except it concatenates the given +prefix+ with the #prefix
@@ -91,14 +91,14 @@ module IRB
#
# See OutputMethod#ppx for more detail.
def ppx(prefix, *objs)
- if notify?
- @base_notifier.ppx @prefix+prefix, *objs
- end
+ if notify?
+ @base_notifier.ppx @prefix+prefix, *objs
+ end
end
# Execute the given block if notifications are enabled.
def exec_if
- yield(@base_notifier) if notify?
+ yield(@base_notifier) if notify?
end
end
@@ -116,10 +116,10 @@ module IRB
# Create a new composite notifier object with the given +prefix+, and
# +base_notifier+ to use for output.
def initialize(prefix, base_notifier)
- super
+ super
- @notifiers = [D_NOMSG]
- @level_notifier = D_NOMSG
+ @notifiers = [D_NOMSG]
+ @level_notifier = D_NOMSG
end
# List of notifiers in the group
@@ -132,9 +132,9 @@ module IRB
#
# This method returns the newly created instance.
def def_notifier(level, prefix = "")
- notifier = LeveledNotifier.new(self, level, prefix)
- @notifiers[level] = notifier
- notifier
+ notifier = LeveledNotifier.new(self, level, prefix)
+ @notifiers[level] = notifier
+ notifier
end
# Returns the leveled notifier for this object
@@ -156,16 +156,16 @@ module IRB
# found in the existing #notifiers Array, or an instance of
# AbstractNotifier
def level_notifier=(value)
- case value
- when AbstractNotifier
- @level_notifier = value
- when Integer
- l = @notifiers[value]
- Notifier.Raise ErrUndefinedNotifier, value unless l
- @level_notifier = l
- else
- Notifier.Raise ErrUnrecognizedLevel, value unless l
- end
+ case value
+ when AbstractNotifier
+ @level_notifier = value
+ when Integer
+ l = @notifiers[value]
+ Notifier.Raise ErrUndefinedNotifier, value unless l
+ @level_notifier = l
+ else
+ Notifier.Raise ErrUnrecognizedLevel, value unless l
+ end
end
alias level= level_notifier=
@@ -183,9 +183,9 @@ module IRB
# CompositeNotifier group to determine whether or not to output
# notifications.
def initialize(base, level, prefix)
- super(prefix, base)
+ super(prefix, base)
- @level = level
+ @level = level
end
# The current level of this notifier object
@@ -196,13 +196,13 @@ module IRB
#
# See the Comparable module for more information.
def <=>(other)
- @level <=> other.level
+ @level <=> other.level
end
# Whether to output messages to the output method, depending on the level
# of this notifier object.
def notify?
- @base_notifier.level >= self
+ @base_notifier.level >= self
end
end
@@ -214,15 +214,15 @@ module IRB
class NoMsgNotifier<LeveledNotifier
# Creates a new notifier that should not be used to output messages.
def initialize
- @base_notifier = nil
- @level = 0
- @prefix = ""
+ @base_notifier = nil
+ @level = 0
+ @prefix = ""
end
# Ensures notifications are ignored, see AbstractNotifier#notify? for
# more information.
def notify?
- false
+ false
end
end
diff --git a/lib/irb/output-method.rb b/lib/irb/output-method.rb
index aae9e2294d..e0ba25f3e4 100644
--- a/lib/irb/output-method.rb
+++ b/lib/irb/output-method.rb
@@ -35,7 +35,7 @@ module IRB
# #parse_printf_format
def printf(format, *opts)
if /(%*)%I/ =~ format
- format, opts = parse_printf_format(format, opts)
+ format, opts = parse_printf_format(format, opts)
end
print sprintf(format, *opts)
end
@@ -58,8 +58,8 @@ module IRB
# character.
def puts(*objs)
for obj in objs
- print(*obj)
- print "\n"
+ print(*obj)
+ print "\n"
end
end
diff --git a/lib/irb/ruby-lex.rb b/lib/irb/ruby-lex.rb
index 4a700b3324..7189307e0a 100644
--- a/lib/irb/ruby-lex.rb
+++ b/lib/irb/ruby-lex.rb
@@ -15,14 +15,13 @@ require "irb/ruby-token"
# :stopdoc:
class RubyLex
- @RCS_ID='-$Id$-'
extend Exception2MessageMapper
def_exception(:AlreadyDefinedToken, "Already defined token(%s)")
def_exception(:TkReading2TokenNoKey, "key nothing(key='%s')")
def_exception(:TkSymbol2TokenNoKey, "key nothing(key='%s')")
def_exception(:TkReading2TokenDuplicateError,
- "key duplicate(token_n='%s', key='%s')")
+ "key duplicate(token_n='%s', key='%s')")
def_exception(:SyntaxError, "%s")
def_exception(:TerminateLineInput, "Terminate Line Input")
@@ -101,7 +100,6 @@ class RubyLex
def getc
while @rests.empty?
-# return nil unless buf_input
@rests.push nil unless buf_input
end
c = @rests.shift
@@ -154,9 +152,9 @@ class RubyLex
if c == "\n"
@line_no -= 1
if idx = @readed.rindex("\n")
- @char_no = idx + 1
+ @char_no = idx + 1
else
- @char_no = @base_char_no + @readed.size
+ @char_no = @base_char_no + @readed.size
end
else
@char_no -= 1
@@ -231,47 +229,43 @@ class RubyLex
initialize_input
catch(:TERM_INPUT) do
loop do
- begin
- @continue = false
- prompt
- unless l = lex
- throw :TERM_INPUT if @line == ''
- else
- @line.concat l
- if @ltype or @continue or @indent > 0
- next
- end
- end
- if @line != "\n"
+ begin
+ @continue = false
+ prompt
+ unless l = lex
+ throw :TERM_INPUT if @line == ''
+ else
+ @line.concat l
+ if @ltype or @continue or @indent > 0
+ next
+ end
+ end
+ if @line != "\n"
@line.force_encoding(@io.encoding)
- yield @line, @exp_line_no
- end
- break unless l
- @line = ''
- @exp_line_no = @line_no
-
- @indent = 0
- @indent_stack = []
- prompt
- rescue TerminateLineInput
- initialize_input
- prompt
- get_readed
- end
+ yield @line, @exp_line_no
+ end
+ break unless l
+ @line = ''
+ @exp_line_no = @line_no
+
+ @indent = 0
+ @indent_stack = []
+ prompt
+ rescue TerminateLineInput
+ initialize_input
+ prompt
+ get_readed
+ end
end
end
end
def lex
until (((tk = token).kind_of?(TkNL) || tk.kind_of?(TkEND_OF_SCRIPT)) &&
- !@continue or
- tk.nil?)
- #p tk
- #p @lex_state
- #p self
+ !@continue or
+ tk.nil?)
end
line = get_readed
- # print self.inspect
if line == "" and tk.kind_of?(TkEND_OF_SCRIPT) || tk.nil?
nil
else
@@ -280,34 +274,31 @@ class RubyLex
end
def token
- # require "tracer"
- # Tracer.on
@prev_seek = @seek
@prev_line_no = @line_no
@prev_char_no = @char_no
begin
begin
- tk = @OP.match(self)
- @space_seen = tk.kind_of?(TkSPACE)
- @lex_state = EXPR_END if @post_symbeg && tk.kind_of?(TkOp)
- @post_symbeg = tk.kind_of?(TkSYMBEG)
+ tk = @OP.match(self)
+ @space_seen = tk.kind_of?(TkSPACE)
+ @lex_state = EXPR_END if @post_symbeg && tk.kind_of?(TkOp)
+ @post_symbeg = tk.kind_of?(TkSYMBEG)
rescue SyntaxError
- raise if @exception_on_syntax_error
- tk = TkError.new(@seek, @line_no, @char_no)
+ raise if @exception_on_syntax_error
+ tk = TkError.new(@seek, @line_no, @char_no)
end
end while @skip_space and tk.kind_of?(TkSPACE)
if @readed_auto_clean_up
get_readed
end
- # Tracer.off
tk
end
ENINDENT_CLAUSE = [
"case", "class", "def", "do", "for", "if",
- "module", "unless", "until", "while", "begin" #, "when"
+ "module", "unless", "until", "while", "begin"
]
- DEINDENT_CLAUSE = ["end" #, "when"
+ DEINDENT_CLAUSE = ["end"
]
PERCENT_LTYPE = {
@@ -361,12 +352,12 @@ class RubyLex
end
@OP.def_rule("=begin",
- proc{|op, io| @prev_char_no == 0 && peek(0) =~ /\s/}) do
+ proc{|op, io| @prev_char_no == 0 && peek(0) =~ /\s/}) do
|op, io|
@ltype = "="
until getc == "\n"; end
until peek_equal?("=end") && peek(4) =~ /\s/
- until getc == "\n"; end
+ until getc == "\n"; end
end
gets
@ltype = nil
@@ -377,15 +368,15 @@ class RubyLex
print "\\n\n" if RubyLex.debug?
case @lex_state
when EXPR_BEG, EXPR_FNAME, EXPR_DOT
- @continue = true
+ @continue = true
else
- @continue = false
- @lex_state = EXPR_BEG
- until (@indent_stack.empty? ||
- [TkLPAREN, TkLBRACK, TkLBRACE,
- TkfLPAREN, TkfLBRACK, TkfLBRACE].include?(@indent_stack.last))
- @indent_stack.pop
- end
+ @continue = false
+ @lex_state = EXPR_BEG
+ until (@indent_stack.empty? ||
+ [TkLPAREN, TkLBRACK, TkLBRACE,
+ TkfLPAREN, TkfLBRACK, TkfLBRACE].include?(@indent_stack.last))
+ @indent_stack.pop
+ end
end
@here_header = false
@here_readed = []
@@ -393,17 +384,17 @@ class RubyLex
end
@OP.def_rules("*", "**",
- "=", "==", "===",
- "=~", "<=>",
- "<", "<=",
- ">", ">=", ">>",
- "!", "!=", "!~") do
+ "=", "==", "===",
+ "=~", "<=>",
+ "<", "<=",
+ ">", ">=", ">>",
+ "!", "!=", "!~") do
|op, io|
case @lex_state
when EXPR_FNAME, EXPR_DOT
- @lex_state = EXPR_ARG
+ @lex_state = EXPR_ARG
else
- @lex_state = EXPR_BEG
+ @lex_state = EXPR_BEG
end
Token(op)
end
@@ -412,20 +403,20 @@ class RubyLex
|op, io|
tk = nil
if @lex_state != EXPR_END && @lex_state != EXPR_CLASS &&
- (@lex_state != EXPR_ARG || @space_seen)
- c = peek(0)
- if /\S/ =~ c && (/["'`]/ =~ c || /\w/ =~ c || c == "-")
- tk = identify_here_document
- end
+ (@lex_state != EXPR_ARG || @space_seen)
+ c = peek(0)
+ if /\S/ =~ c && (/["'`]/ =~ c || /\w/ =~ c || c == "-")
+ tk = identify_here_document
+ end
end
unless tk
- tk = Token(op)
- case @lex_state
- when EXPR_FNAME, EXPR_DOT
- @lex_state = EXPR_ARG
- else
- @lex_state = EXPR_BEG
- end
+ tk = Token(op)
+ case @lex_state
+ when EXPR_FNAME, EXPR_DOT
+ @lex_state = EXPR_ARG
+ else
+ @lex_state = EXPR_BEG
+ end
end
tk
end
@@ -438,31 +429,31 @@ class RubyLex
@OP.def_rules("`") do
|op, io|
if @lex_state == EXPR_FNAME
- @lex_state = EXPR_END
- Token(op)
+ @lex_state = EXPR_END
+ Token(op)
else
- identify_string(op)
+ identify_string(op)
end
end
@OP.def_rules('?') do
|op, io|
if @lex_state == EXPR_END
- @lex_state = EXPR_BEG
- Token(TkQUESTION)
+ @lex_state = EXPR_BEG
+ Token(TkQUESTION)
else
- ch = getc
- if @lex_state == EXPR_ARG && ch =~ /\s/
- ungetc
- @lex_state = EXPR_BEG;
- Token(TkQUESTION)
- else
- if (ch == '\\')
- read_escape
- end
- @lex_state = EXPR_END
- Token(TkINTEGER)
- end
+ ch = getc
+ if @lex_state == EXPR_ARG && ch =~ /\s/
+ ungetc
+ @lex_state = EXPR_BEG;
+ Token(TkQUESTION)
+ else
+ if (ch == '\\')
+ read_escape
+ end
+ @lex_state = EXPR_END
+ Token(TkINTEGER)
+ end
end
end
@@ -473,7 +464,7 @@ class RubyLex
end
@OP.def_rules("+=", "-=", "*=", "**=",
- "&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do
+ "&=", "|=", "^=", "<<=", ">>=", "||=", "&&=") do
|op, io|
@lex_state = EXPR_BEG
op =~ /^(.*)=$/
@@ -495,18 +486,18 @@ class RubyLex
@OP.def_rules("+", "-") do
|op, io|
catch(:RET) do
- if @lex_state == EXPR_ARG
- if @space_seen and peek(0) =~ /[0-9]/
- throw :RET, identify_number
- else
- @lex_state = EXPR_BEG
- end
- elsif @lex_state != EXPR_END and peek(0) =~ /[0-9]/
- throw :RET, identify_number
- else
- @lex_state = EXPR_BEG
- end
- Token(op)
+ if @lex_state == EXPR_ARG
+ if @space_seen and peek(0) =~ /[0-9]/
+ throw :RET, identify_number
+ else
+ @lex_state = EXPR_BEG
+ end
+ elsif @lex_state != EXPR_END and peek(0) =~ /[0-9]/
+ throw :RET, identify_number
+ else
+ @lex_state = EXPR_BEG
+ end
+ Token(op)
end
end
@@ -514,12 +505,12 @@ class RubyLex
|op, io|
@lex_state = EXPR_BEG
if peek(0) =~ /[0-9]/
- ungetc
- identify_number
+ ungetc
+ identify_number
else
- # for "obj.if" etc.
- @lex_state = EXPR_DOT
- Token(TkDOT)
+ # for "obj.if" etc.
+ @lex_state = EXPR_DOT
+ Token(TkDOT)
end
end
@@ -544,39 +535,38 @@ class RubyLex
@OP.def_rule(":") do
|op, io|
if @lex_state == EXPR_END || peek(0) =~ /\s/
- @lex_state = EXPR_BEG
- Token(TkCOLON)
+ @lex_state = EXPR_BEG
+ Token(TkCOLON)
else
- @lex_state = EXPR_FNAME
- Token(TkSYMBEG)
+ @lex_state = EXPR_FNAME
+ Token(TkSYMBEG)
end
end
@OP.def_rule("::") do
|op, io|
-# p @lex_state.id2name, @space_seen
if @lex_state == EXPR_BEG or @lex_state == EXPR_ARG && @space_seen
- @lex_state = EXPR_BEG
- Token(TkCOLON3)
+ @lex_state = EXPR_BEG
+ Token(TkCOLON3)
else
- @lex_state = EXPR_DOT
- Token(TkCOLON2)
+ @lex_state = EXPR_DOT
+ Token(TkCOLON2)
end
end
@OP.def_rule("/") do
|op, io|
if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
- identify_string(op)
+ identify_string(op)
elsif peek(0) == '='
- getc
- @lex_state = EXPR_BEG
- Token(TkOPASGN, "/") #/)
+ getc
+ @lex_state = EXPR_BEG
+ Token(TkOPASGN, "/") #/)
elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
- identify_string(op)
+ identify_string(op)
else
- @lex_state = EXPR_BEG
- Token("/") #/)
+ @lex_state = EXPR_BEG
+ Token("/") #/)
end
end
@@ -586,11 +576,6 @@ class RubyLex
Token("^")
end
- # @OP.def_rules("^=") do
- # @lex_state = EXPR_BEG
- # Token(OP_ASGN, :^)
- # end
-
@OP.def_rules(",") do
|op, io|
@lex_state = EXPR_BEG
@@ -601,9 +586,9 @@ class RubyLex
|op, io|
@lex_state = EXPR_BEG
until (@indent_stack.empty? ||
- [TkLPAREN, TkLBRACK, TkLBRACE,
- TkfLPAREN, TkfLBRACK, TkfLBRACE].include?(@indent_stack.last))
- @indent_stack.pop
+ [TkLPAREN, TkLBRACK, TkLBRACE,
+ TkfLPAREN, TkfLBRACK, TkfLBRACE].include?(@indent_stack.last))
+ @indent_stack.pop
end
Token(op)
end
@@ -624,11 +609,11 @@ class RubyLex
|op, io|
@indent += 1
if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
- @lex_state = EXPR_BEG
- tk_c = TkfLPAREN
+ @lex_state = EXPR_BEG
+ tk_c = TkfLPAREN
else
- @lex_state = EXPR_BEG
- tk_c = TkLPAREN
+ @lex_state = EXPR_BEG
+ tk_c = TkLPAREN
end
@indent_stack.push tk_c
Token(tk_c)
@@ -650,16 +635,16 @@ class RubyLex
|op, io|
@indent += 1
if @lex_state == EXPR_FNAME
- tk_c = TkfLBRACK
+ tk_c = TkfLBRACK
else
- if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
- tk_c = TkLBRACK
- elsif @lex_state == EXPR_ARG && @space_seen
- tk_c = TkLBRACK
- else
- tk_c = TkfLBRACK
- end
- @lex_state = EXPR_BEG
+ if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
+ tk_c = TkLBRACK
+ elsif @lex_state == EXPR_ARG && @space_seen
+ tk_c = TkLBRACK
+ else
+ tk_c = TkfLBRACK
+ end
+ @lex_state = EXPR_BEG
end
@indent_stack.push tk_c
Token(tk_c)
@@ -669,9 +654,9 @@ class RubyLex
|op, io|
@indent += 1
if @lex_state != EXPR_END && @lex_state != EXPR_ARG
- tk_c = TkLBRACE
+ tk_c = TkLBRACE
else
- tk_c = TkfLBRACE
+ tk_c = TkfLBRACE
end
@lex_state = EXPR_BEG
@indent_stack.push tk_c
@@ -681,27 +666,27 @@ class RubyLex
@OP.def_rule('\\') do
|op, io|
if getc == "\n"
- @space_seen = true
- @continue = true
- Token(TkSPACE)
+ @space_seen = true
+ @continue = true
+ Token(TkSPACE)
else
- read_escape
- Token("\\")
+ read_escape
+ Token("\\")
end
end
@OP.def_rule('%') do
|op, io|
if @lex_state == EXPR_BEG || @lex_state == EXPR_MID
- identify_quotation
+ identify_quotation
elsif peek(0) == '='
- getc
- Token(TkOPASGN, :%)
+ getc
+ Token(TkOPASGN, :%)
elsif @lex_state == EXPR_ARG and @space_seen and peek(0) !~ /\s/
- identify_quotation
+ identify_quotation
else
- @lex_state = EXPR_BEG
- Token("%") #))
+ @lex_state = EXPR_BEG
+ Token("%") #))
end
end
@@ -713,30 +698,20 @@ class RubyLex
@OP.def_rule('@') do
|op, io|
if peek(0) =~ /[\w@]/
- ungetc
- identify_identifier
+ ungetc
+ identify_identifier
else
- Token("@")
+ Token("@")
end
end
- # @OP.def_rule("def", proc{|op, io| /\s/ =~ io.peek(0)}) do
- # |op, io|
- # @indent += 1
- # @lex_state = EXPR_FNAME
- # # @lex_state = EXPR_END
- # # until @rests[0] == "\n" or @rests[0] == ";"
- # # rests.shift
- # # end
- # end
-
@OP.def_rule("") do
|op, io|
printf "MATCH: start %s: %s\n", op, io.inspect if RubyLex.debug?
if peek(0) =~ /[0-9]/
- t = identify_number
+ t = identify_number
elsif peek(0) =~ /[^\x00-\/:-@\[-^`{-\x7F]/
- t = identify_identifier
+ t = identify_identifier
end
printf "MATCH: end %s: %s\n", op, io.inspect if RubyLex.debug?
t
@@ -774,7 +749,7 @@ class RubyLex
if peek(0) =~ /[$@]/
token.concat(c = getc)
if c == "@" and peek(0) == "@"
- token.concat getc
+ token.concat getc
end
end
@@ -807,61 +782,60 @@ class RubyLex
token_c, *trans = TkReading2Token[token]
if token_c
- # reserved word?
-
- if (@lex_state != EXPR_BEG &&
- @lex_state != EXPR_FNAME &&
- trans[1])
- # modifiers
- token_c = TkSymbol2Token[trans[1]]
- @lex_state = trans[0]
- else
- if @lex_state != EXPR_FNAME
- if ENINDENT_CLAUSE.include?(token)
- # check for ``class = val'' etc.
- valid = true
- case token
- when "class"
- valid = false unless peek_match?(/^\s*(<<|\w|::)/)
- when "def"
- valid = false if peek_match?(/^\s*(([+\-\/*&\|^]|<<|>>|\|\||\&\&)=|\&\&|\|\|)/)
- when "do"
- valid = false if peek_match?(/^\s*([+\-\/*]?=|\*|<|>|\&)/)
- when *ENINDENT_CLAUSE
- valid = false if peek_match?(/^\s*([+\-\/*]?=|\*|<|>|\&|\|)/)
- else
- # no nothing
- end
- if valid
- if token == "do"
- if ![TkFOR, TkWHILE, TkUNTIL].include?(@indent_stack.last)
- @indent += 1
- @indent_stack.push token_c
- end
- else
- @indent += 1
- @indent_stack.push token_c
- end
-# p @indent_stack
- end
-
- elsif DEINDENT_CLAUSE.include?(token)
- @indent -= 1
- @indent_stack.pop
- end
- @lex_state = trans[0]
- else
- @lex_state = EXPR_END
- end
- end
- return Token(token_c, token)
+ # reserved word?
+
+ if (@lex_state != EXPR_BEG &&
+ @lex_state != EXPR_FNAME &&
+ trans[1])
+ # modifiers
+ token_c = TkSymbol2Token[trans[1]]
+ @lex_state = trans[0]
+ else
+ if @lex_state != EXPR_FNAME
+ if ENINDENT_CLAUSE.include?(token)
+ # check for ``class = val'' etc.
+ valid = true
+ case token
+ when "class"
+ valid = false unless peek_match?(/^\s*(<<|\w|::)/)
+ when "def"
+ valid = false if peek_match?(/^\s*(([+\-\/*&\|^]|<<|>>|\|\||\&\&)=|\&\&|\|\|)/)
+ when "do"
+ valid = false if peek_match?(/^\s*([+\-\/*]?=|\*|<|>|\&)/)
+ when *ENINDENT_CLAUSE
+ valid = false if peek_match?(/^\s*([+\-\/*]?=|\*|<|>|\&|\|)/)
+ else
+ # no nothing
+ end
+ if valid
+ if token == "do"
+ if ![TkFOR, TkWHILE, TkUNTIL].include?(@indent_stack.last)
+ @indent += 1
+ @indent_stack.push token_c
+ end
+ else
+ @indent += 1
+ @indent_stack.push token_c
+ end
+ end
+
+ elsif DEINDENT_CLAUSE.include?(token)
+ @indent -= 1
+ @indent_stack.pop
+ end
+ @lex_state = trans[0]
+ else
+ @lex_state = EXPR_END
+ end
+ end
+ return Token(token_c, token)
end
end
if @lex_state == EXPR_FNAME
@lex_state = EXPR_END
if peek(0) == '='
- token.concat getc
+ token.concat getc
end
elsif @lex_state == EXPR_BEG || @lex_state == EXPR_DOT
@lex_state = EXPR_ARG
@@ -880,7 +854,6 @@ class RubyLex
def identify_here_document
ch = getc
-# if lt = PERCENT_LTYPE[ch]
if ch == "-"
ch = getc
indent = true
@@ -889,13 +862,13 @@ class RubyLex
lt = ch
quoted = ""
while (c = getc) && c != lt
- quoted.concat c
+ quoted.concat c
end
else
lt = '"'
quoted = ch.dup
while (c = getc) && c =~ /\w/
- quoted.concat c
+ quoted.concat c
end
ungetc
end
@@ -905,32 +878,26 @@ class RubyLex
while ch = getc
reserve.push ch
if ch == "\\"
- reserve.push ch = getc
+ reserve.push ch = getc
elsif ch == "\n"
- break
+ break
end
end
@here_header = false
-# while l = gets
-# l = l.sub(/(:?\r)?\n\z/, '')
-# if (indent ? l.strip : l) == quoted
-# break
-# end
-# end
line = ""
while ch = getc
if ch == "\n"
- if line == quoted
- break
- end
- line = ""
+ if line == quoted
+ break
+ end
+ line = ""
else
- line.concat ch unless indent && line == "" && /\s/ =~ ch
- if @ltype != "'" && ch == "#" && peek(0) == "{"
- identify_string_dvar
- end
+ line.concat ch unless indent && line == "" && /\s/ =~ ch
+ if @ltype != "'" && ch == "#" && peek(0) == "{"
+ identify_string_dvar
+ end
end
end
@@ -954,11 +921,6 @@ class RubyLex
else
RubyLex.fail SyntaxError, "unknown type of %string"
end
-# if ch !~ /\W/
-# ungetc
-# next
-# end
- #@ltype = lt
@quoted = ch unless @quoted = PERCENT_PAREN[ch]
identify_string(lt, @quoted)
end
@@ -970,49 +932,49 @@ class RubyLex
getc
case peek(0)
when /[xX]/
- ch = getc
- match = /[0-9a-fA-F_]/
+ ch = getc
+ match = /[0-9a-fA-F_]/
when /[bB]/
- ch = getc
- match = /[01_]/
+ ch = getc
+ match = /[01_]/
when /[oO]/
- ch = getc
- match = /[0-7_]/
+ ch = getc
+ match = /[0-7_]/
when /[dD]/
- ch = getc
- match = /[0-9_]/
+ ch = getc
+ match = /[0-9_]/
when /[0-7]/
- match = /[0-7_]/
+ match = /[0-7_]/
when /[89]/
- RubyLex.fail SyntaxError, "Invalid octal digit"
+ RubyLex.fail SyntaxError, "Invalid octal digit"
else
- return Token(TkINTEGER)
+ return Token(TkINTEGER)
end
len0 = true
non_digit = false
while ch = getc
- if match =~ ch
- if ch == "_"
- if non_digit
- RubyLex.fail SyntaxError, "trailing `#{ch}' in number"
- else
- non_digit = ch
- end
- else
- non_digit = false
- len0 = false
- end
- else
- ungetc
- if len0
- RubyLex.fail SyntaxError, "numeric literal without digits"
- end
- if non_digit
- RubyLex.fail SyntaxError, "trailing `#{non_digit}' in number"
- end
- break
- end
+ if match =~ ch
+ if ch == "_"
+ if non_digit
+ RubyLex.fail SyntaxError, "trailing `#{ch}' in number"
+ else
+ non_digit = ch
+ end
+ else
+ non_digit = false
+ len0 = false
+ end
+ else
+ ungetc
+ if len0
+ RubyLex.fail SyntaxError, "numeric literal without digits"
+ end
+ if non_digit
+ RubyLex.fail SyntaxError, "trailing `#{non_digit}' in number"
+ end
+ break
+ end
end
return Token(TkINTEGER)
end
@@ -1024,37 +986,37 @@ class RubyLex
while ch = getc
case ch
when /[0-9]/
- non_digit = false
+ non_digit = false
when "_"
- non_digit = ch
+ non_digit = ch
when allow_point && "."
- if non_digit
- RubyLex.fail SyntaxError, "trailing `#{non_digit}' in number"
- end
- type = TkFLOAT
- if peek(0) !~ /[0-9]/
- type = TkINTEGER
- ungetc
- break
- end
- allow_point = false
+ if non_digit
+ RubyLex.fail SyntaxError, "trailing `#{non_digit}' in number"
+ end
+ type = TkFLOAT
+ if peek(0) !~ /[0-9]/
+ type = TkINTEGER
+ ungetc
+ break
+ end
+ allow_point = false
when allow_e && "e", allow_e && "E"
- if non_digit
- RubyLex.fail SyntaxError, "trailing `#{non_digit}' in number"
- end
- type = TkFLOAT
- if peek(0) =~ /[+-]/
- getc
- end
- allow_e = false
- allow_point = false
- non_digit = ch
+ if non_digit
+ RubyLex.fail SyntaxError, "trailing `#{non_digit}' in number"
+ end
+ type = TkFLOAT
+ if peek(0) =~ /[+-]/
+ getc
+ end
+ allow_e = false
+ allow_point = false
+ non_digit = ch
else
- if non_digit
- RubyLex.fail SyntaxError, "trailing `#{non_digit}' in number"
- end
- ungetc
- break
+ if non_digit
+ RubyLex.fail SyntaxError, "trailing `#{non_digit}' in number"
+ end
+ ungetc
+ break
end
end
Token(type)
@@ -1067,38 +1029,38 @@ class RubyLex
begin
nest = 0
while ch = getc
- if @quoted == ch and nest == 0
- break
- elsif @ltype != "'" && ch == "#" && peek(0) == "{"
- identify_string_dvar
- elsif @ltype != "'" && @ltype != "]" && @ltype != ":" and ch == "#"
- subtype = true
- elsif ch == '\\' and @ltype == "'" #'
- case ch = getc
- when "\\", "\n", "'"
- else
- ungetc
- end
- elsif ch == '\\' #'
- read_escape
- end
- if PERCENT_PAREN.values.include?(@quoted)
- if PERCENT_PAREN[ch] == @quoted
- nest += 1
- elsif ch == @quoted
- nest -= 1
- end
- end
+ if @quoted == ch and nest == 0
+ break
+ elsif @ltype != "'" && ch == "#" && peek(0) == "{"
+ identify_string_dvar
+ elsif @ltype != "'" && @ltype != "]" && @ltype != ":" and ch == "#"
+ subtype = true
+ elsif ch == '\\' and @ltype == "'" #'
+ case ch = getc
+ when "\\", "\n", "'"
+ else
+ ungetc
+ end
+ elsif ch == '\\' #'
+ read_escape
+ end
+ if PERCENT_PAREN.values.include?(@quoted)
+ if PERCENT_PAREN[ch] == @quoted
+ nest += 1
+ elsif ch == @quoted
+ nest -= 1
+ end
+ end
end
if @ltype == "/"
while /[imxoesun]/ =~ peek(0)
- getc
- end
+ getc
+ end
end
if subtype
- Token(DLtype2Token[ltype])
+ Token(DLtype2Token[ltype])
else
- Token(Ltype2Token[ltype])
+ Token(Ltype2Token[ltype])
end
ensure
@ltype = nil
@@ -1125,13 +1087,13 @@ class RubyLex
@lex_state = EXPR_BEG
loop do
- @continue = false
- prompt
- tk = token
- if @ltype or @continue or @indent > 0
- next
- end
- break if tk.kind_of?(TkRBRACE)
+ @continue = false
+ prompt
+ tk = token
+ if @ltype or @continue or @indent >= 0
+ next
+ end
+ break if tk.kind_of?(TkRBRACE)
end
ensure
@continue = reserve_continue
@@ -1147,13 +1109,10 @@ class RubyLex
@ltype = "#"
while ch = getc
-# if ch == "\\" #"
-# read_escape
-# end
if ch == "\n"
- @ltype = nil
- ungetc
- break
+ @ltype = nil
+ ungetc
+ break
end
end
return Token(TkCOMMENT)
@@ -1166,42 +1125,42 @@ class RubyLex
when /[0-7]/
ungetc ch
3.times do
- case ch = getc
- when /[0-7]/
- when nil
- break
- else
- ungetc
- break
- end
+ case ch = getc
+ when /[0-7]/
+ when nil
+ break
+ else
+ ungetc
+ break
+ end
end
when "x"
2.times do
- case ch = getc
- when /[0-9a-fA-F]/
- when nil
- break
- else
- ungetc
- break
- end
+ case ch = getc
+ when /[0-9a-fA-F]/
+ when nil
+ break
+ else
+ ungetc
+ break
+ end
end
when "M"
if (ch = getc) != '-'
- ungetc
+ ungetc
else
- if (ch = getc) == "\\" #"
- read_escape
- end
+ if (ch = getc) == "\\" #"
+ read_escape
+ end
end
when "C", "c" #, "^"
if ch == "C" and (ch = getc) != "-"
- ungetc
+ ungetc
elsif (ch = getc) == "\\" #"
- read_escape
+ read_escape
end
else
# other characters
diff --git a/lib/irb/ruby-token.rb b/lib/irb/ruby-token.rb
index 2c7565dbfc..a80d81c9a5 100644
--- a/lib/irb/ruby-token.rb
+++ b/lib/irb/ruby-token.rb
@@ -24,14 +24,14 @@ module RubyToken
@line_no = line_no
@char_no = char_no
end
- attr :seek, :line_no, :char_no
+ attr_reader :seek, :line_no, :char_no
end
class TkNode < Token
def initialize(seek, line_no, char_no)
super
end
- attr :node
+ attr_reader :node
end
class TkId < Token
@@ -39,7 +39,7 @@ module RubyToken
super(seek, line_no, char_no)
@name = name
end
- attr :name
+ attr_reader :name
end
class TkVal < Token
@@ -47,7 +47,7 @@ module RubyToken
super(seek, line_no, char_no)
@value = value
end
- attr :value
+ attr_reader :value
end
class TkOp < Token
@@ -60,7 +60,7 @@ module RubyToken
op = TkReading2Token[op][0] unless op.kind_of?(Symbol)
@op = op
end
- attr :op
+ attr_reader :op
end
class TkUnknownChar < Token
@@ -68,7 +68,7 @@ module RubyToken
super(seek, line_no, char_no)
@name = name
end
- attr :name
+ attr_reader :name
end
class TkError < Token
@@ -78,23 +78,23 @@ module RubyToken
case token
when String
if (tk = TkReading2Token[token]).nil?
- IRB.fail TkReading2TokenNoKey, token
+ IRB.fail TkReading2TokenNoKey, token
end
tk = Token(tk[0], value)
if tk.kind_of?(TkOp)
- tk.name = token
+ tk.name = token
end
return tk
when Symbol
if (tk = TkSymbol2Token[token]).nil?
- IRB.fail TkSymbol2TokenNoKey, token
+ IRB.fail TkSymbol2TokenNoKey, token
end
return Token(tk[0], value)
else
if (token.ancestors & [TkId, TkVal, TkOPASGN, TkUnknownChar]).empty?
- token.new(@prev_seek, @prev_line_no, @prev_char_no)
+ token.new(@prev_seek, @prev_line_no, @prev_char_no)
else
- token.new(@prev_seek, @prev_line_no, @prev_char_no, value)
+ token.new(@prev_seek, @prev_line_no, @prev_char_no, value)
end
end
end
@@ -186,7 +186,6 @@ module RubyToken
[:TkRSHFT, TkOp, ">>"],
[:TkCOLON2, TkOp],
[:TkCOLON3, TkOp],
-# [:OPASGN, TkOp], # +=, -= etc. #
[:TkASSOC, TkOp, "=>"],
[:TkQUESTION, TkOp, "?"], #?
[:TkCOLON, TkOp, ":"], #:
@@ -249,12 +248,12 @@ module RubyToken
if reading
if TkReading2Token[reading]
- IRB.fail TkReading2TokenDuplicateError, token_n, reading
+ IRB.fail TkReading2TokenDuplicateError, token_n, reading
end
if opts.empty?
- TkReading2Token[reading] = [token_c]
+ TkReading2Token[reading] = [token_c]
else
- TkReading2Token[reading] = [token_c].concat(opts)
+ TkReading2Token[reading] = [token_c].concat(opts)
end
end
TkSymbol2Token[token_n.intern] = token_c
diff --git a/lib/irb/slex.rb b/lib/irb/slex.rb
index 09c1c02ebc..f6c2bd92f5 100644
--- a/lib/irb/slex.rb
+++ b/lib/irb/slex.rb
@@ -15,7 +15,6 @@ require "irb/notifier"
# :stopdoc:
module IRB
class SLex
- @RCS_ID='-$Id$-'
extend Exception2MessageMapper
def_exception :ErrNodeNothing, "node nothing"
@@ -41,10 +40,10 @@ module IRB
def def_rules(*tokens, &block)
if block_given?
- p = block
+ p = block
end
for token in tokens
- def_rule(token, nil, p)
+ def_rule(token, nil, p)
end
end
@@ -71,9 +70,9 @@ module IRB
case token
when Array
when String
- return match(token.split(//))
+ return match(token.split(//))
else
- return @head.match_io(token)
+ return @head.match_io(token)
end
ret = @head.match(token)
D_DETAIL.exec_if{D_DETAIL.printf "match end: %s:%s\n", ret, token.inspect}
@@ -93,69 +92,69 @@ module IRB
# if postproc is nil, this node is an abstract node.
# if postproc is non-nil, this node is a real node.
def initialize(preproc = nil, postproc = nil)
- @Tree = {}
- @preproc = preproc
- @postproc = postproc
+ @Tree = {}
+ @preproc = preproc
+ @postproc = postproc
end
attr_accessor :preproc
attr_accessor :postproc
def search(chrs, opt = nil)
- return self if chrs.empty?
- ch = chrs.shift
- if node = @Tree[ch]
- node.search(chrs, opt)
- else
- if opt
- chrs.unshift ch
- self.create_subnode(chrs)
- else
- SLex.fail ErrNodeNothing
- end
- end
+ return self if chrs.empty?
+ ch = chrs.shift
+ if node = @Tree[ch]
+ node.search(chrs, opt)
+ else
+ if opt
+ chrs.unshift ch
+ self.create_subnode(chrs)
+ else
+ SLex.fail ErrNodeNothing
+ end
+ end
end
def create_subnode(chrs, preproc = nil, postproc = nil)
- if chrs.empty?
- if @postproc
- D_DETAIL.pp node
- SLex.fail ErrNodeAlreadyExists
- else
- D_DEBUG.puts "change abstract node to real node."
- @preproc = preproc
- @postproc = postproc
- end
- return self
- end
+ if chrs.empty?
+ if @postproc
+ D_DETAIL.pp node
+ SLex.fail ErrNodeAlreadyExists
+ else
+ D_DEBUG.puts "change abstract node to real node."
+ @preproc = preproc
+ @postproc = postproc
+ end
+ return self
+ end
- ch = chrs.shift
- if node = @Tree[ch]
- if chrs.empty?
- if node.postproc
- DebugLogger.pp node
- DebugLogger.pp self
- DebugLogger.pp ch
- DebugLogger.pp chrs
- SLex.fail ErrNodeAlreadyExists
- else
- D_WARN.puts "change abstract node to real node"
- node.preproc = preproc
- node.postproc = postproc
- end
- else
- node.create_subnode(chrs, preproc, postproc)
- end
- else
- if chrs.empty?
- node = Node.new(preproc, postproc)
- else
- node = Node.new
- node.create_subnode(chrs, preproc, postproc)
- end
- @Tree[ch] = node
- end
- node
+ ch = chrs.shift
+ if node = @Tree[ch]
+ if chrs.empty?
+ if node.postproc
+ DebugLogger.pp node
+ DebugLogger.pp self
+ DebugLogger.pp ch
+ DebugLogger.pp chrs
+ SLex.fail ErrNodeAlreadyExists
+ else
+ D_WARN.puts "change abstract node to real node"
+ node.preproc = preproc
+ node.postproc = postproc
+ end
+ else
+ node.create_subnode(chrs, preproc, postproc)
+ end
+ else
+ if chrs.empty?
+ node = Node.new(preproc, postproc)
+ else
+ node = Node.new
+ node.create_subnode(chrs, preproc, postproc)
+ end
+ @Tree[ch] = node
+ end
+ node
end
#
@@ -165,81 +164,81 @@ module IRB
# able to be called arbitrary number of times.
#
def match(chrs, op = "")
- D_DETAIL.print "match>: ", chrs, "op:", op, "\n"
- if chrs.empty?
- if @preproc.nil? || @preproc.call(op, chrs)
- DOUT.printf(D_DETAIL, "op1: %s\n", op)
- @postproc.call(op, chrs)
- else
- nil
- end
- else
- ch = chrs.shift
- if node = @Tree[ch]
- if ret = node.match(chrs, op+ch)
- return ret
- else
- chrs.unshift ch
- if @postproc and @preproc.nil? || @preproc.call(op, chrs)
- DOUT.printf(D_DETAIL, "op2: %s\n", op.inspect)
- ret = @postproc.call(op, chrs)
- return ret
- else
- return nil
- end
- end
- else
- chrs.unshift ch
- if @postproc and @preproc.nil? || @preproc.call(op, chrs)
- DOUT.printf(D_DETAIL, "op3: %s\n", op)
- @postproc.call(op, chrs)
- return ""
- else
- return nil
- end
- end
- end
+ D_DETAIL.print "match>: ", chrs, "op:", op, "\n"
+ if chrs.empty?
+ if @preproc.nil? || @preproc.call(op, chrs)
+ DOUT.printf(D_DETAIL, "op1: %s\n", op)
+ @postproc.call(op, chrs)
+ else
+ nil
+ end
+ else
+ ch = chrs.shift
+ if node = @Tree[ch]
+ if ret = node.match(chrs, op+ch)
+ return ret
+ else
+ chrs.unshift ch
+ if @postproc and @preproc.nil? || @preproc.call(op, chrs)
+ DOUT.printf(D_DETAIL, "op2: %s\n", op.inspect)
+ ret = @postproc.call(op, chrs)
+ return ret
+ else
+ return nil
+ end
+ end
+ else
+ chrs.unshift ch
+ if @postproc and @preproc.nil? || @preproc.call(op, chrs)
+ DOUT.printf(D_DETAIL, "op3: %s\n", op)
+ @postproc.call(op, chrs)
+ return ""
+ else
+ return nil
+ end
+ end
+ end
end
def match_io(io, op = "")
- if op == ""
- ch = io.getc
- if ch == nil
- return nil
- end
- else
- ch = io.getc_of_rests
- end
- if ch.nil?
- if @preproc.nil? || @preproc.call(op, io)
- D_DETAIL.printf("op1: %s\n", op)
- @postproc.call(op, io)
- else
- nil
- end
- else
- if node = @Tree[ch]
- if ret = node.match_io(io, op+ch)
- ret
- else
- io.ungetc ch
- if @postproc and @preproc.nil? || @preproc.call(op, io)
- DOUT.exec_if{D_DETAIL.printf "op2: %s\n", op.inspect}
- @postproc.call(op, io)
- else
- nil
- end
- end
- else
- io.ungetc ch
- if @postproc and @preproc.nil? || @preproc.call(op, io)
- D_DETAIL.printf("op3: %s\n", op)
- @postproc.call(op, io)
- else
- nil
- end
- end
- end
+ if op == ""
+ ch = io.getc
+ if ch == nil
+ return nil
+ end
+ else
+ ch = io.getc_of_rests
+ end
+ if ch.nil?
+ if @preproc.nil? || @preproc.call(op, io)
+ D_DETAIL.printf("op1: %s\n", op)
+ @postproc.call(op, io)
+ else
+ nil
+ end
+ else
+ if node = @Tree[ch]
+ if ret = node.match_io(io, op+ch)
+ ret
+ else
+ io.ungetc ch
+ if @postproc and @preproc.nil? || @preproc.call(op, io)
+ DOUT.exec_if{D_DETAIL.printf "op2: %s\n", op.inspect}
+ @postproc.call(op, io)
+ else
+ nil
+ end
+ end
+ else
+ io.ungetc ch
+ if @postproc and @preproc.nil? || @preproc.call(op, io)
+ D_DETAIL.printf("op3: %s\n", op)
+ @postproc.call(op, io)
+ else
+ nil
+ end
+ end
+ end
end
end
end
@@ -247,7 +246,6 @@ end
# :startdoc:
if $0 == __FILE__
- # Tracer.on
case $1
when "1"
tr = SLex.new
@@ -281,4 +279,3 @@ if $0 == __FILE__
end
exit
end
-
diff --git a/lib/irb/workspace.rb b/lib/irb/workspace.rb
index a627e7f3c2..e05c3bbc96 100644
--- a/lib/irb/workspace.rb
+++ b/lib/irb/workspace.rb
@@ -16,61 +16,61 @@ module IRB # :nodoc:
# inherit main from TOPLEVEL_BINDING.
def initialize(*main)
if main[0].kind_of?(Binding)
- @binding = main.shift
+ @binding = main.shift
elsif IRB.conf[:SINGLE_IRB]
- @binding = TOPLEVEL_BINDING
+ @binding = TOPLEVEL_BINDING
else
- case IRB.conf[:CONTEXT_MODE]
- when 0 # binding in proc on TOPLEVEL_BINDING
- @binding = eval("proc{binding}.call",
- TOPLEVEL_BINDING,
- __FILE__,
- __LINE__)
- when 1 # binding in loaded file
- require "tempfile"
- f = Tempfile.open("irb-binding")
- f.print <<EOF
- $binding = binding
+ case IRB.conf[:CONTEXT_MODE]
+ when 0 # binding in proc on TOPLEVEL_BINDING
+ @binding = eval("proc{binding}.call",
+ TOPLEVEL_BINDING,
+ __FILE__,
+ __LINE__)
+ when 1 # binding in loaded file
+ require "tempfile"
+ f = Tempfile.open("irb-binding")
+ f.print <<EOF
+ $binding = binding
EOF
- f.close
- load f.path
- @binding = $binding
+ f.close
+ load f.path
+ @binding = $binding
- when 2 # binding in loaded file(thread use)
- unless defined? BINDING_QUEUE
- require "thread"
+ when 2 # binding in loaded file(thread use)
+ unless defined? BINDING_QUEUE
+ require "thread"
- IRB.const_set(:BINDING_QUEUE, SizedQueue.new(1))
- Thread.abort_on_exception = true
- Thread.start do
- eval "require \"irb/ws-for-case-2\"", TOPLEVEL_BINDING, __FILE__, __LINE__
- end
- Thread.pass
- end
- @binding = BINDING_QUEUE.pop
+ IRB.const_set(:BINDING_QUEUE, SizedQueue.new(1))
+ Thread.abort_on_exception = true
+ Thread.start do
+ eval "require \"irb/ws-for-case-2\"", TOPLEVEL_BINDING, __FILE__, __LINE__
+ end
+ Thread.pass
+ end
+ @binding = BINDING_QUEUE.pop
- when 3 # binding in function on TOPLEVEL_BINDING(default)
- @binding = eval("def irb_binding; private; binding; end; irb_binding",
- TOPLEVEL_BINDING,
- __FILE__,
- __LINE__ - 3)
- end
+ when 3 # binding in function on TOPLEVEL_BINDING(default)
+ @binding = eval("def irb_binding; private; binding; end; irb_binding",
+ TOPLEVEL_BINDING,
+ __FILE__,
+ __LINE__ - 3)
+ end
end
if main.empty?
- @main = eval("self", @binding)
+ @main = eval("self", @binding)
else
- @main = main[0]
- IRB.conf[:__MAIN__] = @main
- case @main
- when Module
- @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
- else
- begin
- @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
- rescue TypeError
- IRB.fail CantChangeBinding, @main.inspect
- end
- end
+ @main = main[0]
+ IRB.conf[:__MAIN__] = @main
+ case @main
+ when Module
+ @binding = eval("IRB.conf[:__MAIN__].module_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
+ else
+ begin
+ @binding = eval("IRB.conf[:__MAIN__].instance_eval('binding', __FILE__, __LINE__)", @binding, __FILE__, __LINE__)
+ rescue TypeError
+ IRB.fail CantChangeBinding, @main.inspect
+ end
+ end
end
eval("_=nil", @binding)
end
@@ -90,20 +90,20 @@ EOF
def filter_backtrace(bt)
case IRB.conf[:CONTEXT_MODE]
when 0
- return nil if bt =~ /\(irb_local_binding\)/
+ return nil if bt =~ /\(irb_local_binding\)/
when 1
- if(bt =~ %r!/tmp/irb-binding! or
- bt =~ %r!irb/.*\.rb! or
- bt =~ /irb\.rb/)
- return nil
- end
+ if(bt =~ %r!/tmp/irb-binding! or
+ bt =~ %r!irb/.*\.rb! or
+ bt =~ /irb\.rb/)
+ return nil
+ end
when 2
- return nil if bt =~ /irb\/.*\.rb/
- return nil if bt =~ /irb\.rb/
+ return nil if bt =~ /irb\/.*\.rb/
+ return nil if bt =~ /irb\.rb/
when 3
- return nil if bt =~ /irb\/.*\.rb/
- return nil if bt =~ /irb\.rb/
- bt = bt.sub(/:\s*in `irb_binding'/, '')
+ return nil if bt =~ /irb\/.*\.rb/
+ return nil if bt =~ /irb\.rb/
+ bt = bt.sub(/:\s*in `irb_binding'/, '')
end
bt
end
diff --git a/lib/irb/xmp.rb b/lib/irb/xmp.rb
index 947d2cf5a2..449f04328b 100644
--- a/lib/irb/xmp.rb
+++ b/lib/irb/xmp.rb
@@ -43,7 +43,6 @@ require "irb/frame"
# ctx.eval 'today # is what?'
# #=> "a good day"
class XMP
- @RCS_ID='-$Id$-'
# Creates a new XMP object.
#
@@ -54,8 +53,6 @@ class XMP
# full detail.
def initialize(bind = nil)
IRB.init_config(nil)
- #IRB.parse_opts
- #IRB.load_modules
IRB.conf[:PROMPT_MODE] = :XMP
@@ -65,7 +62,6 @@ class XMP
@irb = IRB::Irb.new(ws, @io)
@irb.context.ignore_sigint = false
-# IRB.conf[:IRB_RC].call(@irb.context) if IRB.conf[:IRB_RC]
IRB.conf[:MAIN_CONTEXT] = @irb.context
end
@@ -85,16 +81,16 @@ class XMP
if @irb.context.ignore_sigint
begin
- trap_proc_b = trap("SIGINT"){@irb.signal_handle}
- catch(:IRB_EXIT) do
- @irb.eval_input
- end
+ trap_proc_b = trap("SIGINT"){@irb.signal_handle}
+ catch(:IRB_EXIT) do
+ @irb.eval_input
+ end
ensure
- trap("SIGINT", trap_proc_b)
+ trap("SIGINT", trap_proc_b)
end
else
catch(:IRB_EXIT) do
- @irb.eval_input
+ @irb.eval_input
end
end
end
@@ -117,10 +113,10 @@ class XMP
# See IO#gets for more information.
def gets
while l = @exps.shift
- next if /^\s+$/ =~ l
- l.concat "\n"
- print @prompt, l
- break
+ next if /^\s+$/ =~ l
+ l.concat "\n"
+ print @prompt, l
+ break
end
l
end
@@ -131,14 +127,14 @@ class XMP
# doesn't match the previous expression evaluated.
def puts(exps)
if @encoding and exps.encoding != @encoding
- enc = Encoding.compatible?(@exps.join("\n"), exps)
- if enc.nil?
- raise Encoding::CompatibilityError, "Encoding in which the passed expression is encoded is not compatible to the preceding's one"
- else
- @encoding = enc
- end
+ enc = Encoding.compatible?(@exps.join("\n"), exps)
+ if enc.nil?
+ raise Encoding::CompatibilityError, "Encoding in which the passed expression is encoded is not compatible to the preceding's one"
+ else
+ @encoding = enc
+ end
else
- @encoding = exps.encoding
+ @encoding = exps.encoding
end
@exps.concat exps.split(/\n/)
end
diff --git a/lib/logger.rb b/lib/logger.rb
index 3c50cb2313..530b718cde 100644
--- a/lib/logger.rb
+++ b/lib/logger.rb
@@ -290,8 +290,8 @@ class Logger
#
# :call-seq:
- # Logger.new(name, shift_age = 7, shift_size = 1048576)
- # Logger.new(name, shift_age = 'weekly')
+ # Logger.new(logdev, shift_age = 7, shift_size = 1048576)
+ # Logger.new(logdev, shift_age = 'weekly')
#
# === Args
#
@@ -510,11 +510,7 @@ private
private
def format_datetime(time)
- if @datetime_format.nil?
- time.strftime("%Y-%m-%dT%H:%M:%S.") << "%06d " % time.usec
- else
- time.strftime(@datetime_format)
- end
+ time.strftime(@datetime_format || "%Y-%m-%dT%H:%M:%S.%6N ".freeze)
end
def msg2str(msg)
@@ -530,9 +526,48 @@ private
end
end
+ module Period
+ module_function
+
+ SiD = 24 * 60 * 60
+
+ def next_rotate_time(now, shift_age)
+ case shift_age
+ when /^daily$/
+ t = Time.mktime(now.year, now.month, now.mday) + SiD
+ when /^weekly$/
+ t = Time.mktime(now.year, now.month, now.mday) + SiD * (7 - now.wday)
+ when /^monthly$/
+ t = Time.mktime(now.year, now.month, 1) + SiD * 31
+ mday = (1 if t.mday > 1)
+ else
+ return now
+ end
+ if mday or t.hour.nonzero? or t.min.nonzero? or t.sec.nonzero?
+ t = Time.mktime(t.year, t.month, mday || (t.mday + (t.hour > 12 ? 1 : 0)))
+ end
+ t
+ end
+
+ def previous_period_end(now, shift_age)
+ case shift_age
+ when /^daily$/
+ t = Time.mktime(now.year, now.month, now.mday) - SiD / 2
+ when /^weekly$/
+ t = Time.mktime(now.year, now.month, now.mday) - (SiD * (now.wday + 1) + SiD / 2)
+ when /^monthly$/
+ t = Time.mktime(now.year, now.month, 1) - SiD / 2
+ else
+ return now
+ end
+ Time.mktime(t.year, t.month, t.mday, 23, 59, 59)
+ end
+ end
# Device used for logging messages.
class LogDevice
+ include Period
+
attr_reader :dev
attr_reader :filename
@@ -551,6 +586,7 @@ private
@filename = log
@shift_age = opt[:shift_age] || 7
@shift_size = opt[:shift_size] || 1048576
+ @next_rotate_time = next_rotate_time(Time.now, @shift_age) unless @shift_age.is_a?(Integer)
end
end
@@ -616,8 +652,6 @@ private
) if file.size == 0
end
- SiD = 24 * 60 * 60
-
def check_shift_log
if @shift_age.is_a?(Integer)
# Note: always returns false if '0'.
@@ -626,9 +660,9 @@ private
end
else
now = Time.now
- period_end = previous_period_end(now)
- if @dev.stat.mtime <= period_end
- lock_shift_log { shift_log_period(period_end) }
+ if now >= @next_rotate_time
+ @next_rotate_time = next_rotate_time(now, @shift_age)
+ lock_shift_log { shift_log_period(previous_period_end(now, @shift_age)) }
end
end
end
@@ -699,146 +733,5 @@ private
@dev = create_logfile(@filename)
return true
end
-
- def previous_period_end(now)
- case @shift_age
- when /^daily$/
- eod(now - 1 * SiD)
- when /^weekly$/
- eod(now - ((now.wday + 1) * SiD))
- when /^monthly$/
- eod(now - now.mday * SiD)
- else
- now
- end
- end
-
- def eod(t)
- Time.mktime(t.year, t.month, t.mday, 23, 59, 59)
- end
- end
-
-
- #
- # == Description
- #
- # Logger::Application --- Add logging support to your application.
- #
- # == Usage
- #
- # 1. Define your application class as a sub-class of this class.
- # 2. Override the +run+ method in your class to do many things.
- # 3. Instantiate it and invoke #start.
- #
- # == Example
- #
- # class FooApp < Logger::Application
- # def initialize(foo_app, application_specific, arguments)
- # super('FooApp') # Name of the application.
- # end
- #
- # def run
- # ...
- # log(WARN, 'warning', 'my_method1')
- # ...
- # @log.error('my_method2') { 'Error!' }
- # ...
- # end
- # end
- #
- # status = FooApp.new(....).start
- #
- class Application
- include Logger::Severity
-
- # Name of the application given at initialize.
- attr_reader :appname
-
- #
- # :call-seq:
- # Logger::Application.new(appname = '')
- #
- # == Args
- #
- # +appname+:: Name of the application.
- #
- # == Description
- #
- # Create an instance. Log device is +STDERR+ by default. This can be
- # changed with #set_log.
- #
- def initialize(appname = nil)
- @appname = appname
- @log = Logger.new(STDERR)
- @log.progname = @appname
- @level = @log.level
- end
-
- #
- # Start the application. Return the status code.
- #
- def start
- status = -1
- begin
- log(INFO, "Start of #{ @appname }.")
- status = run
- rescue
- log(FATAL, "Detected an exception. Stopping ... #{$!} (#{$!.class})\n" << $@.join("\n"))
- ensure
- log(INFO, "End of #{ @appname }. (status: #{ status.to_s })")
- end
- status
- end
-
- # Logger for this application. See the class Logger for an explanation.
- def logger
- @log
- end
-
- #
- # Sets the logger for this application. See the class Logger for an
- # explanation.
- #
- def logger=(logger)
- @log = logger
- @log.progname = @appname
- @log.level = @level
- end
-
- #
- # Sets the log device for this application. See <tt>Logger.new</tt> for
- # an explanation of the arguments.
- #
- def set_log(logdev, shift_age = 0, shift_size = 1024000)
- @log = Logger.new(logdev, shift_age, shift_size)
- @log.progname = @appname
- @log.level = @level
- end
-
- def log=(logdev)
- set_log(logdev)
- end
-
- #
- # Set the logging threshold, just like <tt>Logger#level=</tt>.
- #
- def level=(level)
- @level = level
- @log.level = @level
- end
-
- #
- # See Logger#add. This application's +appname+ is used.
- #
- def log(severity, message = nil, &block)
- @log.add(severity, message, @appname, &block) if @log
- end
-
- private
-
- def run
- # TODO: should be an NotImplementedError
- raise RuntimeError.new('Method run must be defined in the derived class.')
- end
end
end
diff --git a/lib/mathn.rb b/lib/mathn.rb
index aae4620c3f..315e5438d7 100644
--- a/lib/mathn.rb
+++ b/lib/mathn.rb
@@ -5,9 +5,8 @@
##
# = mathn
#
-# mathn is a library for changing the way Ruby does math. If you need
-# more precise rounding with multiple division or exponentiation
-# operations, then mathn is the right tool.
+# mathn serves to make mathematical operations more precise in Ruby
+# and to integrate other mathematical standard libraries.
#
# Without mathn:
#
@@ -17,7 +16,7 @@
#
# 3 / 2 => 3/2 # Rational
#
-# mathn features late rounding and lacks truncation of intermediate results:
+# mathn keeps value in exact terms.
#
# Without mathn:
#
@@ -38,6 +37,8 @@
# class Numeric follows to make this documentation findable in a reasonable
# location
+warn('lib/mathn.rb is deprecated') if $VERBOSE
+
class Numeric; end
require "cmath.rb"
@@ -53,7 +54,7 @@ unless defined?(Math.exp!)
end
##
-# When mathn is required, Fixnum's division and exponentiation are enhanced to
+# When mathn is required, Fixnum's division is enhanced to
# return more precise values from mathematical expressions.
#
# 2/3*3 # => 0
@@ -69,25 +70,13 @@ class Fixnum
# 1/3 # => (1/3)
alias / quo
-
- alias power! ** unless method_defined? :power!
-
- ##
- # Exponentiate by +other+
-
- def ** (other)
- if self < 0 && other.round != other
- Complex(self, 0.0) ** other
- else
- power!(other)
- end
- end
-
end
##
-# When mathn is required Bignum's division and exponentiation are enhanced to
+# When mathn is required Bignum's division is enhanced to
# return more precise values from mathematical expressions.
+#
+# (2**72) / ((2**70) * 3) # => 4/3
class Bignum
remove_method :/
@@ -98,103 +87,6 @@ class Bignum
# (2**72) / ((2**70) * 3) # => 4/3
alias / quo
-
- alias power! ** unless method_defined? :power!
-
- ##
- # Exponentiate by +other+
-
- def ** (other)
- if self < 0 && other.round != other
- Complex(self, 0.0) ** other
- else
- power!(other)
- end
- end
-
-end
-
-##
-# When mathn is required Rational is changed to simplify the use of Rational
-# operations.
-#
-# Normal behaviour:
-#
-# Rational.new!(1,3) ** 2 # => Rational(1, 9)
-# (1 / 3) ** 2 # => 0
-#
-# require 'mathn' behaviour:
-#
-# (1 / 3) ** 2 # => 1/9
-
-class Rational
- remove_method :**
-
- ##
- # Exponentiate by +other+
- #
- # (1/3) ** 2 # => 1/9
-
- def ** (other)
- if other.kind_of?(Rational)
- other2 = other
- if self < 0
- return Complex(self, 0.0) ** other
- elsif other == 0
- return Rational(1,1)
- elsif self == 0
- return Rational(0,1)
- elsif self == 1
- return Rational(1,1)
- end
-
- npd = numerator.prime_division
- dpd = denominator.prime_division
- if other < 0
- other = -other
- npd, dpd = dpd, npd
- end
-
- for elm in npd
- elm[1] = elm[1] * other
- if !elm[1].kind_of?(Integer) and elm[1].denominator != 1
- return Float(self) ** other2
- end
- elm[1] = elm[1].to_i
- end
-
- for elm in dpd
- elm[1] = elm[1] * other
- if !elm[1].kind_of?(Integer) and elm[1].denominator != 1
- return Float(self) ** other2
- end
- elm[1] = elm[1].to_i
- end
-
- num = Integer.from_prime_division(npd)
- den = Integer.from_prime_division(dpd)
-
- Rational(num,den)
-
- elsif other.kind_of?(Integer)
- if other > 0
- num = numerator ** other
- den = denominator ** other
- elsif other < 0
- num = denominator ** -other
- den = numerator ** -other
- elsif other == 0
- num = 1
- den = 1
- end
- Rational(num, den)
- elsif other.kind_of?(Float)
- Float(self) ** other
- else
- x , y = other.coerce(self)
- x ** y
- end
- end
end
##
@@ -226,14 +118,8 @@ module Math
def sqrt(a)
if a.kind_of?(Complex)
abs = sqrt(a.real*a.real + a.imag*a.imag)
-# if not abs.kind_of?(Rational)
-# return a**Rational(1,2)
-# end
x = sqrt((a.real + abs)/Rational(2))
y = sqrt((-a.real + abs)/Rational(2))
-# if !(x.kind_of?(Rational) and y.kind_of?(Rational))
-# return a**Rational(1,2)
-# end
if a.imag >= 0
Complex(x, y)
else
@@ -303,22 +189,3 @@ module Math
module_function :sqrt
module_function :rsqrt
end
-
-##
-# When mathn is required, Float is changed to handle Complex numbers.
-
-class Float
- alias power! **
-
- ##
- # Exponentiate by +other+
-
- def ** (other)
- if self < 0 && other.round != other
- Complex(self, 0.0) ** other
- else
- power!(other)
- end
- end
-
-end
diff --git a/lib/matrix.rb b/lib/matrix.rb
index b20fd9451f..76bec9228b 100644
--- a/lib/matrix.rb
+++ b/lib/matrix.rb
@@ -58,6 +58,8 @@ end
# * #each_with_index
# * #find_index
# * #minor(*param)
+# * #first_minor(row, column)
+# * #cofactor(row, column)
#
# Properties of a matrix:
# * #diagonal?
@@ -204,6 +206,7 @@ class Matrix
#
def Matrix.diagonal(*values)
size = values.size
+ return Matrix.empty if size == 0
rows = Array.new(size) {|j|
row = Array.new(size, 0)
row[j] = values[j]
@@ -543,6 +546,7 @@ class Matrix
nil
end
alias_method :find_index, :index
+
#
# Returns a section of the matrix. The parameters are either:
# * start_row, nrows, start_col, ncols; OR
@@ -589,6 +593,49 @@ class Matrix
new_matrix rows, [column_count - from_col, size_col].min
end
+ #
+ # Returns the submatrix obtained by deleting the specified row and column.
+ #
+ # Matrix.diagonal(9, 5, -3, 4).first_minor(1, 2)
+ # => 9 0 0
+ # 0 0 0
+ # 0 0 4
+ #
+ def first_minor(row, column)
+ raise RuntimeError, "first_minor of empty matrix is not defined" if empty?
+
+ unless 0 <= row && row < row_count
+ raise ArgumentError, "invalid row (#{row.inspect} for 0..#{row_count - 1})"
+ end
+
+ unless 0 <= column && column < column_count
+ raise ArgumentError, "invalid column (#{column.inspect} for 0..#{column_count - 1})"
+ end
+
+ arrays = to_a
+ arrays.delete_at(row)
+ arrays.each do |array|
+ array.delete_at(column)
+ end
+
+ new_matrix arrays, column_count - 1
+ end
+
+ #
+ # Returns the (row, column) cofactor which is obtained by multiplying
+ # the first minor by (-1)**(row + column).
+ #
+ # Matrix.diagonal(9, 5, -3, 4).cofactor(1, 1)
+ # => -108
+ #
+ def cofactor(row, column)
+ raise RuntimeError, "cofactor of empty matrix is not defined" if empty?
+ Matrix.Raise ErrDimensionMismatch unless square?
+
+ det_of_minor = first_minor(row, column).determinant
+ det_of_minor * (-1) ** (row + column)
+ end
+
#--
# TESTING -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
#++
@@ -847,7 +894,7 @@ class Matrix
return apply_through_coercion(m, __method__)
end
- Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count and column_count == m.column_count
+ Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count && column_count == m.column_count
rows = Array.new(row_count) {|i|
Array.new(column_count) {|j|
@@ -874,7 +921,7 @@ class Matrix
return apply_through_coercion(m, __method__)
end
- Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count and column_count == m.column_count
+ Matrix.Raise ErrDimensionMismatch unless row_count == m.row_count && column_count == m.column_count
rows = Array.new(row_count) {|i|
Array.new(column_count) {|j|
diff --git a/lib/matrix/eigenvalue_decomposition.rb b/lib/matrix/eigenvalue_decomposition.rb
index 0dd9d42f29..ab353ecf61 100644
--- a/lib/matrix/eigenvalue_decomposition.rb
+++ b/lib/matrix/eigenvalue_decomposition.rb
@@ -40,14 +40,14 @@ class Matrix
# Returns the eigenvector matrix +V+
#
def eigenvector_matrix
- Matrix.send :new, build_eigenvectors.transpose
+ Matrix.send(:new, build_eigenvectors.transpose)
end
alias v eigenvector_matrix
# Returns the inverse of the eigenvector matrix +V+
#
def eigenvector_matrix_inv
- r = Matrix.send :new, build_eigenvectors
+ r = Matrix.send(:new, build_eigenvectors)
r = r.transpose.inverse unless @symmetric
r
end
@@ -64,7 +64,7 @@ class Matrix
# Returns an array of the eigenvectors
#
def eigenvectors
- build_eigenvectors.map{|ev| Vector.send :new, ev}
+ build_eigenvectors.map{|ev| Vector.send(:new, ev)}
end
# Returns the block diagonal eigenvalue matrix +D+
diff --git a/lib/minitest/.document b/lib/minitest/.document
deleted file mode 100644
index 6850e5befb..0000000000
--- a/lib/minitest/.document
+++ /dev/null
@@ -1,2 +0,0 @@
-# Ignore README.txt, it is included in the minitest documentation.
-*.rb
diff --git a/lib/minitest/autorun.rb b/lib/minitest/autorun.rb
deleted file mode 100644
index cb4a3a0e5d..0000000000
--- a/lib/minitest/autorun.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# encoding: utf-8
-######################################################################
-# This file is imported from the minitest project.
-# DO NOT make modifications in this repo. They _will_ be reverted!
-# File a patch instead and assign it to Ryan Davis.
-######################################################################
-
-begin
- require 'rubygems'
- gem 'minitest'
-rescue Gem::LoadError
- # do nothing
-end
-
-require 'minitest/unit'
-require 'minitest/spec'
-require 'minitest/mock'
-
-MiniTest::Unit.autorun
diff --git a/lib/minitest/hell.rb b/lib/minitest/hell.rb
deleted file mode 100644
index 827bf0e320..0000000000
--- a/lib/minitest/hell.rb
+++ /dev/null
@@ -1,20 +0,0 @@
-# encoding: utf-8
-######################################################################
-# This file is imported from the minitest project.
-# DO NOT make modifications in this repo. They _will_ be reverted!
-# File a patch instead and assign it to Ryan Davis.
-######################################################################
-
-require "minitest/parallel_each"
-
-# :stopdoc:
-class Minitest::Unit::TestCase
- class << self
- alias :old_test_order :test_order
-
- def test_order
- :parallel
- end
- end
-end
-# :startdoc:
diff --git a/lib/minitest/parallel_each.rb b/lib/minitest/parallel_each.rb
deleted file mode 100644
index e1020b35a0..0000000000
--- a/lib/minitest/parallel_each.rb
+++ /dev/null
@@ -1,80 +0,0 @@
-# encoding: utf-8
-######################################################################
-# This file is imported from the minitest project.
-# DO NOT make modifications in this repo. They _will_ be reverted!
-# File a patch instead and assign it to Ryan Davis.
-######################################################################
-
-##
-# Provides a parallel #each that lets you enumerate using N threads.
-# Use environment variable N to customize. Defaults to 2. Enumerable,
-# so all the goodies come along (tho not all are wrapped yet to
-# return another ParallelEach instance).
-
-class ParallelEach
- require 'thread'
- include Enumerable
-
- ##
- # How many Threads to use for this parallel #each.
-
- N = (ENV['N'] || 2).to_i
-
- ##
- # Create a new ParallelEach instance over +list+.
-
- def initialize list
- @queue = Queue.new # *sigh*... the Queue api sucks sooo much...
-
- list.each { |i| @queue << i }
- N.times { @queue << nil }
- end
-
- def grep pattern # :nodoc:
- self.class.new super
- end
-
- def select(&block) # :nodoc:
- self.class.new super
- end
-
- alias find_all select # :nodoc:
-
- ##
- # Starts N threads that yield each element to your block. Joins the
- # threads at the end.
-
- def each
- threads = N.times.map {
- Thread.new do
- Thread.current.abort_on_exception = true
- while job = @queue.pop
- yield job
- end
- end
- }
- threads.map(&:join)
- end
-
- def count
- [@queue.size - N, 0].max
- end
-
- alias_method :size, :count
-end
-
-class MiniTest::Unit
- alias _old_run_suites _run_suites
-
- ##
- # Runs all the +suites+ for a given +type+. Runs suites declaring
- # a test_order of +:parallel+ in parallel, and everything else
- # serial.
-
- def _run_suites suites, type
- parallel, serial = suites.partition { |s| s.test_order == :parallel }
-
- ParallelEach.new(parallel).map { |suite| _run_suite suite, type } +
- serial.map { |suite| _run_suite suite, type }
- end
-end
diff --git a/lib/minitest/pride.rb b/lib/minitest/pride.rb
deleted file mode 100644
index 40c35394fa..0000000000
--- a/lib/minitest/pride.rb
+++ /dev/null
@@ -1,119 +0,0 @@
-# encoding: utf-8
-######################################################################
-# This file is imported from the minitest project.
-# DO NOT make modifications in this repo. They _will_ be reverted!
-# File a patch instead and assign it to Ryan Davis.
-######################################################################
-
-require "minitest/unit"
-
-##
-# Show your testing pride!
-
-class PrideIO
-
- # Start an escape sequence
- ESC = "\e["
-
- # End the escape sequence
- NND = "#{ESC}0m"
-
- # The IO we're going to pipe through.
- attr_reader :io
-
- def initialize io # :nodoc:
- @io = io
- # stolen from /System/Library/Perl/5.10.0/Term/ANSIColor.pm
- # also reference http://en.wikipedia.org/wiki/ANSI_escape_code
- @colors ||= (31..36).to_a
- @size = @colors.size
- @index = 0
- # io.sync = true
- end
-
- ##
- # Wrap print to colorize the output.
-
- def print o
- case o
- when "." then
- io.print pride o
- when "E", "F" then
- io.print "#{ESC}41m#{ESC}37m#{o}#{NND}"
- else
- io.print o
- end
- end
-
- def puts(*o) # :nodoc:
- o.map! { |s|
- s.to_s.sub(/Finished tests/) {
- @index = 0
- 'Fabulous tests'.split(//).map { |c|
- pride(c)
- }.join
- }
- }
-
- super
- end
-
- ##
- # Color a string.
-
- def pride string
- string = "*" if string == "."
- c = @colors[@index % @size]
- @index += 1
- "#{ESC}#{c}m#{string}#{NND}"
- end
-
- def method_missing msg, *args # :nodoc:
- io.send(msg, *args)
- end
-end
-
-##
-# If you thought the PrideIO was colorful...
-#
-# (Inspired by lolcat, but with clean math)
-
-class PrideLOL < PrideIO
- PI_3 = Math::PI / 3 # :nodoc:
-
- def initialize io # :nodoc:
- # walk red, green, and blue around a circle separated by equal thirds.
- #
- # To visualize, type this into wolfram-alpha:
- #
- # plot (3*sin(x)+3), (3*sin(x+2*pi/3)+3), (3*sin(x+4*pi/3)+3)
-
- # 6 has wide pretty gradients. 3 == lolcat, about half the width
- @colors = (0...(6 * 7)).map { |n|
- n *= 1.0 / 6
- r = (3 * Math.sin(n ) + 3).to_i
- g = (3 * Math.sin(n + 2 * PI_3) + 3).to_i
- b = (3 * Math.sin(n + 4 * PI_3) + 3).to_i
-
- # Then we take rgb and encode them in a single number using base 6.
- # For some mysterious reason, we add 16... to clear the bottom 4 bits?
- # Yes... they're ugly.
-
- 36 * r + 6 * g + b + 16
- }
-
- super
- end
-
- ##
- # Make the string even more colorful. Damnit.
-
- def pride string
- c = @colors[@index % @size]
- @index += 1
- "#{ESC}38;5;#{c}m#{string}#{NND}"
- end
-end
-
-klass = ENV['TERM'] =~ /^xterm|-256color$/ ? PrideLOL : PrideIO
-MiniTest::Unit.output = klass.new(MiniTest::Unit.output)
diff --git a/lib/minitest/spec.rb b/lib/minitest/spec.rb
deleted file mode 100644
index d91fccf5bc..0000000000
--- a/lib/minitest/spec.rb
+++ /dev/null
@@ -1,551 +0,0 @@
-# encoding: utf-8
-######################################################################
-# This file is imported from the minitest project.
-# DO NOT make modifications in this repo. They _will_ be reverted!
-# File a patch instead and assign it to Ryan Davis.
-######################################################################
-
-#!/usr/bin/ruby -w
-
-require 'minitest/unit'
-
-class Module # :nodoc:
- def infect_an_assertion meth, new_name, dont_flip = false # :nodoc:
- # warn "%-22p -> %p %p" % [meth, new_name, dont_flip]
- self.class_eval <<-EOM
- def #{new_name} *args
- case
- when Proc === self then
- MiniTest::Spec.current.#{meth}(*args, &self)
- when #{!!dont_flip} then
- MiniTest::Spec.current.#{meth}(self, *args)
- else
- MiniTest::Spec.current.#{meth}(args.first, self, *args[1..-1])
- end
- end
- EOM
- end
-
- ##
- # infect_with_assertions has been removed due to excessive clever.
- # Use infect_an_assertion directly instead.
-
- def infect_with_assertions(pos_prefix, neg_prefix,
- skip_re,
- dont_flip_re = /\c0/,
- map = {})
- abort "infect_with_assertions is dead. Use infect_an_assertion directly"
- end
-end
-
-module Kernel # :nodoc:
- ##
- # Describe a series of expectations for a given target +desc+.
- #
- # TODO: find good tutorial url.
- #
- # Defines a test class subclassing from either MiniTest::Spec or
- # from the surrounding describe's class. The surrounding class may
- # subclass MiniTest::Spec manually in order to easily share code:
- #
- # class MySpec < MiniTest::Spec
- # # ... shared code ...
- # end
- #
- # class TestStuff < MySpec
- # it "does stuff" do
- # # shared code available here
- # end
- # describe "inner stuff" do
- # it "still does stuff" do
- # # ...and here
- # end
- # end
- # end
-
- def describe desc, additional_desc = nil, &block # :doc:
- stack = MiniTest::Spec.describe_stack
- name = [stack.last, desc, additional_desc].compact.join("::")
- sclas = stack.last || if Class === self && is_a?(MiniTest::Spec::DSL) then
- self
- else
- MiniTest::Spec.spec_type desc
- end
-
- cls = sclas.create name, desc
-
- stack.push cls
- cls.class_eval(&block)
- stack.pop
- cls
- end
- private :describe
-end
-
-##
-# MiniTest::Spec -- The faster, better, less-magical spec framework!
-#
-# For a list of expectations, see MiniTest::Expectations.
-
-class MiniTest::Spec < MiniTest::Unit::TestCase
-
- ##
- # Oh look! A MiniTest::Spec::DSL module! Eat your heart out DHH.
-
- module DSL
- ##
- # Contains pairs of matchers and Spec classes to be used to
- # calculate the superclass of a top-level describe. This allows for
- # automatically customizable spec types.
- #
- # See: register_spec_type and spec_type
-
- TYPES = [[//, MiniTest::Spec]]
-
- ##
- # Register a new type of spec that matches the spec's description.
- # This method can take either a Regexp and a spec class or a spec
- # class and a block that takes the description and returns true if
- # it matches.
- #
- # Eg:
- #
- # register_spec_type(/Controller$/, MiniTest::Spec::Rails)
- #
- # or:
- #
- # register_spec_type(MiniTest::Spec::RailsModel) do |desc|
- # desc.superclass == ActiveRecord::Base
- # end
-
- def register_spec_type(*args, &block)
- if block then
- matcher, klass = block, args.first
- else
- matcher, klass = *args
- end
- TYPES.unshift [matcher, klass]
- end
-
- ##
- # Figure out the spec class to use based on a spec's description. Eg:
- #
- # spec_type("BlahController") # => MiniTest::Spec::Rails
-
- def spec_type desc
- TYPES.find { |matcher, klass|
- if matcher.respond_to? :call then
- matcher.call desc
- else
- matcher === desc.to_s
- end
- }.last
- end
-
- def describe_stack # :nodoc:
- Thread.current[:describe_stack] ||= []
- end
-
- ##
- # Returns the children of this spec.
-
- def children
- @children ||= []
- end
-
- def nuke_test_methods! # :nodoc:
- self.public_instance_methods.grep(/^test_/).each do |name|
- self.send :undef_method, name
- end
- end
-
- ##
- # Define a 'before' action. Inherits the way normal methods should.
- #
- # NOTE: +type+ is ignored and is only there to make porting easier.
- #
- # Equivalent to MiniTest::Unit::TestCase#setup.
-
- def before type = nil, &block
- define_method :setup do
- super()
- self.instance_eval(&block)
- end
- end
-
- ##
- # Define an 'after' action. Inherits the way normal methods should.
- #
- # NOTE: +type+ is ignored and is only there to make porting easier.
- #
- # Equivalent to MiniTest::Unit::TestCase#teardown.
-
- def after type = nil, &block
- define_method :teardown do
- self.instance_eval(&block)
- super()
- end
- end
-
- ##
- # Define an expectation with name +desc+. Name gets morphed to a
- # proper test method name. For some freakish reason, people who
- # write specs don't like class inheritance, so this goes way out of
- # its way to make sure that expectations aren't inherited.
- #
- # This is also aliased to #specify and doesn't require a +desc+ arg.
- #
- # Hint: If you _do_ want inheritence, use minitest/unit. You can mix
- # and match between assertions and expectations as much as you want.
-
- def it desc = "anonymous", &block
- block ||= proc { skip "(no tests defined)" }
-
- @specs ||= 0
- @specs += 1
-
- name = "test_%04d_%s" % [ @specs, desc ]
-
- define_method name, &block
-
- self.children.each do |mod|
- mod.send :undef_method, name if mod.public_method_defined? name
- end
-
- name
- end
-
- ##
- # Essentially, define an accessor for +name+ with +block+.
- #
- # Why use let instead of def? I honestly don't know.
-
- def let name, &block
- define_method name do
- @_memoized ||= {}
- @_memoized.fetch(name) { |k| @_memoized[k] = instance_eval(&block) }
- end
- end
-
- ##
- # Another lazy man's accessor generator. Made even more lazy by
- # setting the name for you to +subject+.
-
- def subject &block
- let :subject, &block
- end
-
- def create name, desc # :nodoc:
- cls = Class.new(self) do
- @name = name
- @desc = desc
-
- nuke_test_methods!
- end
-
- children << cls
-
- cls
- end
-
- def name # :nodoc:
- defined?(@name) ? @name : super
- end
-
- def to_s # :nodoc:
- name # Can't alias due to 1.8.7, not sure why
- end
-
- # :stopdoc:
- attr_reader :desc
- alias :specify :it
- # :startdoc:
- end
-
- extend DSL
-
- TYPES = DSL::TYPES # :nodoc:
-end
-
-##
-# It's where you hide your "assertions".
-
-module MiniTest::Expectations
- ##
- # See MiniTest::Assertions#assert_empty.
- #
- # collection.must_be_empty
- #
- # :method: must_be_empty
-
- infect_an_assertion :assert_empty, :must_be_empty, :unary
-
- ##
- # See MiniTest::Assertions#assert_equal
- #
- # a.must_equal b
- #
- # :method: must_equal
-
- infect_an_assertion :assert_equal, :must_equal
-
- ##
- # See MiniTest::Assertions#assert_in_delta
- #
- # n.must_be_close_to m [, delta]
- #
- # :method: must_be_close_to
-
- infect_an_assertion :assert_in_delta, :must_be_close_to
-
- alias :must_be_within_delta :must_be_close_to # :nodoc:
-
- ##
- # See MiniTest::Assertions#assert_in_epsilon
- #
- # n.must_be_within_epsilon m [, epsilon]
- #
- # :method: must_be_within_epsilon
-
- infect_an_assertion :assert_in_epsilon, :must_be_within_epsilon
-
- ##
- # See MiniTest::Assertions#assert_includes
- #
- # collection.must_include obj
- #
- # :method: must_include
-
- infect_an_assertion :assert_includes, :must_include, :reverse
-
- ##
- # See MiniTest::Assertions#assert_instance_of
- #
- # obj.must_be_instance_of klass
- #
- # :method: must_be_instance_of
-
- infect_an_assertion :assert_instance_of, :must_be_instance_of
-
- ##
- # See MiniTest::Assertions#assert_kind_of
- #
- # obj.must_be_kind_of mod
- #
- # :method: must_be_kind_of
-
- infect_an_assertion :assert_kind_of, :must_be_kind_of
-
- ##
- # See MiniTest::Assertions#assert_match
- #
- # a.must_match b
- #
- # :method: must_match
-
- infect_an_assertion :assert_match, :must_match
-
- ##
- # See MiniTest::Assertions#assert_nil
- #
- # obj.must_be_nil
- #
- # :method: must_be_nil
-
- infect_an_assertion :assert_nil, :must_be_nil, :unary
-
- ##
- # See MiniTest::Assertions#assert_operator
- #
- # n.must_be :<=, 42
- #
- # This can also do predicates:
- #
- # str.must_be :empty?
- #
- # :method: must_be
-
- infect_an_assertion :assert_operator, :must_be, :reverse
-
- ##
- # See MiniTest::Assertions#assert_output
- #
- # proc { ... }.must_output out_or_nil [, err]
- #
- # :method: must_output
-
- infect_an_assertion :assert_output, :must_output
-
- ##
- # See MiniTest::Assertions#assert_raises
- #
- # proc { ... }.must_raise exception
- #
- # :method: must_raise
-
- infect_an_assertion :assert_raises, :must_raise
-
- ##
- # See MiniTest::Assertions#assert_respond_to
- #
- # obj.must_respond_to msg
- #
- # :method: must_respond_to
-
- infect_an_assertion :assert_respond_to, :must_respond_to, :reverse
-
- ##
- # See MiniTest::Assertions#assert_same
- #
- # a.must_be_same_as b
- #
- # :method: must_be_same_as
-
- infect_an_assertion :assert_same, :must_be_same_as
-
- ##
- # See MiniTest::Assertions#assert_send
- # TODO: remove me
- #
- # a.must_send
- #
- # :method: must_send
-
- infect_an_assertion :assert_send, :must_send
-
- ##
- # See MiniTest::Assertions#assert_silent
- #
- # proc { ... }.must_be_silent
- #
- # :method: must_be_silent
-
- infect_an_assertion :assert_silent, :must_be_silent
-
- ##
- # See MiniTest::Assertions#assert_throws
- #
- # proc { ... }.must_throw sym
- #
- # :method: must_throw
-
- infect_an_assertion :assert_throws, :must_throw
-
- ##
- # See MiniTest::Assertions#refute_empty
- #
- # collection.wont_be_empty
- #
- # :method: wont_be_empty
-
- infect_an_assertion :refute_empty, :wont_be_empty, :unary
-
- ##
- # See MiniTest::Assertions#refute_equal
- #
- # a.wont_equal b
- #
- # :method: wont_equal
-
- infect_an_assertion :refute_equal, :wont_equal
-
- ##
- # See MiniTest::Assertions#refute_in_delta
- #
- # n.wont_be_close_to m [, delta]
- #
- # :method: wont_be_close_to
-
- infect_an_assertion :refute_in_delta, :wont_be_close_to
-
- alias :wont_be_within_delta :wont_be_close_to # :nodoc:
-
- ##
- # See MiniTest::Assertions#refute_in_epsilon
- #
- # n.wont_be_within_epsilon m [, epsilon]
- #
- # :method: wont_be_within_epsilon
-
- infect_an_assertion :refute_in_epsilon, :wont_be_within_epsilon
-
- ##
- # See MiniTest::Assertions#refute_includes
- #
- # collection.wont_include obj
- #
- # :method: wont_include
-
- infect_an_assertion :refute_includes, :wont_include, :reverse
-
- ##
- # See MiniTest::Assertions#refute_instance_of
- #
- # obj.wont_be_instance_of klass
- #
- # :method: wont_be_instance_of
-
- infect_an_assertion :refute_instance_of, :wont_be_instance_of
-
- ##
- # See MiniTest::Assertions#refute_kind_of
- #
- # obj.wont_be_kind_of mod
- #
- # :method: wont_be_kind_of
-
- infect_an_assertion :refute_kind_of, :wont_be_kind_of
-
- ##
- # See MiniTest::Assertions#refute_match
- #
- # a.wont_match b
- #
- # :method: wont_match
-
- infect_an_assertion :refute_match, :wont_match
-
- ##
- # See MiniTest::Assertions#refute_nil
- #
- # obj.wont_be_nil
- #
- # :method: wont_be_nil
-
- infect_an_assertion :refute_nil, :wont_be_nil, :unary
-
- ##
- # See MiniTest::Assertions#refute_operator
- #
- # n.wont_be :<=, 42
- #
- # This can also do predicates:
- #
- # str.wont_be :empty?
- #
- # :method: wont_be
-
- infect_an_assertion :refute_operator, :wont_be, :reverse
-
- ##
- # See MiniTest::Assertions#refute_respond_to
- #
- # obj.wont_respond_to msg
- #
- # :method: wont_respond_to
-
- infect_an_assertion :refute_respond_to, :wont_respond_to, :reverse
-
- ##
- # See MiniTest::Assertions#refute_same
- #
- # a.wont_be_same_as b
- #
- # :method: wont_be_same_as
-
- infect_an_assertion :refute_same, :wont_be_same_as
-end
-
-class Object # :nodoc:
- include MiniTest::Expectations unless ENV["MT_NO_EXPECTATIONS"]
-end
diff --git a/lib/mkmf.rb b/lib/mkmf.rb
index f5c462b58e..2a83189e30 100644
--- a/lib/mkmf.rb
+++ b/lib/mkmf.rb
@@ -71,7 +71,7 @@ module MakeMakefile
# Extensions for files complied with a C++ compiler
CXX_EXT = %w[cc mm cxx cpp]
- if File::FNM_SYSCASE.zero?
+ unless File.exist?(File.join(*File.split(__FILE__).tap {|d, b| b.swapcase}))
CXX_EXT.concat(%w[C])
end
@@ -467,7 +467,7 @@ MSG
end
end
- def link_command(ldflags, opt="", libpath=$DEFLIBPATH|$LIBPATH)
+ def link_command(ldflags, opt="", libpath=$LIBPATH|$DEFLIBPATH)
librubyarg = $extmk ? $LIBRUBYARG_STATIC : "$(LIBRUBYARG)"
conf = RbConfig::CONFIG.merge('hdrdir' => $hdrdir.quote,
'src' => "#{CONFTEST_C}",
@@ -503,7 +503,7 @@ MSG
conf)
end
- def libpathflag(libpath=$DEFLIBPATH|$LIBPATH)
+ def libpathflag(libpath=$LIBPATH|$DEFLIBPATH)
libpath.map{|x|
case x
when "$(topdir)", /\A\./
@@ -610,7 +610,9 @@ MSG
end
def try_cppflags(flags)
- try_header(MAIN_DOES_NOTHING, flags)
+ with_cppflags(flags) do
+ try_header("int main() {return 0;}")
+ end
end
def with_cflags(flags)
@@ -622,7 +624,9 @@ MSG
end
def try_cflags(flags)
- try_compile(MAIN_DOES_NOTHING, flags)
+ with_cflags(flags) do
+ try_compile("int main() {return 0;}")
+ end
end
def with_ldflags(flags)
@@ -634,7 +638,9 @@ MSG
end
def try_ldflags(flags)
- try_link(MAIN_DOES_NOTHING, flags)
+ with_ldflags(flags) do
+ try_link("int main() {return 0;}")
+ end
end
def try_static_assert(expr, headers = nil, opt = "", &b)
@@ -661,7 +667,6 @@ SRC
return nil
end
upper = 1
- lower = 0
until try_static_assert("#{const} <= #{upper}", headers, opt)
lower = upper
upper <<= 1
@@ -1087,11 +1092,11 @@ SRC
checking_for fw do
src = cpp_include("#{fw}/#{header}") << "\n" "int main(void){return 0;}"
opt = " -framework #{fw}"
- if try_link(src, "-ObjC#{opt}", &b)
+ if try_link(src, opt, &b) or (objc = try_link(src, "-ObjC#{opt}", &b))
$defs.push(format("-DHAVE_FRAMEWORK_%s", fw.tr_cpp))
# TODO: non-worse way than this hack, to get rid of separating
# option and its argument.
- $LDFLAGS << " -ObjC" unless /(\A|\s)-ObjC(\s|\z)/ =~ $LDFLAGS
+ $LDFLAGS << " -ObjC" if objc and /(\A|\s)-ObjC(\s|\z)/ !~ $LDFLAGS
$LIBS << opt
true
else
@@ -1671,13 +1676,28 @@ SRC
$extconf_h = header
end
- # Sets a +target+ name that the user can then use to configure various
- # "with" options with on the command line by using that name. For example,
- # if the target is set to "foo", then the user could use the
- # <code>--with-foo-dir</code> command line option.
+ # call-seq:
+ # dir_config(target)
+ # dir_config(target, prefix)
+ # dir_config(target, idefault, ldefault)
+ #
+ # Sets a +target+ name that the user can then use to configure
+ # various "with" options with on the command line by using that
+ # name. For example, if the target is set to "foo", then the user
+ # could use the <code>--with-foo-dir=prefix</code>,
+ # <code>--with-foo-include=dir</code> and
+ # <code>--with-foo-lib=dir</code> command line options to tell where
+ # to search for header/library files.
#
- # You may pass along additional "include" or "lib" defaults via the
- # +idefault+ and +ldefault+ parameters, respectively.
+ # You may pass along additional parameters to specify default
+ # values. If one is given it is taken as default +prefix+, and if
+ # two are given they are taken as "include" and "lib" defaults in
+ # that order.
+ #
+ # In any case, the return value will be an array of determined
+ # "include" and "lib" directories, either of which can be nil if no
+ # corresponding command line option is given when no default value
+ # is specified.
#
# Note that dir_config only adds to the list of places to search for
# libraries and include files. It does not link the libraries into your
@@ -1739,22 +1759,37 @@ SRC
def pkg_config(pkg, option=nil)
if pkgconfig = with_config("#{pkg}-config") and find_executable0(pkgconfig)
# iff package specific config command is given
- get = proc {|opt| `#{pkgconfig} --#{opt}`.strip}
elsif ($PKGCONFIG ||=
(pkgconfig = with_config("pkg-config", ("pkg-config" unless CROSS_COMPILING))) &&
find_executable0(pkgconfig) && pkgconfig) and
system("#{$PKGCONFIG} --exists #{pkg}")
# default to pkg-config command
- get = proc {|opt| `#{$PKGCONFIG} --#{opt} #{pkg}`.strip}
+ pkgconfig = $PKGCONFIG
+ get = proc {|opt|
+ opt = IO.popen("#{$PKGCONFIG} --#{opt} #{pkg}", err:[:child, :out], &:read)
+ opt.strip if $?.success?
+ }
elsif find_executable0(pkgconfig = "#{pkg}-config")
# default to package specific config command, as a last resort.
- get = proc {|opt| `#{pkgconfig} --#{opt}`.strip}
+ else
+ pkgconfig = nil
+ end
+ if pkgconfig
+ get ||= proc {|opt|
+ opt = IO.popen("#{pkgconfig} --#{opt}", err:[:child, :out], &:read)
+ opt.strip if $?.success?
+ }
end
orig_ldflags = $LDFLAGS
if get and option
get[option]
elsif get and try_ldflags(ldflags = get['libs'])
- cflags = get['cflags']
+ if incflags = get['cflags-only-I']
+ $INCFLAGS << " " << incflags
+ cflags = get['cflags-only-other']
+ else
+ cflags = get['cflags']
+ end
libs = get['libs-only-l']
ldflags = (Shellwords.shellwords(ldflags) - Shellwords.shellwords(libs)).quote.join(" ")
$CFLAGS += " " << cflags
@@ -1828,6 +1863,7 @@ Q1 = $(V:1=)
Q = $(Q1:0=@)
ECHO1 = $(V:1=@#{CONFIG['NULLCMD']})
ECHO = $(ECHO1:0=@echo)
+NULLCMD = #{CONFIG['NULLCMD']}
#### Start of system configuration section. ####
#{"top_srcdir = " + $top_srcdir.sub(%r"\A#{Regexp.quote($topdir)}/", "$(topdir)/") if $extmk}
@@ -2105,7 +2141,7 @@ RULES
#
def create_makefile(target, srcprefix = nil)
$target = target
- libpath = $DEFLIBPATH|$LIBPATH
+ libpath = $LIBPATH|$DEFLIBPATH
message "creating Makefile\n"
MakeMakefile.rm_f "#{CONFTEST}*"
if CONFIG["DLEXT"] == $OBJEXT
@@ -2186,7 +2222,7 @@ RULES
conf = yield(conf) if block_given?
mfile.puts(conf)
mfile.print "
-libpath = #{($DEFLIBPATH|$LIBPATH).join(" ")}
+libpath = #{($LIBPATH|$DEFLIBPATH).join(" ")}
LIBPATH = #{libpath}
DEFFILE = #{deffile}
@@ -2232,7 +2268,7 @@ static: $(STATIC_LIB)#{$extout ? " install-rb" : ""}
fseprepl = proc {|s|
s = s.gsub("/", fsep)
s = s.gsub(/(\$\(\w+)(\))/) {$1+sep+$2}
- s = s.gsub(/(\$\{\w+)(\})/) {$1+sep+$2}
+ s.gsub(/(\$\{\w+)(\})/) {$1+sep+$2}
}
rsep = ":#{fsep}=/"
else
@@ -2290,7 +2326,11 @@ static: $(STATIC_LIB)#{$extout ? " install-rb" : ""}
end
end
mfile.print "pre-install-rb#{sfx}:\n"
- mfile.print("\t$(ECHO) installing#{sfx.sub(/^-/, " ")} #{target} libraries\n")
+ if files.empty?
+ mfile.print("\t@$(NULLCMD)\n")
+ else
+ mfile.print("\t$(ECHO) installing#{sfx.sub(/^-/, " ")} #{target} libraries\n")
+ end
if $extout
dirs.uniq!
unless dirs.empty?
diff --git a/lib/net/ftp.rb b/lib/net/ftp.rb
index a57372ac3b..6b452b8a75 100644
--- a/lib/net/ftp.rb
+++ b/lib/net/ftp.rb
@@ -446,12 +446,12 @@ module Net
private :transfercmd
#
- # Logs in to the remote host. The session must have been previously
- # connected. If +user+ is the string "anonymous" and the +password+ is
- # +nil+, a password of <tt>user@host</tt> is synthesized. If the +acct+
- # parameter is not +nil+, an FTP ACCT command is sent following the
- # successful login. Raises an exception on error (typically
- # <tt>Net::FTPPermError</tt>).
+ # Logs in to the remote host. The session must have been
+ # previously connected. If +user+ is the string "anonymous" and
+ # the +password+ is +nil+, "anonymous@" is used as a password. If
+ # the +acct+ parameter is not +nil+, an FTP ACCT command is sent
+ # following the successful login. Raises an exception on error
+ # (typically <tt>Net::FTPPermError</tt>).
#
def login(user = "anonymous", passwd = nil, acct = nil)
if user == "anonymous" and passwd == nil
diff --git a/lib/net/http.rb b/lib/net/http.rb
index bd0a4d6b5f..aceb530442 100644
--- a/lib/net/http.rb
+++ b/lib/net/http.rb
@@ -687,10 +687,10 @@ module Net #:nodoc:
# The port number to connect to.
attr_reader :port
- # The local host used to estabilish the connection.
+ # The local host used to establish the connection.
attr_accessor :local_host
- # The local port used to estabilish the connection.
+ # The local port used to establish the connection.
attr_accessor :local_port
attr_writer :proxy_from_env
@@ -914,10 +914,7 @@ module Net #:nodoc:
@socket.write(buf)
HTTPResponse.read_new(@socket).value
end
- if @ssl_session and
- Time.now < @ssl_session.time + @ssl_session.timeout
- s.session = @ssl_session if @ssl_session
- end
+ s.session = @ssl_session if @ssl_session
# Server Name Indication (SNI) RFC 3546
s.hostname = @address if s.respond_to? :hostname=
Timeout.timeout(@open_timeout, Net::OpenTimeout) { s.connect }
@@ -1128,7 +1125,7 @@ module Net #:nodoc:
# end
# }
#
- def get(path, initheader = {}, dest = nil, &block) # :yield: +body_segment+
+ def get(path, initheader = nil, dest = nil, &block) # :yield: +body_segment+
res = nil
request(Get.new(path, initheader)) {|r|
r.read_body dest, &block
@@ -1350,8 +1347,7 @@ module Net #:nodoc:
# puts response.body
#
def send_request(name, path, data = nil, header = nil)
- has_response_body = name != 'HEAD'
- r = HTTPGenericRequest.new(name,(data ? true : false),has_response_body,path,header)
+ r = HTTPGenericRequest.new(name,(data ? true : false),true,path,header)
request r, data
end
@@ -1461,10 +1457,7 @@ module Net #:nodoc:
req['connection'] ||= 'close'
end
- host = req['host'] || address
- host = $1 if host =~ /(.*):\d+$/
- req.update_uri host, port, use_ssl?
-
+ req.update_uri address, port, use_ssl?
req['host'] ||= addr_port()
end
diff --git a/lib/net/http/generic_request.rb b/lib/net/http/generic_request.rb
index b51034c7ea..00ff434ccf 100644
--- a/lib/net/http/generic_request.rb
+++ b/lib/net/http/generic_request.rb
@@ -14,19 +14,18 @@ class Net::HTTPGenericRequest
if URI === uri_or_path then
@uri = uri_or_path.dup
- host = @uri.hostname
- host += ":#{@uri.port}" if @uri.port != @uri.class::DEFAULT_PORT
- path = uri_or_path.request_uri
+ host = @uri.hostname.dup
+ host << ":".freeze << @uri.port.to_s if @uri.port != @uri.default_port
+ @path = uri_or_path.request_uri
+ raise ArgumentError, "no HTTP request path given" unless @path
else
@uri = nil
host = nil
- path = uri_or_path
+ raise ArgumentError, "no HTTP request path given" unless uri_or_path
+ raise ArgumentError, "HTTP request path is empty" if uri_or_path.empty?
+ @path = uri_or_path.dup
end
- raise ArgumentError, "no HTTP request path given" unless path
- raise ArgumentError, "HTTP request path is empty" if path.empty?
- @path = path
-
@decode_content = false
if @response_has_body and Net::HTTP::HAVE_ZLIB then
@@ -44,7 +43,7 @@ class Net::HTTPGenericRequest
initialize_http_header initheader
self['Accept'] ||= '*/*'
self['User-Agent'] ||= 'Ruby'
- self['Host'] ||= host
+ self['Host'] ||= host if host
@body = nil
@body_stream = nil
@body_data = nil
@@ -117,15 +116,6 @@ class Net::HTTPGenericRequest
#
def exec(sock, ver, path) #:nodoc: internal use only
- if @uri
- if @uri.port == @uri.default_port
- # [Bug #7650] Amazon ECS API and GFE/1.3 disallow extra default port number
- self['host'] = @uri.host
- else
- self['host'] = "#{@uri.host}:#{@uri.port}"
- end
- end
-
if @body
send_request_with_body sock, ver, path, @body
elsif @body_stream
@@ -137,21 +127,34 @@ class Net::HTTPGenericRequest
end
end
- def update_uri(host, port, ssl) # :nodoc: internal use only
+ def update_uri(addr, port, ssl) # :nodoc: internal use only
+ # reflect the connection and @path to @uri
return unless @uri
- @uri.host ||= host
- @uri.port = port
-
- scheme = ssl ? 'https' : 'http'
+ if ssl
+ scheme = 'https'.freeze
+ klass = URI::HTTPS
+ else
+ scheme = 'http'.freeze
+ klass = URI::HTTP
+ end
+ if host = self['host']
+ host.sub!(/:.*/s, ''.freeze)
+ elsif host = @uri.host
+ else
+ host = addr
+ end
# convert the class of the URI
- unless scheme == @uri.scheme then
- new_uri = @uri.to_s.sub(/^https?/, scheme)
- @uri = URI new_uri
+ if @uri.is_a?(klass)
+ @uri.host = host
+ @uri.port = port
+ else
+ @uri = klass.new(
+ scheme, @uri.userinfo,
+ host, port, nil,
+ @uri.path, nil, @uri.query, nil)
end
-
- @uri
end
private
diff --git a/lib/net/http/requests.rb b/lib/net/http/requests.rb
index ef719ea6e7..c1f8360479 100644
--- a/lib/net/http/requests.rb
+++ b/lib/net/http/requests.rb
@@ -46,7 +46,7 @@ end
class Net::HTTP::Options < Net::HTTPRequest
METHOD = 'OPTIONS'
REQUEST_HAS_BODY = false
- RESPONSE_HAS_BODY = false
+ RESPONSE_HAS_BODY = true
end
# See Net::HTTPGenericRequest for attributes and methods.
diff --git a/lib/net/http/response.rb b/lib/net/http/response.rb
index 9aaa0b3208..777aca9e45 100644
--- a/lib/net/http/response.rb
+++ b/lib/net/http/response.rb
@@ -37,7 +37,7 @@ class Net::HTTPResponse
def read_status_line(sock)
str = sock.readline
- m = /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)(?:\s+(.*))?\z/in.match(str) or
+ m = /\AHTTP(?:\/(\d+\.\d+))?\s+(\d\d\d)\s*(.*)\z/in.match(str) or
raise Net::HTTPBadResponse, "wrong status line: #{str.dump}"
m.captures
end
@@ -259,7 +259,12 @@ class Net::HTTPResponse
begin
yield inflate_body_io
ensure
- inflate_body_io.finish
+ e = $!
+ begin
+ inflate_body_io.finish
+ rescue
+ raise e
+ end
end
when 'none', 'identity' then
self.delete 'content-encoding'
@@ -301,7 +306,6 @@ class Net::HTTPResponse
# See RFC 2616 section 3.6.1 for definitions
def read_chunked(dest, chunk_data_io) # :nodoc:
- len = nil
total = 0
while true
line = @socket.readline
@@ -364,6 +368,11 @@ class Net::HTTPResponse
# entire body in memory.
def inflate_adapter(dest)
+ if dest.respond_to?(:set_encoding)
+ dest.set_encoding(Encoding::ASCII_8BIT)
+ elsif dest.respond_to?(:force_encoding)
+ dest.force_encoding(Encoding::ASCII_8BIT)
+ end
block = proc do |compressed_chunk|
@inflate.inflate(compressed_chunk) do |chunk|
dest << chunk
diff --git a/lib/net/http/responses.rb b/lib/net/http/responses.rb
index bc7642c7f3..1454a27a3e 100644
--- a/lib/net/http/responses.rb
+++ b/lib/net/http/responses.rb
@@ -85,7 +85,9 @@ end
class Net::HTTPTemporaryRedirect < Net::HTTPRedirection # 307
HAS_BODY = true
end
-# 308 Permanent Redirect - in draft
+class Net::HTTPPermanentRedirect < Net::HTTPRedirection # 308
+ HAS_BODY = true
+end
class Net::HTTPBadRequest < Net::HTTPClientError # 400
HAS_BODY = true
diff --git a/lib/net/imap.rb b/lib/net/imap.rb
index 1bb0b81eec..85644f388c 100644
--- a/lib/net/imap.rb
+++ b/lib/net/imap.rb
@@ -37,7 +37,7 @@ module Net
# arranged in an hierarchical namespace, and each of which
# contains zero or more messages. How this is implemented on
# the server is implementation-dependent; on a UNIX server, it
- # will frequently be implemented as a files in mailbox format
+ # will frequently be implemented as files in mailbox format
# within a hierarchy of directories.
#
# To work on the messages within a mailbox, the client must
@@ -48,12 +48,12 @@ module Net
# related commands implicitly operate.
#
# Messages have two sorts of identifiers: message sequence
- # numbers, and UIDs.
+ # numbers and UIDs.
#
- # Message sequence numbers number messages within a mail box
- # from 1 up to the number of items in the mail box. If new
+ # Message sequence numbers number messages within a mailbox
+ # from 1 up to the number of items in the mailbox. If a new
# message arrives during a session, it receives a sequence
- # number equal to the new size of the mail box. If messages
+ # number equal to the new size of the mailbox. If messages
# are expunged from the mailbox, remaining messages have their
# sequence numbers "shuffled down" to fill the gaps.
#
@@ -63,7 +63,7 @@ module Net
# be assigned in ascending (but not necessarily sequential)
# order within a mailbox; this means that if a non-IMAP client
# rearranges the order of mailitems within a mailbox, the
- # UIDs have to be reassigned. An IMAP client cannot thus
+ # UIDs have to be reassigned. An IMAP client thus cannot
# rearrange message orders.
#
# == Examples of Usage
@@ -113,7 +113,7 @@ module Net
#
# NO:: the attempted command could not be successfully completed. For
# instance, the username/password used for logging in are incorrect;
- # the selected mailbox does not exists; etc.
+ # the selected mailbox does not exist; etc.
#
# BAD:: the request from the client does not follow the server's
# understanding of the IMAP protocol. This includes attempting
@@ -125,7 +125,7 @@ module Net
# BYE:: the server is saying goodbye. This can be part of a normal
# logout sequence, and can be used as part of a login sequence
# to indicate that the server is (for some reason) unwilling
- # to accept our connection. As a response to any other command,
+ # to accept your connection. As a response to any other command,
# it indicates either that the server is shutting down, or that
# the server is timing out the client connection due to inactivity.
#
@@ -223,14 +223,14 @@ module Net
# The thread to receive exceptions.
attr_accessor :client_thread
- # Flag indicating a message has been seen
+ # Flag indicating a message has been seen.
SEEN = :Seen
- # Flag indicating a message has been answered
+ # Flag indicating a message has been answered.
ANSWERED = :Answered
# Flag indicating a message has been flagged for special or urgent
- # attention
+ # attention.
FLAGGED = :Flagged
# Flag indicating a message has been marked for deletion. This
@@ -240,7 +240,7 @@ module Net
# Flag indicating a message is only a draft or work-in-progress version.
DRAFT = :Draft
- # Flag indicating that the message is "recent", meaning that this
+ # Flag indicating that the message is "recent," meaning that this
# session is the first session in which the client has been notified
# of this message.
RECENT = :Recent
@@ -386,7 +386,7 @@ module Net
# Sends an AUTHENTICATE command to authenticate the client.
# The +auth_type+ parameter is a string that represents
# the authentication mechanism to be used. Currently Net::IMAP
- # supports authentication mechanisms:
+ # supports the authentication mechanisms:
#
# LOGIN:: login using cleartext user and password.
# CRAM-MD5:: login with cleartext user and encrypted password
@@ -394,8 +394,8 @@ module Net
# mechanism requires that the server have the user's
# password stored in clear-text password.
#
- # For both these mechanisms, there should be two +args+: username
- # and (cleartext) password. A server may not support one or other
+ # For both of these mechanisms, there should be two +args+: username
+ # and (cleartext) password. A server may not support one or the other
# of these mechanisms; check #capability() for a capability of
# the form "AUTH=LOGIN" or "AUTH=CRAM-MD5".
#
@@ -500,7 +500,7 @@ module Net
# by #lsub().
#
# A Net::IMAP::NoResponseError is raised if +mailbox+ cannot be
- # subscribed to, for instance because it does not exist.
+ # subscribed to; for instance, because it does not exist.
def subscribe(mailbox)
send_command("SUBSCRIBE", mailbox)
end
@@ -509,7 +509,7 @@ module Net
# from the server's set of "active" or "subscribed" mailboxes.
#
# A Net::IMAP::NoResponseError is raised if +mailbox+ cannot be
- # unsubscribed from, for instance because the client is not currently
+ # unsubscribed from; for instance, because the client is not currently
# subscribed to it.
def unsubscribe(mailbox)
send_command("UNSUBSCRIBE", mailbox)
@@ -576,9 +576,9 @@ module Net
end
end
- # Sends the GETQUOTAROOT command along with specified +mailbox+.
+ # Sends the GETQUOTAROOT command along with the specified +mailbox+.
# This command is generally available to both admin and user.
- # If mailbox exists, returns an array containing objects of
+ # If this mailbox exists, it returns an array containing objects of type
# Net::IMAP::MailboxQuotaRoot and Net::IMAP::MailboxQuota.
def getquotaroot(mailbox)
synchronize do
@@ -593,7 +593,7 @@ module Net
# Sends the GETQUOTA command along with specified +mailbox+.
# If this mailbox exists, then an array containing a
# Net::IMAP::MailboxQuota object is returned. This
- # command generally is only available to server admin.
+ # command is generally only available to server admin.
def getquota(mailbox)
synchronize do
send_command("GETQUOTA", mailbox)
@@ -602,8 +602,8 @@ module Net
end
# Sends a SETQUOTA command along with the specified +mailbox+ and
- # +quota+. If +quota+ is nil, then quota will be unset for that
- # mailbox. Typically one needs to be logged in as server admin
+ # +quota+. If +quota+ is nil, then +quota+ will be unset for that
+ # mailbox. Typically one needs to be logged in as a server admin
# for this to work. The IMAP quota commands are described in
# [RFC-2087].
def setquota(mailbox, quota)
@@ -627,7 +627,7 @@ module Net
end
end
- # Send the GETACL command along with specified +mailbox+.
+ # Send the GETACL command along with a specified +mailbox+.
# If this mailbox exists, an array containing objects of
# Net::IMAP::MailboxACLItem will be returned.
def getacl(mailbox)
@@ -639,7 +639,7 @@ module Net
# Sends a LSUB command, and returns a subset of names from the set
# of names that the user has declared as being "active" or
- # "subscribed". +refname+ and +mailbox+ are interpreted as
+ # "subscribed." +refname+ and +mailbox+ are interpreted as
# for #list().
# The return value is an array of +Net::IMAP::MailboxList+.
def lsub(refname, mailbox)
@@ -650,8 +650,8 @@ module Net
end
# Sends a STATUS command, and returns the status of the indicated
- # +mailbox+. +attr+ is a list of one or more attributes that
- # we are request the status of. Supported attributes include:
+ # +mailbox+. +attr+ is a list of one or more attributes whose
+ # statuses are to be requested. Supported attributes include:
#
# MESSAGES:: the number of messages in the mailbox.
# RECENT:: the number of recent messages in the mailbox.
@@ -663,7 +663,7 @@ module Net
# #=> {"RECENT"=>0, "MESSAGES"=>44}
#
# A Net::IMAP::NoResponseError is raised if status values
- # for +mailbox+ cannot be returned, for instance because it
+ # for +mailbox+ cannot be returned; for instance, because it
# does not exist.
def status(mailbox, attr)
synchronize do
@@ -674,7 +674,7 @@ module Net
# Sends a APPEND command to append the +message+ to the end of
# the +mailbox+. The optional +flags+ argument is an array of
- # flags to initially passing to the new message. The optional
+ # flags initially passed to the new message. The optional
# +date_time+ argument specifies the creation time to assign to the
# new message; it defaults to the current time.
# For example:
@@ -702,7 +702,7 @@ module Net
# Sends a CHECK command to request a checkpoint of the currently
# selected mailbox. This performs implementation-specific
- # housekeeping, for instance, reconciling the mailbox's
+ # housekeeping; for instance, reconciling the mailbox's
# in-memory and on-disk state.
def check
send_command("CHECK")
@@ -768,18 +768,28 @@ module Net
return search_internal("SEARCH", keys, charset)
end
- # As for #search(), but returns unique identifiers.
+ # Similar to #search(), but returns unique identifiers.
def uid_search(keys, charset = nil)
return search_internal("UID SEARCH", keys, charset)
end
# Sends a FETCH command to retrieve data associated with a message
- # in the mailbox. The +set+ parameter is a number or an array of
- # numbers or a Range object. The number is a message sequence
- # number. +attr+ is a list of attributes to fetch; see the
- # documentation for Net::IMAP::FetchData for a list of valid
- # attributes.
- # The return value is an array of Net::IMAP::FetchData. For example:
+ # in the mailbox.
+ #
+ # The +set+ parameter is a number or a range between two numbers,
+ # or an array of those. The number is a message sequence number,
+ # where -1 repesents a '*' for use in range notation like 100..-1
+ # being interpreted as '100:*'. Beware that the +exclude_end?+
+ # property of a Range object is ignored, and the contents of a
+ # range are independent of the order of the range endpoints as per
+ # the protocol specification, so 1...5, 5..1 and 5...1 are all
+ # equivalent to 1..5.
+ #
+ # +attr+ is a list of attributes to fetch; see the documentation
+ # for Net::IMAP::FetchData for a list of valid attributes.
+ #
+ # The return value is an array of Net::IMAP::FetchData. For
+ # example:
#
# p imap.fetch(6..8, "UID")
# #=> [#<Net::IMAP::FetchData seqno=6, attr={"UID"=>98}>, \\
@@ -800,18 +810,18 @@ module Net
return fetch_internal("FETCH", set, attr)
end
- # As for #fetch(), but +set+ contains unique identifiers.
+ # Similar to #fetch(), but +set+ contains unique identifiers.
def uid_fetch(set, attr)
return fetch_internal("UID FETCH", set, attr)
end
# Sends a STORE command to alter data associated with messages
# in the mailbox, in particular their flags. The +set+ parameter
- # is a number or an array of numbers or a Range object. Each number
+ # is a number, an array of numbers, or a Range object. Each number
# is a message sequence number. +attr+ is the name of a data item
- # to store: 'FLAGS' means to replace the message's flag list
- # with the provided one; '+FLAGS' means to add the provided flags;
- # and '-FLAGS' means to remove them. +flags+ is a list of flags.
+ # to store: 'FLAGS' will replace the message's flag list
+ # with the provided one, '+FLAGS' will add the provided flags,
+ # and '-FLAGS' will remove them. +flags+ is a list of flags.
#
# The return value is an array of Net::IMAP::FetchData. For example:
#
@@ -823,20 +833,20 @@ module Net
return store_internal("STORE", set, attr, flags)
end
- # As for #store(), but +set+ contains unique identifiers.
+ # Similar to #store(), but +set+ contains unique identifiers.
def uid_store(set, attr, flags)
return store_internal("UID STORE", set, attr, flags)
end
# Sends a COPY command to copy the specified message(s) to the end
# of the specified destination +mailbox+. The +set+ parameter is
- # a number or an array of numbers or a Range object. The number is
+ # a number, an array of numbers, or a Range object. The number is
# a message sequence number.
def copy(set, mailbox)
copy_internal("COPY", set, mailbox)
end
- # As for #copy(), but +set+ contains unique identifiers.
+ # Similar to #copy(), but +set+ contains unique identifiers.
def uid_copy(set, mailbox)
copy_internal("UID COPY", set, mailbox)
end
@@ -854,16 +864,16 @@ module Net
return sort_internal("SORT", sort_keys, search_keys, charset)
end
- # As for #sort(), but returns an array of unique identifiers.
+ # Similar to #sort(), but returns an array of unique identifiers.
def uid_sort(sort_keys, search_keys, charset)
return sort_internal("UID SORT", sort_keys, search_keys, charset)
end
# Adds a response handler. For example, to detect when
- # the server sends us a new EXISTS response (which normally
- # indicates new messages being added to the mail box),
- # you could add the following handler after selecting the
- # mailbox.
+ # the server sends a new EXISTS response (which normally
+ # indicates new messages being added to the mailbox),
+ # add the following handler after selecting the
+ # mailbox:
#
# imap.add_response_handler { |resp|
# if resp.kind_of?(Net::IMAP::UntaggedResponse) and resp.name == "EXISTS"
@@ -880,7 +890,7 @@ module Net
@response_handlers.delete(handler)
end
- # As for #search(), but returns message sequence numbers in threaded
+ # Similar to #search(), but returns message sequence numbers in threaded
# format, as a Net::IMAP::ThreadMember tree. The supported algorithms
# are:
#
@@ -897,7 +907,7 @@ module Net
return thread_internal("THREAD", algorithm, search_keys, charset)
end
- # As for #thread(), but returns unique identifiers instead of
+ # Similar to #thread(), but returns unique identifiers instead of
# message sequence numbers.
def uid_thread(algorithm, search_keys, charset)
return thread_internal("UID THREAD", algorithm, search_keys, charset)
@@ -953,7 +963,7 @@ module Net
# containing non-ASCII characters; see [IMAP] section 5.1.3.
#
# Net::IMAP does _not_ automatically encode and decode
- # mailbox names to and from utf7.
+ # mailbox names to and from UTF-7.
def self.decode_utf7(s)
return s.gsub(/&([^-]+)?-/n) {
if $1
@@ -1006,24 +1016,24 @@ module Net
#
# The available options are:
#
- # port:: port number (default value is 143 for imap, or 993 for imaps)
- # ssl:: if options[:ssl] is true, then an attempt will be made
+ # port:: Port number (default value is 143 for imap, or 993 for imaps)
+ # ssl:: If options[:ssl] is true, then an attempt will be made
# to use SSL (now TLS) to connect to the server. For this to work
# OpenSSL [OSSL] and the Ruby OpenSSL [RSSL] extensions need to
# be installed.
- # if options[:ssl] is a hash, it's passed to
+ # If options[:ssl] is a hash, it's passed to
# OpenSSL::SSL::SSLContext#set_params as parameters.
#
# The most common errors are:
#
- # Errno::ECONNREFUSED:: connection refused by +host+ or an intervening
+ # Errno::ECONNREFUSED:: Connection refused by +host+ or an intervening
# firewall.
- # Errno::ETIMEDOUT:: connection timed out (possibly due to packets
+ # Errno::ETIMEDOUT:: Connection timed out (possibly due to packets
# being dropped by an intervening firewall).
- # Errno::ENETUNREACH:: there is no route to that network.
- # SocketError:: hostname not known or other socket error.
- # Net::IMAP::ByeResponseError:: we connected to the host, but they
- # immediately said goodbye to us.
+ # Errno::ENETUNREACH:: There is no route to that network.
+ # SocketError:: Hostname not known or other socket error.
+ # Net::IMAP::ByeResponseError:: The connected to the host was successful, but
+ # it immediately said goodbye.
def initialize(host, port_or_options = {},
usessl = false, certs = nil, verify = true)
super()
@@ -1043,40 +1053,43 @@ module Net
@tagno = 0
@parser = ResponseParser.new
@sock = TCPSocket.open(@host, @port)
- if options[:ssl]
- start_tls_session(options[:ssl])
- @usessl = true
- else
- @usessl = false
- end
- @responses = Hash.new([].freeze)
- @tagged_responses = {}
- @response_handlers = []
- @tagged_response_arrival = new_cond
- @continuation_request_arrival = new_cond
- @idle_done_cond = nil
- @logout_command_tag = nil
- @debug_output_bol = true
- @exception = nil
-
- @greeting = get_response
- if @greeting.nil?
- @sock.close
- raise Error, "connection closed"
- end
- if @greeting.name == "BYE"
- @sock.close
- raise ByeResponseError, @greeting
- end
+ begin
+ if options[:ssl]
+ start_tls_session(options[:ssl])
+ @usessl = true
+ else
+ @usessl = false
+ end
+ @responses = Hash.new([].freeze)
+ @tagged_responses = {}
+ @response_handlers = []
+ @tagged_response_arrival = new_cond
+ @continuation_request_arrival = new_cond
+ @idle_done_cond = nil
+ @logout_command_tag = nil
+ @debug_output_bol = true
+ @exception = nil
- @client_thread = Thread.current
- @receiver_thread = Thread.start {
- begin
- receive_responses
- rescue Exception
+ @greeting = get_response
+ if @greeting.nil?
+ raise Error, "connection closed"
end
- }
- @receiver_thread_terminating = false
+ if @greeting.name == "BYE"
+ raise ByeResponseError, @greeting
+ end
+
+ @client_thread = Thread.current
+ @receiver_thread = Thread.start {
+ begin
+ receive_responses
+ rescue Exception
+ end
+ }
+ @receiver_thread_terminating = false
+ rescue Exception
+ @sock.close
+ raise
+ end
end
def receive_responses
@@ -1608,10 +1621,10 @@ module Net
#
# ==== Fields:
#
- # name:: Returns the name such as "FLAGS", "LIST", "FETCH"....
+ # name:: Returns the name, such as "FLAGS", "LIST", or "FETCH".
#
# data:: Returns the data such as an array of flag symbols,
- # a ((<Net::IMAP::MailboxList>)) object....
+ # a ((<Net::IMAP::MailboxList>)) object.
#
# raw_data:: Returns the raw data string.
UntaggedResponse = Struct.new(:name, :data, :raw_data)
@@ -1632,7 +1645,7 @@ module Net
#
# tag:: Returns the tag.
#
- # name:: Returns the name. the name is one of "OK", "NO", "BAD".
+ # name:: Returns the name, one of "OK", "NO", or "BAD".
#
# data:: Returns the data. See ((<Net::IMAP::ResponseText>)).
#
@@ -1654,7 +1667,6 @@ module Net
#
ResponseText = Struct.new(:code, :text)
- #
# Net::IMAP::ResponseCode represents response codes.
#
# resp_text_code ::= "ALERT" / "PARSE" /
@@ -1666,9 +1678,9 @@ module Net
#
# ==== Fields:
#
- # name:: Returns the name such as "ALERT", "PERMANENTFLAGS", "UIDVALIDITY"....
+ # name:: Returns the name, such as "ALERT", "PERMANENTFLAGS", or "UIDVALIDITY".
#
- # data:: Returns the data if it exists.
+ # data:: Returns the data, if it exists.
#
ResponseCode = Struct.new(:name, :data)
@@ -1683,7 +1695,7 @@ module Net
# attr:: Returns the name attributes. Each name attribute is a symbol
# capitalized by String#capitalize, such as :Noselect (not :NoSelect).
#
- # delim:: Returns the hierarchy delimiter
+ # delim:: Returns the hierarchy delimiter.
#
# name:: Returns the mailbox name.
#
@@ -1704,9 +1716,9 @@ module Net
#
# mailbox:: The mailbox with the associated quota.
#
- # usage:: Current storage usage of mailbox.
+ # usage:: Current storage usage of the mailbox.
#
- # quota:: Quota limit imposed on mailbox.
+ # quota:: Quota limit imposed on the mailbox.
#
MailboxQuota = Struct.new(:mailbox, :usage, :quota)
@@ -1719,12 +1731,12 @@ module Net
#
# mailbox:: The mailbox with the associated quota.
#
- # quotaroots:: Zero or more quotaroots that effect the quota on the
+ # quotaroots:: Zero or more quotaroots that affect the quota on the
# specified mailbox.
#
MailboxQuotaRoot = Struct.new(:mailbox, :quotaroots)
- # Net::IMAP::MailboxACLItem represents response from GETACL.
+ # Net::IMAP::MailboxACLItem represents the response from GETACL.
#
# acl_data ::= "ACL" SPACE mailbox *(SPACE identifier SPACE rights)
#
@@ -1742,7 +1754,7 @@ module Net
#
MailboxACLItem = Struct.new(:user, :rights, :mailbox)
- # Net::IMAP::StatusData represents contents of the STATUS response.
+ # Net::IMAP::StatusData represents the contents of the STATUS response.
#
# ==== Fields:
#
@@ -1753,7 +1765,7 @@ module Net
#
StatusData = Struct.new(:mailbox, :attr)
- # Net::IMAP::FetchData represents contents of the FETCH response.
+ # Net::IMAP::FetchData represents the contents of the FETCH response.
#
# ==== Fields:
#
@@ -1777,7 +1789,7 @@ module Net
# A Net::IMAP::Envelope object that describes the envelope
# structure of a message.
# [FLAGS]
- # A array of flag symbols that are set for this message. flag symbols
+ # A array of flag symbols that are set for this message. Flag symbols
# are capitalized by String#capitalize.
# [INTERNALDATE]
# A string representing the internal date of the message.
@@ -1832,7 +1844,7 @@ module Net
#
# mailbox:: nil indicates end of [RFC-822] group.
# If non-nil and host is nil, returns [RFC-822] group name.
- # Otherwise, returns [RFC-822] local-part
+ # Otherwise, returns [RFC-822] local-part.
#
# host:: nil indicates [RFC-822] group syntax.
# Otherwise, returns [RFC-822] domain name.
@@ -1852,14 +1864,14 @@ module Net
ContentDisposition = Struct.new(:dsp_type, :param)
# Net::IMAP::ThreadMember represents a thread-node returned
- # by Net::IMAP#thread
+ # by Net::IMAP#thread.
#
# ==== Fields:
#
# seqno:: The sequence number of this message.
#
- # children:: an array of Net::IMAP::ThreadMember objects for mail
- # items that are children of this in the thread.
+ # children:: An array of Net::IMAP::ThreadMember objects for mail
+ # items that are children of this in the thread.
#
ThreadMember = Struct.new(:seqno, :children)
@@ -3070,39 +3082,6 @@ module Net
return Address.new(name, route, mailbox, host)
end
-# def flag_list
-# result = []
-# match(T_LPAR)
-# while true
-# token = lookahead
-# case token.symbol
-# when T_RPAR
-# shift_token
-# break
-# when T_SPACE
-# shift_token
-# end
-# result.push(flag)
-# end
-# return result
-# end
-
-# def flag
-# token = lookahead
-# if token.symbol == T_BSLASH
-# shift_token
-# token = lookahead
-# if token.symbol == T_STAR
-# shift_token
-# return token.value.intern
-# else
-# return atom.intern
-# end
-# else
-# return atom
-# end
-# end
-
FLAG_REGEXP = /\
(?# FLAG )\\([^\x80-\xff(){ \x00-\x1f\x7f%"\\]+)|\
(?# ATOM )([^\x80-\xff(){ \x00-\x1f\x7f%*"\\]+)/n
@@ -3597,174 +3576,3 @@ module Net
end
end
end
-
-if __FILE__ == $0
- # :enddoc:
- require "getoptlong"
-
- $stdout.sync = true
- $port = nil
- $user = ENV["USER"] || ENV["LOGNAME"]
- $auth = "login"
- $ssl = false
- $starttls = false
-
- def usage
- <<EOF
-usage: #{$0} [options] <host>
-
- --help print this message
- --port=PORT specifies port
- --user=USER specifies user
- --auth=AUTH specifies auth type
- --starttls use starttls
- --ssl use ssl
-EOF
- end
-
- begin
- require 'io/console'
- rescue LoadError
- def _noecho(&block)
- system("stty", "-echo")
- begin
- yield STDIN
- ensure
- system("stty", "echo")
- end
- end
- else
- def _noecho(&block)
- STDIN.noecho(&block)
- end
- end
-
- def get_password
- print "password: "
- begin
- return _noecho(&:gets).chomp
- ensure
- puts
- end
- end
-
- def get_command
- printf("%s@%s> ", $user, $host)
- if line = gets
- return line.strip.split(/\s+/)
- else
- return nil
- end
- end
-
- parser = GetoptLong.new
- parser.set_options(['--debug', GetoptLong::NO_ARGUMENT],
- ['--help', GetoptLong::NO_ARGUMENT],
- ['--port', GetoptLong::REQUIRED_ARGUMENT],
- ['--user', GetoptLong::REQUIRED_ARGUMENT],
- ['--auth', GetoptLong::REQUIRED_ARGUMENT],
- ['--starttls', GetoptLong::NO_ARGUMENT],
- ['--ssl', GetoptLong::NO_ARGUMENT])
- begin
- parser.each_option do |name, arg|
- case name
- when "--port"
- $port = arg
- when "--user"
- $user = arg
- when "--auth"
- $auth = arg
- when "--ssl"
- $ssl = true
- when "--starttls"
- $starttls = true
- when "--debug"
- Net::IMAP.debug = true
- when "--help"
- usage
- exit
- end
- end
- rescue
- abort usage
- end
-
- $host = ARGV.shift
- unless $host
- abort usage
- end
-
- imap = Net::IMAP.new($host, :port => $port, :ssl => $ssl)
- begin
- imap.starttls if $starttls
- class << password = method(:get_password)
- alias to_str call
- end
- imap.authenticate($auth, $user, password)
- while true
- cmd, *args = get_command
- break unless cmd
- begin
- case cmd
- when "list"
- for mbox in imap.list("", args[0] || "*")
- if mbox.attr.include?(Net::IMAP::NOSELECT)
- prefix = "!"
- elsif mbox.attr.include?(Net::IMAP::MARKED)
- prefix = "*"
- else
- prefix = " "
- end
- print prefix, mbox.name, "\n"
- end
- when "select"
- imap.select(args[0] || "inbox")
- print "ok\n"
- when "close"
- imap.close
- print "ok\n"
- when "summary"
- unless messages = imap.responses["EXISTS"][-1]
- puts "not selected"
- next
- end
- if messages > 0
- for data in imap.fetch(1..-1, ["ENVELOPE"])
- print data.seqno, ": ", data.attr["ENVELOPE"].subject, "\n"
- end
- else
- puts "no message"
- end
- when "fetch"
- if args[0]
- data = imap.fetch(args[0].to_i, ["RFC822.HEADER", "RFC822.TEXT"])[0]
- puts data.attr["RFC822.HEADER"]
- puts data.attr["RFC822.TEXT"]
- else
- puts "missing argument"
- end
- when "logout", "exit", "quit"
- break
- when "help", "?"
- print <<EOF
-list [pattern] list mailboxes
-select [mailbox] select mailbox
-close close mailbox
-summary display summary
-fetch [msgno] display message
-logout logout
-help, ? display help message
-EOF
- else
- print "unknown command: ", cmd, "\n"
- end
- rescue Net::IMAP::Error
- puts $!
- end
- end
- ensure
- imap.logout
- imap.disconnect
- end
-end
-
diff --git a/lib/net/smtp.rb b/lib/net/smtp.rb
index 5fd4f8e5c5..64e536a12a 100644
--- a/lib/net/smtp.rb
+++ b/lib/net/smtp.rb
@@ -901,10 +901,17 @@ module Net
end
res = critical {
check_continue get_response('DATA')
- if msgstr
- @socket.write_message msgstr
- else
- @socket.write_message_by_block(&block)
+ socket_sync_bak = @socket.io.sync
+ begin
+ @socket.io.sync = false
+ if msgstr
+ @socket.write_message msgstr
+ else
+ @socket.write_message_by_block(&block)
+ end
+ ensure
+ @socket.io.flush
+ @socket.io.sync = socket_sync_bak
end
recv_response()
}
diff --git a/lib/net/telnet.rb b/lib/net/telnet.rb
index 3c5d6e8e73..2260e7fb10 100644
--- a/lib/net/telnet.rb
+++ b/lib/net/telnet.rb
@@ -371,7 +371,7 @@ module Net
# The socket the Telnet object is using. Note that this object becomes
# a delegate of the Telnet object, so normally you invoke its methods
# directly on the Telnet object.
- attr :sock
+ attr_reader :sock
# Set telnet command interpretation on (+mode+ == true) or off
# (+mode+ == false), or return the current value (+mode+ not
diff --git a/lib/observer.rb b/lib/observer.rb
index 99610f7505..10f2eb0db5 100644
--- a/lib/observer.rb
+++ b/lib/observer.rb
@@ -127,7 +127,7 @@ module Observable
def add_observer(observer, func=:update)
@observer_peers = {} unless defined? @observer_peers
unless observer.respond_to? func
- raise NoMethodError, "observer does not respond to `#{func.to_s}'"
+ raise NoMethodError, "observer does not respond to `#{func}'"
end
@observer_peers[observer] = func
end
diff --git a/lib/open-uri.rb b/lib/open-uri.rb
index 264c8501cf..b793828063 100644
--- a/lib/open-uri.rb
+++ b/lib/open-uri.rb
@@ -155,7 +155,7 @@ module OpenURI
if io.respond_to? :close!
io.close! # Tempfile
else
- io.close
+ io.close if !io.closed?
end
end
else
@@ -256,8 +256,7 @@ module OpenURI
raise "Non-HTTP proxy URI: #{proxy_uri}" if proxy_uri.class != URI::HTTP
end
- if target.userinfo && "1.9.0" <= RUBY_VERSION
- # don't raise for 1.8 because compatibility.
+ if target.userinfo
raise ArgumentError, "userinfo not supported. [RFC3986]"
end
diff --git a/lib/open3.rb b/lib/open3.rb
index a54e1b3886..e80b1cd385 100644
--- a/lib/open3.rb
+++ b/lib/open3.rb
@@ -257,7 +257,10 @@ module Open3
end
out_reader = Thread.new { o.read }
err_reader = Thread.new { e.read }
- i.write stdin_data
+ begin
+ i.write stdin_data
+ rescue Errno::EPIPE
+ end
i.close
[out_reader.value, err_reader.value, t.value]
}
@@ -293,14 +296,19 @@ module Open3
# End
# image, s = Open3.capture2("gnuplot", :stdin_data=>gnuplot_commands, :binmode=>true)
#
- def capture2(*cmd, stdin_data: '', binmode: false, **opts)
+ def capture2(*cmd, stdin_data: nil, binmode: false, **opts)
popen2(*cmd, opts) {|i, o, t|
if binmode
i.binmode
o.binmode
end
out_reader = Thread.new { o.read }
- i.write stdin_data
+ if stdin_data
+ begin
+ i.write stdin_data
+ rescue Errno::EPIPE
+ end
+ end
i.close
[out_reader.value, t.value]
}
@@ -323,14 +331,19 @@ module Open3
# # capture make log
# make_log, s = Open3.capture2e("make")
#
- def capture2e(*cmd, stdin_data: '', binmode: false, **opts)
+ def capture2e(*cmd, stdin_data: nil, binmode: false, **opts)
popen2e(*cmd, opts) {|i, oe, t|
if binmode
i.binmode
oe.binmode
end
outerr_reader = Thread.new { oe.read }
- i.write stdin_data
+ if stdin_data
+ begin
+ i.write stdin_data
+ rescue Errno::EPIPE
+ end
+ end
i.close
[outerr_reader.value, t.value]
}
@@ -648,16 +661,3 @@ module Open3
end
end
-
-if $0 == __FILE__
- a = Open3.popen3("nroff -man")
- Thread.start do
- while line = gets
- a[0].print line
- end
- a[0].close
- end
- while line = a[1].gets
- print ":", line
- end
-end
diff --git a/lib/optionparser.rb b/lib/optionparser.rb
new file mode 100644
index 0000000000..d89a4d22fb
--- /dev/null
+++ b/lib/optionparser.rb
@@ -0,0 +1 @@
+require_relative 'optparse'
diff --git a/lib/optparse.rb b/lib/optparse.rb
index 6c4560f749..4ec891e3ae 100644
--- a/lib/optparse.rb
+++ b/lib/optparse.rb
@@ -82,6 +82,43 @@
# p options
# p ARGV
#
+# === Generating Help
+#
+# OptionParser can be used to automatically generate help for the commands you
+# write:
+#
+# require 'optparse'
+#
+# Options = Struct.new(:name)
+#
+# class Parser
+# def self.parse(options)
+# args = Options.new("world")
+#
+# opt_parser = OptionParser.new do |opts|
+# opts.banner = "Usage: example.rb [options]"
+#
+# opts.on("-nNAME", "--name=NAME", "Name to say hello to") do |n|
+# args.name = n
+# end
+#
+# opts.on("-h", "--help", "Prints this help") do
+# puts opts
+# exit
+# end
+# end
+#
+# opt_parser.parse!(options)
+# return args
+# end
+# end
+# options = Parser.parse %w[--help]
+#
+# #=>
+# # Usage: example.rb [options]
+# # -n, --name=NAME Name to say hello to
+# # -h, --help Prints this help#
+#
# === Complete example
#
# The following example is a complete Ruby program. You can run it and see the
@@ -1458,11 +1495,12 @@ XXX
#
# Wrapper method for getopts.rb.
#
- # params = ARGV.getopts("ab:", "foo", "bar:")
+ # params = ARGV.getopts("ab:", "foo", "bar:", "zot:Z;zot option)
# # params[:a] = true # -a
# # params[:b] = "1" # -b1
# # params[:foo] = "1" # --foo
# # params[:bar] = "x" # --bar x
+ # # params[:zot] = "z" # --zot Z
#
def getopts(*args)
argv = Array === args.first ? args.shift : default_argv
@@ -1481,13 +1519,14 @@ XXX
end if single_options
long_options.each do |arg|
+ arg, desc = arg.split(';', 2)
opt, val = arg.split(':', 2)
if val
result[opt] = val.empty? ? nil : val
- define("--#{opt} VAL")
+ define("--#{opt}=#{result[opt] || "VAL"}", *[desc].compact)
else
result[opt] = false
- define("--#{opt}")
+ define("--#{opt}", *[desc].compact)
end
end
@@ -1796,7 +1835,7 @@ XXX
end
def inspect
- "#<#{self.class.to_s}: #{args.join(' ')}>"
+ "#<#{self.class}: #{args.join(' ')}>"
end
#
@@ -1954,3 +1993,5 @@ end
# ARGV is arguable by OptionParser
ARGV.extend(OptionParser::Arguable)
+
+OptParse = OptionParser
diff --git a/lib/optparse/version.rb b/lib/optparse/version.rb
index 76ed564287..8525677418 100644
--- a/lib/optparse/version.rb
+++ b/lib/optparse/version.rb
@@ -51,7 +51,7 @@ class << OptionParser
raise NameError, path unless Module === klass
klass.constants.grep(/#{name}/i) do |c|
klass.const_defined?(c) or next
- c = klass.const_get(c)
+ klass.const_get(c)
end
end
end
diff --git a/lib/prettyprint.rb b/lib/prettyprint.rb
index 5b1da330dd..7e989374b7 100644
--- a/lib/prettyprint.rb
+++ b/lib/prettyprint.rb
@@ -154,28 +154,6 @@ class PrettyPrint
@group_stack.last
end
- # first? is a predicate to test the call is a first call to first? with
- # current group.
- #
- # It is useful to format comma separated values as:
- #
- # q.group(1, '[', ']') {
- # xxx.each {|yyy|
- # unless q.first?
- # q.text ','
- # q.breakable
- # end
- # ... pretty printing yyy ...
- # }
- # }
- #
- # first? is obsoleted in 1.8.2.
- #
- def first?
- warn "PrettyPrint#first? is obsoleted at 1.8.2."
- current_group.first?
- end
-
# Breaks the buffer into lines that are shorter than #maxwidth
def break_outmost_groups
while @maxwidth < @output_width + @buffer_width
diff --git a/lib/prime.rb b/lib/prime.rb
index f359c12693..ebe012b613 100644
--- a/lib/prime.rb
+++ b/lib/prime.rb
@@ -29,7 +29,7 @@ class Integer
Prime.prime_division(self, generator)
end
- # Returns true if +self+ is a prime number, false for a composite.
+ # Returns true if +self+ is a prime number, else returns false.
def prime?
Prime.prime?(self)
end
@@ -150,14 +150,13 @@ class Prime
end
- # Returns true if +value+ is prime, false for a composite.
+ # Returns true if +value+ is a prime number, else returns false.
#
# == Parameters
#
# +value+:: an arbitrary integer to be checked.
# +generator+:: optional. A pseudo-prime generator.
def prime?(value, generator = Prime::Generator23.new)
- value = -value if value < 0
return false if value < 2
for num in generator
q,r = value.divmod num
@@ -181,7 +180,7 @@ class Prime
# Prime.int_from_prime_division([[2,2], [3,1]]) #=> 12
def int_from_prime_division(pd)
pd.inject(1){|value, (prime, index)|
- value *= prime**index
+ value * prime**index
}
end
diff --git a/lib/pstore.rb b/lib/pstore.rb
index a2813a8e20..02c20c91c7 100644
--- a/lib/pstore.rb
+++ b/lib/pstore.rb
@@ -482,25 +482,3 @@ class PStore
EMPTY_MARSHAL_CHECKSUM
end
end
-
-# :enddoc:
-
-if __FILE__ == $0
- db = PStore.new("/tmp/foo")
- db.transaction do
- p db.roots
- ary = db["root"] = [1,2,3,4]
- ary[1] = [1,1.5]
- end
-
- 1000.times do
- db.transaction do
- db["root"][0] += 1
- p db["root"][0]
- end
- end
-
- db.transaction(true) do
- p db["root"]
- end
-end
diff --git a/lib/racc/parser.rb b/lib/racc/parser.rb
index 9e6de03dd5..f811ab6e78 100644
--- a/lib/racc/parser.rb
+++ b/lib/racc/parser.rb
@@ -380,7 +380,6 @@ module Racc
_, _, _, _,
_, _, _, shift_n, reduce_n,
_, _, * = arg
- nerr = 0 # tmp
if act > 0 and act < shift_n
#
@@ -431,7 +430,6 @@ module Racc
case @racc_error_status
when 0
unless arg[21] # user_yyerror
- nerr += 1
on_error @racc_t, @racc_val, @racc_vstack
end
when 3
diff --git a/lib/rake.rb b/lib/rake.rb
index 531cfc82b8..47cce17064 100644
--- a/lib/rake.rb
+++ b/lib/rake.rb
@@ -1,5 +1,4 @@
#--
-
# Copyright 2003-2010 by Jim Weirich (jim.weirich@gmail.com)
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -21,9 +20,14 @@
# IN THE SOFTWARE.
#++
+module Rake
+ VERSION = '10.3.2'
+end
+
require 'rake/version'
# :stopdoc:
+# TODO: Remove in Rake 11
RAKEVERSION = Rake::VERSION
# :startdoc:
@@ -41,6 +45,7 @@ require 'rake/ext/time'
require 'rake/win32'
require 'rake/linked_list'
+require 'rake/cpu_counter'
require 'rake/scope'
require 'rake/task_argument_error'
require 'rake/rule_recursion_overflow_error'
diff --git a/lib/rake/alt_system.rb b/lib/rake/alt_system.rb
index a42597bf09..aa7b7791b6 100644
--- a/lib/rake/alt_system.rb
+++ b/lib/rake/alt_system.rb
@@ -24,11 +24,13 @@
require 'rbconfig'
-#
+##
# Alternate implementations of system() and backticks `` on Windows
# for ruby-1.8 and earlier.
-#
-module Rake::AltSystem
+#--
+# TODO: Remove in Rake 11
+
+module Rake::AltSystem # :nodoc: all
WINDOWS = RbConfig::CONFIG["host_os"] =~
%r!(msdos|mswin|djgpp|mingw|[Ww]indows)!
diff --git a/lib/rake/application.rb b/lib/rake/application.rb
index b76244b7a3..795b4685d4 100644
--- a/lib/rake/application.rb
+++ b/lib/rake/application.rb
@@ -12,10 +12,10 @@ module Rake
CommandLineOptionError = Class.new(StandardError)
- ######################################################################
+ ##
# Rake main application object. When invoking +rake+ from the
# command line, a Rake::Application object is created and run.
- #
+
class Application
include TaskManager
include TraceOutput
@@ -84,7 +84,7 @@ module Rake
standard_exception_handling do
@name = app_name
handle_options
- collect_tasks
+ collect_command_line_tasks
end
end
@@ -117,8 +117,8 @@ module Rake
thread_pool.join
if options.job_stats
stats = thread_pool.statistics
- puts "Maximum active threads: #{stats[:max_active_threads]}"
- puts "Total threads in play: #{stats[:total_threads_in_play]}"
+ puts "Maximum active threads: #{stats[:max_active_threads]} + main"
+ puts "Total threads in play: #{stats[:total_threads_in_play]} + main"
end
ThreadHistoryDisplay.new(thread_pool.history).show if
options.job_stats == :history
@@ -138,30 +138,41 @@ module Rake
# Return the thread pool used for multithreaded processing.
def thread_pool # :nodoc:
- @thread_pool ||= ThreadPool.new(options.thread_pool_size || FIXNUM_MAX)
+ @thread_pool ||= ThreadPool.new(options.thread_pool_size || Rake.suggested_thread_count-1)
end
- # private ----------------------------------------------------------------
+ # internal ----------------------------------------------------------------
- def invoke_task(task_string)
+ # Invokes a task with arguments that are extracted from +task_string+
+ def invoke_task(task_string) # :nodoc:
name, args = parse_task_string(task_string)
t = self[name]
t.invoke(*args)
end
- def parse_task_string(string)
- if string =~ /^([^\[]+)(\[(.*)\])$/
- name = $1
- args = $3.split(/\s*,\s*/)
- else
- name = string
- args = []
- end
- [name, args]
+ def parse_task_string(string) # :nodoc:
+ /^([^\[]+)(?:\[(.*)\])$/ =~ string.to_s
+
+ name = $1
+ remaining_args = $2
+
+ return string, [] unless name
+ return name, [] if remaining_args.empty?
+
+ args = []
+
+ begin
+ /((?:[^\\,]|\\.)*?)\s*(?:,\s*(.*))?$/ =~ remaining_args
+
+ remaining_args = $2
+ args << $1.gsub(/\\(.)/, '\1')
+ end while remaining_args
+
+ return name, args
end
# Provide standard exception handling for the given block.
- def standard_exception_handling
+ def standard_exception_handling # :nodoc:
yield
rescue SystemExit
# Exit silently with current status
@@ -177,22 +188,47 @@ module Rake
# Exit the program because of an unhandle exception.
# (may be overridden by subclasses)
- def exit_because_of_exception(ex)
+ def exit_because_of_exception(ex) # :nodoc:
exit(false)
end
# Display the error message that caused the exception.
- def display_error_message(ex)
+ def display_error_message(ex) # :nodoc:
trace "#{name} aborted!"
- trace ex.message
+ display_exception_details(ex)
+ trace "Tasks: #{ex.chain}" if has_chain?(ex)
+ trace "(See full trace by running task with --trace)" unless
+ options.backtrace
+ end
+
+ def display_exception_details(ex) # :nodoc:
+ seen = Thread.current[:rake_display_exception_details_seen] ||= []
+ return if seen.include? ex
+ seen << ex
+
+ display_exception_message_details(ex)
+ display_exception_backtrace(ex)
+ display_exception_details(ex.cause) if has_cause?(ex)
+ end
+
+ def has_cause?(ex) # :nodoc:
+ ex.respond_to?(:cause) && ex.cause
+ end
+
+ def display_exception_message_details(ex) # :nodoc:
+ if ex.instance_of?(RuntimeError)
+ trace ex.message
+ else
+ trace "#{ex.class.name}: #{ex.message}"
+ end
+ end
+
+ def display_exception_backtrace(ex) # :nodoc:
if options.backtrace
trace ex.backtrace.join("\n")
else
trace Backtrace.collapse(ex.backtrace).join("\n")
end
- trace "Tasks: #{ex.chain}" if has_chain?(ex)
- trace "(See full trace by running task with --trace)" unless
- options.backtrace
end
# Warn about deprecated usage.
@@ -200,7 +236,7 @@ module Rake
# Example:
# Rake.application.deprecate("import", "Rake.import", caller.first)
#
- def deprecate(old_usage, new_usage, call_site)
+ def deprecate(old_usage, new_usage, call_site) # :nodoc:
unless options.ignore_deprecate
$stderr.puts "WARNING: '#{old_usage}' is deprecated. " +
"Please use '#{new_usage}' instead.\n" +
@@ -209,14 +245,14 @@ module Rake
end
# Does the exception have a task invocation chain?
- def has_chain?(exception)
+ def has_chain?(exception) # :nodoc:
exception.respond_to?(:chain) && exception.chain
end
private :has_chain?
# True if one of the files in RAKEFILES is in the current directory.
# If a match is found, it is copied into @rakefile.
- def have_rakefile
+ def have_rakefile # :nodoc:
@rakefiles.each do |fn|
if File.exist?(fn)
others = FileList.glob(fn, File::FNM_CASEFOLD)
@@ -229,23 +265,23 @@ module Rake
end
# True if we are outputting to TTY, false otherwise
- def tty_output?
+ def tty_output? # :nodoc:
@tty_output
end
# Override the detected TTY output state (mostly for testing)
- def tty_output=(tty_output_state)
+ def tty_output=(tty_output_state) # :nodoc:
@tty_output = tty_output_state
end
# We will truncate output if we are outputting to a TTY or if we've been
# given an explicit column width to honor
- def truncate_output?
+ def truncate_output? # :nodoc:
tty_output? || @terminal_columns.nonzero?
end
# Display the tasks and comments.
- def display_tasks_and_comments
+ def display_tasks_and_comments # :nodoc:
displayable_tasks = tasks.select { |t|
(options.show_all_tasks || t.comment) &&
t.name =~ options.show_task_pattern
@@ -284,7 +320,7 @@ module Rake
end
end
- def terminal_width
+ def terminal_width # :nodoc:
if @terminal_columns.nonzero?
result = @terminal_columns
else
@@ -296,28 +332,28 @@ module Rake
end
# Calculate the dynamic width of the
- def dynamic_width
+ def dynamic_width # :nodoc:
@dynamic_width ||= (dynamic_width_stty.nonzero? || dynamic_width_tput)
end
- def dynamic_width_stty
+ def dynamic_width_stty # :nodoc:
%x{stty size 2>/dev/null}.split[1].to_i
end
- def dynamic_width_tput
+ def dynamic_width_tput # :nodoc:
%x{tput cols 2>/dev/null}.to_i
end
- def unix?
+ def unix? # :nodoc:
RbConfig::CONFIG['host_os'] =~
/(aix|darwin|linux|(net|free|open)bsd|cygwin|solaris|irix|hpux)/i
end
- def windows?
+ def windows? # :nodoc:
Win32.windows?
end
- def truncate(string, width)
+ def truncate(string, width) # :nodoc:
if string.nil?
""
elsif string.length <= width
@@ -328,19 +364,19 @@ module Rake
end
# Display the tasks and prerequisites
- def display_prerequisites
+ def display_prerequisites # :nodoc:
tasks.each do |t|
puts "#{name} #{t.name}"
t.prerequisites.each { |pre| puts " #{pre}" }
end
end
- def trace(*strings)
+ def trace(*strings) # :nodoc:
options.trace_output ||= $stderr
trace_on(options.trace_output, *strings)
end
- def sort_options(options)
+ def sort_options(options) # :nodoc:
options.sort_by { |opt|
opt.select { |o| o =~ /^-/ }.map { |o| o.downcase }.sort.reverse
}
@@ -349,11 +385,11 @@ module Rake
# A list of all the standard options used in rake, suitable for
# passing to OptionParser.
- def standard_rake_options
+ def standard_rake_options # :nodoc:
sort_options(
[
['--all', '-A',
- "Show all tasks, even uncommented ones",
+ "Show all tasks, even uncommented ones (in combination with -T or -D)",
lambda { |value|
options.show_all_tasks = value
}
@@ -365,6 +401,12 @@ module Rake
select_trace_output(options, 'backtrace', value)
}
],
+ ['--build-all', '-B',
+ "Build all prerequisites, including those which are up-to-date.",
+ lambda { |value|
+ options.build_all = true
+ }
+ ],
['--comments',
"Show commented tasks only",
lambda { |value|
@@ -407,9 +449,17 @@ module Rake
],
['--jobs', '-j [NUMBER]',
"Specifies the maximum number of tasks to execute in parallel. " +
- "(default is 2)",
+ "(default is number of CPU cores + 4)",
lambda { |value|
- options.thread_pool_size = [(value || 2).to_i, 2].max
+ if value.nil? || value == ''
+ value = FIXNUM_MAX
+ elsif value =~ /^\d+$/
+ value = value.to_i
+ else
+ value = Rake.suggested_thread_count
+ end
+ value = 1 if value < 1
+ options.thread_pool_size = value - 1
}
],
['--job-stats [LEVEL]',
@@ -443,8 +493,8 @@ module Rake
"Do not log messages to standard output.",
lambda { |value| Rake.verbose(false) }
],
- ['--rakefile', '-f [FILE]',
- "Use FILE as the rakefile.",
+ ['--rakefile', '-f [FILENAME]',
+ "Use FILENAME as the rakefile to search for.",
lambda { |value|
value ||= ''
@rakefiles.clear
@@ -545,14 +595,14 @@ module Rake
])
end
- def select_tasks_to_show(options, show_tasks, value)
+ def select_tasks_to_show(options, show_tasks, value) # :nodoc:
options.show_tasks = show_tasks
options.show_task_pattern = Regexp.new(value || '')
Rake::TaskManager.record_task_metadata = true
end
private :select_tasks_to_show
- def select_trace_output(options, trace_option, value)
+ def select_trace_output(options, trace_option, value) # :nodoc:
value = value.strip unless value.nil?
case value
when 'stdout'
@@ -567,7 +617,7 @@ module Rake
private :select_trace_output
# Read and handle the command line options.
- def handle_options
+ def handle_options # :nodoc:
options.rakelib = ['rakelib']
options.trace_output = $stderr
@@ -588,7 +638,7 @@ module Rake
# Similar to the regular Ruby +require+ command, but will check
# for *.rake files in addition to *.rb files.
- def rake_require(file_name, paths=$LOAD_PATH, loaded=$")
+ def rake_require(file_name, paths=$LOAD_PATH, loaded=$") # :nodoc:
fn = file_name + ".rake"
return false if loaded.include?(fn)
paths.each do |path|
@@ -602,7 +652,7 @@ module Rake
fail LoadError, "Can't find #{file_name}"
end
- def find_rakefile_location
+ def find_rakefile_location # :nodoc:
here = Dir.pwd
until (fn = have_rakefile)
Dir.chdir("..")
@@ -614,7 +664,7 @@ module Rake
Dir.chdir(Rake.original_dir)
end
- def print_rakefile_directory(location)
+ def print_rakefile_directory(location) # :nodoc:
$stderr.puts "(in #{Dir.pwd})" unless
options.silent or original_dir == location
end
@@ -645,13 +695,13 @@ module Rake
load_imports
end
- def glob(path, &block)
+ def glob(path, &block) # :nodoc:
FileList.glob(path.gsub("\\", '/')).each(&block)
end
private :glob
# The directory path containing the system wide rakefiles.
- def system_dir
+ def system_dir # :nodoc:
@system_dir ||=
begin
if ENV['RAKE_SYSTEM']
@@ -677,7 +727,7 @@ module Rake
# Collect the list of tasks on the command line. If no tasks are
# given, return a list containing only the default task.
# Environmental assignments are processed at this time as well.
- def collect_tasks
+ def collect_command_line_tasks # :nodoc:
@top_level_tasks = []
ARGV.each do |arg|
if arg =~ /^(\w+)=(.*)$/m
@@ -691,28 +741,33 @@ module Rake
# Default task name ("default").
# (May be overridden by subclasses)
- def default_task_name
+ def default_task_name # :nodoc:
"default"
end
# Add a file to the list of files to be imported.
- def add_import(fn)
+ def add_import(fn) # :nodoc:
@pending_imports << fn
end
# Load the pending list of imported files.
- def load_imports
+ def load_imports # :nodoc:
while fn = @pending_imports.shift
next if @imported.member?(fn)
fn_task = lookup(fn) and fn_task.invoke
ext = File.extname(fn)
loader = @loaders[ext] || @default_loader
loader.load(fn)
+ if fn_task = lookup(fn) and fn_task.needed?
+ fn_task.reenable
+ fn_task.invoke
+ loader.load(fn)
+ end
@imported << fn
end
end
- def rakefile_location(backtrace=caller)
+ def rakefile_location(backtrace=caller) # :nodoc:
backtrace.map { |t| t[/([^:]+):/, 1] }
re = /^#{@rakefile}$/
diff --git a/lib/rake/backtrace.rb b/lib/rake/backtrace.rb
index 9b2ba6157f..dc18773436 100644
--- a/lib/rake/backtrace.rb
+++ b/lib/rake/backtrace.rb
@@ -1,6 +1,6 @@
module Rake
- module Backtrace
- SYS_KEYS = RbConfig::CONFIG.keys.grep(/(prefix|libdir)/)
+ module Backtrace # :nodoc: all
+ SYS_KEYS = RbConfig::CONFIG.keys.grep(/(?:[a-z]prefix|libdir)\z/)
SYS_PATHS = RbConfig::CONFIG.values_at(*SYS_KEYS).uniq +
[ File.join(File.dirname(__FILE__), "..") ]
@@ -9,6 +9,9 @@ module Rake
map { |f| File.expand_path(f) }.
reject { |s| s.nil? || s =~ /^ *$/ }
SUPPRESSED_PATHS_RE = SUPPRESSED_PATHS.map { |f| Regexp.quote(f) }.join("|")
+ SUPPRESSED_PATHS_RE << "|^org\\/jruby\\/\\w+\\.java" if
+ Object.const_defined?(:RUBY_ENGINE) and RUBY_ENGINE == 'jruby'
+
SUPPRESS_PATTERN = %r!(\A(#{SUPPRESSED_PATHS_RE})|bin/rake:\d+)!i
def self.collapse(backtrace)
diff --git a/lib/rake/clean.rb b/lib/rake/clean.rb
index 8001ce569a..a49cd44167 100644
--- a/lib/rake/clean.rb
+++ b/lib/rake/clean.rb
@@ -31,9 +31,30 @@ module Rake
begin
rm_r file_name, opts
rescue StandardError => ex
- puts "Failed to remove #{file_name}: #{ex}"
+ puts "Failed to remove #{file_name}: #{ex}" unless file_already_gone?(file_name)
end
end
+
+ def file_already_gone?(file_name)
+ return false if File.exist?(file_name)
+
+ path = file_name
+ prev = nil
+
+ while path = File.dirname(path)
+ return false if cant_be_deleted?(path)
+ break if [prev, "."].include?(path)
+ prev = path
+ end
+ true
+ end
+ private_class_method :file_already_gone?
+
+ def cant_be_deleted?(path_name)
+ File.exist?(path_name) &&
+ (!File.readable?(path_name) || !File.executable?(path_name))
+ end
+ private_class_method :cant_be_deleted?
end
end
diff --git a/lib/rake/cloneable.rb b/lib/rake/cloneable.rb
index ac67471232..d53645f2f3 100644
--- a/lib/rake/cloneable.rb
+++ b/lib/rake/cloneable.rb
@@ -1,9 +1,9 @@
module Rake
- # ##########################################################################
+ ##
# Mixin for creating easily cloned objects.
- #
- module Cloneable
- # The hook that invoked by 'clone' and 'dup' methods.
+
+ module Cloneable # :nodoc:
+ # The hook that is invoked by 'clone' and 'dup' methods.
def initialize_copy(source)
super
source.instance_variables.each do |var|
diff --git a/lib/rake/contrib/.document b/lib/rake/contrib/.document
new file mode 100644
index 0000000000..8b13789179
--- /dev/null
+++ b/lib/rake/contrib/.document
@@ -0,0 +1 @@
+
diff --git a/lib/rake/contrib/ftptools.rb b/lib/rake/contrib/ftptools.rb
index 0dd50fdc8d..b178523bc6 100644
--- a/lib/rake/contrib/ftptools.rb
+++ b/lib/rake/contrib/ftptools.rb
@@ -9,9 +9,7 @@ require 'rake/file_list'
module Rake # :nodoc:
- ####################################################################
- # <b>Note:</b> <em> Not released for general use.</em>
- class FtpFile
+ class FtpFile # :nodoc: all
attr_reader :name, :size, :owner, :group, :time
def self.date
@@ -68,9 +66,9 @@ module Rake # :nodoc:
end
end
- ####################################################################
+ ##
# Manage the uploading of files to an FTP account.
- class FtpUploader
+ class FtpUploader # :nodoc:
# Log uploads to standard output when true.
attr_accessor :verbose
diff --git a/lib/rake/contrib/publisher.rb b/lib/rake/contrib/publisher.rb
index 8b11edb59c..f4ee1abf86 100644
--- a/lib/rake/contrib/publisher.rb
+++ b/lib/rake/contrib/publisher.rb
@@ -14,8 +14,10 @@ HostInfo = Struct.new(:name, :webdir, :pkgdir)
# :startdoc:
+# TODO: Move to contrib/sshpublisher
+#--
# Manage several publishers as a single entity.
-class CompositePublisher
+class CompositePublisher # :nodoc:
def initialize
@publishers = []
end
@@ -31,9 +33,11 @@ class CompositePublisher
end
end
+# TODO: Remove in Rake 11, duplicated
+#--
# Publish an entire directory to an existing remote directory using
# SSH.
-class SshDirPublisher
+class SshDirPublisher # :nodoc: all
def initialize(host, remote_dir, local_dir)
@host = host
@remote_dir = remote_dir
@@ -45,8 +49,10 @@ class SshDirPublisher
end
end
+# TODO: Remove in Rake 11, duplicated
+#--
# Publish an entire directory to a fresh remote directory using SSH.
-class SshFreshDirPublisher < SshDirPublisher
+class SshFreshDirPublisher < SshDirPublisher # :nodoc: all
def upload
run %{ssh #{@host} rm -rf #{@remote_dir}} rescue nil
run %{ssh #{@host} mkdir #{@remote_dir}}
@@ -54,8 +60,10 @@ class SshFreshDirPublisher < SshDirPublisher
end
end
+# TODO: Remove in Rake 11, duplicated
+#--
# Publish a list of files to an existing remote directory.
-class SshFilePublisher
+class SshFilePublisher # :nodoc: all
# Create a publisher using the give host information.
def initialize(host, remote_dir, local_dir, *files)
@host = host
diff --git a/lib/rake/contrib/rubyforgepublisher.rb b/lib/rake/contrib/rubyforgepublisher.rb
index a4b96936c8..00889ad7b9 100644
--- a/lib/rake/contrib/rubyforgepublisher.rb
+++ b/lib/rake/contrib/rubyforgepublisher.rb
@@ -1,8 +1,10 @@
+# TODO: Remove in Rake 11
+
require 'rake/contrib/sshpublisher'
module Rake
- class RubyForgePublisher < SshDirPublisher
+ class RubyForgePublisher < SshDirPublisher # :nodoc: all
attr_reader :project, :proj_id, :user
def initialize(projname, user)
diff --git a/lib/rake/contrib/sshpublisher.rb b/lib/rake/contrib/sshpublisher.rb
index bd6adc127e..64f577017c 100644
--- a/lib/rake/contrib/sshpublisher.rb
+++ b/lib/rake/contrib/sshpublisher.rb
@@ -8,22 +8,30 @@ module Rake
class SshDirPublisher
include Rake::DSL
+ # Creates an SSH publisher which will scp all files in +local_dir+ to
+ # +remote_dir+ on +host+
+
def initialize(host, remote_dir, local_dir)
@host = host
@remote_dir = remote_dir
@local_dir = local_dir
end
+ # Uploads the files
+
def upload
- sh %{scp -rq #{@local_dir}/* #{@host}:#{@remote_dir}}
+ sh "scp", "-rq", "#{@local_dir}/*", "#{@host}:#{@remote_dir}"
end
end
# Publish an entire directory to a fresh remote directory using SSH.
class SshFreshDirPublisher < SshDirPublisher
+
+ # Uploads the files after removing the existing remote directory.
+
def upload
- sh %{ssh #{@host} rm -rf #{@remote_dir}} rescue nil
- sh %{ssh #{@host} mkdir #{@remote_dir}}
+ sh "ssh", @host, "rm", "-rf", @remote_dir rescue nil
+ sh "ssh", @host, "mkdir", @remote_dir
super
end
end
@@ -32,7 +40,9 @@ module Rake
class SshFilePublisher
include Rake::DSL
- # Create a publisher using the give host information.
+ # Creates an SSH publisher which will scp all +files+ in +local_dir+ to
+ # +remote_dir+ on +host+.
+
def initialize(host, remote_dir, local_dir, *files)
@host = host
@remote_dir = remote_dir
@@ -40,10 +50,11 @@ module Rake
@files = files
end
- # Upload the local directory to the remote directory.
+ # Uploads the files
+
def upload
@files.each do |fn|
- sh %{scp -q #{@local_dir}/#{fn} #{@host}:#{@remote_dir}}
+ sh "scp", "-q", "#{@local_dir}/#{fn}", "#{@host}:#{@remote_dir}"
end
end
end
diff --git a/lib/rake/contrib/sys.rb b/lib/rake/contrib/sys.rb
index a3a9f69e25..8d4c735434 100644
--- a/lib/rake/contrib/sys.rb
+++ b/lib/rake/contrib/sys.rb
@@ -1,2 +1,4 @@
+# TODO: Remove in Rake 11
+
fail "ERROR: 'rake/contrib/sys' is obsolete and no longer supported. " +
"Use 'FileUtils' instead."
diff --git a/lib/rake/cpu_counter.rb b/lib/rake/cpu_counter.rb
new file mode 100644
index 0000000000..d7c92a6cbe
--- /dev/null
+++ b/lib/rake/cpu_counter.rb
@@ -0,0 +1,110 @@
+require 'rbconfig'
+
+# TODO: replace with IO.popen using array-style arguments in Rake 11
+require 'open3'
+
+module Rake
+
+ # Based on a script at:
+ # http://stackoverflow.com/questions/891537/ruby-detect-number-of-cpus-installed
+ class CpuCounter # :nodoc: all
+ def self.count
+ new.count_with_default
+ end
+
+ def count_with_default(default=4)
+ count || default
+ rescue StandardError
+ default
+ end
+
+ def count
+ if defined?(Java::Java)
+ count_via_java_runtime
+ else
+ case RbConfig::CONFIG['host_os']
+ when /darwin9/
+ count_via_hwprefs_cpu_count
+ when /darwin/
+ count_via_hwprefs_thread_count || count_via_sysctl
+ when /linux/
+ count_via_cpuinfo
+ when /bsd/
+ count_via_sysctl
+ when /mswin|mingw/
+ count_via_win32
+ else
+ # Try everything
+ count_via_win32 ||
+ count_via_sysctl ||
+ count_via_hwprefs_thread_count ||
+ count_via_hwprefs_cpu_count ||
+ count_via_cpuinfo
+ end
+ end
+ end
+
+ def count_via_java_runtime
+ Java::Java.lang.Runtime.getRuntime.availableProcessors
+ rescue StandardError
+ nil
+ end
+
+ def count_via_win32
+ require 'win32ole'
+ wmi = WIN32OLE.connect("winmgmts://")
+ cpu = wmi.ExecQuery("select NumberOfCores from Win32_Processor") # TODO count hyper-threaded in this
+ cpu.to_enum.first.NumberOfCores
+ rescue StandardError, LoadError
+ nil
+ end
+
+ def count_via_cpuinfo
+ open('/proc/cpuinfo') { |f| f.readlines }.grep(/processor/).size
+ rescue StandardError
+ nil
+ end
+
+ def count_via_hwprefs_thread_count
+ run 'hwprefs', 'thread_count'
+ end
+
+ def count_via_hwprefs_cpu_count
+ run 'hwprefs', 'cpu_count'
+ end
+
+ def count_via_sysctl
+ run 'sysctl', '-n', 'hw.ncpu'
+ end
+
+ def run(command, *args)
+ cmd = resolve_command(command)
+ if cmd
+ Open3.popen3 cmd, *args do |inn, out, err,|
+ inn.close
+ err.read
+ out.read.to_i
+ end
+ else
+ nil
+ end
+ end
+
+ def resolve_command(command)
+ look_for_command("/usr/sbin", command) ||
+ look_for_command("/sbin", command) ||
+ in_path_command(command)
+ end
+
+ def look_for_command(dir, command)
+ path = File.join(dir, command)
+ File.exist?(path) ? path : nil
+ end
+
+ def in_path_command(command)
+ Open3.popen3 'which', command do |_, out,|
+ out.eof? ? nil : command
+ end
+ end
+ end
+end
diff --git a/lib/rake/default_loader.rb b/lib/rake/default_loader.rb
index 5dd3c05617..6154408f44 100644
--- a/lib/rake/default_loader.rb
+++ b/lib/rake/default_loader.rb
@@ -2,6 +2,10 @@ module Rake
# Default Rakefile loader used by +import+.
class DefaultLoader
+
+ ##
+ # Loads a rakefile into the current application from +fn+
+
def load(fn)
Rake.load_rakefile(File.expand_path(fn))
end
diff --git a/lib/rake/dsl_definition.rb b/lib/rake/dsl_definition.rb
index b24a821386..b521b7dc5c 100644
--- a/lib/rake/dsl_definition.rb
+++ b/lib/rake/dsl_definition.rb
@@ -6,6 +6,9 @@ module Rake
##
# DSL is a module that provides #task, #desc, #namespace, etc. Use this
# when you'd like to use rake outside the top level scope.
+ #
+ # For a Rakefile you run from the comamnd line this module is automatically
+ # included.
module DSL
@@ -21,14 +24,45 @@ module Rake
private
- # Declare a basic task.
+ # :call-seq:
+ # task task_name
+ # task task_name: dependencies
+ # task task_name, arguments => dependencies
+ # task task_name, argument[, argument ...], :needs: dependencies
#
- # Example:
- # task :clobber => [:clean] do
+ # Declare a basic task. The +task_name+ is always the first argument. If
+ # the task name contains a ":" it is defined in that namespace.
+ #
+ # The +dependencies+ may be a single task name or an Array of task names.
+ # The +argument+ (a single name) or +arguments+ (an Array of names) define
+ # the arguments provided to the task.
+ #
+ # The task, argument and dependency names may be either symbols or
+ # strings.
+ #
+ # A task with a single dependency:
+ #
+ # task clobber: %w[clean] do
# rm_rf "html"
# end
#
- def task(*args, &block)
+ # A task with an argument and a dependency:
+ #
+ # task :package, [:version] => :test do |t, args|
+ # # ...
+ # end
+ #
+ # To invoke this task from the command line:
+ #
+ # $ rake package[1.2.3]
+ #
+ # Alternate definition:
+ #
+ # task :package, :version, needs: :test do |t, args|
+ # # ...
+ # end
+ #
+ def task(*args, &block) # :doc:
Rake::Task.define_task(*args, &block)
end
@@ -45,7 +79,7 @@ module Rake
# end
# end
#
- def file(*args, &block)
+ def file(*args, &block) # :doc:
Rake::FileTask.define_task(*args, &block)
end
@@ -61,9 +95,10 @@ module Rake
# Example:
# directory "testdata/doc"
#
- def directory(*args, &block)
+ def directory(*args, &block) # :doc:
result = file_create(*args, &block)
dir, _ = *Rake.application.resolve_args(args)
+ dir = Rake.from_pathname(dir)
Rake.each_dir_parent(dir) do |d|
file_create d do |t|
mkdir_p t.name unless File.exist?(t.name)
@@ -78,9 +113,9 @@ module Rake
# about it)
#
# Example:
- # multitask :deploy => [:deploy_gem, :deploy_rdoc]
+ # multitask deploy: %w[deploy_gem deploy_rdoc]
#
- def multitask(*args, &block)
+ def multitask(*args, &block) # :doc:
Rake::MultiTask.define_task(*args, &block)
end
@@ -88,14 +123,22 @@ module Rake
# block. Returns a NameSpace object that can be used to lookup
# tasks defined in the namespace.
#
- # E.g.
+ # Example:
#
# ns = namespace "nested" do
+ # # the "nested:run" task
# task :run
# end
# task_run = ns[:run] # find :run in the given namespace.
#
- def namespace(name=nil, &block)
+ # Tasks can also be defined in a namespace by using a ":" in the task
+ # name:
+ #
+ # task "nested:test" do
+ # # ...
+ # end
+ #
+ def namespace(name=nil, &block) # :doc:
name = name.to_s if name.kind_of?(Symbol)
name = name.to_str if name.respond_to?(:to_str)
unless name.kind_of?(String) || name.nil?
@@ -108,23 +151,22 @@ module Rake
#
# Example:
# rule '.o' => '.c' do |t|
- # sh %{cc -o #{t.name} #{t.source}}
+ # sh 'cc', '-o', t.name, t.source
# end
#
- def rule(*args, &block)
+ def rule(*args, &block) # :doc:
Rake::Task.create_rule(*args, &block)
end
- # Describe the next rake task.
- # Duplicate descriptions are discarded.
+ # Describes the next rake task. Duplicate descriptions are discarded.
#
# Example:
# desc "Run the Unit Tests"
- # task :test => [:build]
- # runtests
+ # task test: [:build]
+ # # ... run tests
# end
#
- def desc(description)
+ def desc(description) # :doc:
Rake.application.last_description = description
end
@@ -142,7 +184,7 @@ module Rake
# Example:
# import ".depend", "my_rules"
#
- def import(*fns)
+ def import(*fns) # :doc:
fns.each do |fn|
Rake.application.add_import(fn)
end
diff --git a/lib/rake/early_time.rb b/lib/rake/early_time.rb
index 8c0e7d3339..abcb1872b5 100644
--- a/lib/rake/early_time.rb
+++ b/lib/rake/early_time.rb
@@ -5,11 +5,14 @@ module Rake
include Comparable
include Singleton
+ ##
+ # The EarlyTime always comes before +other+!
+
def <=>(other)
-1
end
- def to_s
+ def to_s # :nodoc:
"<EARLY TIME>"
end
end
diff --git a/lib/rake/ext/core.rb b/lib/rake/ext/core.rb
index c924c7eaba..7575df15a9 100644
--- a/lib/rake/ext/core.rb
+++ b/lib/rake/ext/core.rb
@@ -1,8 +1,5 @@
-######################################################################
-# Core extension library
-#
class Module
- # Check for an existing method in the current class before extending. IF
+ # Check for an existing method in the current class before extending. If
# the method already exists, then a warning is printed and the extension is
# not added. Otherwise the block is yielded and any definitions in the
# block will take effect.
@@ -17,7 +14,7 @@ class Module
# end
# end
#
- def rake_extension(method)
+ def rake_extension(method) # :nodoc:
if method_defined?(method)
$stderr.puts "WARNING: Possible conflict with Rake extension: " +
"#{self}##{method} already exists"
diff --git a/lib/rake/ext/module.rb b/lib/rake/ext/module.rb
index 8b13789179..3ee155ff6c 100644
--- a/lib/rake/ext/module.rb
+++ b/lib/rake/ext/module.rb
@@ -1 +1,2 @@
+# TODO: remove in Rake 11
diff --git a/lib/rake/ext/pathname.rb b/lib/rake/ext/pathname.rb
new file mode 100644
index 0000000000..49e2cd47ac
--- /dev/null
+++ b/lib/rake/ext/pathname.rb
@@ -0,0 +1,25 @@
+require 'rake/ext/core'
+require 'pathname'
+
+class Pathname
+
+ rake_extension("ext") do
+ # Return a new Pathname with <tt>String#ext</tt> applied to it.
+ #
+ # This Pathname extension comes from Rake
+ def ext(newext='')
+ Pathname.new(Rake.from_pathname(self).ext(newext))
+ end
+ end
+
+ rake_extension("pathmap") do
+ # Apply the pathmap spec to the Pathname, returning a
+ # new Pathname with the modified paths. (See String#pathmap for
+ # details.)
+ #
+ # This Pathname extension comes from Rake
+ def pathmap(spec=nil, &block)
+ Pathname.new(Rake.from_pathname(self).pathmap(spec, &block))
+ end
+ end
+end
diff --git a/lib/rake/ext/string.rb b/lib/rake/ext/string.rb
index 07ef167f82..b47b055a74 100644
--- a/lib/rake/ext/string.rb
+++ b/lib/rake/ext/string.rb
@@ -1,8 +1,5 @@
require 'rake/ext/core'
-######################################################################
-# Rake extension methods for String.
-#
class String
rake_extension("ext") do
@@ -11,6 +8,8 @@ class String
# is not given, or is the empty string, remove any existing extension.
#
# +ext+ is a user added method for the String class.
+ #
+ # This String extension comes from Rake
def ext(newext='')
return self.dup if ['.', '..'].include? self
newext = (newext =~ /^\./) ? newext : ("." + newext) if newext != ''
@@ -20,6 +19,8 @@ class String
rake_extension("pathmap") do
# Explode a path into individual components. Used by +pathmap+.
+ #
+ # This String extension comes from Rake
def pathmap_explode
head, tail = File.split(self)
return [self] if head == self
@@ -32,6 +33,8 @@ class String
# Extract a partial path from the path. Include +n+ directories from the
# front end (left hand side) if +n+ is positive. Include |+n+|
# directories from the back end (right hand side) if +n+ is negative.
+ #
+ # This String extension comes from Rake
def pathmap_partial(n)
dirs = File.dirname(self).pathmap_explode
partial_dirs =
@@ -46,8 +49,10 @@ class String
end
protected :pathmap_partial
- # Preform the pathmap replacement operations on the given path. The
+ # Perform the pathmap replacement operations on the given path. The
# patterns take the form 'pat1,rep1;pat2,rep2...'.
+ #
+ # This String extension comes from Rake
def pathmap_replace(patterns, &block)
result = self
patterns.split(';').each do |pair|
@@ -69,35 +74,36 @@ class String
# controls the details of the mapping. The following special patterns are
# recognized:
#
- # * <b>%p</b> -- The complete path.
- # * <b>%f</b> -- The base file name of the path, with its file extension,
- # but without any directories.
- # * <b>%n</b> -- The file name of the path without its file extension.
- # * <b>%d</b> -- The directory list of the path.
- # * <b>%x</b> -- The file extension of the path. An empty string if there
- # is no extension.
- # * <b>%X</b> -- Everything *but* the file extension.
- # * <b>%s</b> -- The alternate file separator if defined, otherwise use
- # the standard file separator.
- # * <b>%%</b> -- A percent sign.
- #
- # The %d specifier can also have a numeric prefix (e.g. '%2d'). If the
- # number is positive, only return (up to) +n+ directories in the path,
- # starting from the left hand side. If +n+ is negative, return (up to)
- # |+n+| directories from the right hand side of the path.
+ # <tt>%p</tt> :: The complete path.
+ # <tt>%f</tt> :: The base file name of the path, with its file extension,
+ # but without any directories.
+ # <tt>%n</tt> :: The file name of the path without its file extension.
+ # <tt>%d</tt> :: The directory list of the path.
+ # <tt>%x</tt> :: The file extension of the path. An empty string if there
+ # is no extension.
+ # <tt>%X</tt> :: Everything *but* the file extension.
+ # <tt>%s</tt> :: The alternate file separator if defined, otherwise use #
+ # the standard file separator.
+ # <tt>%%</tt> :: A percent sign.
+ #
+ # The <tt>%d</tt> specifier can also have a numeric prefix (e.g. '%2d').
+ # If the number is positive, only return (up to) +n+ directories in the
+ # path, starting from the left hand side. If +n+ is negative, return (up
+ # to) +n+ directories from the right hand side of the path.
#
# Examples:
#
# 'a/b/c/d/file.txt'.pathmap("%2d") => 'a/b'
# 'a/b/c/d/file.txt'.pathmap("%-2d") => 'c/d'
#
- # Also the %d, %p, %f, %n, %x, and %X operators can take a
- # pattern/replacement argument to perform simple string substitutions on a
- # particular part of the path. The pattern and replacement are separated
- # by a comma and are enclosed by curly braces. The replacement spec comes
- # after the % character but before the operator letter. (e.g.
- # "%{old,new}d"). Multiple replacement specs should be separated by
- # semi-colons (e.g. "%{old,new;src,bin}d").
+ # Also the <tt>%d</tt>, <tt>%p</tt>, <tt>%f</tt>, <tt>%n</tt>,
+ # <tt>%x</tt>, and <tt>%X</tt> operators can take a pattern/replacement
+ # argument to perform simple string substitutions on a particular part of
+ # the path. The pattern and replacement are separated by a comma and are
+ # enclosed by curly braces. The replacement spec comes after the %
+ # character but before the operator letter. (e.g. "%{old,new}d").
+ # Multiple replacement specs should be separated by semi-colons (e.g.
+ # "%{old,new;src,bin}d").
#
# Regular expressions may be used for the pattern, and back refs may be
# used in the replacement text. Curly braces, commas and semi-colons are
@@ -106,11 +112,11 @@ class String
#
# For example:
#
- # "src/org/onestepback/proj/A.java".pathmap("%{^src,bin}X.class")
+ # "src/org/onestepback/proj/A.java".pathmap("%{^src,class}X.class")
#
# returns:
#
- # "bin/org/onestepback/proj/A.class"
+ # "class/org/onestepback/proj/A.class"
#
# If the replacement text is '*', then a block may be provided to perform
# some arbitrary calculation for the replacement.
@@ -125,6 +131,7 @@ class String
#
# "/path/to/file.txt"
#
+ # This String extension comes from Rake
def pathmap(spec=nil, &block)
return self if spec.nil?
result = ''
diff --git a/lib/rake/ext/time.rb b/lib/rake/ext/time.rb
index ea8b037e39..c058649b7e 100644
--- a/lib/rake/ext/time.rb
+++ b/lib/rake/ext/time.rb
@@ -3,7 +3,7 @@
require 'rake/early_time'
-class Time
+class Time # :nodoc: all
alias rake_original_time_compare :<=>
def <=>(other)
if Rake::EarlyTime === other
diff --git a/lib/rake/file_list.rb b/lib/rake/file_list.rb
index 0b60925f09..006ec7703e 100644
--- a/lib/rake/file_list.rb
+++ b/lib/rake/file_list.rb
@@ -2,10 +2,10 @@ require 'rake/cloneable'
require 'rake/file_utils_ext'
require 'rake/pathmap'
-######################################################################
+
module Rake
- # #########################################################################
+ ##
# A FileList is essentially an array with a few helper methods defined to
# make file manipulation a bit easier.
#
@@ -49,7 +49,7 @@ module Rake
# List of methods that should not be delegated here (we define special
# versions of them explicitly below).
- MUST_NOT_DEFINE = %w[to_a to_ary partition *]
+ MUST_NOT_DEFINE = %w[to_a to_ary partition * <<]
# List of delegated methods that return new array values which need
# wrapping.
@@ -119,7 +119,7 @@ module Rake
if fn.respond_to? :to_ary
include(*fn.to_ary)
else
- @pending_add << fn
+ @pending_add << Rake.from_pathname(fn)
end
end
@pending = true
@@ -149,14 +149,13 @@ module Rake
#
def exclude(*patterns, &block)
patterns.each do |pat|
- @exclude_patterns << pat
+ @exclude_patterns << Rake.from_pathname(pat)
end
@exclude_procs << block if block_given?
resolve_exclude unless @pending
self
end
-
# Clear all the exclude patterns so that we exclude nothing.
def clear_exclude
@exclude_patterns = []
@@ -164,7 +163,7 @@ module Rake
self
end
- # Define equality.
+ # A FileList is equal through array equality.
def ==(array)
to_ary == array
end
@@ -197,6 +196,12 @@ module Rake
end
end
+ def <<(obj)
+ resolve
+ @items << Rake.from_pathname(obj)
+ self
+ end
+
# Resolve all the pending adds now.
def resolve
if @pending
@@ -208,7 +213,7 @@ module Rake
self
end
- def resolve_add(fn)
+ def resolve_add(fn) # :nodoc:
case fn
when %r{[*?\[\{]}
add_matching(fn)
@@ -218,7 +223,7 @@ module Rake
end
private :resolve_add
- def resolve_exclude
+ def resolve_exclude # :nodoc:
reject! { |fn| excluded_from_list?(fn) }
self
end
@@ -276,7 +281,6 @@ module Rake
collect { |fn| fn.ext(newext) }
end
-
# Grep each of the files in the filelist using the given pattern. If a
# block is given, call the block on each matching line, passing the file
# name, line number, and the matching line of text. If no block is given,
@@ -348,7 +352,7 @@ module Rake
# Should the given file name be excluded from the list?
#
- # NOTE: This method was formally named "exclude?", but Rails
+ # NOTE: This method was formerly named "exclude?", but Rails
# introduced an exclude? method as an array method and setup a
# conflict with file list. We renamed the method to avoid
# confusion. If you were using "FileList#exclude?" in your user
@@ -377,7 +381,7 @@ module Rake
proc { |fn| fn =~ /(^|[\/\\])core$/ && ! File.directory?(fn) }
]
- def import(array)
+ def import(array) # :nodoc:
@items = array
self
end
@@ -391,7 +395,7 @@ module Rake
end
# Get a sorted list of files matching the pattern. This method
- # should be prefered to Dir[pattern] and Dir.glob(pattern) because
+ # should be preferred to Dir[pattern] and Dir.glob(pattern) because
# the files returned are guaranteed to be sorted.
def glob(pattern, *args)
Dir.glob(pattern, *args).sort
@@ -412,5 +416,13 @@ module Rake
dir = File.dirname(dir)
end
end
+
+ # Convert Pathname and Pathname-like objects to strings;
+ # leave everything else alone
+ def from_pathname(path) # :nodoc:
+ path = path.to_path if path.respond_to?(:to_path)
+ path = path.to_str if path.respond_to?(:to_str)
+ path
+ end
end
end # module Rake
diff --git a/lib/rake/file_task.rb b/lib/rake/file_task.rb
index 3e717c24b7..11823bbe46 100644
--- a/lib/rake/file_task.rb
+++ b/lib/rake/file_task.rb
@@ -2,7 +2,7 @@ require 'rake/task.rb'
require 'rake/early_time'
module Rake
- # #########################################################################
+
# A FileTask is a task that includes time based dependencies. If any of a
# FileTask's prerequisites have a timestamp that is later than the file
# represented by this task, then the file must be rebuilt (using the
@@ -13,7 +13,7 @@ module Rake
# Is this file task needed? Yes if it doesn't exist, or if its time stamp
# is out of date.
def needed?
- ! File.exist?(name) || out_of_date?(timestamp)
+ ! File.exist?(name) || out_of_date?(timestamp) || @application.options.build_all
end
# Time stamp for file task.
@@ -39,7 +39,7 @@ module Rake
# Apply the scope to the task name according to the rules for this kind
# of task. File based tasks ignore the scope when creating the name.
def scope_name(scope, task_name)
- task_name
+ Rake.from_pathname(task_name)
end
end
end
diff --git a/lib/rake/file_utils.rb b/lib/rake/file_utils.rb
index 0f7f459d87..27f4e2e1d1 100644
--- a/lib/rake/file_utils.rb
+++ b/lib/rake/file_utils.rb
@@ -14,12 +14,24 @@ module FileUtils
OPT_TABLE['sh'] = %w(noop verbose)
OPT_TABLE['ruby'] = %w(noop verbose)
- # Run the system command +cmd+. If multiple arguments are given the command
- # is not run with the shell (same semantics as Kernel::exec and
+ # Run the system command +cmd+. If multiple arguments are given the command
+ # is run directly (without the shell, same semantics as Kernel::exec and
# Kernel::system).
#
- # Example:
- # sh %{ls -ltr}
+ # It is recommended you use the multiple argument form over interpolating
+ # user input for both usability and security reasons. With the multiple
+ # argument form you can easily process files with spaces or other shell
+ # reserved characters in them. With the multiple argument form your rake
+ # tasks are not vulnerable to users providing an argument like
+ # <code>; rm # -rf /</code>.
+ #
+ # If a block is given, upon command completion the block is called with an
+ # OK flag (true on a zero exit status) and a Process::Status object.
+ # Without a block a RuntimeError is raised when the command exits non-zero.
+ #
+ # Examples:
+ #
+ # sh 'ls -ltr'
#
# sh 'ls', 'file with spaces'
#
diff --git a/lib/rake/gempackagetask.rb b/lib/rake/gempackagetask.rb
index 4ace0a6f0e..16e7ce042b 100644
--- a/lib/rake/gempackagetask.rb
+++ b/lib/rake/gempackagetask.rb
@@ -1,2 +1,4 @@
+# TODO: Remove in Rake 11
+
fail "ERROR: 'rake/gempackagetask' is obsolete and no longer supported. " +
- "Use 'rubygems/packagetask' instead."
+ "Use 'rubygems/package_task' instead."
diff --git a/lib/rake/invocation_chain.rb b/lib/rake/invocation_chain.rb
index dae9a35915..540628957c 100644
--- a/lib/rake/invocation_chain.rb
+++ b/lib/rake/invocation_chain.rb
@@ -1,6 +1,5 @@
module Rake
- ####################################################################
# InvocationChain tracks the chain of task invocations to detect
# circular dependencies.
class InvocationChain < LinkedList
@@ -32,7 +31,7 @@ module Rake
private
def prefix
- "#{tail.to_s} => "
+ "#{tail} => "
end
# Null object for an empty chain.
diff --git a/lib/rake/lib/.document b/lib/rake/lib/.document
deleted file mode 100644
index 098e64716e..0000000000
--- a/lib/rake/lib/.document
+++ /dev/null
@@ -1 +0,0 @@
-# Ignore project.rake
diff --git a/lib/rake/lib/project.rake b/lib/rake/lib/project.rake
deleted file mode 100644
index a5497328a7..0000000000
--- a/lib/rake/lib/project.rake
+++ /dev/null
@@ -1,21 +0,0 @@
-task "create:project" => ["lib", "test", "Rakefile"]
-
-directory "lib"
-directory "test"
-
-file "Rakefile" do
- File.open("Rakefile", "w") do |out|
- out.puts %{# -*- ruby -*-
-
-require 'rake/clean'
-require 'rake/testtask'
-
-task :default => :test
-
-Rake::TestTask.new do |t|
- t.verbose = false
- t.test_files = FileList['test/test_*.rb']
-end
-}
- end
-end
diff --git a/lib/rake/linked_list.rb b/lib/rake/linked_list.rb
index 26483703f4..b5ab797808 100644
--- a/lib/rake/linked_list.rb
+++ b/lib/rake/linked_list.rb
@@ -13,7 +13,7 @@ module Rake
end
# Polymorphically add a new element to the head of a list. The
- # type of head node will be the same list type has the tail.
+ # type of head node will be the same list type as the tail.
def conj(item)
self.class.cons(item, self)
end
@@ -80,7 +80,7 @@ module Rake
#
# When inheriting from the LinkedList class, you should implement
# a type specific Empty class as well. Make sure you set the class
- # instance variable @parent to the assocated list class (this
+ # instance variable @parent to the associated list class (this
# allows conj, cons and make to work polymorphically).
class EmptyLinkedList < LinkedList
@parent = LinkedList
diff --git a/lib/rake/name_space.rb b/lib/rake/name_space.rb
index e1cc0940b8..58f911e434 100644
--- a/lib/rake/name_space.rb
+++ b/lib/rake/name_space.rb
@@ -1,25 +1,38 @@
-module Rake
-
- # The NameSpace class will lookup task names in the the scope
- # defined by a +namespace+ command.
- #
- class NameSpace
-
- # Create a namespace lookup object using the given task manager
- # and the list of scopes.
- def initialize(task_manager, scope_list)
- @task_manager = task_manager
- @scope = scope_list.dup
- end
-
- # Lookup a task named +name+ in the namespace.
- def [](name)
- @task_manager.lookup(name, @scope)
- end
-
- # Return the list of tasks defined in this and nested namespaces.
- def tasks
- @task_manager.tasks_in_scope(@scope)
- end
+##
+# The NameSpace class will lookup task names in the scope defined by a
+# +namespace+ command.
+
+class Rake::NameSpace
+
+ ##
+ # Create a namespace lookup object using the given task manager
+ # and the list of scopes.
+
+ def initialize(task_manager, scope_list)
+ @task_manager = task_manager
+ @scope = scope_list.dup
+ end
+
+ ##
+ # Lookup a task named +name+ in the namespace.
+
+ def [](name)
+ @task_manager.lookup(name, @scope)
+ end
+
+ ##
+ # The scope of the namespace (a LinkedList)
+
+ def scope
+ @scope.dup
end
+
+ ##
+ # Return the list of tasks defined in this and nested namespaces.
+
+ def tasks
+ @task_manager.tasks_in_scope(@scope)
+ end
+
end
+
diff --git a/lib/rake/packagetask.rb b/lib/rake/packagetask.rb
index 029caa6d49..e862952c05 100644
--- a/lib/rake/packagetask.rb
+++ b/lib/rake/packagetask.rb
@@ -11,27 +11,27 @@ module Rake
#
# The PackageTask will create the following targets:
#
- # [<b>:package</b>]
+ # +:package+ ::
# Create all the requested package files.
#
- # [<b>:clobber_package</b>]
+ # +:clobber_package+ ::
# Delete all the package files. This target is automatically
# added to the main clobber target.
#
- # [<b>:repackage</b>]
+ # +:repackage+ ::
# Rebuild the package files from scratch, even if they are not out
# of date.
#
- # [<b>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tgz"</b>]
+ # <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tgz"</tt> ::
# Create a gzipped tar package (if <em>need_tar</em> is true).
#
- # [<b>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tar.gz"</b>]
+ # <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tar.gz"</tt> ::
# Create a gzipped tar package (if <em>need_tar_gz</em> is true).
#
- # [<b>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tar.bz2"</b>]
+ # <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.tar.bz2"</tt> ::
# Create a bzip2'd tar package (if <em>need_tar_bz2</em> is true).
#
- # [<b>"<em>package_dir</em>/<em>name</em>-<em>version</em>.zip"</b>]
+ # <tt>"<em>package_dir</em>/<em>name</em>-<em>version</em>.zip"</tt> ::
# Create a zip package archive (if <em>need_zip</em> is true).
#
# Example:
@@ -127,7 +127,7 @@ module Rake
file "#{package_dir}/#{file}" =>
[package_dir_path] + package_files do
chdir(package_dir) do
- sh %{#{@tar_command} #{flag}cvf #{file} #{package_name}}
+ sh @tar_command, "#{flag}cvf", file, package_name
end
end
end
@@ -138,7 +138,7 @@ module Rake
file "#{package_dir}/#{zip_file}" =>
[package_dir_path] + package_files do
chdir(package_dir) do
- sh %{#{@zip_command} -r #{zip_file} #{package_name}}
+ sh @zip_command, "-r", zip_file, package_name
end
end
end
@@ -162,26 +162,38 @@ module Rake
self
end
+ # The name of this package
+
def package_name
@version ? "#{@name}-#{@version}" : @name
end
+ # The directory this package will be built in
+
def package_dir_path
"#{package_dir}/#{package_name}"
end
+ # The package name with .tgz added
+
def tgz_file
"#{package_name}.tgz"
end
+ # The package name with .tar.gz added
+
def tar_gz_file
"#{package_name}.tar.gz"
end
+ # The package name with .tar.bz2 added
+
def tar_bz2_file
"#{package_name}.tar.bz2"
end
+ # The package name with .zip added
+
def zip_file
"#{package_name}.zip"
end
diff --git a/lib/rake/pathmap.rb b/lib/rake/pathmap.rb
index 2275724341..9a840cda29 100644
--- a/lib/rake/pathmap.rb
+++ b/lib/rake/pathmap.rb
@@ -1 +1,3 @@
+# TODO: Remove in Rake 11
+
require 'rake/ext/string'
diff --git a/lib/rake/pseudo_status.rb b/lib/rake/pseudo_status.rb
index 09d5c88c7e..16e1903bd6 100644
--- a/lib/rake/pseudo_status.rb
+++ b/lib/rake/pseudo_status.rb
@@ -1,8 +1,8 @@
module Rake
- ####################################################################
+ ##
# Exit status class for times the system just gives us a nil.
- class PseudoStatus
+ class PseudoStatus # :nodoc: all
attr_reader :exitstatus
def initialize(code=0)
diff --git a/lib/rake/rake_module.rb b/lib/rake/rake_module.rb
index fcf5800064..3692753434 100644
--- a/lib/rake/rake_module.rb
+++ b/lib/rake/rake_module.rb
@@ -2,8 +2,6 @@ require 'rake/application'
module Rake
- # Rake module singleton methods.
- #
class << self
# Current Rake Application
def application
@@ -15,6 +13,11 @@ module Rake
@application = app
end
+ def suggested_thread_count # :nodoc:
+ @cpu_count ||= Rake::CpuCounter.count
+ @cpu_count + 4
+ end
+
# Return the original directory where the Rake application was started.
def original_dir
application.original_dir
@@ -28,9 +31,7 @@ module Rake
# Add files to the rakelib list
def add_rakelib(*files)
application.options.rakelib ||= []
- files.each do |file|
- application.options.rakelib << file
- end
+ application.options.rakelib.concat(files)
end
end
diff --git a/lib/rake/rdoctask.rb b/lib/rake/rdoctask.rb
index 50b7e269d5..8d7df4f12b 100644
--- a/lib/rake/rdoctask.rb
+++ b/lib/rake/rdoctask.rb
@@ -1,2 +1,4 @@
+# TODO: Remove in Rake 11
+
fail "ERROR: 'rake/rdoctask' is obsolete and no longer supported. " +
"Use 'rdoc/task' (available in RDoc 2.4.2+) instead."
diff --git a/lib/rake/ruby182_test_unit_fix.rb b/lib/rake/ruby182_test_unit_fix.rb
index e47feeb09c..40b30a6fde 100644
--- a/lib/rake/ruby182_test_unit_fix.rb
+++ b/lib/rake/ruby182_test_unit_fix.rb
@@ -1,3 +1,5 @@
+# TODO: Remove in rake 11
+
# Local Rake override to fix bug in Ruby 0.8.2
module Test # :nodoc:
# Local Rake override to fix bug in Ruby 0.8.2
diff --git a/lib/rake/runtest.rb b/lib/rake/runtest.rb
index 3f01b28cad..4774b0e262 100644
--- a/lib/rake/runtest.rb
+++ b/lib/rake/runtest.rb
@@ -5,7 +5,12 @@ require 'rake/file_list'
module Rake
include Test::Unit::Assertions
- def run_tests(pattern='test/test*.rb', log_enabled=false)
+ ##
+ # Deprecated way of running tests in process, but only for Test::Unit.
+ #--
+ # TODO: Remove in rake 11
+
+ def run_tests(pattern='test/test*.rb', log_enabled=false) # :nodoc:
FileList.glob(pattern).each do |fn|
$stderr.puts fn if log_enabled
begin
diff --git a/lib/rake/scope.rb b/lib/rake/scope.rb
index 33e1c08e7b..dbefcea465 100644
--- a/lib/rake/scope.rb
+++ b/lib/rake/scope.rb
@@ -1,5 +1,5 @@
module Rake
- class Scope < LinkedList
+ class Scope < LinkedList # :nodoc: all
# Path for the scope.
def path
diff --git a/lib/rake/task.rb b/lib/rake/task.rb
index 5e4dd64d4e..9bcf725523 100644
--- a/lib/rake/task.rb
+++ b/lib/rake/task.rb
@@ -2,7 +2,7 @@ require 'rake/invocation_exception_mixin'
module Rake
- # #########################################################################
+ ##
# A Task is the basic unit of work in a Rakefile. Tasks have associated
# actions (possibly more than one) and a list of prerequisites. When
# invoked, a task will first ensure that all of its prerequisites have an
@@ -34,14 +34,18 @@ module Rake
name
end
- def inspect
+ def inspect # :nodoc:
"<#{self.class} #{name} => [#{prerequisites.join(', ')}]>"
end
# List of sources for task.
attr_writer :sources
def sources
- @sources ||= []
+ if defined?(@sources)
+ @sources
+ else
+ prerequisites
+ end
end
# List of prerequisite tasks
@@ -49,7 +53,7 @@ module Rake
prerequisites.map { |pre| lookup_prerequisite(pre) }
end
- def lookup_prerequisite(prerequisite_name)
+ def lookup_prerequisite(prerequisite_name) # :nodoc:
application[prerequisite_name, @scope]
end
private :lookup_prerequisite
@@ -63,7 +67,7 @@ module Rake
seen.values
end
- def collect_prerequisites(seen)
+ def collect_prerequisites(seen) # :nodoc:
prerequisite_tasks.each do |pre|
next if seen[pre.name]
seen[pre.name] = pre
@@ -74,7 +78,7 @@ module Rake
# First source from a rule (nil if no sources)
def source
- @sources.first if defined?(@sources)
+ sources.first
end
# Create a task named +task_name+ with no actions or prerequisites. Use
@@ -180,7 +184,7 @@ module Rake
end
protected :invoke_with_call_chain
- def add_chain_to(exception, new_chain)
+ def add_chain_to(exception, new_chain) # :nodoc:
exception.extend(InvocationExceptionMixin) unless
exception.respond_to?(:chain)
exception.chain = new_chain if exception.chain.nil?
@@ -257,11 +261,12 @@ module Rake
add_comment(comment) if comment && ! comment.empty?
end
- def comment=(comment)
+ def comment=(comment) # :nodoc:
add_comment(comment)
end
- def add_comment(comment)
+ def add_comment(comment) # :nodoc:
+ return if comment.nil?
@comments << comment unless @comments.include?(comment)
end
private :add_comment
diff --git a/lib/rake/task_arguments.rb b/lib/rake/task_arguments.rb
index 0094682579..fc0d657274 100644
--- a/lib/rake/task_arguments.rb
+++ b/lib/rake/task_arguments.rb
@@ -1,16 +1,16 @@
module Rake
- ####################################################################
+ ##
# TaskArguments manage the arguments passed to a task.
#
class TaskArguments
include Enumerable
+ # Argument names
attr_reader :names
- # Create a TaskArgument object with a list of named arguments
- # (given by :names) and a set of associated values (given by
- # :values). :parent is the parent argument object.
+ # Create a TaskArgument object with a list of argument +names+ and a set
+ # of associated +values+. +parent+ is the parent argument object.
def initialize(names, values, parent=nil)
@names = names
@parent = parent
@@ -21,12 +21,12 @@ module Rake
}
end
- # Retrive the complete array of sequential values
+ # Retrieve the complete array of sequential values
def to_a
@values.dup
end
- # Retrive the list of values not associated with named arguments
+ # Retrieve the list of values not associated with named arguments
def extras
@values[@names.length..-1] || []
end
@@ -50,33 +50,42 @@ module Rake
@hash = defaults.merge(@hash)
end
+ # Enumerates the arguments and their values
def each(&block)
@hash.each(&block)
end
+ # Extracts the argument values at +keys+
def values_at(*keys)
keys.map { |k| lookup(k) }
end
+ # Returns the value of the given argument via method_missing
def method_missing(sym, *args)
lookup(sym.to_sym)
end
+ # Returns a Hash of arguments and their values
def to_hash
@hash
end
- def to_s
+ def to_s # :nodoc:
@hash.inspect
end
- def inspect
+ def inspect # :nodoc:
to_s
end
+ # Returns true if +key+ is one of the arguments
+ def has_key?(key)
+ @hash.has_key?(key)
+ end
+
protected
- def lookup(name)
+ def lookup(name) # :nodoc:
if @hash.has_key?(name)
@hash[name]
elsif @parent
@@ -85,5 +94,5 @@ module Rake
end
end
- EMPTY_TASK_ARGS = TaskArguments.new([], [])
+ EMPTY_TASK_ARGS = TaskArguments.new([], []) # :nodoc:
end
diff --git a/lib/rake/task_manager.rb b/lib/rake/task_manager.rb
index 06c243a7b2..221c68cec4 100644
--- a/lib/rake/task_manager.rb
+++ b/lib/rake/task_manager.rb
@@ -4,9 +4,12 @@ module Rake
module TaskManager
# Track the last comment made in the Rakefile.
attr_accessor :last_description
- alias :last_comment :last_description # Backwards compatibility
- def initialize
+ # TODO: Remove in Rake 11
+
+ alias :last_comment :last_description # :nodoc: Backwards compatibility
+
+ def initialize # :nodoc:
super
@tasks = Hash.new
@rules = Array.new
@@ -14,17 +17,25 @@ module Rake
@last_description = nil
end
- def create_rule(*args, &block)
+ def create_rule(*args, &block) # :nodoc:
pattern, args, deps = resolve_args(args)
pattern = Regexp.new(Regexp.quote(pattern) + '$') if String === pattern
@rules << [pattern, args, deps, block]
end
- def define_task(task_class, *args, &block)
+ def define_task(task_class, *args, &block) # :nodoc:
task_name, arg_names, deps = resolve_args(args)
+
+ original_scope = @scope
+ if String === task_name and
+ not task_class.ancestors.include? Rake::FileTask then
+ task_name, *definition_scope = *(task_name.split(":").reverse)
+ @scope = Scope.make(*(definition_scope + @scope.to_a))
+ end
+
task_name = task_class.scope_name(@scope, task_name)
deps = [deps] unless deps.respond_to?(:to_ary)
- deps = deps.map { |d| d.to_s }
+ deps = deps.map { |d| Rake.from_pathname(d).to_s }
task = intern(task_class, task_name)
task.set_arg_names(arg_names) unless arg_names.empty?
if Rake::TaskManager.record_task_metadata
@@ -32,6 +43,8 @@ module Rake
task.add_description(get_description(task))
end
task.enhance(deps, &block)
+ ensure
+ @scope = original_scope
end
# Lookup a task. Return an existing task if found, otherwise
@@ -49,7 +62,7 @@ module Rake
fail "Don't know how to build task '#{task_name}'"
end
- def synthesize_file_task(task_name)
+ def synthesize_file_task(task_name) # :nodoc:
return nil unless File.exist?(task_name)
define_task(Rake::FileTask, task_name)
end
@@ -226,7 +239,7 @@ module Rake
"_anon_#{@seed}"
end
- def trace_rule(level, message)
+ def trace_rule(level, message) # :nodoc:
options.trace_output.puts "#{" " * level}#{message}" if
Rake.application.options.trace_rules
end
@@ -265,7 +278,7 @@ module Rake
task_name.ext(ext)
when String
ext
- when Proc
+ when Proc, Method
if ext.arity == 1
ext.call(task_name)
else
@@ -289,7 +302,7 @@ module Rake
end
class << self
- attr_accessor :record_task_metadata
+ attr_accessor :record_task_metadata # :nodoc:
TaskManager.record_task_metadata = false
end
end
diff --git a/lib/rake/tasklib.rb b/lib/rake/tasklib.rb
index 48d27df9ed..6203d9402b 100644
--- a/lib/rake/tasklib.rb
+++ b/lib/rake/tasklib.rb
@@ -14,6 +14,8 @@ module Rake
# libraries depend on this so I can't remove it without breaking
# other people's code. So for now it stays for backwards
# compatibility. BUT DON'T USE IT.
+ #--
+ # TODO: Remove in Rake 11
def paste(a, b) # :nodoc:
(a.to_s + b.to_s).intern
end
diff --git a/lib/rake/testtask.rb b/lib/rake/testtask.rb
index c693dd2626..2daa589634 100644
--- a/lib/rake/testtask.rb
+++ b/lib/rake/testtask.rb
@@ -1,5 +1,3 @@
-# Define a task library for running unit tests.
-
require 'rake'
require 'rake/tasklib'
@@ -67,6 +65,9 @@ module Rake
# Array of commandline options to pass to ruby when running test loader.
attr_accessor :ruby_opts
+ # Description of the test task. (default is 'Run tests')
+ attr_accessor :description
+
# Explicitly define the list of test files to be included in a
# test. +list+ is expected to be an array of file names (a
# FileList is acceptable). If both +pattern+ and +test_files+ are
@@ -86,6 +87,7 @@ module Rake
@warning = false
@loader = :rake
@ruby_opts = []
+ @description = "Run tests" + (@name == :test ? "" : " for #{@name}")
yield self if block_given?
@pattern = 'test/test*.rb' if @pattern.nil? && @test_files.nil?
define
@@ -93,7 +95,7 @@ module Rake
# Create the tasks defined by this task lib.
def define
- desc "Run tests" + (@name == :test ? "" : " for #{@name}")
+ desc @description
task @name do
FileUtilsExt.verbose(@verbose) do
args =
@@ -121,18 +123,18 @@ module Rake
"")
end
- def ruby_opts_string
+ def ruby_opts_string # :nodoc:
opts = @ruby_opts.dup
opts.unshift("-I\"#{lib_path}\"") unless @libs.empty?
opts.unshift("-w") if @warning
opts.join(" ")
end
- def lib_path
+ def lib_path # :nodoc:
@libs.join(File::PATH_SEPARATOR)
end
- def file_list_string
+ def file_list_string # :nodoc:
file_list.map { |fn| "\"#{fn}\"" }.join(' ')
end
@@ -156,18 +158,18 @@ module Rake
end || ''
end
- def ruby_version
+ def ruby_version # :nodoc:
RUBY_VERSION
end
- def run_code
+ def run_code # :nodoc:
case @loader
when :direct
"-e \"ARGV.each{|f| require f}\""
when :testrb
"-S testrb #{fix}"
when :rake
- "-I\"#{rake_lib_dir}\" \"#{rake_loader}\""
+ "#{rake_include_arg} \"#{rake_loader}\""
end
end
@@ -184,6 +186,15 @@ module Rake
nil
end
+ def rake_include_arg # :nodoc:
+ spec = Gem.loaded_specs['rake']
+ if spec.respond_to?(:default_gem?) && spec.default_gem?
+ ""
+ else
+ "-I\"#{rake_lib_dir}\""
+ end
+ end
+
def rake_lib_dir # :nodoc:
find_dir('rake') or
fail "unable to find rake lib"
diff --git a/lib/rake/thread_pool.rb b/lib/rake/thread_pool.rb
index 44bc7483e4..d2ac6e7ac2 100644
--- a/lib/rake/thread_pool.rb
+++ b/lib/rake/thread_pool.rb
@@ -5,10 +5,10 @@ require 'rake/promise'
module Rake
- class ThreadPool # :nodoc: all
+ class ThreadPool # :nodoc: all
- # Creates a ThreadPool object.
- # The parameter is the size of the pool.
+ # Creates a ThreadPool object. The +thread_count+ parameter is the size
+ # of the pool.
def initialize(thread_count)
@max_active_threads = [thread_count, 0].max
@threads = Set.new
@@ -25,9 +25,9 @@ module Rake
# Creates a future executed by the +ThreadPool+.
#
# The args are passed to the block when executing (similarly to
- # <tt>Thread#new</tt>) The return value is an object representing
+ # Thread#new) The return value is an object representing
# a future which has been created and added to the queue in the
- # pool. Sending <tt>#value</tt> to the object will sleep the
+ # pool. Sending #value to the object will sleep the
# current thread until the future is finished and will return the
# result (or raise an exception thrown from the future)
def future(*args, &block)
@@ -109,13 +109,19 @@ module Rake
false
end
+ def safe_thread_count
+ @threads_mon.synchronize do
+ @threads.count
+ end
+ end
+
def start_thread # :nodoc:
@threads_mon.synchronize do
next unless @threads.count < @max_active_threads
t = Thread.new do
begin
- while @threads.count <= @max_active_threads
+ while safe_thread_count <= @max_active_threads
break unless process_queue_item
end
ensure
@@ -126,6 +132,7 @@ module Rake
end
end
end
+
@threads << t
stat(
:spawned,
@@ -152,10 +159,6 @@ module Rake
def __queue__ # :nodoc:
@queue
end
-
- def __threads__ # :nodoc:
- @threads.dup
- end
end
end
diff --git a/lib/rake/trace_output.rb b/lib/rake/trace_output.rb
index 1cd19451ca..396096d4df 100644
--- a/lib/rake/trace_output.rb
+++ b/lib/rake/trace_output.rb
@@ -1,5 +1,5 @@
module Rake
- module TraceOutput
+ module TraceOutput # :nodoc: all
# Write trace output to output stream +out+.
#
diff --git a/lib/rake/version.rb b/lib/rake/version.rb
index 05c934d785..b9b1b2d485 100644
--- a/lib/rake/version.rb
+++ b/lib/rake/version.rb
@@ -1,6 +1,4 @@
module Rake
- VERSION = '10.1.0'
-
module Version # :nodoc: all
MAJOR, MINOR, BUILD, *OTHER = Rake::VERSION.split '.'
diff --git a/lib/rake/win32.rb b/lib/rake/win32.rb
index edb33938b4..6b4873da2c 100644
--- a/lib/rake/win32.rb
+++ b/lib/rake/win32.rb
@@ -4,7 +4,7 @@ module Rake
# Win 32 interface methods for Rake. Windows specific functionality
# will be placed here to collect that knowledge in one spot.
- module Win32
+ module Win32 # :nodoc: all
# Error indicating a problem in locating the home directory on a
# Win32 system.
diff --git a/lib/rational.rb b/lib/rational.rb
deleted file mode 100644
index a1aeca1e40..0000000000
--- a/lib/rational.rb
+++ /dev/null
@@ -1,23 +0,0 @@
-# :enddoc:
-
-warn('lib/rational.rb is deprecated') if $VERBOSE
-
-class Fixnum
-
- alias quof fdiv
- alias rdiv quo
-
- alias power! ** unless method_defined? :power!
- alias rpower **
-
-end
-
-class Bignum
-
- alias quof fdiv
- alias rdiv quo
-
- alias power! ** unless method_defined? :power!
- alias rpower **
-
-end
diff --git a/lib/rbconfig/obsolete.rb b/lib/rbconfig/obsolete.rb
deleted file mode 100644
index 7025fb43fb..0000000000
--- a/lib/rbconfig/obsolete.rb
+++ /dev/null
@@ -1,38 +0,0 @@
-module ::RbConfig
- module Obsolete
- end
- class << Obsolete
- def _warn_
- loc, = caller_locations(2, 1)
- loc = "#{loc.to_s}: " if loc
- warn "#{loc}Use RbConfig instead of obsolete and deprecated Config."
- self
- end
-
- def const_missing(name)
- _warn_
- ::RbConfig.const_get(name)
- end
-
- def method_missing(*args, &block)
- _warn_
- rbconfig = ::RbConfig
- result = rbconfig.__send__(*args, &block)
- result = rbconfig if rbconfig.equal?(result)
- result
- end
-
- def respond_to_missing?(*args, &block)
- _warn_
- ::RbConfig.send(:respond_to_missing?, *args, &block)
- end
- end
-end
-
-::Config = ::RbConfig::Obsolete._warn_
-=begin
-def Object.const_missing(name)
- return super unless name == :Config
- ::RbConfig::Obsolete._warn_
-end
-=end
diff --git a/lib/rdoc.rb b/lib/rdoc.rb
index 133888c280..87ed2df9b6 100644
--- a/lib/rdoc.rb
+++ b/lib/rdoc.rb
@@ -64,7 +64,7 @@ module RDoc
##
# RDoc version you are using
- VERSION = '4.1.0'
+ VERSION = '4.2.0.alpha'
##
# Method visibilities
@@ -151,6 +151,8 @@ module RDoc
autoload :Comment, 'rdoc/comment'
+ autoload :I18n, 'rdoc/i18n'
+
# code objects
#
# We represent the various high-level code constructs that appear in Ruby
diff --git a/lib/rdoc/any_method.rb b/lib/rdoc/any_method.rb
index 3afafc86b8..ae022d72f8 100644
--- a/lib/rdoc/any_method.rb
+++ b/lib/rdoc/any_method.rb
@@ -240,7 +240,15 @@ class RDoc::AnyMethod < RDoc::MethodAttr
return []
end
- params = params.gsub(/\s+/, '').split ','
+ if @block_params then
+ # If this method has explicit block parameters, remove any explicit
+ # &block
+ params.sub!(/,?\s*&\w+/, '')
+ else
+ params.sub!(/\&(\w+)/, '\1')
+ end
+
+ params = params.gsub(/\s+/, '').split(',').reject(&:empty?)
params.map { |param| param.sub(/=.*/, '') }
end
diff --git a/lib/rdoc/context.rb b/lib/rdoc/context.rb
index 892a43e118..5eb86ddc92 100644
--- a/lib/rdoc/context.rb
+++ b/lib/rdoc/context.rb
@@ -164,6 +164,8 @@ class RDoc::Context < RDoc::CodeObject
# Contexts are sorted by full_name
def <=>(other)
+ return nil unless RDoc::CodeObject === other
+
full_name <=> other.full_name
end
@@ -321,10 +323,11 @@ class RDoc::Context < RDoc::CodeObject
end
# fix up superclass
- superclass = nil if full_name == 'BasicObject'
- superclass = nil if full_name == 'Object' and defined?(::BasicObject)
- superclass = '::BasicObject' if
- defined?(::BasicObject) and full_name == 'Object'
+ if full_name == 'BasicObject' then
+ superclass = nil
+ elsif full_name == 'Object' then
+ superclass = defined?(::BasicObject) ? '::BasicObject' : nil
+ end
# find the superclass full name
if superclass then
diff --git a/lib/rdoc/encoding.rb b/lib/rdoc/encoding.rb
index 9fe3539412..b3515a435f 100644
--- a/lib/rdoc/encoding.rb
+++ b/lib/rdoc/encoding.rb
@@ -29,7 +29,9 @@ module RDoc::Encoding
encoding ||= Encoding.default_external
orig_encoding = content.encoding
- if utf8 then
+ if not orig_encoding.ascii_compatible? then
+ content.encode! encoding
+ elsif utf8 then
content.force_encoding Encoding::UTF_8
content.encode! encoding
else
diff --git a/lib/rdoc/generator.rb b/lib/rdoc/generator.rb
index 9051f8a658..7d3989d42f 100644
--- a/lib/rdoc/generator.rb
+++ b/lib/rdoc/generator.rb
@@ -45,6 +45,7 @@ module RDoc::Generator
autoload :Darkfish, 'rdoc/generator/darkfish'
autoload :JsonIndex, 'rdoc/generator/json_index'
autoload :RI, 'rdoc/generator/ri'
+ autoload :POT, 'rdoc/generator/pot'
end
diff --git a/lib/rdoc/generator/pot.rb b/lib/rdoc/generator/pot.rb
new file mode 100644
index 0000000000..db6f3a0354
--- /dev/null
+++ b/lib/rdoc/generator/pot.rb
@@ -0,0 +1,97 @@
+##
+# Generates a POT file.
+#
+# Here is a translator work flow with the generator.
+#
+# == Create .pot
+#
+# You create .pot file by pot formatter:
+#
+# % rdoc --format pot
+#
+# It generates doc/rdoc.pot.
+#
+# == Create .po
+#
+# You create .po file from doc/rdoc.pot. This operation is needed only
+# the first time. This work flow assumes that you are a translator
+# for Japanese.
+#
+# You create locale/ja/rdoc.po from doc/rdoc.pot. You can use msginit
+# provided by GNU gettext or rmsginit provided by gettext gem. This
+# work flow uses gettext gem because it is more portable than GNU
+# gettext for Rubyists. Gettext gem is implemented by pure Ruby.
+#
+# % gem install gettext
+# % mkdir -p locale/ja
+# % rmsginit --input doc/rdoc.pot --output locale/ja/rdoc.po --locale ja
+#
+# Translate messages in .po
+#
+# You translate messages in .po by a PO file editor. po-mode.el exists
+# for Emacs users. There are some GUI tools such as GTranslator.
+# There are some Web services such as POEditor and Tansifex. You can
+# edit by your favorite text editor because .po is a text file.
+# Generate localized documentation
+#
+# You can generate localized documentation with locale/ja/rdoc.po:
+#
+# % rdoc --locale ja
+#
+# You can find documentation in Japanese in doc/. Yay!
+#
+# == Update translation
+#
+# You need to update translation when your application is added or
+# modified messages.
+#
+# You can update .po by the following command lines:
+#
+# % rdoc --format pot
+# % rmsgmerge --update locale/ja/rdoc.po doc/rdoc.pot
+#
+# You edit locale/ja/rdoc.po to translate new messages.
+
+class RDoc::Generator::POT
+
+ RDoc::RDoc.add_generator self
+
+ ##
+ # Description of this generator
+
+ DESCRIPTION = 'creates .pot file'
+
+ ##
+ # Set up a new .pot generator
+
+ def initialize store, options #:not-new:
+ @options = options
+ @store = store
+ end
+
+ ##
+ # Writes .pot to disk.
+
+ def generate
+ po = extract_messages
+ pot_path = 'rdoc.pot'
+ File.open(pot_path, "w") do |pot|
+ pot.print(po.to_s)
+ end
+ end
+
+ def class_dir
+ nil
+ end
+
+ private
+ def extract_messages
+ extractor = MessageExtractor.new(@store)
+ extractor.extract
+ end
+
+ autoload :MessageExtractor, 'rdoc/generator/pot/message_extractor'
+ autoload :PO, 'rdoc/generator/pot/po'
+ autoload :POEntry, 'rdoc/generator/pot/po_entry'
+
+end
diff --git a/lib/rdoc/generator/pot/message_extractor.rb b/lib/rdoc/generator/pot/message_extractor.rb
new file mode 100644
index 0000000000..ceabc5262a
--- /dev/null
+++ b/lib/rdoc/generator/pot/message_extractor.rb
@@ -0,0 +1,67 @@
+##
+# Extracts message from RDoc::Store
+
+class RDoc::Generator::POT::MessageExtractor
+
+ ##
+ # Creates a message extractor for +store+.
+
+ def initialize store
+ @store = store
+ @po = RDoc::Generator::POT::PO.new
+ end
+
+ ##
+ # Extracts messages from +store+, stores them into
+ # RDoc::Generator::POT::PO and returns it.
+
+ def extract
+ @store.all_classes_and_modules.each do |klass|
+ extract_from_klass(klass)
+ end
+ @po
+ end
+
+ private
+
+ def extract_from_klass klass
+ extract_text(klass.comment_location, klass.full_name)
+
+ klass.each_section do |section, constants, attributes|
+ extract_text(section.title ,"#{klass.full_name}: section title")
+ section.comments.each do |comment|
+ extract_text(comment, "#{klass.full_name}: #{section.title}")
+ end
+ end
+
+ klass.each_constant do |constant|
+ extract_text(constant.comment, constant.full_name)
+ end
+
+ klass.each_attribute do |attribute|
+ extract_text(attribute.comment, attribute.full_name)
+ end
+
+ klass.each_method do |method|
+ extract_text(method.comment, method.full_name)
+ end
+ end
+
+ def extract_text text, comment, location = nil
+ return if text.nil?
+
+ options = {
+ :extracted_comment => comment,
+ :references => [location].compact,
+ }
+ i18n_text = RDoc::I18n::Text.new(text)
+ i18n_text.extract_messages do |part|
+ @po.add(entry(part[:paragraph], options))
+ end
+ end
+
+ def entry msgid, options
+ RDoc::Generator::POT::POEntry.new(msgid, options)
+ end
+
+end
diff --git a/lib/rdoc/generator/pot/po.rb b/lib/rdoc/generator/pot/po.rb
new file mode 100644
index 0000000000..6a6b5821f3
--- /dev/null
+++ b/lib/rdoc/generator/pot/po.rb
@@ -0,0 +1,83 @@
+##
+# Generates a PO format text
+
+class RDoc::Generator::POT::PO
+
+ ##
+ # Creates an object that represents PO format.
+
+ def initialize
+ @entries = {}
+ add_header
+ end
+
+ ##
+ # Adds a PO entry to the PO.
+
+ def add entry
+ existing_entry = @entries[entry.msgid]
+ if existing_entry
+ entry = existing_entry.merge(entry)
+ end
+ @entries[entry.msgid] = entry
+ end
+
+ ##
+ # Returns PO format text for the PO.
+
+ def to_s
+ po = ''
+ sort_entries.each do |entry|
+ po << "\n" unless po.empty?
+ po << entry.to_s
+ end
+ po
+ end
+
+ private
+
+ def add_header
+ add(header_entry)
+ end
+
+ def header_entry
+ comment = <<-COMMENT
+SOME DESCRIPTIVE TITLE.
+Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+This file is distributed under the same license as the PACKAGE package.
+FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+ COMMENT
+
+ content = <<-CONTENT
+Project-Id-Version: PACKAGE VERSEION
+Report-Msgid-Bugs-To:
+PO-Revision-Date: YEAR-MO_DA HO:MI+ZONE
+Last-Translator: FULL NAME <EMAIL@ADDRESS>
+Language-Team: LANGUAGE <LL@li.org>
+Language:
+MIME-Version: 1.0
+Content-Type: text/plain; charset=CHARSET
+Content-Transfer-Encoding: 8bit
+Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;
+ CONTENT
+
+ options = {
+ :msgstr => content,
+ :translator_comment => comment,
+ :flags => ['fuzzy'],
+ }
+ RDoc::Generator::POT::POEntry.new('', options)
+ end
+
+ def sort_entries
+ headers, messages = @entries.values.partition do |entry|
+ entry.msgid.empty?
+ end
+ # TODO: sort by location
+ sorted_messages = messages.sort_by do |entry|
+ entry.msgid
+ end
+ headers + sorted_messages
+ end
+
+end
diff --git a/lib/rdoc/generator/pot/po_entry.rb b/lib/rdoc/generator/pot/po_entry.rb
new file mode 100644
index 0000000000..d4cef59ee9
--- /dev/null
+++ b/lib/rdoc/generator/pot/po_entry.rb
@@ -0,0 +1,140 @@
+##
+# A PO entry in PO
+
+class RDoc::Generator::POT::POEntry
+
+ # The msgid content
+ attr_reader :msgid
+
+ # The msgstr content
+ attr_reader :msgstr
+
+ # The comment content created by translator (PO editor)
+ attr_reader :translator_comment
+
+ # The comment content extracted from source file
+ attr_reader :extracted_comment
+
+ # The locations where the PO entry is extracted
+ attr_reader :references
+
+ # The flags of the PO entry
+ attr_reader :flags
+
+ ##
+ # Creates a PO entry for +msgid+. Other valus can be specified by
+ # +options+.
+
+ def initialize msgid, options = {}
+ @msgid = msgid
+ @msgstr = options[:msgstr] || ""
+ @translator_comment = options[:translator_comment]
+ @extracted_comment = options[:extracted_comment]
+ @references = options[:references] || []
+ @flags = options[:flags] || []
+ end
+
+ ##
+ # Returns the PO entry in PO format.
+
+ def to_s
+ entry = ''
+ entry << format_translator_comment
+ entry << format_extracted_comment
+ entry << format_references
+ entry << format_flags
+ entry << <<-ENTRY
+msgid #{format_message(@msgid)}
+msgstr #{format_message(@msgstr)}
+ ENTRY
+ end
+
+ ##
+ # Merges the PO entry with +other_entry+.
+
+ def merge other_entry
+ options = {
+ :extracted_comment => merge_string(@extracted_comment,
+ other_entry.extracted_comment),
+ :translator_comment => merge_string(@translator_comment,
+ other_entry.translator_comment),
+ :references => merge_array(@references,
+ other_entry.references),
+ :flags => merge_array(@flags,
+ other_entry.flags),
+ }
+ self.class.new(@msgid, options)
+ end
+
+ private
+
+ def format_comment mark, comment
+ return '' unless comment
+ return '' if comment.empty?
+
+ formatted_comment = ''
+ comment.each_line do |line|
+ formatted_comment << "#{mark} #{line}"
+ end
+ formatted_comment << "\n" unless formatted_comment.end_with?("\n")
+ formatted_comment
+ end
+
+ def format_translator_comment
+ format_comment('#', @translator_comment)
+ end
+
+ def format_extracted_comment
+ format_comment('#.', @extracted_comment)
+ end
+
+ def format_references
+ return '' if @references.empty?
+
+ formatted_references = ''
+ @references.sort.each do |file, line|
+ formatted_references << "\#: #{file}:#{line}\n"
+ end
+ formatted_references
+ end
+
+ def format_flags
+ return '' if @flags.empty?
+
+ formatted_flags = flags.join(",")
+ "\#, #{formatted_flags}\n"
+ end
+
+ def format_message message
+ return "\"#{escape(message)}\"" unless message.include?("\n")
+
+ formatted_message = '""'
+ message.each_line do |line|
+ formatted_message << "\n"
+ formatted_message << "\"#{escape(line)}\""
+ end
+ formatted_message
+ end
+
+ def escape string
+ string.gsub(/["\\\t\n]/) do |special_character|
+ case special_character
+ when "\t"
+ "\\t"
+ when "\n"
+ "\\n"
+ else
+ "\\#{special_character}"
+ end
+ end
+ end
+
+ def merge_string string1, string2
+ [string1, string2].compact.join("\n")
+ end
+
+ def merge_array array1, array2
+ (array1 + array2).uniq
+ end
+
+end
diff --git a/lib/rdoc/generator/template/darkfish/_head.rhtml b/lib/rdoc/generator/template/darkfish/_head.rhtml
index 062160a751..c87ba95096 100644
--- a/lib/rdoc/generator/template/darkfish/_head.rhtml
+++ b/lib/rdoc/generator/template/darkfish/_head.rhtml
@@ -2,6 +2,13 @@
<title><%= h @title %></title>
+<script type="text/javascript">
+ var rdoc_rel_prefix = "<%= rel_prefix %>/";
+</script>
+
+<script src="<%= asset_rel_prefix %>/js/jquery.js"></script>
+<script src="<%= asset_rel_prefix %>/js/darkfish.js"></script>
+
<link href="<%= asset_rel_prefix %>/fonts.css" rel="stylesheet">
<link href="<%= asset_rel_prefix %>/rdoc.css" rel="stylesheet">
<% if @options.template_stylesheets.flatten.any? then %>
@@ -10,13 +17,3 @@
<% end %>
<% end %>
-<script type="text/javascript">
- var rdoc_rel_prefix = "<%= rel_prefix %>/";
-</script>
-
-<script src="<%= asset_rel_prefix %>/js/jquery.js"></script>
-<script src="<%= asset_rel_prefix %>/js/navigation.js"></script>
-<script src="<%= search_index_rel_prefix %>/js/search_index.js"></script>
-<script src="<%= asset_rel_prefix %>/js/search.js"></script>
-<script src="<%= asset_rel_prefix %>/js/searcher.js"></script>
-<script src="<%= asset_rel_prefix %>/js/darkfish.js"></script>
diff --git a/lib/rdoc/generator/template/darkfish/images/add.png b/lib/rdoc/generator/template/darkfish/images/add.png
index 6332fefea4..6332fefea4 100755..100644
--- a/lib/rdoc/generator/template/darkfish/images/add.png
+++ b/lib/rdoc/generator/template/darkfish/images/add.png
Binary files differ
diff --git a/lib/rdoc/generator/template/darkfish/images/arrow_up.png b/lib/rdoc/generator/template/darkfish/images/arrow_up.png
index 1ebb193243..1ebb193243 100755..100644
--- a/lib/rdoc/generator/template/darkfish/images/arrow_up.png
+++ b/lib/rdoc/generator/template/darkfish/images/arrow_up.png
Binary files differ
diff --git a/lib/rdoc/generator/template/darkfish/images/delete.png b/lib/rdoc/generator/template/darkfish/images/delete.png
index 08f249365a..08f249365a 100755..100644
--- a/lib/rdoc/generator/template/darkfish/images/delete.png
+++ b/lib/rdoc/generator/template/darkfish/images/delete.png
Binary files differ
diff --git a/lib/rdoc/generator/template/darkfish/images/tag_blue.png b/lib/rdoc/generator/template/darkfish/images/tag_blue.png
index 3f02b5f8f8..3f02b5f8f8 100755..100644
--- a/lib/rdoc/generator/template/darkfish/images/tag_blue.png
+++ b/lib/rdoc/generator/template/darkfish/images/tag_blue.png
Binary files differ
diff --git a/lib/rdoc/generator/template/darkfish/js/darkfish.js b/lib/rdoc/generator/template/darkfish/js/darkfish.js
index 06fef3b215..b789a65631 100644
--- a/lib/rdoc/generator/template/darkfish/js/darkfish.js
+++ b/lib/rdoc/generator/template/darkfish/js/darkfish.js
@@ -44,14 +44,6 @@ function hookSourceViews() {
$('.method-heading').click( showSource );
};
-function toggleDebuggingSection() {
- $('.debugging-section').slideToggle();
-};
-
-function hookDebuggingToggle() {
- $('#debugging-toggle img').click( toggleDebuggingSection );
-};
-
function hookSearch() {
var input = $('#search-field').eq(0);
var result = $('#search-results').eq(0);
@@ -129,12 +121,41 @@ function highlightClickTarget( event ) {
};
};
+function loadAsync(path, success) {
+ $.ajax({
+ url: rdoc_rel_prefix + path,
+ dataType: 'script',
+ success: success,
+ cache: true
+ });
+};
$(document).ready( function() {
hookSourceViews();
- hookDebuggingToggle();
- hookSearch();
highlightLocationTarget();
-
$('ul.link-list a').bind( "click", highlightClickTarget );
+
+ var search_scripts_loaded = {
+ navigation_loaded: false,
+ search_loaded: false,
+ search_index_loaded: false,
+ searcher_loaded: false,
+ }
+
+ var search_success_function = function(variable) {
+ return (function (data, status, xhr) {
+ search_scripts_loaded[variable] = true;
+
+ if (search_scripts_loaded['navigation_loaded'] == true &&
+ search_scripts_loaded['search_loaded'] == true &&
+ search_scripts_loaded['search_index_loaded'] == true &&
+ search_scripts_loaded['searcher_loaded'] == true)
+ hookSearch();
+ });
+ }
+
+ loadAsync('js/navigation.js', search_success_function('navigation_loaded'));
+ loadAsync('js/search.js', search_success_function('search_loaded'));
+ loadAsync('js/search_index.js', search_success_function('search_index_loaded'));
+ loadAsync('js/searcher.js', search_success_function('searcher_loaded'));
});
diff --git a/lib/rdoc/generator/template/darkfish/rdoc.css b/lib/rdoc/generator/template/darkfish/rdoc.css
index 4f22adaae1..2f4dca7e08 100644
--- a/lib/rdoc/generator/template/darkfish/rdoc.css
+++ b/lib/rdoc/generator/template/darkfish/rdoc.css
@@ -23,12 +23,22 @@ h3 span,
h4 span,
h5 span,
h6 span {
+ position: relative;
+
display: none;
padding-left: 1em;
+ line-height: 0;
+ vertical-align: baseline;
font-size: 10px;
- vertical-align: super;
}
+h1 span { top: -1.3em; }
+h2 span { top: -1.2em; }
+h3 span { top: -1.0em; }
+h4 span { top: -0.8em; }
+h5 span { top: -0.5em; }
+h6 span { top: -0.5em; }
+
h1:hover span,
h2:hover span,
h3:hover span,
diff --git a/lib/rdoc/i18n.rb b/lib/rdoc/i18n.rb
new file mode 100644
index 0000000000..4cccbc66d3
--- /dev/null
+++ b/lib/rdoc/i18n.rb
@@ -0,0 +1,9 @@
+##
+# This module provides i18n realated features.
+
+module RDoc::I18n
+
+ autoload :Locale, 'rdoc/i18n/locale'
+ autoload :Text, 'rdoc/i18n/text'
+
+end
diff --git a/lib/rdoc/i18n/locale.rb b/lib/rdoc/i18n/locale.rb
new file mode 100644
index 0000000000..e98732e086
--- /dev/null
+++ b/lib/rdoc/i18n/locale.rb
@@ -0,0 +1,101 @@
+##
+# A message container for a locale.
+#
+# This object provides the following two features:
+#
+# * Loads translated messages from .po file.
+# * Translates a message into the locale.
+
+class RDoc::I18n::Locale
+
+ @@locales = {} # :nodoc:
+
+ class << self
+
+ ##
+ # Returns the locale object for +locale_name+.
+
+ def [](locale_name)
+ @@locales[locale_name] ||= new(locale_name)
+ end
+
+ ##
+ # Sets the locale object for +locale_name+.
+ #
+ # Normally, this method is not used. This method is useful for
+ # testing.
+
+ def []=(locale_name, locale)
+ @@locales[locale_name] = locale
+ end
+
+ end
+
+ ##
+ # The name of the locale. It uses IETF language tag format
+ # +[language[_territory][.codeset][@modifier]]+.
+ #
+ # See also {BCP 47 - Tags for Identifying
+ # Languages}[http://tools.ietf.org/rfc/bcp/bcp47.txt].
+
+ attr_reader :name
+
+ ##
+ # Creates a new locale object for +name+ locale. +name+ must
+ # follow IETF language tag format.
+
+ def initialize(name)
+ @name = name
+ @messages = {}
+ end
+
+ ##
+ # Loads translation messages from +locale_directory+/+@name+/rdoc.po
+ # or +locale_directory+/+@name+.po. The former has high priority.
+ #
+ # This method requires gettext gem for parsing .po file. If you
+ # don't have gettext gem, this method doesn't load .po file. This
+ # method warns and returns +false+.
+ #
+ # Returns +true+ if succeeded, +false+ otherwise.
+
+ def load(locale_directory)
+ return false if @name.nil?
+
+ po_file_candidates = [
+ File.join(locale_directory, @name, 'rdoc.po'),
+ File.join(locale_directory, "#{@name}.po"),
+ ]
+ po_file = po_file_candidates.find do |po_file_candidate|
+ File.exist?(po_file_candidate)
+ end
+ return false unless po_file
+
+ begin
+ require 'gettext/po_parser'
+ require 'gettext/mo'
+ rescue LoadError
+ warn('Need gettext gem for i18n feature:')
+ warn(' gem install gettext')
+ return false
+ end
+
+ po_parser = GetText::POParser.new
+ messages = GetText::MO.new
+ po_parser.report_warning = false
+ po_parser.parse_file(po_file, messages)
+
+ @messages.merge!(messages)
+
+ true
+ end
+
+ ##
+ # Translates the +message+ into locale. If there is no tranlsation
+ # messages for +message+ in locale, +message+ itself is returned.
+
+ def translate(message)
+ @messages[message] || message
+ end
+
+end
diff --git a/lib/rdoc/i18n/text.rb b/lib/rdoc/i18n/text.rb
new file mode 100644
index 0000000000..ee5c66a1ff
--- /dev/null
+++ b/lib/rdoc/i18n/text.rb
@@ -0,0 +1,125 @@
+##
+# An i18n supported text.
+#
+# This object provides the following two features:
+#
+# * Extracts translation messages from wrapped raw text.
+# * Translates wrapped raw text in specified locale.
+#
+# Wrapped raw text is one of String, RDoc::Comment or Array of them.
+
+class RDoc::I18n::Text
+
+ ##
+ # Creates a new i18n supported text for +raw+ text.
+
+ def initialize(raw)
+ @raw = raw
+ end
+
+ ##
+ # Extracts translation target messages and yields each message.
+ #
+ # Each yielded message is a Hash. It consists of the followings:
+ #
+ # :type :: :paragraph
+ # :paragraph :: String (The translation target message itself.)
+ # :line_no :: Integer (The line number of the :paragraph is started.)
+ #
+ # The above content may be added in the future.
+
+ def extract_messages
+ parse do |part|
+ case part[:type]
+ when :empty_line
+ # ignore
+ when :paragraph
+ yield(part)
+ end
+ end
+ end
+
+ # Translates raw text into +locale+.
+ def translate(locale)
+ translated_text = ''
+ parse do |part|
+ case part[:type]
+ when :paragraph
+ translated_text << locale.translate(part[:paragraph])
+ when :empty_line
+ translated_text << part[:line]
+ else
+ raise "should not reach here: unexpected type: #{type}"
+ end
+ end
+ translated_text
+ end
+
+ private
+ def parse(&block)
+ paragraph = ''
+ paragraph_start_line = 0
+ line_no = 0
+
+ each_line(@raw) do |line|
+ line_no += 1
+ case line
+ when /\A\s*\z/
+ if paragraph.empty?
+ emit_empty_line_event(line, line_no, &block)
+ else
+ paragraph << line
+ emit_paragraph_event(paragraph, paragraph_start_line, line_no,
+ &block)
+ paragraph = ''
+ end
+ else
+ paragraph_start_line = line_no if paragraph.empty?
+ paragraph << line
+ end
+ end
+
+ unless paragraph.empty?
+ emit_paragraph_event(paragraph, paragraph_start_line, line_no, &block)
+ end
+ end
+
+ def each_line(raw, &block)
+ case raw
+ when RDoc::Comment
+ raw.text.each_line(&block)
+ when Array
+ raw.each do |comment, location|
+ each_line(comment, &block)
+ end
+ else
+ raw.each_line(&block)
+ end
+ end
+
+ def emit_empty_line_event(line, line_no)
+ part = {
+ :type => :empty_line,
+ :line => line,
+ :line_no => line_no,
+ }
+ yield(part)
+ end
+
+ def emit_paragraph_event(paragraph, paragraph_start_line, line_no, &block)
+ paragraph_part = {
+ :type => :paragraph,
+ :line_no => paragraph_start_line,
+ }
+ match_data = /(\s*)\z/.match(paragraph)
+ if match_data
+ paragraph_part[:paragraph] = match_data.pre_match
+ yield(paragraph_part)
+ emit_empty_line_event(match_data[1], line_no, &block)
+ else
+ paragraph_part[:paragraph] = paragraph
+ yield(paragraph_part)
+ end
+ end
+
+end
diff --git a/lib/rdoc/markup.rb b/lib/rdoc/markup.rb
index e1d75fa52b..0e754ff33d 100644
--- a/lib/rdoc/markup.rb
+++ b/lib/rdoc/markup.rb
@@ -84,7 +84,7 @@
#
# markup.add_special(/\b([A-Z][a-z]+[A-Z]\w+)/, :WIKIWORD)
#
-# wh = WikiHtml.new markup
+# wh = WikiHtml.new RDoc::Options.new, markup
# wh.add_tag(:STRIKE, "<strike>", "</strike>")
#
# puts "<body>#{wh.convert ARGF.read}</body>"
@@ -163,7 +163,7 @@
#
# The header's id would be:
#
-# <h1 id="method-i-do_fun_things-label-Example">Example</h3>
+# <h1 id="method-i-do_fun_things-label-Example">Example</h1>
#
# The label can be linked-to using <tt>SomeClass@Headers</tt>. See
# {Links}[RDoc::Markup@Links] for further details.
diff --git a/lib/rdoc/markup/attribute_manager.rb b/lib/rdoc/markup/attribute_manager.rb
index c5a50d519c..ce4ac76d5b 100644
--- a/lib/rdoc/markup/attribute_manager.rb
+++ b/lib/rdoc/markup/attribute_manager.rb
@@ -130,7 +130,7 @@ class RDoc::Markup::AttributeManager
# first do matching ones
tags = @matching_word_pairs.keys.join("")
- re = /(^|\W)([#{tags}])([#:\\]?[\w.\/-]+?\S?)\2(\W|$)/
+ re = /(^|\W)([#{tags}])([#\\]?[\w:.\/-]+?\S?)\2(\W|$)/
1 while str.gsub!(re) do
attr = @matching_word_pairs[$2]
diff --git a/lib/rdoc/method_attr.rb b/lib/rdoc/method_attr.rb
index 8bde102640..a0ea851dc5 100644
--- a/lib/rdoc/method_attr.rb
+++ b/lib/rdoc/method_attr.rb
@@ -110,12 +110,15 @@ class RDoc::MethodAttr < RDoc::CodeObject
# Order by #singleton then #name
def <=>(other)
+ return unless other.respond_to?(:singleton) &&
+ other.respond_to?(:name)
+
[ @singleton ? 0 : 1, name] <=>
[other.singleton ? 0 : 1, other.name]
end
def == other # :nodoc:
- super or self.class == other.class and full_name == other.full_name
+ equal?(other) or self.class == other.class and full_name == other.full_name
end
##
@@ -181,8 +184,8 @@ class RDoc::MethodAttr < RDoc::CodeObject
parent != kernel && !searched.include?(kernel)
searched.each do |ancestor|
- next if parent == ancestor
next if String === ancestor
+ next if parent == ancestor
other = ancestor.find_method_named('#' << name) ||
ancestor.find_attribute_named(name)
@@ -358,7 +361,12 @@ class RDoc::MethodAttr < RDoc::CodeObject
end
def pretty_print q # :nodoc:
- alias_for = @is_alias_for ? "alias for #{@is_alias_for.name}" : nil
+ alias_for =
+ if @is_alias_for.respond_to? :name then
+ "alias for #{@is_alias_for.name}"
+ elsif Array === @is_alias_for then
+ "alias for #{@is_alias_for.last}"
+ end
q.group 2, "[#{self.class.name} #{full_name} #{visibility}", "]" do
if alias_for then
diff --git a/lib/rdoc/options.rb b/lib/rdoc/options.rb
index e27be89dbf..5779d35c44 100644
--- a/lib/rdoc/options.rb
+++ b/lib/rdoc/options.rb
@@ -214,6 +214,16 @@ class RDoc::Options
attr_accessor :line_numbers
##
+ # The output locale.
+
+ attr_accessor :locale
+
+ ##
+ # The directory where locale data live.
+
+ attr_accessor :locale_dir
+
+ ##
# Name of the file, class or module to display in the initial index page (if
# not specified the first file we encounter is used)
@@ -325,7 +335,7 @@ class RDoc::Options
# other visibilities may be overridden on a per-method basis with the :doc:
# directive.
- attr_accessor :visibility
+ attr_reader :visibility
def initialize # :nodoc:
init_ivars
@@ -343,6 +353,9 @@ class RDoc::Options
@generators = RDoc::RDoc::GENERATORS
@hyperlink_all = false
@line_numbers = false
+ @locale = nil
+ @locale_name = nil
+ @locale_dir = 'locale'
@main_page = nil
@markup = 'rdoc'
@coverage_report = false
@@ -388,6 +401,8 @@ class RDoc::Options
@generator_name = map['generator_name']
@hyperlink_all = map['hyperlink_all']
@line_numbers = map['line_numbers']
+ @locale_name = map['locale_name']
+ @locale_dir = map['locale_dir']
@main_page = map['main_page']
@markup = map['markup']
@op_dir = map['op_dir']
@@ -412,6 +427,8 @@ class RDoc::Options
@generator_name == other.generator_name and
@hyperlink_all == other.hyperlink_all and
@line_numbers == other.line_numbers and
+ @locale == other.locale and
+ @locale_dir == other.locale_dir and
@main_page == other.main_page and
@markup == other.markup and
@op_dir == other.op_dir and
@@ -515,6 +532,13 @@ class RDoc::Options
@template_dir = template_dir_for @template
end
+ if @locale_name
+ @locale = RDoc::I18n::Locale[@locale_name]
+ @locale.load(@locale_dir)
+ else
+ @locale = nil
+ end
+
self
end
@@ -677,6 +701,19 @@ Usage: #{opt.program_name} [options] [names...]
opt.separator nil
end
+
+ opt.on("--locale=NAME",
+ "Specifies the output locale.") do |value|
+ @locale_name = value
+ end
+
+ opt.on("--locale-data-dir=DIR",
+ "Specifies the directory where locale data live.") do |value|
+ @locale_dir = value
+ end
+
+ opt.separator nil
+
opt.on("--all", "-a",
"Synonym for --visibility=private.") do |value|
@visibility = :private
@@ -1016,8 +1053,7 @@ Usage: #{opt.program_name} [options] [names...]
opt.separator nil
- opt.on("--help",
- "Display this help") do
+ opt.on("--help", "-h", "Display this help") do
RDoc::RDoc::GENERATORS.each_key do |generator|
setup_generator generator
end
@@ -1174,6 +1210,22 @@ Usage: #{opt.program_name} [options] [names...]
end
end
+ # Sets the minimum visibility of a documented method.
+ #
+ # Accepts +:public+, +:protected+, +:private+, +:nodoc+, or +:all+.
+ #
+ # When +:all+ is passed, visibility is set to +:private+, similarly to
+ # RDOCOPT="--all", see #visibility for more information.
+
+ def visibility= visibility
+ case visibility
+ when :all
+ @visibility = :private
+ else
+ @visibility = visibility
+ end
+ end
+
##
# Displays a warning using Kernel#warn if we're being verbose
diff --git a/lib/rdoc/parser.rb b/lib/rdoc/parser.rb
index 5572ba10a4..4da7f00d3c 100644
--- a/lib/rdoc/parser.rb
+++ b/lib/rdoc/parser.rb
@@ -83,7 +83,7 @@ class RDoc::Parser
mode = "r"
s.sub!(/\A#!.*\n/, '') # assume shebang line isn't longer than 1024.
encoding = s[/^\s*\#\s*(?:-\*-\s*)?(?:en)?coding:\s*([^\s;]+?)(?:-\*-|[\s;])/, 1]
- mode = "r:#{encoding}" if encoding
+ mode = "rb:#{encoding}" if encoding
s = File.open(file, mode) {|f| f.gets(nil, 1024)}
not s.valid_encoding?
diff --git a/lib/rdoc/parser/c.rb b/lib/rdoc/parser/c.rb
index f7d0a9afa0..dd3ba5efdb 100644
--- a/lib/rdoc/parser/c.rb
+++ b/lib/rdoc/parser/c.rb
@@ -594,9 +594,10 @@ class RDoc::Parser::C < RDoc::Parser
\s*#{attr_name}\s*,
#{rw},.*?\)\s*;%xm then
$1
- elsif @content =~ %r%Document-attr:\s#{attr_name}\s*?\n
- ((?>.*?\*/))%xm then
- $1
+ elsif @content =~ %r%(/\*.*?(?:\s*\*\s*)?)
+ Document-attr:\s#{attr_name}\s*?\n
+ ((?>(.|\n)*?\*/))%x then
+ "#{$1}\n#{$2}"
else
''
end
@@ -610,7 +611,7 @@ class RDoc::Parser::C < RDoc::Parser
def find_body class_name, meth_name, meth_obj, file_content, quiet = false
case file_content
when %r%((?>/\*.*?\*/\s*)?)
- ((?:(?:static|SWIGINTERN)\s+)?
+ ((?:(?:\w+)\s+)?
(?:intern\s+)?VALUE\s+#{meth_name}
\s*(\([^)]*\))([^;]|$))%xm then
comment = RDoc::Comment.new $1, @top_level
@@ -1185,7 +1186,6 @@ class RDoc::Parser::C < RDoc::Parser
if hash then
args << "p#{position} = {}"
- position += 1
end
args << '&block' if block
diff --git a/lib/rdoc/parser/changelog.rb b/lib/rdoc/parser/changelog.rb
index 782d8f09bf..a3567c1f81 100644
--- a/lib/rdoc/parser/changelog.rb
+++ b/lib/rdoc/parser/changelog.rb
@@ -145,10 +145,14 @@ class RDoc::Parser::ChangeLog < RDoc::Parser
# HACK Ruby 1.8 does not raise ArgumentError for Time.parse "Other"
entry_name = nil unless entry_name =~ /#{time.year}/
rescue NoMethodError
- time, = entry_name.split ' ', 2
- time = Time.parse time
+ # HACK Ruby 2.1.2 and earlier raises NoMethodError if time part is absent
+ entry_name.split ' ', 2
rescue ArgumentError
- entry_name = nil
+ if /out of range/ =~ $!.message
+ Time.parse(entry_name.split(' ', 2)[0]) rescue entry_name = nil
+ else
+ entry_name = nil
+ end
end
entry_body = []
diff --git a/lib/rdoc/parser/ruby.rb b/lib/rdoc/parser/ruby.rb
index 1c4b637640..ce1083edc7 100644
--- a/lib/rdoc/parser/ruby.rb
+++ b/lib/rdoc/parser/ruby.rb
@@ -187,15 +187,16 @@ class RDoc::Parser::Ruby < RDoc::Parser
end
##
- # Extracts the visibility information for the visibility token +tk+.
+ # Extracts the visibility information for the visibility token +tk+
+ # and +single+ class type identifier.
#
# Returns the visibility type (a string), the visibility (a symbol) and
# +singleton+ if the methods following should be converted to singleton
# methods.
- def get_visibility_information tk # :nodoc:
+ def get_visibility_information tk, single # :nodoc:
vis_type = tk.name
- singleton = false
+ singleton = single == SINGLE
vis =
case vis_type
@@ -226,6 +227,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
comment = ''
comment.force_encoding @encoding if @encoding
first_line = true
+ first_comment_tk_class = nil
tk = get_tk
@@ -238,6 +240,9 @@ class RDoc::Parser::Ruby < RDoc::Parser
skip_tkspace
tk = get_tk
else
+ break if first_comment_tk_class and not first_comment_tk_class === tk
+ first_comment_tk_class = tk.class
+
first_line = false
comment << tk.text << "\n"
tk = get_tk
@@ -841,7 +846,6 @@ class RDoc::Parser::Ruby < RDoc::Parser
# true, no found constants will be added to RDoc.
def parse_constant container, tk, comment, ignore_constants = false
- prev_container = container
offset = tk.seek
line_no = tk.line_no
@@ -864,8 +868,6 @@ class RDoc::Parser::Ruby < RDoc::Parser
end
unless TkASSIGN === eq_tk then
- suppress_parents container, prev_container
-
unget_tk eq_tk
return false
end
@@ -889,7 +891,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
read_documentation_modifiers con, RDoc::CONSTANT_MODIFIERS
@stats.add_constant con
- con = container.add_constant con
+ container.add_constant con
true
end
@@ -1305,7 +1307,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
return unless name
meth = RDoc::AnyMethod.new get_tkread, name
- meth.singleton = singleton
+ meth.singleton = single == SINGLE ? true : singleton
record_location meth
meth.offset = offset
@@ -1875,9 +1877,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
# Determines the visibility in +container+ from +tk+
def parse_visibility(container, single, tk)
- singleton = (single == SINGLE)
-
- vis_type, vis, singleton = get_visibility_information tk
+ vis_type, vis, singleton = get_visibility_information tk, single
skip_tkspace_comment false
@@ -2078,7 +2078,7 @@ class RDoc::Parser::Ruby < RDoc::Parser
def skip_for_variable
skip_tkspace false
- tk = get_tk
+ get_tk
skip_tkspace false
tk = get_tk
unget_tk(tk) unless TkIN === tk
diff --git a/lib/rdoc/rd/block_parser.rb b/lib/rdoc/rd/block_parser.rb
index dd15e1262e..a495ca4e1e 100644
--- a/lib/rdoc/rd/block_parser.rb
+++ b/lib/rdoc/rd/block_parser.rb
@@ -1,6 +1,6 @@
#
# DO NOT MODIFY!!!!
-# This file is automatically generated by Racc 1.4.9
+# This file is automatically generated by Racc 1.4.11
# from Racc grammer file "".
#
@@ -144,9 +144,9 @@ def next_token # :nodoc:
# call filter, part_out is output(Part object)
part_out = @tree.filter[@in_part].call(part)
- if @tree.filter[@in_part].mode == :rd # if output is RD formated
+ if @tree.filter[@in_part].mode == :rd # if output is RD formatted
subtree = parse_subtree(part_out.to_a)
- else # if output is target formated
+ else # if output is target formatted
basename = TMPFILE.join('.')
TMPFILE[-1] += 1
tmpfile = open(@tree.tmp_dir + "/" + basename + ".#{@in_part}", "w")
diff --git a/lib/rdoc/rd/inline_parser.rb b/lib/rdoc/rd/inline_parser.rb
index c3c1f4b030..80d029cc21 100644
--- a/lib/rdoc/rd/inline_parser.rb
+++ b/lib/rdoc/rd/inline_parser.rb
@@ -1,6 +1,6 @@
#
# DO NOT MODIFY!!!!
-# This file is automatically generated by Racc 1.4.9
+# This file is automatically generated by Racc 1.4.11
# from Racc grammer file "".
#
diff --git a/lib/rdoc/rdoc.rb b/lib/rdoc/rdoc.rb
index b41434ba39..4d45d47978 100644
--- a/lib/rdoc/rdoc.rb
+++ b/lib/rdoc/rdoc.rb
@@ -305,6 +305,9 @@ option)
when "directory" then
next if rel_file_name == "CVS" || rel_file_name == ".svn"
+ created_rid = File.join rel_file_name, "created.rid"
+ next if File.file? created_rid
+
dot_doc = File.join rel_file_name, RDoc::DOT_DOC_FILENAME
if File.file? dot_doc then
@@ -336,7 +339,7 @@ option)
# Parses +filename+ and returns an RDoc::TopLevel
def parse_file filename
- if defined?(Encoding) then
+ if Object.const_defined? :Encoding then
encoding = @options.encoding
filename = filename.encode encoding
end
@@ -411,8 +414,6 @@ The internal error was:
return [] if file_list.empty?
- file_info = []
-
@stats.begin_adding
file_info = file_list.map do |filename|
@@ -565,4 +566,5 @@ end
# require built-in generators after discovery in case they've been replaced
require 'rdoc/generator/darkfish'
require 'rdoc/generator/ri'
+require 'rdoc/generator/pot'
diff --git a/lib/rdoc/ruby_lex.rb b/lib/rdoc/ruby_lex.rb
index d470d2b5f8..91b90ab2cf 100644
--- a/lib/rdoc/ruby_lex.rb
+++ b/lib/rdoc/ruby_lex.rb
@@ -434,7 +434,7 @@ class RDoc::RubyLex
|op, io|
@ltype = "="
res = ''
- nil until (ch = getc) == "\n"
+ nil until getc == "\n"
until ( peek_equal?("=end") && peek(4) =~ /\s/ ) do
(ch = getc)
@@ -1184,9 +1184,9 @@ class RDoc::RubyLex
str = if ltype == quoted and %w[" ' /].include? ltype then
ltype.dup
elsif RUBY_VERSION > '1.9' then
- "%#{type or PERCENT_LTYPE.key ltype}#{PERCENT_PAREN_REV[quoted]}"
+ "%#{type or PERCENT_LTYPE.key ltype}#{PERCENT_PAREN_REV[quoted]||quoted}"
else
- "%#{type or PERCENT_LTYPE.index ltype}#{PERCENT_PAREN_REV[quoted]}"
+ "%#{type or PERCENT_LTYPE.index ltype}#{PERCENT_PAREN_REV[quoted]||quoted}"
end
subtype = nil
diff --git a/lib/rdoc/ruby_token.rb b/lib/rdoc/ruby_token.rb
index 8010475b92..f091e1a676 100644
--- a/lib/rdoc/ruby_token.rb
+++ b/lib/rdoc/ruby_token.rb
@@ -38,9 +38,9 @@ module RDoc::RubyToken
@text = text
end
- attr :seek
- attr :line_no
- attr :char_no
+ attr_reader :seek
+ attr_reader :line_no
+ attr_reader :char_no
attr_accessor :text
@@ -73,7 +73,7 @@ module RDoc::RubyToken
@node = node
end
- attr :node
+ attr_reader:node
def ==(other)
self.class == other.class and
@@ -101,7 +101,7 @@ module RDoc::RubyToken
super(seek, line_no, char_no)
@name = name
end
- attr :name
+ attr_reader:name
def ==(other)
self.class == other.class and
@@ -192,7 +192,7 @@ module RDoc::RubyToken
@text = nil
end
- attr :op
+ attr_reader:op
def ==(other)
self.class == other.class and
@@ -217,7 +217,7 @@ module RDoc::RubyToken
super(seek, line_no, char_no)
@name = name
end
- attr :name
+ attr_reader:name
def ==(other)
self.class == other.class and
diff --git a/lib/rdoc/rubygems_hook.rb b/lib/rdoc/rubygems_hook.rb
index b4393114f1..c4eaddbd97 100644
--- a/lib/rdoc/rubygems_hook.rb
+++ b/lib/rdoc/rubygems_hook.rb
@@ -153,7 +153,13 @@ class RDoc::RubygemsHook
options = nil
args = @spec.rdoc_options
- args.concat @spec.require_paths
+
+ if @spec.respond_to? :source_paths then
+ args.concat @spec.source_paths
+ else
+ args.concat @spec.require_paths
+ end
+
args.concat @spec.extra_rdoc_files
case config_args = Gem.configuration[:rdoc]
diff --git a/lib/rdoc/stats/normal.rb b/lib/rdoc/stats/normal.rb
index c971973bf1..ef366a500e 100644
--- a/lib/rdoc/stats/normal.rb
+++ b/lib/rdoc/stats/normal.rb
@@ -1,3 +1,8 @@
+begin
+ require 'io/console/size'
+rescue LoadError
+end
+
##
# Stats printer that prints just the files being documented with a progress
# bar
@@ -5,15 +10,14 @@
class RDoc::Stats::Normal < RDoc::Stats::Quiet
def begin_adding # :nodoc:
- puts "Parsing sources..." if $stdout.tty?
+ puts "Parsing sources..."
+ @last_width = 0
end
##
# Prints a file with a progress bar
def print_file files_so_far, filename
- return unless $stdout.tty?
-
progress_bar = sprintf("%3d%% [%2d/%2d] ",
100 * files_so_far / @num_files,
files_so_far,
@@ -21,7 +25,11 @@ class RDoc::Stats::Normal < RDoc::Stats::Quiet
# Print a progress bar, but make sure it fits on a single line. Filename
# will be truncated if necessary.
- terminal_width = (ENV['COLUMNS'] || 80).to_i
+ terminal_width = if defined?(IO) && IO.respond_to?(:console_size)
+ IO.console_size[1].to_i.nonzero? || 80
+ else
+ 80
+ end
max_filename_size = terminal_width - progress_bar.size
if filename.size > max_filename_size then
@@ -30,18 +38,21 @@ class RDoc::Stats::Normal < RDoc::Stats::Quiet
filename[0..2] = "..."
end
- # Pad the line with whitespaces so that leftover output from the
- # previous line doesn't show up.
line = "#{progress_bar}#{filename}"
- padding = terminal_width - line.size
- line << (" " * padding) if padding > 0
-
- $stdout.print("#{line}\r")
+ if $stdout.tty?
+ # Clean the line with whitespaces so that leftover output from the
+ # previous line doesn't show up.
+ $stdout.print("\r" << (" " * @last_width) << ("\b" * @last_width) << "\r") if @last_width && @last_width > 0
+ @last_width = line.size
+ $stdout.print("#{line}\r")
+ else
+ $stdout.puts(line)
+ end
$stdout.flush
end
def done_adding # :nodoc:
- puts if $stdout.tty?
+ puts
end
end
diff --git a/lib/rdoc/task.rb b/lib/rdoc/task.rb
index d347e4d6ab..a83939090d 100644
--- a/lib/rdoc/task.rb
+++ b/lib/rdoc/task.rb
@@ -291,7 +291,7 @@ class RDoc::Task < Rake::TaskLib
private
def rdoc_target
- "#{rdoc_dir}/index.html"
+ "#{rdoc_dir}/created.rid"
end
def rdoc_task_name
diff --git a/lib/rdoc/text.rb b/lib/rdoc/text.rb
index ef52500358..3a58641ec1 100644
--- a/lib/rdoc/text.rb
+++ b/lib/rdoc/text.rb
@@ -68,11 +68,11 @@ module RDoc::Text
expanded = []
text.each_line do |line|
- nil while line.gsub!(/(?:\G|\r)((?:.{8})*?)([^\t\r\n]{0,7})\t/) do
+ line.gsub!(/^((?:.{8})*?)([^\t\r\n]{0,7})\t/) do
r = "#{$1}#{$2}#{' ' * (8 - $2.size)}"
r.force_encoding text.encoding if Object.const_defined? :Encoding
r
- end
+ end until line !~ /\t/
expanded << line
end
@@ -103,6 +103,15 @@ module RDoc::Text
# Requires the including class to implement #formatter
def markup text
+ if @store.rdoc.options
+ locale = @store.rdoc.options.locale
+ else
+ locale = nil
+ end
+ if locale
+ i18n_text = RDoc::I18n::Text.new(text)
+ text = i18n_text.translate(locale)
+ end
parse(text).accept formatter
end
diff --git a/lib/rdoc/token_stream.rb b/lib/rdoc/token_stream.rb
index 851bc05bf5..b46b7da2f7 100644
--- a/lib/rdoc/token_stream.rb
+++ b/lib/rdoc/token_stream.rb
@@ -88,7 +88,7 @@ module RDoc::TokenStream
# Returns a string representation of the token stream
def tokens_to_s
- token_stream.map { |token| token.text }.join ''
+ token_stream.compact.map { |token| token.text }.join ''
end
end
diff --git a/lib/resolv.rb b/lib/resolv.rb
index 74618bfaab..9c7dd1b9b3 100644
--- a/lib/resolv.rb
+++ b/lib/resolv.rb
@@ -1,5 +1,4 @@
require 'socket'
-require 'fcntl'
require 'timeout'
require 'thread'
@@ -671,8 +670,8 @@ class Resolv
timelimit = start + tout
begin
sender.send
- rescue Errno::EHOSTUNREACH, # multi-homed IPv6 may generate this
- Errno::ENETUNREACH
+ rescue Errno::EHOSTUNREACH
+ # multi-homed IPv6 may generate this
raise ResolvTimeout
end
while true
@@ -750,7 +749,6 @@ class Resolv
next # The kernel doesn't support the address family.
end
sock.do_not_reverse_lookup = true
- sock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::F_SETFD
DNS.bind_random_port(sock, bind_host)
@socks << sock
@socks_hash[bind_host] = sock
@@ -804,7 +802,6 @@ class Resolv
sock = UDPSocket.new(is_ipv6 ? Socket::AF_INET6 : Socket::AF_INET)
@socks = [sock]
sock.do_not_reverse_lookup = true
- sock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::F_SETFD
DNS.bind_random_port(sock, is_ipv6 ? "::" : "0.0.0.0")
sock.connect(host, port)
end
@@ -862,7 +859,6 @@ class Resolv
@port = port
sock = TCPSocket.new(@host, @port)
@socks = [sock]
- sock.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::F_SETFD
@senders = {}
end
@@ -1070,10 +1066,6 @@ class Resolv
candidates = []
end
candidates.concat(@search.map {|domain| Name.new(name.to_a + domain)})
- fname = Name.create("#{name}.")
- if !candidates.include?(fname)
- candidates << fname
- end
end
return candidates
end
@@ -1183,7 +1175,7 @@ class Resolv
end
def inspect
- return "#<#{self.class} #{self.to_s}>"
+ return "#<#{self.class} #{self}>"
end
def ==(other)
@@ -1228,7 +1220,7 @@ class Resolv
end
def inspect # :nodoc:
- "#<#{self.class}: #{self.to_s}#{@absolute ? '.' : ''}>"
+ "#<#{self.class}: #{self}#{@absolute ? '.' : ''}>"
end
##
@@ -1240,8 +1232,7 @@ class Resolv
def ==(other) # :nodoc:
return false unless Name === other
- return false unless @absolute == other.absolute?
- return @labels == other.to_a
+ return @labels.join == other.to_a.join && @absolute == other.absolute?
end
alias eql? == # :nodoc:
@@ -1583,30 +1574,33 @@ class Resolv
return Name.new(self.get_labels)
end
- def get_labels(limit=nil)
- limit = @index if !limit || @index < limit
+ def get_labels
+ prev_index = @index
+ save_index = nil
d = []
while true
raise DecodeError.new("limit exceeded") if @limit <= @index
case @data[@index].ord
when 0
@index += 1
+ if save_index
+ @index = save_index
+ end
return d
when 192..255
idx = self.get_unpack('n')[0] & 0x3fff
- if limit <= idx
+ if prev_index <= idx
raise DecodeError.new("non-backward name pointer")
end
- save_index = @index
+ prev_index = idx
+ if !save_index
+ save_index = @index
+ end
@index = idx
- d += self.get_labels(limit)
- @index = save_index
- return d
else
d << self.get_label
end
end
- return d
end
def get_label
@@ -1667,10 +1661,10 @@ class Resolv
return false unless self.class == other.class
s_ivars = self.instance_variables
s_ivars.sort!
- s_ivars.delete :@ttl
+ s_ivars.delete "@ttl"
o_ivars = other.instance_variables
o_ivars.sort!
- o_ivars.delete :@ttl
+ o_ivars.delete "@ttl"
return s_ivars == o_ivars &&
s_ivars.collect {|name| self.instance_variable_get name} ==
o_ivars.collect {|name| other.instance_variable_get name}
@@ -1683,7 +1677,7 @@ class Resolv
def hash # :nodoc:
h = 0
vars = self.instance_variables
- vars.delete :@ttl
+ vars.delete "@ttl"
vars.each {|name|
h ^= self.instance_variable_get(name).hash
}
@@ -2352,7 +2346,7 @@ class Resolv
end
def inspect # :nodoc:
- return "#<#{self.class} #{self.to_s}>"
+ return "#<#{self.class} #{self}>"
end
##
@@ -2495,7 +2489,7 @@ class Resolv
end
def inspect # :nodoc:
- return "#<#{self.class} #{self.to_s}>"
+ return "#<#{self.class} #{self}>"
end
##
@@ -2645,7 +2639,7 @@ class Resolv
end
def inspect # :nodoc:
- return "#<#{self.class} #{self.to_s}>"
+ return "#<#{self.class} #{self}>"
end
def ==(other) # :nodoc:
@@ -2734,7 +2728,7 @@ class Resolv
end
def inspect # :nodoc:
- return "#<#{self.class} #{self.to_s}>"
+ return "#<#{self.class} #{self}>"
end
def ==(other) # :nodoc:
@@ -2796,7 +2790,7 @@ class Resolv
end
def inspect # :nodoc:
- return "#<#{self.class} #{self.to_s}>"
+ return "#<#{self.class} #{self}>"
end
def ==(other) # :nodoc:
diff --git a/lib/rexml/attribute.rb b/lib/rexml/attribute.rb
index 803d0217b1..ef9e544294 100644
--- a/lib/rexml/attribute.rb
+++ b/lib/rexml/attribute.rb
@@ -159,7 +159,7 @@ module REXML
self
end
- # Removes this Attribute from the tree, and returns true if successfull
+ # Removes this Attribute from the tree, and returns true if successful
#
# This method is usually not called directly.
def remove
diff --git a/lib/rexml/document.rb b/lib/rexml/document.rb
index f92eb62d95..8342b96e6a 100644
--- a/lib/rexml/document.rb
+++ b/lib/rexml/document.rb
@@ -123,7 +123,7 @@ module REXML
def xml_decl
rv = @children[0]
return rv if rv.kind_of? XMLDecl
- rv = @children.unshift(XMLDecl.default)[0]
+ @children.unshift(XMLDecl.default)[0]
end
# @return the XMLDecl version of this document as a String.
@@ -278,10 +278,6 @@ module REXML
end
end
- def document
- self
- end
-
private
def build( source )
Parsers::TreeParser.new( source, self ).parse
diff --git a/lib/rexml/dtd/dtd.rb b/lib/rexml/dtd/dtd.rb
index 966e39ea57..62317bac9e 100644
--- a/lib/rexml/dtd/dtd.rb
+++ b/lib/rexml/dtd/dtd.rb
@@ -24,23 +24,18 @@ module REXML
case input
when ElementDecl.PATTERN_RE
match = $&
- source = $'
contents << ElementDecl.new( match )
when AttlistDecl.PATTERN_RE
matchdata = $~
- source = $'
contents << AttlistDecl.new( matchdata )
when EntityDecl.PATTERN_RE
matchdata = $~
- source = $'
contents << EntityDecl.new( matchdata )
when Comment.PATTERN_RE
matchdata = $~
- source = $'
contents << Comment.new( matchdata )
when NotationDecl.PATTERN_RE
matchdata = $~
- source = $'
contents << NotationDecl.new( matchdata )
end
end
diff --git a/lib/rexml/element.rb b/lib/rexml/element.rb
index c30b150c0b..e459704d3c 100644
--- a/lib/rexml/element.rb
+++ b/lib/rexml/element.rb
@@ -206,7 +206,7 @@ module REXML
return namespaces
end
- # Evalutas to the URI for a prefix, or the empty string if no such
+ # Evaluates to the URI for a prefix, or the empty string if no such
# namespace is declared for this element. Evaluates recursively for
# ancestors. Returns the default namespace, if there is one.
# prefix::
@@ -1181,9 +1181,8 @@ module REXML
prefix = '' unless prefix
end
old = fetch(name, nil)
- attr = nil
if old.kind_of? Hash # the supplied attribute is one of many
- attr = old.delete(prefix)
+ old.delete(prefix)
if old.size == 1
repl = nil
old.each_value{|v| repl = v}
@@ -1192,7 +1191,6 @@ module REXML
elsif old.nil?
return @element
else # the supplied attribute is a top-level one
- attr = old
super(name)
end
@element
diff --git a/lib/rexml/entity.rb b/lib/rexml/entity.rb
index 3a35ec6b94..39f3900075 100644
--- a/lib/rexml/entity.rb
+++ b/lib/rexml/entity.rb
@@ -138,14 +138,8 @@ module REXML
matches = @value.scan(PEREFERENCE_RE)
rv = @value.clone
if @parent
- sum = 0
matches.each do |entity_reference|
entity_value = @parent.entity( entity_reference[0] )
- if sum + entity_value.bytesize > Security.entity_expansion_text_limit
- raise "entity expansion has grown too large"
- else
- sum += entity_value.bytesize
- end
rv.gsub!( /%#{entity_reference.join};/um, entity_value )
end
end
@@ -157,7 +151,6 @@ module REXML
# This is a set of entity constants -- the ones defined in the XML
# specification. These are +gt+, +lt+, +amp+, +quot+ and +apos+.
- # CAUTION: these entities does not have parent and document
module EntityConst
# +>+
GT = Entity.new( 'gt', '>' )
diff --git a/lib/rexml/functions.rb b/lib/rexml/functions.rb
index 20c8961aee..2010be14e0 100644
--- a/lib/rexml/functions.rb
+++ b/lib/rexml/functions.rb
@@ -363,7 +363,7 @@ module REXML
def Functions::sum( nodes )
nodes = [nodes] unless nodes.kind_of? Array
- nodes.inject(0) { |r,n| r += number(string(n)) }
+ nodes.inject(0) { |r,n| r + number(string(n)) }
end
def Functions::floor( number )
diff --git a/lib/rexml/parsers/xpathparser.rb b/lib/rexml/parsers/xpathparser.rb
index e643d11511..d30aa34f6e 100644
--- a/lib/rexml/parsers/xpathparser.rb
+++ b/lib/rexml/parsers/xpathparser.rb
@@ -21,7 +21,7 @@ module REXML
path.gsub!(/([\(\[])\s+/, '\1') # Strip ignorable spaces
path.gsub!( /\s+([\]\)])/, '\1')
parsed = []
- path = OrExpr(path, parsed)
+ OrExpr(path, parsed)
parsed
end
diff --git a/lib/rexml/source.rb b/lib/rexml/source.rb
index b653714b2f..a0bbe25de7 100644
--- a/lib/rexml/source.rb
+++ b/lib/rexml/source.rb
@@ -62,7 +62,7 @@ module REXML
# requirements; for another, the source can be consumed. You can easily
# confuse this method. Originally, the patterns were easier
# to construct and this method more robust, because this method
- # generated search regexes on the fly; however, this was
+ # generated search regexps on the fly; however, this was
# computationally expensive and slowed down the entire REXML package
# considerably, since this is by far the most commonly called method.
# @param pattern must be a Regexp, and must be in the form of
diff --git a/lib/rexml/streamlistener.rb b/lib/rexml/streamlistener.rb
index 8805ffba4d..3a0528c102 100644
--- a/lib/rexml/streamlistener.rb
+++ b/lib/rexml/streamlistener.rb
@@ -13,7 +13,7 @@ module REXML
def tag_start name, attrs
end
# Called when the end tag is reached. In the case of <tag/>, tag_end
- # will be called immidiately after tag_start
+ # will be called immediately after tag_start
# @p the name of the tag
def tag_end name
end
diff --git a/lib/rexml/xmltokens.rb b/lib/rexml/xmltokens.rb
index 7dc4e8b2ba..4d4dd27f2d 100644
--- a/lib/rexml/xmltokens.rb
+++ b/lib/rexml/xmltokens.rb
@@ -2,12 +2,78 @@ module REXML
# Defines a number of tokens used for parsing XML. Not for general
# consumption.
module XMLTokens
- NCNAME_STR= '[\w:][\-\w.]*'
- NAME_STR= "(?:#{NCNAME_STR}:)?#{NCNAME_STR}"
+ # From http://www.w3.org/TR/REC-xml/#sec-common-syn
+ #
+ # [4] NameStartChar ::=
+ # ":" |
+ # [A-Z] |
+ # "_" |
+ # [a-z] |
+ # [#xC0-#xD6] |
+ # [#xD8-#xF6] |
+ # [#xF8-#x2FF] |
+ # [#x370-#x37D] |
+ # [#x37F-#x1FFF] |
+ # [#x200C-#x200D] |
+ # [#x2070-#x218F] |
+ # [#x2C00-#x2FEF] |
+ # [#x3001-#xD7FF] |
+ # [#xF900-#xFDCF] |
+ # [#xFDF0-#xFFFD] |
+ # [#x10000-#xEFFFF]
+ name_start_chars = [
+ ":",
+ "A-Z",
+ "_",
+ "a-z",
+ "\\u00C0-\\u00D6",
+ "\\u00D8-\\u00F6",
+ "\\u00F8-\\u02FF",
+ "\\u0370-\\u037D",
+ "\\u037F-\\u1FFF",
+ "\\u200C-\\u200D",
+ "\\u2070-\\u218F",
+ "\\u2C00-\\u2FEF",
+ "\\u3001-\\uD7FF",
+ "\\uF900-\\uFDCF",
+ "\\uFDF0-\\uFFFD",
+ "\\u{10000}-\\u{EFFFF}",
+ ]
+ # From http://www.w3.org/TR/REC-xml/#sec-common-syn
+ #
+ # [4a] NameChar ::=
+ # NameStartChar |
+ # "-" |
+ # "." |
+ # [0-9] |
+ # #xB7 |
+ # [#x0300-#x036F] |
+ # [#x203F-#x2040]
+ name_chars = name_start_chars + [
+ "\\-",
+ "\\.",
+ "0-9",
+ "\\u00B7",
+ "\\u0300-\\u036F",
+ "\\u203F-\\u2040",
+ ]
+ NAME_START_CHAR = "[#{name_start_chars.join('')}]"
+ NAME_CHAR = "[#{name_chars.join('')}]"
+ NAMECHAR = NAME_CHAR # deprecated. Use NAME_CHAR instead.
- NAMECHAR = '[\-\w\.:]'
- NAME = "([\\w:]#{NAMECHAR}*)"
- NMTOKEN = "(?:#{NAMECHAR})+"
+ # From http://www.w3.org/TR/xml-names11/#NT-NCName
+ #
+ # [6] NCNameStartChar ::= NameStartChar - ':'
+ ncname_start_chars = name_start_chars - [":"]
+ # From http://www.w3.org/TR/xml-names11/#NT-NCName
+ #
+ # [5] NCNameChar ::= NameChar - ':'
+ ncname_chars = name_chars - [":"]
+ NCNAME_STR = "[#{ncname_start_chars.join('')}][#{ncname_chars.join('')}]*"
+ NAME_STR = "(?:#{NCNAME_STR}:)?#{NCNAME_STR}"
+
+ NAME = "(#{NAME_START_CHAR}#{NAME_CHAR}*)"
+ NMTOKEN = "(?:#{NAME_CHAR})+"
NMTOKENS = "#{NMTOKEN}(\\s+#{NMTOKEN})*"
REFERENCE = "(?:&#{NAME};|&#\\d+;|&#x[0-9a-fA-F]+;)"
diff --git a/lib/rexml/xpath_parser.rb b/lib/rexml/xpath_parser.rb
index 0fc9da2e08..367cbee1e8 100644
--- a/lib/rexml/xpath_parser.rb
+++ b/lib/rexml/xpath_parser.rb
@@ -63,19 +63,19 @@ module REXML
end
def parse path, nodeset
- #puts "#"*40
- path_stack = @parser.parse( path )
- #puts "PARSE: #{path} => #{path_stack.inspect}"
- #puts "PARSE: nodeset = #{nodeset.inspect}"
- match( path_stack, nodeset )
+ #puts "#"*40
+ path_stack = @parser.parse( path )
+ #puts "PARSE: #{path} => #{path_stack.inspect}"
+ #puts "PARSE: nodeset = #{nodeset.inspect}"
+ match( path_stack, nodeset )
end
def get_first path, nodeset
- #puts "#"*40
- path_stack = @parser.parse( path )
- #puts "PARSE: #{path} => #{path_stack.inspect}"
- #puts "PARSE: nodeset = #{nodeset.inspect}"
- first( path_stack, nodeset )
+ #puts "#"*40
+ path_stack = @parser.parse( path )
+ #puts "PARSE: #{path} => #{path_stack.inspect}"
+ #puts "PARSE: nodeset = #{nodeset.inspect}"
+ first( path_stack, nodeset )
end
def predicate path, nodeset
diff --git a/lib/rinda/ring.rb b/lib/rinda/ring.rb
index 2c29977d11..fe33420494 100644
--- a/lib/rinda/ring.rb
+++ b/lib/rinda/ring.rb
@@ -225,6 +225,7 @@ module Rinda
@w_services.each do |thread|
thread.kill
+ thread.join
end
@sockets.each do |socket|
@@ -232,6 +233,7 @@ module Rinda
end
@r_service.kill
+ @r_service.join
end
end
@@ -411,22 +413,26 @@ module Rinda
addrinfo = Addrinfo.udp(address, @port)
soc = Socket.new(addrinfo.pfamily, addrinfo.socktype, addrinfo.protocol)
+ begin
+ if addrinfo.ipv4_multicast? then
+ soc.setsockopt(Socket::Option.ipv4_multicast_loop(1))
+ soc.setsockopt(Socket::Option.ipv4_multicast_ttl(@multicast_hops))
+ elsif addrinfo.ipv6_multicast? then
+ soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_LOOP, true)
+ soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_HOPS,
+ [@multicast_hops].pack('I'))
+ soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_IF,
+ [@multicast_interface].pack('I'))
+ else
+ soc.setsockopt(:SOL_SOCKET, :SO_BROADCAST, true)
+ end
- if addrinfo.ipv4_multicast? then
- soc.setsockopt(Socket::Option.ipv4_multicast_loop(1))
- soc.setsockopt(Socket::Option.ipv4_multicast_ttl(@multicast_hops))
- elsif addrinfo.ipv6_multicast? then
- soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_LOOP, true)
- soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_HOPS,
- [@multicast_hops].pack('I'))
- soc.setsockopt(:IPPROTO_IPV6, :IPV6_MULTICAST_IF,
- [@multicast_interface].pack('I'))
- else
- soc.setsockopt(:SOL_SOCKET, :SO_BROADCAST, true)
+ soc.connect(addrinfo)
+ rescue Exception
+ soc.close
+ raise
end
- soc.connect(addrinfo)
-
soc
end
@@ -472,27 +478,3 @@ module Rinda
end
end
-
-if __FILE__ == $0
- DRb.start_service
- case ARGV.shift
- when 's'
- require 'rinda/tuplespace'
- ts = Rinda::TupleSpace.new
- Rinda::RingServer.new(ts)
- $stdin.gets
- when 'w'
- finger = Rinda::RingFinger.new(nil)
- finger.lookup_ring do |ts2|
- p ts2
- ts2.write([:hello, :world])
- end
- when 'r'
- finger = Rinda::RingFinger.new(nil)
- finger.lookup_ring do |ts2|
- p ts2
- p ts2.take([nil, nil])
- end
- end
-end
-
diff --git a/lib/rss/maker/base.rb b/lib/rss/maker/base.rb
index 36860032da..0f2fc11103 100644
--- a/lib/rss/maker/base.rb
+++ b/lib/rss/maker/base.rb
@@ -367,7 +367,7 @@ module RSS
self.date ||= self.dc_date
super
ensure
- date = keep[:date]
+ self.date = keep[:date]
dc_dates.replace(keep[:dc_dates])
end
diff --git a/lib/rss/rss.rb b/lib/rss/rss.rb
index 6c89598e2d..4f6732b4d2 100644
--- a/lib/rss/rss.rb
+++ b/lib/rss/rss.rb
@@ -28,7 +28,7 @@ class Time
datetime = apply_offset(*(datetime + [off]))
datetime << usec
time = Time.utc(*datetime)
- time.localtime unless zone_utc?(zone)
+ force_zone!(time, zone, off)
time
else
datetime << usec
@@ -105,7 +105,7 @@ module RSS
end
# Some tags must only exist a specific number of times in a given RSS feed.
- # If a feed has too many occurances of one of these tags, a TooMuchTagError
+ # If a feed has too many occurrences of one of these tags, a TooMuchTagError
# will be raised.
class TooMuchTagError < InvalidRSSError
attr_reader :tag, :parent
diff --git a/lib/rss/utils.rb b/lib/rss/utils.rb
index 5ed214159f..b420e6b24c 100644
--- a/lib/rss/utils.rb
+++ b/lib/rss/utils.rb
@@ -3,7 +3,7 @@ module RSS
##
# RSS::Utils is a module that holds various utility functions that are used
# across many parts of the rest of the RSS library. Like most modules named
- # some variant of 'util', its methods are probably not particuarly useful
+ # some variant of 'util', its methods are probably not particularly useful
# to those who aren't developing the library itself.
module Utils
module_function
diff --git a/lib/rss/xmlparser.rb b/lib/rss/xmlparser.rb
index 6af157a2f2..46df94a320 100644
--- a/lib/rss/xmlparser.rb
+++ b/lib/rss/xmlparser.rb
@@ -20,7 +20,7 @@ end
module XML
class Parser
unless defined?(Error)
- # This erorr is legacy, so we just set it to the new one
+ # This error is legacy, so we just set it to the new one
Error = ::XMLParserError # :nodoc:
end
end
diff --git a/lib/rubygems.rb b/lib/rubygems.rb
index ea1893046f..453520665a 100644
--- a/lib/rubygems.rb
+++ b/lib/rubygems.rb
@@ -6,9 +6,10 @@
#++
require 'rbconfig'
+require 'thread'
module Gem
- VERSION = '2.2.3'
+ VERSION = '2.4.1'
end
# Must be first since it unloads the prelude from 1.9.2
@@ -56,8 +57,8 @@ require 'rubygems/errors'
# RubyGems defaults are stored in rubygems/defaults.rb. If you're packaging
# RubyGems or implementing Ruby you can change RubyGems' defaults.
#
-# For RubyGems packagers, provide lib/rubygems/operating_system.rb and
-# override any defaults from lib/rubygems/defaults.rb.
+# For RubyGems packagers, provide lib/rubygems/defaults/operating_system.rb
+# and override any defaults from lib/rubygems/defaults.rb.
#
# For Ruby implementers, provide lib/rubygems/defaults/#{RUBY_ENGINE}.rb and
# override any defaults from lib/rubygems/defaults.rb.
@@ -83,7 +84,7 @@ require 'rubygems/errors'
# * Chad Fowler -- chad(at)chadfowler.com
# * David Black -- dblack(at)wobblini.net
# * Paul Brannan -- paul(at)atdesk.com
-# * Jim Weirch -- jim(at)weirichhouse.org
+# * Jim Weirich -- jim(at)weirichhouse.org
#
# Contributors:
#
@@ -156,6 +157,7 @@ module Gem
@configuration = nil
@loaded_specs = {}
+ LOADED_SPECS_MUTEX = Mutex.new
@path_to_default_spec_map = {}
@platforms = []
@ruby = nil
@@ -298,7 +300,7 @@ module Gem
end
##
- # The path the the data directory specified by the gem name. If the
+ # The path to the data directory specified by the gem name. If the
# package is not available as a gem, return nil.
def self.datadir(gem_name)
@@ -544,9 +546,9 @@ module Gem
# Fetching: minitest-3.0.1.gem (100%)
# => [#<Gem::Specification:0x1013b4528 @name="minitest", ...>]
- def self.install name, version = Gem::Requirement.default
+ def self.install name, version = Gem::Requirement.default, *options
require "rubygems/dependency_installer"
- inst = Gem::DependencyInstaller.new
+ inst = Gem::DependencyInstaller.new(*options)
inst.install name, version
inst.installed_gems
end
@@ -995,19 +997,31 @@ module Gem
end
##
- # Looks for gem dependency files (gem.deps.rb, Gemfile, Isolate) from the
- # current directory up and activates the gems in the first file found.
+ # Looks for a gem dependency file at +path+ and activates the gems in the
+ # file if found. If the file is not found an ArgumentError is raised.
+ #
+ # If +path+ is not given the RUBYGEMS_GEMDEPS environment variable is used,
+ # but if no file is found no exception is raised.
+ #
+ # If '-' is given for +path+ RubyGems searches up from the current working
+ # directory for gem dependency files (gem.deps.rb, Gemfile, Isolate) and
+ # activates the gems in the first one found.
#
# You can run this automatically when rubygems starts. To enable, set
# the <code>RUBYGEMS_GEMDEPS</code> environment variable to either the path
- # of your Gemfile or "-" to auto-discover in parent directories.
+ # of your gem dependencies file or "-" to auto-discover in parent
+ # directories.
#
# NOTE: Enabling automatic discovery on multiuser systems can lead to
# execution of arbitrary code when used from directories outside your
# control.
- def self.use_gemdeps
- return unless path = ENV['RUBYGEMS_GEMDEPS']
+ def self.use_gemdeps path = nil
+ raise_exception = path
+
+ path ||= ENV['RUBYGEMS_GEMDEPS']
+ return unless path
+
path = path.dup
if path == "-" then
@@ -1025,7 +1039,11 @@ module Gem
path.untaint
- return unless File.file? path
+ unless File.file? path then
+ return unless raise_exception
+
+ raise ArgumentError, "Unable to find gem dependencies file at #{path}"
+ end
rs = Gem::RequestSet.new
rs.load_gemdeps path
@@ -1035,6 +1053,10 @@ module Gem
sp.activate
sp
end
+ rescue Gem::LoadError, Gem::UnsatisfiableDependencyError => e
+ warn e.message
+ warn "You may need to `gem install -g` to install missing gems"
+ warn ""
end
class << self
diff --git a/lib/rubygems/available_set.rb b/lib/rubygems/available_set.rb
index fabdd6e79d..dae254b385 100644
--- a/lib/rubygems/available_set.rb
+++ b/lib/rubygems/available_set.rb
@@ -126,7 +126,7 @@ class Gem::AvailableSet
dep = req.dependency
match = @set.find_all do |t|
- dep.matches_spec? t.spec
+ dep.match? t.spec
end
match.map do |t|
diff --git a/lib/rubygems/basic_specification.rb b/lib/rubygems/basic_specification.rb
index 470a6ebc8b..f9eb193fb4 100644
--- a/lib/rubygems/basic_specification.rb
+++ b/lib/rubygems/basic_specification.rb
@@ -15,6 +15,11 @@ class Gem::BasicSpecification
attr_writer :extension_dir # :nodoc:
##
+ # Is this specification ignored for activation purposes?
+
+ attr_writer :ignored # :nodoc:
+
+ ##
# The path this gemspec was loaded from. This attribute is not persisted.
attr_reader :loaded_from
@@ -53,7 +58,16 @@ class Gem::BasicSpecification
# Return true if this spec can require +file+.
def contains_requirable_file? file
- build_extensions
+ if instance_variable_defined?(:@ignored) or
+ instance_variable_defined?('@ignored') then
+ return false
+ elsif missing_extensions? then
+ @ignored = true
+
+ warn "Ignoring #{full_name} because its extensions are not built. " +
+ "Try: gem pristine #{full_name}"
+ return false
+ end
suffixes = Gem.suffixes
@@ -120,11 +134,11 @@ class Gem::BasicSpecification
# activated.
def full_require_paths
- full_paths = @require_paths.map do |path|
+ full_paths = raw_require_paths.map do |path|
File.join full_gem_path, path
end
- full_paths.unshift extension_dir unless @extensions.empty?
+ full_paths.unshift extension_dir unless @extensions.nil? || @extensions.empty?
full_paths
end
@@ -176,7 +190,7 @@ class Gem::BasicSpecification
end
def raw_require_paths # :nodoc:
- @require_paths
+ Array(@require_paths)
end
##
@@ -197,13 +211,9 @@ class Gem::BasicSpecification
# spec.require_path = '.'
def require_paths
- return @require_paths if @extensions.empty?
-
- relative_extension_dir =
- File.join '..', '..', 'extensions', Gem::Platform.local.to_s,
- Gem.extension_api_version, full_name
+ return raw_require_paths if @extensions.nil? || @extensions.empty?
- [relative_extension_dir].concat @require_paths
+ [extension_dir].concat raw_require_paths
end
##
diff --git a/lib/rubygems/command.rb b/lib/rubygems/command.rb
index cba79b9196..0c6abec56c 100644
--- a/lib/rubygems/command.rb
+++ b/lib/rubygems/command.rb
@@ -148,6 +148,8 @@ class Gem::Command
##
# Display to the user that a gem couldn't be found and reasons why
+ #--
+ # TODO: replace +domain+ with a parameter to suppress suggestions
def show_lookup_failure(gem_name, version, errors, domain)
if errors and !errors.empty?
@@ -557,7 +559,8 @@ basic help message containing pointers to more information.
Further help:
gem help commands list all 'gem' commands
gem help examples show some examples of usage
- gem help platforms show information about platforms
+ gem help gem_dependencies gem dependencies file guide
+ gem help platforms gem platforms guide
gem help <COMMAND> show help on COMMAND
(e.g. 'gem help install')
gem server present a web page at
diff --git a/lib/rubygems/command_manager.rb b/lib/rubygems/command_manager.rb
index fdee064fed..53d18c29cc 100644
--- a/lib/rubygems/command_manager.rb
+++ b/lib/rubygems/command_manager.rb
@@ -48,6 +48,7 @@ class Gem::CommandManager
:list,
:lock,
:mirror,
+ :open,
:outdated,
:owner,
:pristine,
@@ -136,7 +137,7 @@ class Gem::CommandManager
def run(args, build_args=nil)
process_args(args, build_args)
rescue StandardError, Timeout::Error => ex
- alert_error "While executing gem ... (#{ex.class})\n #{ex.to_s}"
+ alert_error "While executing gem ... (#{ex.class})\n #{ex}"
ui.backtrace ex
terminate_interaction(1)
diff --git a/lib/rubygems/commands/cert_command.rb b/lib/rubygems/commands/cert_command.rb
index e417193bca..a920e7fcc3 100644
--- a/lib/rubygems/commands/cert_command.rb
+++ b/lib/rubygems/commands/cert_command.rb
@@ -129,23 +129,21 @@ class Gem::Commands::CertCommand < Gem::Command
end
def build_key # :nodoc:
- if options[:key] then
- options[:key]
- else
- passphrase = ask_for_password 'Passphrase for your Private Key:'
- say "\n"
+ return options[:key] if options[:key]
- passphrase_confirmation = ask_for_password 'Please repeat the passphrase for your Private Key:'
- say "\n"
+ passphrase = ask_for_password 'Passphrase for your Private Key:'
+ say "\n"
- raise Gem::CommandLineError,
- "Passphrase and passphrase confirmation don't match" unless passphrase == passphrase_confirmation
+ passphrase_confirmation = ask_for_password 'Please repeat the passphrase for your Private Key:'
+ say "\n"
- key = Gem::Security.create_key
- key_path = Gem::Security.write key, "gem-private_key.pem", 0600, passphrase
+ raise Gem::CommandLineError,
+ "Passphrase and passphrase confirmation don't match" unless passphrase == passphrase_confirmation
- return key, key_path
- end
+ key = Gem::Security.create_key
+ key_path = Gem::Security.write key, "gem-private_key.pem", 0600, passphrase
+
+ return key, key_path
end
def certificates_matching filter
diff --git a/lib/rubygems/commands/cleanup_command.rb b/lib/rubygems/commands/cleanup_command.rb
index c8f0082bfb..69975640fe 100644
--- a/lib/rubygems/commands/cleanup_command.rb
+++ b/lib/rubygems/commands/cleanup_command.rb
@@ -67,10 +67,10 @@ If no gems are named all gems in GEM_HOME are cleaned.
say "Clean Up Complete"
- if Gem.configuration.really_verbose then
+ verbose do
skipped = @default_gems.map { |spec| spec.full_name }
- say "Skipped default gems: #{skipped.join ', '}"
+ "Skipped default gems: #{skipped.join ', '}"
end
end
diff --git a/lib/rubygems/commands/contents_command.rb b/lib/rubygems/commands/contents_command.rb
index 603f1d072a..15657f31a2 100644
--- a/lib/rubygems/commands/contents_command.rb
+++ b/lib/rubygems/commands/contents_command.rb
@@ -8,7 +8,8 @@ class Gem::Commands::ContentsCommand < Gem::Command
def initialize
super 'contents', 'Display the contents of the installed gems',
- :specdirs => [], :lib_only => false, :prefix => true
+ :specdirs => [], :lib_only => false, :prefix => true,
+ :show_install_dir => false
add_version_option
@@ -32,6 +33,11 @@ class Gem::Commands::ContentsCommand < Gem::Command
options[:prefix] = prefix
end
+ add_option( '--[no-]show-install-dir',
+ 'Show only the gem install dir') do |show, options|
+ options[:show_install_dir] = show
+ end
+
@path_kind = nil
@spec_dirs = nil
@version = nil
@@ -65,7 +71,12 @@ prefix or only the files that are requireable.
names = gem_names
names.each do |name|
- found = gem_contents name
+ found =
+ if options[:show_install_dir] then
+ gem_install_dir name
+ else
+ gem_contents name
+ end
terminate_interaction 1 unless found or names.length > 1
end
@@ -115,6 +126,16 @@ prefix or only the files that are requireable.
true
end
+ def gem_install_dir name
+ spec = spec_for name
+
+ return false unless spec
+
+ say spec.gem_dir
+
+ true
+ end
+
def gem_names # :nodoc:
if options[:all] then
Gem::Specification.map(&:name)
diff --git a/lib/rubygems/commands/dependency_command.rb b/lib/rubygems/commands/dependency_command.rb
index c5d6dd7d70..4a54a3e385 100644
--- a/lib/rubygems/commands/dependency_command.rb
+++ b/lib/rubygems/commands/dependency_command.rb
@@ -31,7 +31,7 @@ class Gem::Commands::DependencyCommand < Gem::Command
end
def arguments # :nodoc:
- "GEMNAME name of gem to show dependencies for"
+ "REGEXP show dependencies for gems whose names start with REGEXP"
end
def defaults_str # :nodoc:
@@ -50,7 +50,7 @@ use with other commands.
end
def usage # :nodoc:
- "#{program_name} GEMNAME"
+ "#{program_name} REGEXP"
end
def fetch_remote_specs dependency # :nodoc:
diff --git a/lib/rubygems/commands/environment_command.rb b/lib/rubygems/commands/environment_command.rb
index d32d12b757..067d0b1607 100644
--- a/lib/rubygems/commands/environment_command.rb
+++ b/lib/rubygems/commands/environment_command.rb
@@ -28,8 +28,9 @@ The RubyGems environment can be controlled through command line arguments,
gemrc files, environment variables and built-in defaults.
Command line argument defaults and some RubyGems defaults can be set in a
-~/.gemrc file for individual users and a /etc/gemrc for all users. These
-files are YAML files with the following YAML keys:
+~/.gemrc file for individual users and a gemrc in the SYSTEM CONFIGURATION
+DIRECTORY for all users. These files are YAML files with the following YAML
+keys:
:sources: A YAML array of remote gem repositories to install gems from
:verbose: Verbosity of the gem command. false, true, and :really are the
@@ -120,6 +121,8 @@ lib/rubygems/defaults/operating_system.rb
out << " - SPEC CACHE DIRECTORY: #{Gem.spec_cache_dir}\n"
+ out << " - SYSTEM CONFIGURATION DIRECTORY: #{Gem::ConfigFile::SYSTEM_CONFIG_PATH}\n"
+
out << " - RUBYGEMS PLATFORMS:\n"
Gem.platforms.each do |platform|
out << " - #{platform}\n"
diff --git a/lib/rubygems/commands/help_command.rb b/lib/rubygems/commands/help_command.rb
index ed7be903ac..ed81ad6e25 100644
--- a/lib/rubygems/commands/help_command.rb
+++ b/lib/rubygems/commands/help_command.rb
@@ -52,6 +52,183 @@ Some examples of 'gem' usage.
gem update --system
EOF
+ GEM_DEPENDENCIES = <<-EOF
+A gem dependencies file allows installation of a consistent set of gems across
+multiple environments. The RubyGems implementation is designed to be
+compatible with Bundler's Gemfile format. You can see additional
+documentation on the format at:
+
+ http://bundler.io
+
+RubyGems automatically looks for these gem dependencies files:
+
+* gem.deps.rb
+* Gemfile
+* Isolate
+
+These files are looked up automatically using `gem install -g`, or you can
+specify a custom file.
+
+When the RUBYGEMS_GEMDEPS environment variable is set to a gem dependencies
+file the gems from that file will be activated at startup time. Set it to a
+specific filename or to "-" to have RubyGems automatically discover the gem
+dependencies file by walking up from the current directory.
+
+You can also activate gem dependencies at program startup using
+Gem.use_gemdeps.
+
+NOTE: Enabling automatic discovery on multiuser systems can lead to execution
+of arbitrary code when used from directories outside your control.
+
+Gem Dependencies
+================
+
+Use #gem to declare which gems you directly depend upon:
+
+ gem 'rake'
+
+To depend on a specific set of versions:
+
+ gem 'rake', '~> 10.3', '>= 10.3.2'
+
+RubyGems will require the gem name when activating the gem using
+the RUBYGEMS_GEMDEPS environment variable or Gem::use_gemdeps. Use the
+require: option to override this behavior if the gem does not have a file of
+that name or you don't want to require those files:
+
+ gem 'my_gem', require: 'other_file'
+
+To prevent RubyGems from requiring any files use:
+
+ gem 'my_gem', require: false
+
+To load dependencies from a .gemspec file:
+
+ gemspec
+
+RubyGems looks for the first .gemspec file in the current directory. To
+override this use the name: option:
+
+ gemspec name: 'specific_gem'
+
+To look in a different directory use the path: option:
+
+ gemspec name: 'specific_gem', path: 'gemspecs'
+
+To depend on a gem unpacked into a local directory:
+
+ gem 'modified_gem', path: 'vendor/modified_gem'
+
+To depend on a gem from git:
+
+ gem 'private_gem', git: 'git@my.company.example:private_gem.git'
+
+To depend on a gem from github:
+
+ gem 'private_gem', github: 'my_company/private_gem'
+
+To depend on a gem from a github gist:
+
+ gem 'bang', gist: '1232884'
+
+Git, github and gist support the ref:, branch: and tag: options to specify a
+commit reference or hash, branch or tag respectively to use for the gem.
+
+Setting the submodules: option to true for git, github and gist dependencies
+causes fetching of submodules when fetching the repository.
+
+You can depend on multiple gems from a single repository with the git method:
+
+ git 'https://github.com/rails/rails.git' do
+ gem 'activesupport'
+ gem 'activerecord'
+ end
+
+Gem Sources
+===========
+
+RubyGems uses the default sources for regular `gem install` for gem
+dependencies files. Unlike bundler, you do need to specify a source.
+
+You can override the sources used for downloading gems with:
+
+ source 'https://gem_server.example'
+
+You may specify multiple sources. Unlike bundler the prepend: option is not
+supported. Sources are used in-order, to prepend a source place it at the
+front of the list.
+
+Gem Platform
+============
+
+You can restrict gem dependencies to specific platforms with the #platform
+and #platforms methods:
+
+ platform :ruby_21 do
+ gem 'debugger'
+ end
+
+See the bundler Gemfile manual page for a list of platforms supported in a gem
+dependencies file.:
+
+ http://bundler.io/v1.6/man/gemfile.5.html
+
+Ruby Version and Engine Dependency
+==================================
+
+You can specifiy the version, engine and engine version of ruby to use with
+your gem dependencies file. If you are not running the specified version
+RubyGems will raise an exception.
+
+To depend on a specific version of ruby:
+
+ ruby '2.1.2'
+
+To depend on a specific ruby engine:
+
+ ruby '1.9.3', engine: 'jruby'
+
+To depend on a specific ruby engine version:
+
+ ruby '1.9.3', engine: 'jruby', engine_version: '1.7.11'
+
+Grouping Dependencies
+=====================
+
+Gem dependencies may be placed in groups that can be excluded from install.
+Dependencies required for development or testing of your code may be excluded
+when installed in a production environment.
+
+A #gem dependency may be placed in a group using the group: option:
+
+ gem 'minitest', group: :test
+
+To install dependencies from a gemfile without specific groups use the
+`--without` option for `gem install -g`:
+
+ $ gem install -g --without test
+
+The group: option also accepts multiple groups if the gem fits in multiple
+categories.
+
+Multiple groups may be excluded during install by comma-separating the groups for `--without` or by specifying `--without` multiple times.
+
+The #group method can also be used to place gems in groups:
+
+ group :test do
+ gem 'minitest'
+ gem 'minitest-emoji'
+ end
+
+The #group method allows multiple groups.
+
+The #gemspec development dependencies are placed in the :development group by
+default. This may be overriden with the :development_group option:
+
+ gemspec development_group: :other
+
+ EOF
+
PLATFORMS = <<-'EOF'
RubyGems platforms are composed of three parts, a CPU, an OS, and a
version. These values are taken from values in rbconfig.rb. You can view
@@ -90,6 +267,16 @@ When building platform gems, set the platform in the gem specification to
Gem::Platform::CURRENT. This will correctly mark the gem with your ruby's
platform.
EOF
+
+ # NOTE when updating also update Gem::Command::HELP
+
+ SUBCOMMANDS = [
+ ["commands", :show_commands],
+ ["options", Gem::Command::HELP],
+ ["examples", EXAMPLES],
+ ["gem_dependencies", GEM_DEPENDENCIES],
+ ["platforms", PLATFORMS],
+ ]
# :startdoc:
def initialize
@@ -98,15 +285,6 @@ platform.
@command_manager = Gem::CommandManager.instance
end
- def arguments # :nodoc:
- args = <<-EOF
- commands List all 'gem' commands
- examples Show examples of 'gem' usage
- <command> Show specific help for <command>
- EOF
- return args.gsub(/^\s+/, '')
- end
-
def usage # :nodoc:
"#{program_name} ARGUMENT"
end
@@ -114,19 +292,20 @@ platform.
def execute
arg = options[:args][0]
- if begins? "commands", arg then
- show_commands
-
- elsif begins? "options", arg then
- say Gem::Command::HELP
-
- elsif begins? "examples", arg then
- say EXAMPLES
+ _, help = SUBCOMMANDS.find do |command,|
+ begins? command, arg
+ end
- elsif begins? "platforms", arg then
- say PLATFORMS
+ if help then
+ if Symbol === help then
+ send help
+ else
+ say help
+ end
+ return
+ end
- elsif options[:help] then
+ if options[:help] then
show_help
elsif arg then
diff --git a/lib/rubygems/commands/install_command.rb b/lib/rubygems/commands/install_command.rb
index 8219eef6ea..1bf5928ebb 100644
--- a/lib/rubygems/commands/install_command.rb
+++ b/lib/rubygems/commands/install_command.rb
@@ -21,6 +21,8 @@ class Gem::Commands::InstallCommand < Gem::Command
def initialize
defaults = Gem::DependencyInstaller::DEFAULT_OPTIONS.merge({
:format_executable => false,
+ :lock => true,
+ :suggest_alternate => true,
:version => Gem::Requirement.default,
:without_groups => [],
})
@@ -69,6 +71,16 @@ class Gem::Commands::InstallCommand < Gem::Command
o[:explain] = v
end
+ add_option(:"Install/Update", '--[no-]lock',
+ 'Create a lock file (when used with -g/--file)') do |v,o|
+ o[:lock] = v
+ end
+
+ add_option(:"Install/Update", '--[no-]suggestions',
+ 'Suggest alternates when gems are not found') do |v,o|
+ o[:suggest_alternate] = v
+ end
+
@installed_specs = []
end
@@ -78,7 +90,7 @@ class Gem::Commands::InstallCommand < Gem::Command
def defaults_str # :nodoc:
"--both --version '#{Gem::Requirement.default}' --document --no-force\n" +
- "--install-dir #{Gem.dir}"
+ "--install-dir #{Gem.dir} --lock"
end
def description # :nodoc:
@@ -92,6 +104,25 @@ The wrapper allows you to choose among alternate gem versions using _version_.
For example `rake _0.7.3_ --version` will run rake version 0.7.3 if a newer
version is also installed.
+Gem Dependency Files
+====================
+
+RubyGems can install a consistent set of gems across multiple environments
+using `gem install -g` when a gem dependencies file (gem.deps.rb, Gemfile or
+Isolate) is present. If no explicit file is given RubyGems attempts to find
+one in the current directory.
+
+When the RUBYGEMS_GEMDEPS environment variable is set to a gem dependencies
+file the gems from that file will be activated at startup time. Set it to a
+specific filename or to "-" to have RubyGems automatically discover the gem
+dependencies file by walking up from the current directory.
+
+NOTE: Enabling automatic discovery on multiuser systems can lead to
+execution of arbitrary code when used from directories outside your control.
+
+Extension Install Failures
+==========================
+
If an extension fails to compile during gem installation the gem
specification is not written out, but the gem remains unpacked in the
repository. You may need to specify the path to the library's headers and
@@ -204,23 +235,20 @@ to write the specification by hand. For example:
install_gem_without_dependencies name, req
else
inst = Gem::DependencyInstaller.new options
+ request_set = inst.resolve_dependencies name, req
if options[:explain]
- request_set = inst.resolve_dependencies name, req
-
puts "Gems to install:"
- request_set.specs.map { |s| s.full_name }.sort.each do |s|
- puts " #{s}"
+ request_set.sorted_requests.each do |s|
+ puts " #{s.full_name}"
end
return
else
- inst.install name, req
+ @installed_specs.concat request_set.install options
end
- @installed_specs.push(*inst.installed_gems)
-
show_install_errors inst.errors
end
end
@@ -250,6 +278,14 @@ to write the specification by hand. For example:
inst = Gem::Installer.new gem, options
inst.install
+ require 'rubygems/dependency_installer'
+ dinst = Gem::DependencyInstaller.new options
+ dinst.installed_gems.replace [inst.spec]
+
+ Gem.done_installing_hooks.each do |hook|
+ hook.call dinst, [inst.spec]
+ end unless Gem.done_installing_hooks.empty?
+
@installed_specs.push(inst.spec)
end
@@ -264,8 +300,10 @@ to write the specification by hand. For example:
rescue Gem::InstallError => e
alert_error "Error installing #{gem_name}:\n\t#{e.message}"
exit_code |= 1
- rescue Gem::GemNotFoundException => e
- show_lookup_failure e.name, e.version, e.errors, options[:domain]
+ rescue Gem::GemNotFoundException, Gem::UnsatisfiableDependencyError => e
+ domain = options[:domain]
+ domain = :local unless options[:suggest_alternate]
+ show_lookup_failure e.name, e.version, e.errors, domain
exit_code |= 2
end
diff --git a/lib/rubygems/commands/list_command.rb b/lib/rubygems/commands/list_command.rb
index 4edeabef02..c6ff237311 100644
--- a/lib/rubygems/commands/list_command.rb
+++ b/lib/rubygems/commands/list_command.rb
@@ -8,13 +8,13 @@ require 'rubygems/commands/query_command'
class Gem::Commands::ListCommand < Gem::Commands::QueryCommand
def initialize
- super 'list', 'Display local gems whose name starts with STRING'
+ super 'list', 'Display local gems whose name matches REGEXP'
remove_option('--name-matches')
end
def arguments # :nodoc:
- "STRING start of gem name to look for"
+ "REGEXP regexp to look for in gem name"
end
def defaults_str # :nodoc:
diff --git a/lib/rubygems/commands/open_command.rb b/lib/rubygems/commands/open_command.rb
new file mode 100644
index 0000000000..91963bba73
--- /dev/null
+++ b/lib/rubygems/commands/open_command.rb
@@ -0,0 +1,74 @@
+require 'English'
+require 'rubygems/command'
+require 'rubygems/version_option'
+require 'rubygems/util'
+
+class Gem::Commands::OpenCommand < Gem::Command
+
+ include Gem::VersionOption
+
+ def initialize
+ super 'open', 'Open gem sources in editor'
+
+ add_option('-e', '--editor EDITOR', String,
+ "Opens gem sources in EDITOR") do |editor, options|
+ options[:editor] = editor || get_env_editor
+ end
+ end
+
+ def arguments # :nodoc:
+ "GEMNAME name of gem to open in editor"
+ end
+
+ def defaults_str # :nodoc:
+ "-e #{get_env_editor}"
+ end
+
+ def description # :nodoc:
+ <<-EOF
+ The open command opens gem in editor and changes current path
+ to gem's source directory. Editor can be specified with -e option,
+ otherwise rubygems will look for editor in $EDITOR, $VISUAL and
+ $GEM_EDITOR variables.
+ EOF
+ end
+
+ def usage # :nodoc:
+ "#{program_name} GEMNAME [-e EDITOR]"
+ end
+
+ def get_env_editor
+ ENV['GEM_EDITOR'] ||
+ ENV['VISUAL'] ||
+ ENV['EDITOR'] ||
+ 'vi'
+ end
+
+ def execute
+ @version = options[:version] || Gem::Requirement.default
+ @editor = options[:editor] || get_env_editor
+
+ found = open_gem(get_one_gem_name)
+
+ terminate_interaction 1 unless found
+ end
+
+ def open_gem name
+ spec = spec_for name
+ return false unless spec
+
+ open_editor(spec.full_gem_path)
+ end
+
+ def open_editor path
+ system(*@editor.split(/\s+/) + [path])
+ end
+
+ def spec_for name
+ spec = Gem::Specification.find_all_by_name(name, @version).last
+
+ return spec if spec
+
+ say "Unable to find gem '#{name}'"
+ end
+end
diff --git a/lib/rubygems/commands/owner_command.rb b/lib/rubygems/commands/owner_command.rb
index 13b8793021..322bf6590a 100644
--- a/lib/rubygems/commands/owner_command.rb
+++ b/lib/rubygems/commands/owner_command.rb
@@ -86,7 +86,9 @@ permission to.
request.add_field "Authorization", api_key
end
- with_response response, "Removing #{owner}"
+ action = method == :delete ? "Removing" : "Adding"
+
+ with_response response, "#{action} #{owner}"
rescue
# ignore
end
diff --git a/lib/rubygems/commands/search_command.rb b/lib/rubygems/commands/search_command.rb
index 5809690735..a1e2c1a00e 100644
--- a/lib/rubygems/commands/search_command.rb
+++ b/lib/rubygems/commands/search_command.rb
@@ -4,7 +4,7 @@ require 'rubygems/commands/query_command'
class Gem::Commands::SearchCommand < Gem::Commands::QueryCommand
def initialize
- super 'search', 'Display remote gems whose name contains STRING'
+ super 'search', 'Display remote gems whose name matches REGEXP'
remove_option '--name-matches'
@@ -12,7 +12,7 @@ class Gem::Commands::SearchCommand < Gem::Commands::QueryCommand
end
def arguments # :nodoc:
- "STRING fragment of gem name to search for"
+ "REGEXP regexp to search for in gem name"
end
def defaults_str # :nodoc:
@@ -21,8 +21,8 @@ class Gem::Commands::SearchCommand < Gem::Commands::QueryCommand
def description # :nodoc:
<<-EOF
-The search command displays remote gems whose name contains the given
-string.
+The search command displays remote gems whose name matches the given
+regexp.
The --details option displays additional details from the gem but will
take a little longer to complete as it must download the information
@@ -33,7 +33,7 @@ To list local gems use the list command.
end
def usage # :nodoc:
- "#{program_name} [STRING]"
+ "#{program_name} [REGEXP]"
end
end
diff --git a/lib/rubygems/commands/setup_command.rb b/lib/rubygems/commands/setup_command.rb
index 681db0dc1d..6617396780 100644
--- a/lib/rubygems/commands/setup_command.rb
+++ b/lib/rubygems/commands/setup_command.rb
@@ -446,7 +446,7 @@ abort "#{deprecation_message}"
history.force_encoding Encoding::UTF_8 if
Object.const_defined? :Encoding
- history = history.sub(/^# coding:.*?^=/m, '')
+ history = history.sub(/^# coding:.*?(?=^=)/m, '')
text = history.split(HISTORY_HEADER)
text.shift # correct an off-by-one generated by split
diff --git a/lib/rubygems/commands/uninstall_command.rb b/lib/rubygems/commands/uninstall_command.rb
index e62095a336..71ffdc89fc 100644
--- a/lib/rubygems/commands/uninstall_command.rb
+++ b/lib/rubygems/commands/uninstall_command.rb
@@ -15,7 +15,7 @@ class Gem::Commands::UninstallCommand < Gem::Command
def initialize
super 'uninstall', 'Uninstall gems from the local repository',
:version => Gem::Requirement.default, :user_install => true,
- :check_dev => false
+ :check_dev => false, :vendor => false
add_option('-a', '--[no-]all',
'Uninstall all matching versions'
@@ -76,6 +76,18 @@ class Gem::Commands::UninstallCommand < Gem::Command
add_version_option
add_platform_option
+
+ add_option('--vendor',
+ 'Uninstall gem from the vendor directory.',
+ 'Only for use by gem repackagers.') do |value, options|
+ unless Gem.vendor_dir then
+ raise OptionParser::InvalidOption.new 'your platform is not supported'
+ end
+
+ alert_warning 'Use your OS package manager to uninstall vendor gems'
+ options[:vendor] = true
+ options[:install_dir] = Gem.vendor_dir
+ end
end
def arguments # :nodoc:
diff --git a/lib/rubygems/commands/update_command.rb b/lib/rubygems/commands/update_command.rb
index b4ee59b3bb..9e9bd088f2 100644
--- a/lib/rubygems/commands/update_command.rb
+++ b/lib/rubygems/commands/update_command.rb
@@ -16,6 +16,8 @@ class Gem::Commands::UpdateCommand < Gem::Command
attr_reader :installer # :nodoc:
+ attr_reader :updated # :nodoc:
+
def initialize
super 'update', 'Update installed gems to the latest version',
:document => %w[rdoc ri],
@@ -45,7 +47,7 @@ class Gem::Commands::UpdateCommand < Gem::Command
end
def arguments # :nodoc:
- "GEMNAME name of gem to update"
+ "REGEXP regexp to search for in gem name"
end
def defaults_str # :nodoc:
@@ -56,13 +58,13 @@ class Gem::Commands::UpdateCommand < Gem::Command
<<-EOF
The update command will update your gems to the latest version.
-The update comamnd does not remove the previous version. Use the cleanup
+The update command does not remove the previous version. Use the cleanup
command to remove old versions.
EOF
end
def usage # :nodoc:
- "#{program_name} GEMNAME [GEMNAME ...]"
+ "#{program_name} REGEXP [REGEXP ...]"
end
def check_latest_rubygems version # :nodoc:
@@ -97,10 +99,14 @@ command to remove old versions.
updated = update_gems gems_to_update
+ updated_names = updated.map { |spec| spec.name }
+ not_updated_names = options[:args].uniq - updated_names
+
if updated.empty? then
say "Nothing to update"
else
- say "Gems updated: #{updated.map { |spec| spec.name }.join ' '}"
+ say "Gems updated: #{updated_names.join(' ')}"
+ say "Gems already up-to-date: #{not_updated_names.join(' ')}" unless not_updated_names.empty?
end
end
@@ -199,15 +205,11 @@ command to remove old versions.
@installer ||= Gem::DependencyInstaller.new options
- success = false
-
say "Updating #{name}"
begin
@installer.install name, Gem::Requirement.new(version)
- success = true
- rescue Gem::InstallError => e
+ rescue Gem::InstallError, Gem::DependencyError => e
alert_error "Error installing #{name}:\n\t#{e.message}"
- success = false
end
@installer.installed_gems.each do |spec|
@@ -259,7 +261,7 @@ command to remove old versions.
highest_installed_gems.each do |l_name, l_spec|
next if not gem_names.empty? and
- gem_names.all? { |name| /#{name}/ !~ l_spec.name }
+ gem_names.none? { |name| name == l_spec.name }
highest_remote_ver = highest_remote_version l_spec
@@ -272,4 +274,3 @@ command to remove old versions.
end
end
-
diff --git a/lib/rubygems/commands/yank_command.rb b/lib/rubygems/commands/yank_command.rb
index 2285bb4017..3c7859e763 100644
--- a/lib/rubygems/commands/yank_command.rb
+++ b/lib/rubygems/commands/yank_command.rb
@@ -44,10 +44,7 @@ as the reason for the removal request.
options[:undo] = true
end
- add_option('-k', '--key KEY_NAME',
- 'Use API key from your gem credentials file') do |value, options|
- options[:key] = value
- end
+ add_key_option
end
def execute
@@ -55,14 +52,12 @@ as the reason for the removal request.
version = get_version_from_requirements(options[:version])
platform = get_platform_from_requirements(options)
- api_key = Gem.configuration.rubygems_api_key
- api_key = Gem.configuration.api_keys[options[:key].to_sym] if options[:key]
if version then
if options[:undo] then
- unyank_gem(version, platform, api_key)
+ unyank_gem(version, platform)
else
- yank_gem(version, platform, api_key)
+ yank_gem(version, platform)
end
else
say "A version argument is required: #{usage}"
@@ -70,19 +65,19 @@ as the reason for the removal request.
end
end
- def yank_gem(version, platform, api_key)
+ def yank_gem(version, platform)
say "Yanking gem from #{self.host}..."
- yank_api_request(:delete, version, platform, "api/v1/gems/yank", api_key)
+ yank_api_request(:delete, version, platform, "api/v1/gems/yank")
end
- def unyank_gem(version, platform, api_key)
+ def unyank_gem(version, platform)
say "Unyanking gem from #{host}..."
- yank_api_request(:put, version, platform, "api/v1/gems/unyank", api_key)
+ yank_api_request(:put, version, platform, "api/v1/gems/unyank")
end
private
- def yank_api_request(method, version, platform, api, api_key)
+ def yank_api_request(method, version, platform, api)
name = get_one_gem_name
response = rubygems_api_request(method, api) do |request|
request.add_field("Authorization", api_key)
diff --git a/lib/rubygems/config_file.rb b/lib/rubygems/config_file.rb
index cf14017ea2..1bdc79ae06 100644
--- a/lib/rubygems/config_file.rb
+++ b/lib/rubygems/config_file.rb
@@ -57,7 +57,7 @@ class Gem::ConfigFile
# :stopdoc:
- system_config_path =
+ SYSTEM_CONFIG_PATH =
begin
require "etc"
Etc.sysconfdir
@@ -86,7 +86,7 @@ class Gem::ConfigFile
# :startdoc:
- SYSTEM_WIDE_CONFIG_FILE = File.join system_config_path, 'gemrc'
+ SYSTEM_WIDE_CONFIG_FILE = File.join SYSTEM_CONFIG_PATH, 'gemrc'
##
# List of arguments supplied to the config file object.
@@ -337,7 +337,7 @@ if you believe they were disclosed to a third party.
end
return content
rescue *YAMLErrors => e
- warn "Failed to load #{filename}, #{e.to_s}"
+ warn "Failed to load #{filename}, #{e}"
rescue Errno::EACCES
warn "Failed to load #{filename} due to permissions problem."
end
@@ -383,6 +383,8 @@ if you believe they were disclosed to a third party.
@backtrace = true
when /^--debug$/ then
$DEBUG = true
+
+ warn 'NOTE: Debugging mode prints all exceptions even when rescued'
else
@args << arg
end
@@ -428,6 +430,15 @@ if you believe they were disclosed to a third party.
DEFAULT_VERBOSITY
end
+ yaml_hash[:ssl_verify_mode] =
+ @hash[:ssl_verify_mode] if @hash.key? :ssl_verify_mode
+
+ yaml_hash[:ssl_ca_cert] =
+ @hash[:ssl_ca_cert] if @hash.key? :ssl_ca_cert
+
+ yaml_hash[:ssl_client_cert] =
+ @hash[:ssl_client_cert] if @hash.key? :ssl_client_cert
+
keys = yaml_hash.keys.map { |key| key.to_s }
keys << 'debug'
re = Regexp.union(*keys)
diff --git a/lib/rubygems/core_ext/kernel_gem.rb b/lib/rubygems/core_ext/kernel_gem.rb
index 3405233ab1..edce4ee10b 100644
--- a/lib/rubygems/core_ext/kernel_gem.rb
+++ b/lib/rubygems/core_ext/kernel_gem.rb
@@ -26,6 +26,11 @@ module Kernel
# Kernel#gem should be called *before* any require statements (otherwise
# RubyGems may load a conflicting library version).
#
+ # Kernel#gem only loads prerelease versions when prerelease +requirements+
+ # are given:
+ #
+ # gem 'rake', '>= 1.1.a', '< 2'
+ #
# In older RubyGems versions, the environment variable GEM_SKIP could be
# used to skip activation of specified gems, for example to test out changes
# that haven't been installed yet. Now RubyGems defers to -I and the
@@ -51,7 +56,9 @@ module Kernel
end
spec = Gem::Dependency.new(gem_name, *requirements).to_spec
- spec.activate if spec
+ Gem::LOADED_SPECS_MUTEX.synchronize {
+ spec.activate
+ } if spec
end
private :gem
diff --git a/lib/rubygems/core_ext/kernel_require.rb b/lib/rubygems/core_ext/kernel_require.rb
index 84bb03f67d..bf9618d3bf 100755
--- a/lib/rubygems/core_ext/kernel_require.rb
+++ b/lib/rubygems/core_ext/kernel_require.rb
@@ -50,12 +50,8 @@ module Kernel
# normal require handle loading a gem from the rescue below.
if Gem::Specification.unresolved_deps.empty? then
- begin
- RUBYGEMS_ACTIVATION_MONITOR.exit
- return gem_original_require(path)
- ensure
- RUBYGEMS_ACTIVATION_MONITOR.enter
- end
+ RUBYGEMS_ACTIVATION_MONITOR.exit
+ return gem_original_require(path)
end
# If +path+ is for a gem that has already been loaded, don't
@@ -71,8 +67,6 @@ module Kernel
begin
RUBYGEMS_ACTIVATION_MONITOR.exit
return gem_original_require(path)
- ensure
- RUBYGEMS_ACTIVATION_MONITOR.enter
end if spec
# Attempt to find +path+ in any unresolved gems...
@@ -105,6 +99,7 @@ module Kernel
names = found_specs.map(&:name).uniq
if names.size > 1 then
+ RUBYGEMS_ACTIVATION_MONITOR.exit
raise Gem::LoadError, "#{path} found in multiple gems: #{names.join ', '}"
end
@@ -115,32 +110,27 @@ module Kernel
unless valid then
le = Gem::LoadError.new "unable to find a version of '#{names.first}' to activate"
le.name = names.first
+ RUBYGEMS_ACTIVATION_MONITOR.exit
raise le
end
valid.activate
end
- begin
- RUBYGEMS_ACTIVATION_MONITOR.exit
- return gem_original_require(path)
- ensure
- RUBYGEMS_ACTIVATION_MONITOR.enter
- end
+ RUBYGEMS_ACTIVATION_MONITOR.exit
+ return gem_original_require(path)
rescue LoadError => load_error
+ RUBYGEMS_ACTIVATION_MONITOR.enter
+
if load_error.message.start_with?("Could not find") or
(load_error.message.end_with?(path) and Gem.try_activate(path)) then
- begin
- RUBYGEMS_ACTIVATION_MONITOR.exit
- return gem_original_require(path)
- ensure
- RUBYGEMS_ACTIVATION_MONITOR.enter
- end
+ RUBYGEMS_ACTIVATION_MONITOR.exit
+ return gem_original_require(path)
+ else
+ RUBYGEMS_ACTIVATION_MONITOR.exit
end
raise load_error
- ensure
- RUBYGEMS_ACTIVATION_MONITOR.exit
end
private :require
diff --git a/lib/rubygems/defaults.rb b/lib/rubygems/defaults.rb
index 6924f48e5a..55ca080c96 100644
--- a/lib/rubygems/defaults.rb
+++ b/lib/rubygems/defaults.rb
@@ -89,11 +89,11 @@ module Gem
# Default gem load path
def self.default_path
- if Gem.user_home && File.exist?(Gem.user_home) then
- [user_dir, default_dir]
- else
- [default_dir]
- end
+ path = []
+ path << user_dir if user_home && File.exist?(user_home)
+ path << default_dir
+ path << vendor_dir if vendor_dir and File.directory? vendor_dir
+ path
end
##
@@ -160,4 +160,18 @@ module Gem
true
end
+ ##
+ # Directory where vendor gems are installed.
+
+ def self.vendor_dir # :nodoc:
+ if vendor_dir = ENV['GEM_VENDOR'] then
+ return vendor_dir.dup
+ end
+
+ return nil unless RbConfig::CONFIG.key? 'vendordir'
+
+ File.join RbConfig::CONFIG['vendordir'], 'gems',
+ RbConfig::CONFIG['ruby_version']
+ end
+
end
diff --git a/lib/rubygems/dependency.rb b/lib/rubygems/dependency.rb
index a96d67c3e5..b72a540dc8 100644
--- a/lib/rubygems/dependency.rb
+++ b/lib/rubygems/dependency.rb
@@ -74,7 +74,7 @@ class Gem::Dependency
end
def inspect # :nodoc:
- if @prerelease
+ if prerelease? then
"<%s type=%p name=%p requirements=%p prerelease=ok>" %
[self.class, self.type, self.name, requirement.to_s]
else
@@ -145,7 +145,6 @@ class Gem::Dependency
@requirement = @version_requirements if defined?(@version_requirements)
end
- # DOC: this method needs documentation or :nodoc''d
def requirements_list
requirement.as_list
end
@@ -205,9 +204,19 @@ class Gem::Dependency
alias === =~
- # DOC: this method needs either documented or :nodoc'd
+ ##
+ # :call-seq:
+ # dep.match? name => true or false
+ # dep.match? name, version => true or false
+ # dep.match? spec => true or false
+ #
+ # Does this dependency match the specification described by +name+ and
+ # +version+ or match +spec+?
+ #
+ # NOTE: Unlike #matches_spec? this method does not return true when the
+ # version is a prerelease version unless this is a prerelease dependency.
- def match? obj, version=nil
+ def match? obj, version=nil, allow_prerelease=false
if !version
name = obj.name
version = obj.version
@@ -216,12 +225,23 @@ class Gem::Dependency
end
return false unless self.name === name
- return true if requirement.none?
- requirement.satisfied_by? Gem::Version.new(version)
+ version = Gem::Version.new version
+
+ return true if requirement.none? and not version.prerelease?
+ return false if version.prerelease? and
+ not allow_prerelease and
+ not prerelease?
+
+ requirement.satisfied_by? version
end
- # DOC: this method needs either documented or :nodoc'd
+ ##
+ # Does this dependency match +spec+?
+ #
+ # NOTE: This is not a convenience method. Unlike #match? this method
+ # returns true when +spec+ is a prerelease version even if this dependency
+ # is not a prerelease dependency.
def matches_spec? spec
return false unless name === spec.name
@@ -249,8 +269,6 @@ class Gem::Dependency
self.class.new name, self_req.as_list.concat(other_req.as_list)
end
- # DOC: this method needs either documented or :nodoc'd
-
def matching_specs platform_only = false
matches = Gem::Specification.stubs.find_all { |spec|
self.name === spec.name and # TODO: == instead of ===
@@ -273,8 +291,6 @@ class Gem::Dependency
@requirement.specific?
end
- # DOC: this method needs either documented or :nodoc'd
-
def to_specs
matches = matching_specs true
@@ -287,12 +303,13 @@ class Gem::Dependency
if specs.empty?
total = Gem::Specification.to_a.size
- error = Gem::LoadError.new \
- "Could not find '#{name}' (#{requirement}) among #{total} total gem(s)"
+ msg = "Could not find '#{name}' (#{requirement}) among #{total} total gem(s)\n"
else
- error = Gem::LoadError.new \
- "Could not find '#{name}' (#{requirement}) - did find: [#{specs.join ','}]"
+ msg = "Could not find '#{name}' (#{requirement}) - did find: [#{specs.join ','}]\n"
end
+ msg << "Checked in 'GEM_PATH=#{Gem.path.join(File::PATH_SEPARATOR)}', execute `gem env` for more information"
+
+ error = Gem::LoadError.new(msg)
error.name = self.name
error.requirement = self.requirement
raise error
@@ -303,11 +320,15 @@ class Gem::Dependency
matches
end
- # DOC: this method needs either documented or :nodoc'd
-
def to_spec
matches = self.to_specs
- matches.find { |spec| spec.activated? } or matches.last
+ active = matches.find { |spec| spec.activated? }
+
+ return active if active
+
+ matches.delete_if { |spec| spec.version.prerelease? } unless prerelease?
+
+ matches.last
end
end
diff --git a/lib/rubygems/dependency_installer.rb b/lib/rubygems/dependency_installer.rb
index da6994a9be..039d046da2 100644
--- a/lib/rubygems/dependency_installer.rb
+++ b/lib/rubygems/dependency_installer.rb
@@ -72,6 +72,7 @@ class Gem::DependencyInstaller
def initialize options = {}
@only_install_dir = !!options[:install_dir]
@install_dir = options[:install_dir] || Gem.dir
+ @build_root = options[:build_root]
options = DEFAULT_OPTIONS.merge options
@@ -102,7 +103,7 @@ class Gem::DependencyInstaller
@cache_dir = options[:cache_dir] || @install_dir
- @errors = nil
+ @errors = []
end
##
@@ -157,6 +158,7 @@ class Gem::DependencyInstaller
dependency_list.remove_specs_unsatisfied_by dependencies
end
+
##
# Creates an AvailableSet to install from based on +dep_or_name+ and
# +version+
@@ -243,9 +245,9 @@ class Gem::DependencyInstaller
# FIX if there is a problem talking to the network, we either need to always tell
# the user (no really_verbose) or fail hard, not silently tell them that we just
# couldn't find their requested gem.
- if Gem.configuration.really_verbose then
- say "Error fetching remote data:\t\t#{e.message}"
- say "Falling back to local-only install"
+ verbose do
+ "Error fetching remote data:\t\t#{e.message}\n" \
+ "Falling back to local-only install"
end
@domain = :local
end
@@ -375,13 +377,16 @@ class Gem::DependencyInstaller
options = {
:bin_dir => @bin_dir,
:build_args => @build_args,
+ :document => @document,
:env_shebang => @env_shebang,
:force => @force,
:format_executable => @format_executable,
:ignore_dependencies => @ignore_dependencies,
+ :prerelease => @prerelease,
:security_policy => @security_policy,
:user_install => @user_install,
:wrappers => @wrappers,
+ :build_root => @build_root,
:install_as_default => @install_as_default
}
options[:install_dir] = @install_dir if @only_install_dir
@@ -415,25 +420,59 @@ class Gem::DependencyInstaller
end
def resolve_dependencies dep_or_name, version # :nodoc:
- as = available_set_for dep_or_name, version
-
- request_set = as.to_request_set install_development_deps
+ request_set = Gem::RequestSet.new
+ request_set.development = @development
+ request_set.development_shallow = @dev_shallow
request_set.soft_missing = @force
+ request_set.prerelease = @prerelease
request_set.remote = false unless consider_remote?
installer_set = Gem::Resolver::InstallerSet.new @domain
- installer_set.always_install.concat request_set.always_install
installer_set.ignore_installed = @only_install_dir
+ if consider_local?
+ if dep_or_name =~ /\.gem$/ and File.file? dep_or_name then
+ src = Gem::Source::SpecificFile.new dep_or_name
+ installer_set.add_local dep_or_name, src.spec, src
+ version = src.spec.version if version == Gem::Requirement.default
+ elsif dep_or_name =~ /\.gem$/ then
+ Dir[dep_or_name].each do |name|
+ begin
+ src = Gem::Source::SpecificFile.new name
+ installer_set.add_local dep_or_name, src.spec, src
+ rescue Gem::Package::FormatError
+ end
+ end
+ # else This is a dependency. InstallerSet handles this case
+ end
+ end
+
+ dependency =
+ if spec = installer_set.local?(dep_or_name) then
+ Gem::Dependency.new spec.name, version
+ elsif String === dep_or_name then
+ Gem::Dependency.new dep_or_name, version
+ else
+ dep_or_name
+ end
+
+ dependency.prerelease = @prerelease
+
+ request_set.import [dependency]
+
+ installer_set.add_always_install dependency
+
+ request_set.always_install = installer_set.always_install
+
if @ignore_dependencies then
installer_set.ignore_dependencies = true
request_set.ignore_dependencies = true
request_set.soft_missing = true
end
- composed_set = Gem::Resolver.compose_sets as, installer_set
+ request_set.resolve installer_set
- request_set.resolve composed_set
+ @errors.concat request_set.errors
request_set
end
diff --git a/lib/rubygems/doctor.rb b/lib/rubygems/doctor.rb
index 0aa0f7b79f..3c71fd5aa4 100644
--- a/lib/rubygems/doctor.rb
+++ b/lib/rubygems/doctor.rb
@@ -105,7 +105,7 @@ class Gem::Doctor
next if ent == "." || ent == ".."
child = File.join(directory, ent)
- next unless File.exists?(child)
+ next unless File.exist?(child)
basename = File.basename(child, extension)
next if installed_specs.include? basename
diff --git a/lib/rubygems/errors.rb b/lib/rubygems/errors.rb
index fc9bfbc0dc..9defb9ee9b 100644
--- a/lib/rubygems/errors.rb
+++ b/lib/rubygems/errors.rb
@@ -19,6 +19,36 @@ module Gem
attr_accessor :requirement
end
+ # Raised when there are conflicting gem specs loaded
+
+ class ConflictError < LoadError
+
+ ##
+ # A Hash mapping conflicting specifications to the dependencies that
+ # caused the conflict
+
+ attr_reader :conflicts
+
+ ##
+ # The specification that had the conflict
+
+ attr_reader :target
+
+ def initialize target, conflicts
+ @target = target
+ @conflicts = conflicts
+ @name = target.name
+
+ reason = conflicts.map { |act, dependencies|
+ "#{act.full_name} conflicts with #{dependencies.join(", ")}"
+ }.join ", "
+
+ # TODO: improve message by saying who activated `con`
+
+ super("Unable to activate #{target.full_name}, because #{reason}")
+ end
+ end
+
class ErrorReason; end
# Generated when trying to lookup a gem to indicate that the gem
diff --git a/lib/rubygems/exceptions.rb b/lib/rubygems/exceptions.rb
index 6bd50eca2c..2a9875cd24 100644
--- a/lib/rubygems/exceptions.rb
+++ b/lib/rubygems/exceptions.rb
@@ -27,7 +27,7 @@ class Gem::DependencyRemovalException < Gem::Exception; end
# toplevel. Indicates which dependencies were incompatible through #conflict
# and #conflicting_dependencies
-class Gem::DependencyResolutionError < Gem::Exception
+class Gem::DependencyResolutionError < Gem::DependencyError
attr_reader :conflict
@@ -214,7 +214,7 @@ end
# Raised by Resolver when a dependency requests a gem for which
# there is no spec.
-class Gem::UnsatisfiableDependencyError < Gem::Exception
+class Gem::UnsatisfiableDependencyError < Gem::DependencyError
##
# The unsatisfiable dependency. This is a
@@ -223,6 +223,11 @@ class Gem::UnsatisfiableDependencyError < Gem::Exception
attr_reader :dependency
##
+ # Errors encountered which may have contributed to this exception
+
+ attr_accessor :errors
+
+ ##
# Creates a new UnsatisfiableDependencyError for the unsatisfiable
# Gem::Resolver::DependencyRequest +dep+
@@ -239,6 +244,21 @@ class Gem::UnsatisfiableDependencyError < Gem::Exception
end
@dependency = dep
+ @errors = []
+ end
+
+ ##
+ # The name of the unresolved dependency
+
+ def name
+ @dependency.name
+ end
+
+ ##
+ # The Requirement of the unresolved dependency (not Version).
+
+ def version
+ @dependency.requirement
end
end
diff --git a/lib/rubygems/ext/builder.rb b/lib/rubygems/ext/builder.rb
index cbae8234a1..548f1262a8 100644
--- a/lib/rubygems/ext/builder.rb
+++ b/lib/rubygems/ext/builder.rb
@@ -161,7 +161,7 @@ EOF
results = builder.build(extension, @gem_dir, dest_path,
results, @build_args, lib_dir)
- say results.join("\n") if Gem.configuration.really_verbose
+ verbose { results.join("\n") }
end
end
diff --git a/lib/rubygems/ext/ext_conf_builder.rb b/lib/rubygems/ext/ext_conf_builder.rb
index 990fd18524..213bdcb002 100644
--- a/lib/rubygems/ext/ext_conf_builder.rb
+++ b/lib/rubygems/ext/ext_conf_builder.rb
@@ -11,13 +11,15 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
FileEntry = FileUtils::Entry_ # :nodoc:
def self.build(extension, directory, dest_path, results, args=[], lib_dir=nil)
- tmp_dest = Dir.mktmpdir(".gem.", ".")
+ # relative path required as some versions of mktmpdir return an absolute
+ # path which breaks make if it includes a space in the name
+ tmp_dest = get_relative_path(Dir.mktmpdir(".gem.", "."))
t = nil
Tempfile.open %w"siteconf .rb", "." do |siteconf|
t = siteconf
siteconf.puts "require 'rbconfig'"
- siteconf.puts "dest_path = #{(tmp_dest || dest_path).dump}"
+ siteconf.puts "dest_path = #{tmp_dest.dump}"
%w[sitearchdir sitelibdir].each do |dir|
siteconf.puts "RbConfig::MAKEFILE_CONFIG['#{dir}'] = dest_path"
siteconf.puts "RbConfig::CONFIG['#{dir}'] = dest_path"
@@ -25,24 +27,19 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
siteconf.flush
- siteconf_path = File.expand_path siteconf.path
-
- rubyopt = ENV["RUBYOPT"]
destdir = ENV["DESTDIR"]
begin
- ENV["RUBYOPT"] = ["-r#{siteconf_path}", rubyopt].compact.join(' ')
- cmd = [Gem.ruby, File.basename(extension), *args].join ' '
+ cmd = [Gem.ruby, "-r", get_relative_path(siteconf.path), File.basename(extension), *args].join ' '
begin
run cmd, results
ensure
FileUtils.mv 'mkmf.log', dest_path if File.exist? 'mkmf.log'
+ siteconf.unlink
end
ENV["DESTDIR"] = nil
- ENV["RUBYOPT"] = rubyopt
- siteconf.unlink
make dest_path, results
@@ -57,11 +54,10 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
FileEntry.new(tmp_dest).traverse do |ent|
destent = ent.class.new(dest_path, ent.rel)
- destent.exist? or File.rename(ent.path, destent.path)
+ destent.exist? or FileUtils.mv(ent.path, destent.path)
end
end
ensure
- ENV["RUBYOPT"] = rubyopt
ENV["DESTDIR"] = destdir
end
end
@@ -72,5 +68,11 @@ class Gem::Ext::ExtConfBuilder < Gem::Ext::Builder
FileUtils.rm_rf tmp_dest if tmp_dest
end
+ private
+ def self.get_relative_path(path)
+ path[0..Dir.pwd.length-1] = '.' if path.start_with?(Dir.pwd)
+ path
+ end
+
end
diff --git a/lib/rubygems/gemcutter_utilities.rb b/lib/rubygems/gemcutter_utilities.rb
index 6a4da9e983..4ecf7376e0 100644
--- a/lib/rubygems/gemcutter_utilities.rb
+++ b/lib/rubygems/gemcutter_utilities.rb
@@ -86,7 +86,7 @@ module Gem::GemcutterUtilities
def sign_in sign_in_host = nil
sign_in_host ||= self.host
- return if Gem.configuration.rubygems_api_key
+ return if api_key
pretty_host = if Gem::DEFAULT_HOST == sign_in_host then
'RubyGems.org'
diff --git a/lib/rubygems/install_update_options.rb b/lib/rubygems/install_update_options.rb
index d3f55cd5ea..a503b7fca4 100644
--- a/lib/rubygems/install_update_options.rb
+++ b/lib/rubygems/install_update_options.rb
@@ -59,6 +59,23 @@ module Gem::InstallUpdateOptions
end
end
+ add_option(:"Install/Update", '--build-root DIR',
+ 'Temporary installation root. Useful for building',
+ 'packages. Do not use this when installing remote gems.') do |value, options|
+ options[:build_root] = File.expand_path(value)
+ end
+
+ add_option(:"Install/Update", '--vendor',
+ 'Install gem into the vendor directory.',
+ 'Only for use by gem repackagers.') do |value, options|
+ unless Gem.vendor_dir then
+ raise OptionParser::InvalidOption.new 'your platform is not supported'
+ end
+
+ options[:vendor] = true
+ options[:install_dir] = Gem.vendor_dir
+ end
+
add_option(:"Install/Update", '-N', '--no-document',
'Disable documentation generation') do |value, options|
options[:document] = []
diff --git a/lib/rubygems/installer.rb b/lib/rubygems/installer.rb
index c80981682f..e5cfc0f536 100644
--- a/lib/rubygems/installer.rb
+++ b/lib/rubygems/installer.rb
@@ -39,7 +39,9 @@ class Gem::Installer
include Gem::UserInteraction
- # DOC: Missing docs or :nodoc:.
+ ##
+ # Filename of the gem being installed.
+
attr_reader :gem
##
@@ -47,6 +49,8 @@ class Gem::Installer
attr_reader :bin_dir
+ attr_reader :build_root # :nodoc:
+
##
# The gem repository the gem will be installed into
@@ -64,6 +68,8 @@ class Gem::Installer
@path_warning = false
+ @install_lock = Mutex.new
+
class << self
##
@@ -71,7 +77,19 @@ class Gem::Installer
attr_accessor :path_warning
- # DOC: Missing docs or :nodoc:.
+ ##
+ # Certain aspects of the install process are not thread-safe. This lock is
+ # used to allow multiple threads to install Gems at the same time.
+
+ attr_reader :install_lock
+
+ ##
+ # Overrides the executable format.
+ #
+ # This is a sprintf format with a "%s" which will be replaced with the
+ # executable name. It is based off the ruby executable name's difference
+ # from "ruby".
+
attr_writer :exec_format
# Defaults to use Ruby's program prefix and suffix.
@@ -240,7 +258,7 @@ class Gem::Installer
say spec.post_install_message unless spec.post_install_message.nil?
- Gem::Specification.add_spec spec unless Gem::Specification.include? spec
+ Gem::Installer.install_lock.synchronize { Gem::Specification.add_spec spec }
run_post_install_hooks
@@ -318,6 +336,7 @@ class Gem::Installer
# True if the gems in the system satisfy +dependency+.
def installation_satisfies_dependency?(dependency)
+ return true if @options[:development] and dependency.type == :development
return true if installed_specs.detect { |s| dependency.matches_spec? s }
return false if @only_install_dir
not dependency.matching_specs.empty?
@@ -382,12 +401,11 @@ class Gem::Installer
file.puts windows_stub_script(bindir, filename)
end
- say script_path if Gem.configuration.really_verbose
+ verbose script_path
end
end
- # DOC: Missing docs or :nodoc:.
- def generate_bin
+ def generate_bin # :nodoc:
return if spec.executables.nil? or spec.executables.empty?
Dir.mkdir @bin_dir unless File.exist? @bin_dir
@@ -433,7 +451,7 @@ class Gem::Installer
file.print app_script_text(filename)
end
- say bin_script_path if Gem.configuration.really_verbose
+ verbose bin_script_path
generate_windows_script filename, bindir
end
@@ -536,8 +554,7 @@ class Gem::Installer
end
end
- # DOC: Missing docs or :nodoc:.
- def ensure_required_ruby_version_met
+ def ensure_required_ruby_version_met # :nodoc:
if rrv = spec.required_ruby_version then
unless rrv.satisfied_by? Gem.ruby_version then
raise Gem::InstallError, "#{spec.name} requires Ruby version #{rrv}."
@@ -545,8 +562,7 @@ class Gem::Installer
end
end
- # DOC: Missing docs or :nodoc:.
- def ensure_required_rubygems_version_met
+ def ensure_required_rubygems_version_met # :nodoc:
if rrgv = spec.required_rubygems_version then
unless rrgv.satisfied_by? Gem.rubygems_version then
raise Gem::InstallError,
@@ -556,8 +572,7 @@ class Gem::Installer
end
end
- # DOC: Missing docs or :nodoc:.
- def ensure_dependencies_met
+ def ensure_dependencies_met # :nodoc:
deps = spec.runtime_dependencies
deps |= spec.development_dependencies if @development
@@ -566,8 +581,7 @@ class Gem::Installer
end
end
- # DOC: Missing docs or :nodoc:.
- def process_options
+ def process_options # :nodoc:
@options = {
:bin_dir => nil,
:env_shebang => false,
@@ -590,12 +604,20 @@ class Gem::Installer
# (or use) a new bin dir under the gem_home.
@bin_dir = options[:bin_dir] || Gem.bindir(gem_home)
@development = options[:development]
+ @build_root = options[:build_root]
@build_args = options[:build_args] || Gem::Command.build_args
+
+ unless @build_root.nil?
+ require 'pathname'
+ @build_root = Pathname.new(@build_root).expand_path
+ @bin_dir = File.join(@build_root, options[:bin_dir] || Gem.bindir(@gem_home))
+ @gem_home = File.join(@build_root, @gem_home)
+ alert_warning "You build with buildroot.\n Build root: #{@build_root}\n Bin dir: #{@bin_dir}\n Gem home: #{@gem_home}"
+ end
end
- # DOC: Missing docs or :nodoc:.
- def check_that_user_bin_dir_is_in_path
+ def check_that_user_bin_dir_is_in_path # :nodoc:
user_bin_dir = @bin_dir || Gem.bindir(gem_home)
user_bin_dir = user_bin_dir.gsub(File::SEPARATOR, File::ALT_SEPARATOR) if
File::ALT_SEPARATOR
@@ -606,16 +628,19 @@ class Gem::Installer
user_bin_dir = user_bin_dir.downcase
end
- unless path.split(File::PATH_SEPARATOR).include? user_bin_dir then
- unless self.class.path_warning then
- alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t gem executables will not run."
- self.class.path_warning = true
+ path = path.split(File::PATH_SEPARATOR)
+
+ unless path.include? user_bin_dir then
+ unless !Gem.win_platform? && (path.include? user_bin_dir.sub(ENV['HOME'], '~'))
+ unless self.class.path_warning then
+ alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t gem executables will not run."
+ self.class.path_warning = true
+ end
end
end
end
- # DOC: Missing docs or :nodoc:.
- def verify_gem_home(unpack = false)
+ def verify_gem_home(unpack = false) # :nodoc:
FileUtils.mkdir_p gem_home
raise Gem::FilePermissionError, gem_home unless
unpack or File.writable?(gem_home)
@@ -660,10 +685,10 @@ TEXT
return <<-TEXT
@ECHO OFF
IF NOT "%~f0" == "~f0" GOTO :WinNT
-@"#{ruby}" "#{File.join(bindir, bin_file_name)}" %1 %2 %3 %4 %5 %6 %7 %8 %9
+@"#{bindir.tr(File::SEPARATOR, File::ALT_SEPARATOR)}\\#{ruby}" "#{File.join(bindir, bin_file_name)}" %1 %2 %3 %4 %5 %6 %7 %8 %9
GOTO :EOF
:WinNT
-@"#{ruby}" "%~dpn0" %*
+@"%~dp0#{ruby}" "%~dpn0" %*
TEXT
end
diff --git a/lib/rubygems/installer_test_case.rb b/lib/rubygems/installer_test_case.rb
index d03e512451..549de011e4 100644
--- a/lib/rubygems/installer_test_case.rb
+++ b/lib/rubygems/installer_test_case.rb
@@ -101,6 +101,8 @@ class Gem::InstallerTestCase < Gem::TestCase
@installer = util_installer @spec, @gemhome
@user_installer = util_installer @user_spec, Gem.user_dir, :user
+
+ Gem::Installer.path_warning = false
end
def util_gem_bindir spec = @spec # :nodoc:
diff --git a/lib/rubygems/local_remote_options.rb b/lib/rubygems/local_remote_options.rb
index a1e106d9be..db23d9f974 100644
--- a/lib/rubygems/local_remote_options.rb
+++ b/lib/rubygems/local_remote_options.rb
@@ -100,8 +100,8 @@ module Gem::LocalRemoteOptions
def add_source_option
accept_uri_http
- add_option(:"Local/Remote", '--source URL', URI::HTTP,
- 'Add URL as a remote source for gems') do |source, options|
+ add_option(:"Local/Remote", '-s', '--source URL', URI::HTTP,
+ 'Append URL to list of remote gem sources') do |source, options|
source << '/' if source !~ /\/\z/
diff --git a/lib/rubygems/name_tuple.rb b/lib/rubygems/name_tuple.rb
index f16ab369fa..60323db408 100644
--- a/lib/rubygems/name_tuple.rb
+++ b/lib/rubygems/name_tuple.rb
@@ -53,7 +53,7 @@ class Gem::NameTuple
"#{@name}-#{@version}"
else
"#{@name}-#{@version}-#{@platform}"
- end
+ end.untaint
end
##
@@ -90,7 +90,9 @@ class Gem::NameTuple
alias to_s inspect # :nodoc:
def <=> other
- to_a <=> other.to_a
+ [@name, @version, @platform == Gem::Platform::RUBY ? -1 : 1] <=>
+ [other.name, other.version,
+ other.platform == Gem::Platform::RUBY ? -1 : 1]
end
include Comparable
diff --git a/lib/rubygems/package.rb b/lib/rubygems/package.rb
index 0ed6e1b91f..417b34b79f 100644
--- a/lib/rubygems/package.rb
+++ b/lib/rubygems/package.rb
@@ -54,10 +54,12 @@ class Gem::Package
class FormatError < Error
attr_reader :path
- def initialize message, path = nil
- @path = path
+ def initialize message, source = nil
+ if source
+ @path = source.path
- message << " in #{path}" if path
+ message << " in #{path}" if path
+ end
super message
end
@@ -80,6 +82,7 @@ class Gem::Package
class TarInvalidError < Error; end
+
attr_accessor :build_time # :nodoc:
##
@@ -114,19 +117,26 @@ class Gem::Package
end
##
- # Creates a new Gem::Package for the file at +gem+.
+ # Creates a new Gem::Package for the file at +gem+. +gem+ can also be
+ # provided as an IO object.
#
# If +gem+ is an existing file in the old format a Gem::Package::Old will be
# returned.
def self.new gem
- return super unless Gem::Package == self
- return super unless File.exist? gem
+ gem = if gem.is_a?(Gem::Package::Source)
+ gem
+ elsif gem.respond_to? :read
+ Gem::Package::IOSource.new gem
+ else
+ Gem::Package::FileSource.new gem
+ end
- start = File.read gem, 20
+ return super(gem) unless Gem::Package == self
+ return super unless gem.present?
- return super unless start
- return super unless start.include? 'MD5SUM ='
+ return super unless gem.start
+ return super unless gem.start.include? 'MD5SUM ='
Gem::Package::Old.new gem
end
@@ -227,7 +237,7 @@ class Gem::Package
setup_signer
- open @gem, 'wb' do |gem_io|
+ @gem.with_write_io do |gem_io|
Gem::Package::TarWriter.new gem_io do |gem|
add_metadata gem
add_contents gem
@@ -255,7 +265,7 @@ EOM
@contents = []
- open @gem, 'rb' do |io|
+ @gem.with_read_io do |io|
gem_tar = Gem::Package::TarReader.new io
gem_tar.each do |entry|
@@ -312,7 +322,7 @@ EOM
FileUtils.mkdir_p destination_dir
- open @gem, 'rb' do |io|
+ @gem.with_read_io do |io|
reader = Gem::Package::TarReader.new io
reader.each do |entry|
@@ -360,7 +370,7 @@ EOM
out.write entry.read
end if entry.file?
- say destination if Gem.configuration.really_verbose
+ verbose destination
end
end
end
@@ -490,7 +500,7 @@ EOM
@files = []
@spec = nil
- open @gem, 'rb' do |io|
+ @gem.with_read_io do |io|
Gem::Package::TarReader.new io do |reader|
read_checksums reader
@@ -592,6 +602,9 @@ EOM
end
require 'rubygems/package/digest_io'
+require 'rubygems/package/source'
+require 'rubygems/package/file_source'
+require 'rubygems/package/io_source'
require 'rubygems/package/old'
require 'rubygems/package/tar_header'
require 'rubygems/package/tar_reader'
diff --git a/lib/rubygems/package/file_source.rb b/lib/rubygems/package/file_source.rb
new file mode 100644
index 0000000000..85316f62e7
--- /dev/null
+++ b/lib/rubygems/package/file_source.rb
@@ -0,0 +1,33 @@
+##
+# The primary source of gems is a file on disk, including all usages
+# internal to rubygems.
+#
+# This is a private class, do not depend on it directly. Instead, pass a path
+# object to `Gem::Package.new`.
+
+class Gem::Package::FileSource < Gem::Package::Source # :nodoc: all
+
+ attr_reader :path
+
+ def initialize path
+ @path = path
+ end
+
+ def start
+ @start ||= File.read path, 20
+ end
+
+ def present?
+ File.exist? path
+ end
+
+ def with_write_io &block
+ open path, 'wb', &block
+ end
+
+ def with_read_io &block
+ open path, 'rb', &block
+ end
+
+end
+
diff --git a/lib/rubygems/package/io_source.rb b/lib/rubygems/package/io_source.rb
new file mode 100644
index 0000000000..f89593dd2d
--- /dev/null
+++ b/lib/rubygems/package/io_source.rb
@@ -0,0 +1,45 @@
+##
+# Supports reading and writing gems from/to a generic IO object. This is
+# useful for other applications built on top of rubygems, such as
+# rubygems.org.
+#
+# This is a private class, do not depend on it directly. Instead, pass an IO
+# object to `Gem::Package.new`.
+
+class Gem::Package::IOSource < Gem::Package::Source # :nodoc: all
+
+ attr_reader :io
+
+ def initialize io
+ @io = io
+ end
+
+ def start
+ @start ||= begin
+ if io.pos > 0
+ raise Gem::Package::Error, "Cannot read start unless IO is at start"
+ end
+
+ value = io.read 20
+ io.rewind
+ value
+ end
+ end
+
+ def present?
+ true
+ end
+
+ def with_read_io
+ yield io
+ end
+
+ def with_write_io
+ yield io
+ end
+
+ def path
+ end
+
+end
+
diff --git a/lib/rubygems/package/old.rb b/lib/rubygems/package/old.rb
index d74753fa90..65bcbb2283 100644
--- a/lib/rubygems/package/old.rb
+++ b/lib/rubygems/package/old.rb
@@ -37,7 +37,7 @@ class Gem::Package::Old < Gem::Package
return @contents if @contents
- open @gem, 'rb' do |io|
+ @gem.with_read_io do |io|
read_until_dashes io # spec
header = file_list io
@@ -53,7 +53,7 @@ class Gem::Package::Old < Gem::Package
errstr = "Error reading files from gem"
- open @gem, 'rb' do |io|
+ @gem.with_read_io do |io|
read_until_dashes io # spec
header = file_list io
raise Gem::Exception, errstr unless header
@@ -83,7 +83,7 @@ class Gem::Package::Old < Gem::Package
out.write file_data
end
- say destination if Gem.configuration.really_verbose
+ verbose destination
end
end
rescue Zlib::DataError
@@ -136,7 +136,7 @@ class Gem::Package::Old < Gem::Package
yaml = ''
- open @gem, 'rb' do |io|
+ @gem.with_read_io do |io|
skip_ruby io
read_until_dashes io do |line|
yaml << line
@@ -145,7 +145,7 @@ class Gem::Package::Old < Gem::Package
yaml_error = if RUBY_VERSION < '1.9' then
YAML::ParseError
- elsif YAML::ENGINE.yamler == 'syck' then
+ elsif YAML.const_defined?(:ENGINE) && YAML::ENGINE.yamler == 'syck' then
YAML::ParseError
else
YAML::SyntaxError
diff --git a/lib/rubygems/package/source.rb b/lib/rubygems/package/source.rb
new file mode 100644
index 0000000000..1f18d479da
--- /dev/null
+++ b/lib/rubygems/package/source.rb
@@ -0,0 +1,3 @@
+class Gem::Package::Source # :nodoc:
+end
+
diff --git a/lib/rubygems/package/tar_reader/entry.rb b/lib/rubygems/package/tar_reader/entry.rb
index 7034e59210..737c7639c6 100644
--- a/lib/rubygems/package/tar_reader/entry.rb
+++ b/lib/rubygems/package/tar_reader/entry.rb
@@ -129,6 +129,8 @@ class Gem::Package::TarReader::Entry
ret
end
+ alias readpartial read # :nodoc:
+
##
# Rewinds to the beginning of the tar file entry
diff --git a/lib/rubygems/platform.rb b/lib/rubygems/platform.rb
index 1bcd7549ad..fa56141631 100644
--- a/lib/rubygems/platform.rb
+++ b/lib/rubygems/platform.rb
@@ -17,7 +17,7 @@ class Gem::Platform
def self.local
arch = RbConfig::CONFIG['arch']
- arch = "#{arch}_60" if arch =~ /mswin32$/
+ arch = "#{arch}_60" if arch =~ /mswin(?:32|64)$/
@local ||= new(arch)
end
@@ -173,6 +173,7 @@ class Gem::Platform
when /^dalvik(\d+)?$/ then [nil, 'dalvik', $1 ]
when /dotnet(\-(\d+\.\d+))?/ then ['universal','dotnet', $2 ]
when /mswin32(\_(\d+))?/ then ['x86', 'mswin32', $2 ]
+ when /mswin64(\_(\d+))?/ then ['x64', 'mswin64', $2 ]
when 'powerpc-darwin' then ['powerpc', 'darwin', nil ]
when /powerpc-darwin(\d)/ then ['powerpc', 'darwin', $1 ]
when /sparc-solaris2.8/ then ['sparc', 'solaris', '2.8' ]
diff --git a/lib/rubygems/rdoc.rb b/lib/rubygems/rdoc.rb
index 633bd893a5..180b95fbf3 100644
--- a/lib/rubygems/rdoc.rb
+++ b/lib/rubygems/rdoc.rb
@@ -263,7 +263,7 @@ class Gem::RDoc # :nodoc: all
Gem::Requirement.new('>= 2.4.0') =~ self.class.rdoc_version
r = new_rdoc
- say "rdoc #{args.join ' '}" if Gem.configuration.really_verbose
+ verbose { "rdoc #{args.join ' '}" }
Dir.chdir @spec.full_gem_path do
begin
@@ -279,7 +279,6 @@ class Gem::RDoc # :nodoc: all
ui.errs.puts "... RDOC args: #{args.join(' ')}"
ui.backtrace ex
ui.errs.puts "(continuing with the rest of the installation)"
- ensure
end
end
end
diff --git a/lib/rubygems/remote_fetcher.rb b/lib/rubygems/remote_fetcher.rb
index 58991caeda..607827c47e 100644
--- a/lib/rubygems/remote_fetcher.rb
+++ b/lib/rubygems/remote_fetcher.rb
@@ -2,6 +2,7 @@ require 'rubygems'
require 'rubygems/request'
require 'rubygems/uri_formatter'
require 'rubygems/user_interaction'
+require 'rubygems/request/connection_pools'
require 'resolv'
##
@@ -73,6 +74,9 @@ class Gem::RemoteFetcher
Socket.do_not_reverse_lookup = true
@proxy = proxy
+ @pools = {}
+ @pool_lock = Mutex.new
+ @cert_files = Gem::Request.get_cert_files
@dns = dns
end
@@ -154,11 +158,10 @@ class Gem::RemoteFetcher
# REFACTOR: split this up and dispatch on scheme (eg download_http)
# REFACTOR: be sure to clean up fake fetcher when you do this... cleaner
case scheme
- when 'http', 'https' then
+ when 'http', 'https', 's3' then
unless File.exist? local_gem_path then
begin
- say "Downloading gem #{gem_file_name}" if
- Gem.configuration.really_verbose
+ verbose "Downloading gem #{gem_file_name}"
remote_gem_path = source_uri + "gems/#{gem_file_name}"
@@ -168,8 +171,7 @@ class Gem::RemoteFetcher
alternate_name = "#{spec.original_name}.gem"
- say "Failed, downloading gem #{alternate_name}" if
- Gem.configuration.really_verbose
+ verbose "Failed, downloading gem #{alternate_name}"
remote_gem_path = source_uri + "gems/#{alternate_name}"
@@ -188,8 +190,7 @@ class Gem::RemoteFetcher
local_gem_path = source_uri.to_s
end
- say "Using local gem #{local_gem_path}" if
- Gem.configuration.really_verbose
+ verbose "Using local gem #{local_gem_path}"
when nil then # TODO test for local overriding cache
source_path = if Gem.win_platform? && source_uri.scheme &&
!source_uri.path.include?(':') then
@@ -207,8 +208,7 @@ class Gem::RemoteFetcher
local_gem_path = source_uri.to_s
end
- say "Using local gem #{local_gem_path}" if
- Gem.configuration.really_verbose
+ verbose "Using local gem #{local_gem_path}"
else
raise ArgumentError, "unsupported URI scheme #{source_uri.scheme}"
end
@@ -232,6 +232,7 @@ class Gem::RemoteFetcher
case response
when Net::HTTPOK, Net::HTTPNotModified then
+ response.uri = uri if response.respond_to? :uri
head ? response : response.body
when Net::HTTPMovedPermanently, Net::HTTPFound, Net::HTTPSeeOther,
Net::HTTPTemporaryRedirect then
@@ -265,7 +266,7 @@ class Gem::RemoteFetcher
data = send "fetch_#{uri.scheme}", uri, mtime, head
- if data and !head and uri.to_s =~ /gz$/
+ if data and !head and uri.to_s =~ /\.gz$/
begin
data = Gem.gunzip data
rescue Zlib::GzipFile::Error
@@ -286,6 +287,11 @@ class Gem::RemoteFetcher
end
end
+ def fetch_s3(uri, mtime = nil, head = false)
+ public_uri = sign_s3_url(uri)
+ fetch_https public_uri, mtime, head
+ end
+
##
# Downloads +uri+ to +path+ if necessary. If no path is given, it just
# passes the data.
@@ -332,7 +338,10 @@ class Gem::RemoteFetcher
# connections to reduce connect overhead.
def request(uri, request_class, last_modified = nil)
- request = Gem::Request.new uri, request_class, last_modified, @proxy
+ proxy = proxy_for @proxy, uri
+ pool = pools_for(proxy).pool_for uri
+
+ request = Gem::Request.new uri, request_class, last_modified, pool
request.fetch do |req|
yield req if block_given?
@@ -343,5 +352,43 @@ class Gem::RemoteFetcher
uri.scheme.downcase == 'https'
end
+ protected
+
+ # we have our own signing code here to avoid a dependency on the aws-sdk gem
+ # fortunately, a simple GET request isn't too complex to sign properly
+ def sign_s3_url(uri, expiration = nil)
+ require 'base64'
+ require 'openssl'
+
+ unless uri.user && uri.password
+ raise FetchError.new("credentials needed in s3 source, like s3://key:secret@bucket-name/", uri.to_s)
+ end
+
+ expiration ||= s3_expiration
+ canonical_path = "/#{uri.host}#{uri.path}"
+ payload = "GET\n\n\n#{expiration}\n#{canonical_path}"
+ digest = OpenSSL::HMAC.digest('sha1', uri.password, payload)
+ # URI.escape is deprecated, and there isn't yet a replacement that does quite what we want
+ signature = Base64.encode64(digest).gsub("\n", '').gsub(/[\+\/=]/) { |c| BASE64_URI_TRANSLATE[c] }
+ URI.parse("https://#{uri.host}.s3.amazonaws.com#{uri.path}?AWSAccessKeyId=#{uri.user}&Expires=#{expiration}&Signature=#{signature}")
+ end
+
+ def s3_expiration
+ (Time.now + 3600).to_i # one hour from now
+ end
+
+ BASE64_URI_TRANSLATE = { '+' => '%2B', '/' => '%2F', '=' => '%3D' }.freeze
+
+ private
+
+ def proxy_for proxy, uri
+ Gem::Request.proxy_uri(proxy || Gem::Request.get_proxy_from_env(uri.scheme))
+ end
+
+ def pools_for proxy
+ @pool_lock.synchronize do
+ @pools[proxy] ||= Gem::Request::ConnectionPools.new proxy, @cert_files
+ end
+ end
end
diff --git a/lib/rubygems/request.rb b/lib/rubygems/request.rb
index d2f076f581..702769c500 100644
--- a/lib/rubygems/request.rb
+++ b/lib/rubygems/request.rb
@@ -7,35 +7,43 @@ class Gem::Request
include Gem::UserInteraction
- attr_reader :proxy_uri
+ ###
+ # Legacy. This is used in tests.
+ def self.create_with_proxy uri, request_class, last_modified, proxy # :nodoc:
+ cert_files = get_cert_files
+ proxy ||= get_proxy_from_env(uri.scheme)
+ pool = ConnectionPools.new proxy_uri(proxy), cert_files
+
+ new(uri, request_class, last_modified, pool.pool_for(uri))
+ end
+
+ def self.proxy_uri proxy # :nodoc:
+ case proxy
+ when :no_proxy then nil
+ when URI::HTTP then proxy
+ else URI.parse(proxy)
+ end
+ end
- def initialize(uri, request_class, last_modified, proxy)
+ def initialize(uri, request_class, last_modified, pool)
@uri = uri
@request_class = request_class
@last_modified = last_modified
@requests = Hash.new 0
- @connections = {}
- @connections_mutex = Mutex.new
@user_agent = user_agent
- @proxy_uri =
- case proxy
- when :no_proxy then nil
- when nil then get_proxy_from_env uri.scheme
- when URI::HTTP then proxy
- else URI.parse(proxy)
- end
- @env_no_proxy = get_no_proxy_from_env
+ @connection_pool = pool
end
- def add_rubygems_trusted_certs(store)
+ def proxy_uri; @connection_pool.proxy_uri; end
+ def cert_files; @connection_pool.cert_files; end
+
+ def self.get_cert_files
pattern = File.expand_path("./ssl_certs/*.pem", File.dirname(__FILE__))
- Dir.glob(pattern).each do |ssl_cert_file|
- store.add_file ssl_cert_file
- end
+ Dir.glob(pattern)
end
- def configure_connection_for_https(connection)
+ def self.configure_connection_for_https(connection, cert_files)
require 'net/https'
connection.use_ssl = true
connection.verify_mode =
@@ -49,7 +57,9 @@ class Gem::Request
end
store.set_default_paths
- add_rubygems_trusted_certs(store)
+ cert_files.each do |ssl_cert_file|
+ store.add_file ssl_cert_file
+ end
if Gem.configuration.ssl_ca_cert
if File.directory? Gem.configuration.ssl_ca_cert
store.add_path Gem.configuration.ssl_ca_cert
@@ -58,6 +68,7 @@ class Gem::Request
end
end
connection.cert_store = store
+ connection
rescue LoadError => e
raise unless (e.respond_to?(:path) && e.path == 'openssl') ||
e.message =~ / -- openssl$/
@@ -71,31 +82,7 @@ class Gem::Request
# connection, using a proxy if needed.
def connection_for(uri)
- net_http_args = [uri.host, uri.port]
-
- if @proxy_uri and not no_proxy?(uri.host) then
- net_http_args += [
- @proxy_uri.host,
- @proxy_uri.port,
- Gem::UriFormatter.new(@proxy_uri.user).unescape,
- Gem::UriFormatter.new(@proxy_uri.password).unescape,
- ]
- end
-
- connection_id = [Thread.current.object_id, *net_http_args].join ':'
-
- connection = @connections_mutex.synchronize do
- @connections[connection_id] ||= Net::HTTP.new(*net_http_args)
- @connections[connection_id]
- end
-
- if https?(uri) and not connection.started? then
- configure_connection_for_https(connection)
- end
-
- connection.start unless connection.started?
-
- connection
+ @connection_pool.checkout
rescue defined?(OpenSSL::SSL) ? OpenSSL::SSL::SSLError : Errno::EHOSTDOWN,
Errno::EHOSTDOWN => e
raise Gem::RemoteFetcher::FetchError.new(e.message, uri)
@@ -119,6 +106,37 @@ class Gem::Request
yield request if block_given?
+ perform_request request
+ end
+
+ ##
+ # Returns a proxy URI for the given +scheme+ if one is set in the
+ # environment variables.
+
+ def self.get_proxy_from_env scheme = 'http'
+ _scheme = scheme.downcase
+ _SCHEME = scheme.upcase
+ env_proxy = ENV["#{_scheme}_proxy"] || ENV["#{_SCHEME}_PROXY"]
+
+ no_env_proxy = env_proxy.nil? || env_proxy.empty?
+
+ return get_proxy_from_env 'http' if no_env_proxy and _scheme != 'http'
+ return :no_proxy if no_env_proxy
+
+ uri = URI(Gem::UriFormatter.new(env_proxy).normalize)
+
+ if uri and uri.user.nil? and uri.password.nil? then
+ user = ENV["#{_scheme}_proxy_user"] || ENV["#{_SCHEME}_PROXY_USER"]
+ password = ENV["#{_scheme}_proxy_pass"] || ENV["#{_SCHEME}_PROXY_PASS"]
+
+ uri.user = Gem::UriFormatter.new(user).escape
+ uri.password = Gem::UriFormatter.new(password).escape
+ end
+
+ uri
+ end
+
+ def perform_request request # :nodoc:
connection = connection_for @uri
retried = false
@@ -127,8 +145,7 @@ class Gem::Request
begin
@requests[connection.object_id] += 1
- say "#{request.method} #{@uri}" if
- Gem.configuration.really_verbose
+ verbose "#{request.method} #{@uri}"
file_name = File.basename(@uri.path)
# perform download progress reporter only for gems
@@ -157,11 +174,10 @@ class Gem::Request
response = connection.request request
end
- say "#{response.code} #{response.message}" if
- Gem.configuration.really_verbose
+ verbose "#{response.code} #{response.message}"
rescue Net::HTTPBadResponse
- say "bad response" if Gem.configuration.really_verbose
+ verbose "bad response"
reset connection
@@ -176,8 +192,7 @@ class Gem::Request
Errno::ECONNABORTED, Errno::ECONNRESET, Errno::EPIPE
requests = @requests[connection.object_id]
- say "connection reset after #{requests} requests, retrying" if
- Gem.configuration.really_verbose
+ verbose "connection reset after #{requests} requests, retrying"
raise Gem::RemoteFetcher::FetchError.new('too many connection resets', @uri) if retried
@@ -188,57 +203,8 @@ class Gem::Request
end
response
- end
-
- ##
- # Returns list of no_proxy entries (if any) from the environment
-
- def get_no_proxy_from_env
- env_no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
-
- return [] if env_no_proxy.nil? or env_no_proxy.empty?
-
- env_no_proxy.split(/\s*,\s*/)
- end
-
- ##
- # Returns a proxy URI for the given +scheme+ if one is set in the
- # environment variables.
-
- def get_proxy_from_env scheme = 'http'
- _scheme = scheme.downcase
- _SCHEME = scheme.upcase
- env_proxy = ENV["#{_scheme}_proxy"] || ENV["#{_SCHEME}_PROXY"]
-
- no_env_proxy = env_proxy.nil? || env_proxy.empty?
-
- return get_proxy_from_env 'http' if no_env_proxy and _scheme != 'http'
- return nil if no_env_proxy
-
- uri = URI(Gem::UriFormatter.new(env_proxy).normalize)
-
- if uri and uri.user.nil? and uri.password.nil? then
- user = ENV["#{_scheme}_proxy_user"] || ENV["#{_SCHEME}_PROXY_USER"]
- password = ENV["#{_scheme}_proxy_pass"] || ENV["#{_SCHEME}_PROXY_PASS"]
-
- uri.user = Gem::UriFormatter.new(user).escape
- uri.password = Gem::UriFormatter.new(password).escape
- end
-
- uri
- end
-
- def https?(uri)
- uri.scheme.downcase == 'https'
- end
-
- def no_proxy? host
- host = host.downcase
- @env_no_proxy.each do |pattern|
- pattern = pattern.downcase
- return true if host[-pattern.length, pattern.length ] == pattern
- end
- return false
+ ensure
+ @connection_pool.checkin connection
end
##
@@ -272,3 +238,7 @@ class Gem::Request
end
+require 'rubygems/request/http_pool'
+require 'rubygems/request/https_pool'
+require 'rubygems/request/connection_pools'
+
diff --git a/lib/rubygems/request/connection_pools.rb b/lib/rubygems/request/connection_pools.rb
new file mode 100644
index 0000000000..27ee99c20d
--- /dev/null
+++ b/lib/rubygems/request/connection_pools.rb
@@ -0,0 +1,79 @@
+require 'thread'
+
+class Gem::Request::ConnectionPools # :nodoc:
+
+ @client = Net::HTTP
+
+ class << self
+ attr_accessor :client
+ end
+
+ def initialize proxy_uri, cert_files
+ @proxy_uri = proxy_uri
+ @cert_files = cert_files
+ @pools = {}
+ @pool_mutex = Mutex.new
+ end
+
+ def pool_for uri
+ http_args = net_http_args(uri, @proxy_uri)
+ key = http_args + [https?(uri)]
+ @pool_mutex.synchronize do
+ @pools[key] ||=
+ if https? uri then
+ Gem::Request::HTTPSPool.new(http_args, @cert_files, @proxy_uri)
+ else
+ Gem::Request::HTTPPool.new(http_args, @cert_files, @proxy_uri)
+ end
+ end
+ end
+
+ private
+
+ ##
+ # Returns list of no_proxy entries (if any) from the environment
+
+ def get_no_proxy_from_env
+ env_no_proxy = ENV['no_proxy'] || ENV['NO_PROXY']
+
+ return [] if env_no_proxy.nil? or env_no_proxy.empty?
+
+ env_no_proxy.split(/\s*,\s*/)
+ end
+
+ def https? uri
+ uri.scheme.downcase == 'https'
+ end
+
+ def no_proxy? host, env_no_proxy
+ host = host.downcase
+
+ env_no_proxy.any? do |pattern|
+ pattern = pattern.downcase
+
+ host[-pattern.length, pattern.length] == pattern or
+ (pattern.start_with? '.' and pattern[1..-1] == host)
+ end
+ end
+
+ def net_http_args uri, proxy_uri
+ net_http_args = [uri.host, uri.port]
+
+ no_proxy = get_no_proxy_from_env
+
+ if proxy_uri and not no_proxy?(uri.host, no_proxy) then
+ net_http_args + [
+ proxy_uri.host,
+ proxy_uri.port,
+ Gem::UriFormatter.new(proxy_uri.user).unescape,
+ Gem::UriFormatter.new(proxy_uri.password).unescape,
+ ]
+ elsif no_proxy? uri.host, no_proxy then
+ net_http_args += [nil, nil]
+ else
+ net_http_args
+ end
+ end
+
+end
+
diff --git a/lib/rubygems/request/http_pool.rb b/lib/rubygems/request/http_pool.rb
new file mode 100644
index 0000000000..61c8884af7
--- /dev/null
+++ b/lib/rubygems/request/http_pool.rb
@@ -0,0 +1,38 @@
+##
+# A connection "pool" that only manages one connection for now. Provides
+# thread safe `checkout` and `checkin` methods. The pool consists of one
+# connection that corresponds to `http_args`. This class is private, do not
+# use it.
+
+class Gem::Request::HTTPPool # :nodoc:
+ attr_reader :cert_files, :proxy_uri
+
+ def initialize http_args, cert_files, proxy_uri
+ @http_args = http_args
+ @cert_files = cert_files
+ @proxy_uri = proxy_uri
+ @queue = SizedQueue.new 1
+ @queue << nil
+ end
+
+ def checkout
+ @queue.pop || make_connection
+ end
+
+ def checkin connection
+ @queue.push connection
+ end
+
+ private
+
+ def make_connection
+ setup_connection Gem::Request::ConnectionPools.client.new(*@http_args)
+ end
+
+ def setup_connection connection
+ connection.start
+ connection
+ end
+
+end
+
diff --git a/lib/rubygems/request/https_pool.rb b/lib/rubygems/request/https_pool.rb
new file mode 100644
index 0000000000..2e3da0a44e
--- /dev/null
+++ b/lib/rubygems/request/https_pool.rb
@@ -0,0 +1,10 @@
+class Gem::Request::HTTPSPool < Gem::Request::HTTPPool # :nodoc:
+ private
+
+ def setup_connection connection
+ Gem::Request.configure_connection_for_https(connection, @cert_files)
+ super
+ end
+end
+
+
diff --git a/lib/rubygems/request_set.rb b/lib/rubygems/request_set.rb
index fb54e344bd..d12e06358d 100644
--- a/lib/rubygems/request_set.rb
+++ b/lib/rubygems/request_set.rb
@@ -1,4 +1,3 @@
-require 'rubygems'
require 'tsort'
##
@@ -21,13 +20,23 @@ class Gem::RequestSet
##
# Array of gems to install even if already installed
- attr_reader :always_install
+ attr_accessor :always_install
attr_reader :dependencies
attr_accessor :development
##
+ # Errors fetching gems during resolution.
+
+ attr_reader :errors
+
+ ##
+ # Set to true if you want to install only direct development dependencies.
+
+ attr_accessor :development_shallow
+
+ ##
# The set of git gems imported via load_gemdeps.
attr_reader :git_set # :nodoc:
@@ -38,11 +47,20 @@ class Gem::RequestSet
attr_accessor :ignore_dependencies
+ attr_reader :install_dir # :nodoc:
+
+ ##
+ # If true, allow dependencies to match prerelease gems.
+
+ attr_accessor :prerelease
+
##
# When false no remote sets are used for resolving gems.
attr_accessor :remote
+ attr_reader :resolver # :nodoc:
+
##
# Sets used for resolution
@@ -71,11 +89,15 @@ class Gem::RequestSet
@dependencies = deps
@always_install = []
+ @conservative = false
@dependency_names = {}
@development = false
+ @development_shallow = false
+ @errors = []
@git_set = nil
@ignore_dependencies = false
@install_dir = Gem.dir
+ @prerelease = false
@remote = true
@requests = []
@sets = []
@@ -116,12 +138,14 @@ class Gem::RequestSet
def install options, &block # :yields: request, installer
if dir = options[:install_dir]
- return install_into dir, false, options, &block
+ requests = install_into dir, false, options, &block
+ return requests
end
cache_dir = options[:cache_dir] || Gem.dir
+ @prerelease = options[:prerelease]
- specs = []
+ requests = []
sorted_requests.each do |req|
if req.installed? then
@@ -139,10 +163,30 @@ class Gem::RequestSet
yield req, inst if block_given?
- specs << inst.install
+ requests << inst.install
+ end
+
+ requests
+ ensure
+ raise if $!
+ return requests if options[:gemdeps]
+
+ specs = requests.map do |request|
+ case request
+ when Gem::Resolver::ActivationRequest then
+ request.spec.spec
+ else
+ request
+ end
end
- specs
+ require 'rubygems/dependency_installer'
+ inst = Gem::DependencyInstaller.new options
+ inst.installed_gems.replace specs
+
+ Gem.done_installing_hooks.each do |hook|
+ hook.call inst, specs
+ end unless Gem.done_installing_hooks.empty?
end
##
@@ -156,17 +200,19 @@ class Gem::RequestSet
gemdeps = options[:gemdeps]
@install_dir = options[:install_dir] || Gem.dir
+ @prerelease = options[:prerelease]
@remote = options[:domain] != :local
+ @conservative = true if options[:conservative]
- load_gemdeps gemdeps, options[:without_groups]
+ gem_deps_api = load_gemdeps gemdeps, options[:without_groups], true
resolve
if options[:explain]
puts "Gems to install:"
- specs.map { |s| s.full_name }.sort.each do |s|
- puts " #{s}"
+ sorted_requests.each do |spec|
+ puts " #{spec.full_name}"
end
if Gem.configuration.really_verbose
@@ -175,8 +221,11 @@ class Gem::RequestSet
else
installed = install options, &block
- lockfile = Gem::RequestSet::Lockfile.new self, gemdeps
- lockfile.write
+ if options.fetch :lock, true then
+ lockfile =
+ Gem::RequestSet::Lockfile.new self, gemdeps, gem_deps_api.dependencies
+ lockfile.write
+ end
installed
end
@@ -192,8 +241,10 @@ class Gem::RequestSet
installed = []
+ options[:development] = false
options[:install_dir] = dir
options[:only_install_dir] = true
+ @prerelease = options[:prerelease]
sorted_requests.each do |request|
spec = request.spec
@@ -218,7 +269,7 @@ class Gem::RequestSet
##
# Load a dependency management file.
- def load_gemdeps path, without_groups = []
+ def load_gemdeps path, without_groups = [], installing = false
@git_set = Gem::Resolver::GitSet.new
@vendor_set = Gem::Resolver::VendorSet.new
@@ -228,6 +279,7 @@ class Gem::RequestSet
lockfile.parse
gf = Gem::RequestSet::GemDependencyAPI.new self, path
+ gf.installing = installing
gf.without_groups = without_groups if without_groups
gf.load
end
@@ -243,15 +295,29 @@ class Gem::RequestSet
set = Gem::Resolver.compose_sets(*@sets)
set.remote = @remote
+ set.prerelease = @prerelease
resolver = Gem::Resolver.new @dependencies, set
resolver.development = @development
+ resolver.development_shallow = @development_shallow
resolver.ignore_dependencies = @ignore_dependencies
resolver.soft_missing = @soft_missing
+ if @conservative
+ installed_gems = {}
+ Gem::Specification.find_all do |spec|
+ (installed_gems[spec.name] ||= []) << spec
+ end
+ resolver.skip_gems = installed_gems
+ end
+
@resolver = resolver
@requests = resolver.resolve
+
+ @errors = set.errors
+
+ @requests
end
##
@@ -284,16 +350,20 @@ class Gem::RequestSet
node.spec.dependencies.each do |dep|
next if dep.type == :development and not @development
- match = @requests.find { |r| dep.match? r.spec.name, r.spec.version }
- if match
- begin
- yield match
- rescue TSort::Cyclic
- end
- else
- unless @soft_missing
- raise Gem::DependencyError, "Unresolved dependency found during sorting - #{dep} (requested by #{node.spec.full_name})"
- end
+ match = @requests.find { |r|
+ dep.match? r.spec.name, r.spec.version, @prerelease
+ }
+
+ unless match then
+ next if dep.type == :development and @development_shallow
+ next if @soft_missing
+ raise Gem::DependencyError,
+ "Unresolved dependency found during sorting - #{dep} (requested by #{node.spec.full_name})"
+ end
+
+ begin
+ yield match
+ rescue TSort::Cyclic
end
end
end
diff --git a/lib/rubygems/request_set/gem_dependency_api.rb b/lib/rubygems/request_set/gem_dependency_api.rb
index efce979177..24179dd1ed 100644
--- a/lib/rubygems/request_set/gem_dependency_api.rb
+++ b/lib/rubygems/request_set/gem_dependency_api.rb
@@ -1,5 +1,33 @@
##
-# A semi-compatible DSL for the Bundler Gemfile and Isolate formats.
+# A semi-compatible DSL for the Bundler Gemfile and Isolate gem dependencies
+# files.
+#
+# To work with both the Bundler Gemfile and Isolate formats this
+# implementation takes some liberties to allow compatibility with each, most
+# notably in #source.
+#
+# A basic gem dependencies file will look like the following:
+#
+# source 'https://rubygems.org'
+#
+# gem 'rails', '3.2.14a
+# gem 'devise', '~> 2.1', '>= 2.1.3'
+# gem 'cancan'
+# gem 'airbrake'
+# gem 'pg'
+#
+# RubyGems recommends saving this as gem.deps.rb over Gemfile or Isolate.
+#
+# To install the gems in this Gemfile use `gem install -g` to install it and
+# create a lockfile. The lockfile will ensure that when you make changes to
+# your gem dependencies file a minimum amount of change is made to the
+# dependencies of your gems.
+#
+# RubyGems can activate all the gems in your dependencies file at startup
+# using the RUBYGEMS_GEMDEPS environment variable or through Gem.use_gemdeps.
+# See Gem.use_gemdeps for details and warnings.
+#
+# See `gem help install` and `gem help gem_dependencies` for further details.
class Gem::RequestSet::GemDependencyAPI
@@ -21,6 +49,8 @@ class Gem::RequestSet::GemDependencyAPI
:ruby_21 => %w[ruby rbx maglev],
}
+ mswin = Gem::Platform.new 'x86-mswin32'
+ mswin64 = Gem::Platform.new 'x64-mswin64'
x86_mingw = Gem::Platform.new 'x86-mingw32'
x64_mingw = Gem::Platform.new 'x64-mingw32'
@@ -39,7 +69,15 @@ class Gem::RequestSet::GemDependencyAPI
:mri_19 => Gem::Platform::RUBY,
:mri_20 => Gem::Platform::RUBY,
:mri_21 => Gem::Platform::RUBY,
- :mswin => Gem::Platform::RUBY,
+ :mswin => mswin,
+ :mswin_18 => mswin,
+ :mswin_19 => mswin,
+ :mswin_20 => mswin,
+ :mswin_21 => mswin,
+ :mswin64 => mswin64,
+ :mswin64_19 => mswin64,
+ :mswin64_20 => mswin64,
+ :mswin64_21 => mswin64,
:rbx => Gem::Platform::RUBY,
:ruby => Gem::Platform::RUBY,
:ruby_18 => Gem::Platform::RUBY,
@@ -73,6 +111,14 @@ class Gem::RequestSet::GemDependencyAPI
:mri_20 => tilde_gt_2_0_0,
:mri_21 => tilde_gt_2_1_0,
:mswin => gt_eq_0,
+ :mswin_18 => tilde_gt_1_8_0,
+ :mswin_19 => tilde_gt_1_9_0,
+ :mswin_20 => tilde_gt_2_0_0,
+ :mswin_21 => tilde_gt_2_1_0,
+ :mswin64 => gt_eq_0,
+ :mswin64_19 => tilde_gt_1_9_0,
+ :mswin64_20 => tilde_gt_2_0_0,
+ :mswin64_21 => tilde_gt_2_1_0,
:rbx => gt_eq_0,
:ruby => gt_eq_0,
:ruby_18 => tilde_gt_1_8_0,
@@ -96,6 +142,14 @@ class Gem::RequestSet::GemDependencyAPI
:mri_20 => :never,
:mri_21 => :never,
:mswin => :only,
+ :mswin_18 => :only,
+ :mswin_19 => :only,
+ :mswin_20 => :only,
+ :mswin_21 => :only,
+ :mswin64 => :only,
+ :mswin64_19 => :only,
+ :mswin64_20 => :only,
+ :mswin64_21 => :only,
:rbx => :never,
:ruby => :never,
:ruby_18 => :never,
@@ -108,6 +162,11 @@ class Gem::RequestSet::GemDependencyAPI
}
##
+ # The gems required by #gem statements in the gem.deps.rb file
+
+ attr_reader :dependencies
+
+ ##
# A set of gems that are loaded via the +:git+ option to #gem
attr_reader :git_set # :nodoc:
@@ -136,14 +195,31 @@ class Gem::RequestSet::GemDependencyAPI
@path = path
@current_groups = nil
- @current_platform = nil
+ @current_platforms = nil
@current_repository = nil
+ @dependencies = {}
@default_sources = true
@git_set = @set.git_set
+ @git_sources = {}
+ @installing = false
@requires = Hash.new { |h, name| h[name] = [] }
@vendor_set = @set.vendor_set
@gem_sources = {}
@without_groups = []
+
+ git_source :github do |repo_name|
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include? "/"
+
+ "git://github.com/#{repo_name}.git"
+ end
+
+ git_source :bitbucket do |repo_name|
+ repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include? "/"
+
+ user, = repo_name.split "/", 2
+
+ "https://#{user}@bitbucket.org/#{repo_name}.git"
+ end
end
##
@@ -187,14 +263,26 @@ class Gem::RequestSet::GemDependencyAPI
end
##
- # Loads the gem dependency file
+ # Changes the behavior of gem dependency file loading to installing mode.
+ # In installing mode certain restrictions are ignored such as ruby version
+ # mismatch checks.
+
+ def installing= installing # :nodoc:
+ @installing = installing
+ end
+
+ ##
+ # Loads the gem dependency file and returns self.
def load
instance_eval File.read(@path).untaint, @path, 1
+
+ self
end
##
# :category: Gem Dependencies DSL
+ #
# :call-seq:
# gem(name)
# gem(name, *requirements)
@@ -202,6 +290,66 @@ class Gem::RequestSet::GemDependencyAPI
#
# Specifies a gem dependency with the given +name+ and +requirements+. You
# may also supply +options+ following the +requirements+
+ #
+ # +options+ include:
+ #
+ # require: ::
+ # RubyGems does not provide any autorequire features so requires in a gem
+ # dependencies file are recorded but ignored.
+ #
+ # In bundler the require: option overrides the file to require during
+ # Bundler.require. By default the name of the dependency is required in
+ # Bundler. A single file or an Array of files may be given.
+ #
+ # To disable requiring any file give +false+:
+ #
+ # gem 'rake', require: false
+ #
+ # group: ::
+ # Place the dependencies in the given dependency group. A single group or
+ # an Array of groups may be given.
+ #
+ # See also #group
+ #
+ # platform: ::
+ # Only install the dependency on the given platform. A single platform or
+ # an Array of platforms may be given.
+ #
+ # See #platform for a list of platforms available.
+ #
+ # path: ::
+ # Install this dependency from an unpacked gem in the given directory.
+ #
+ # gem 'modified_gem', path: 'vendor/modified_gem'
+ #
+ # git: ::
+ # Install this dependency from a git repository:
+ #
+ # gem 'private_gem', git: git@my.company.example:private_gem.git'
+ #
+ # gist: ::
+ # Install this dependency from the gist ID:
+ #
+ # gem 'bang', gist: '1232884'
+ #
+ # github: ::
+ # Install this dependency from a github git repository:
+ #
+ # gem 'private_gem', github: 'my_company/private_gem'
+ #
+ # submodules: ::
+ # Set to +true+ to include submodules when fetching the git repository for
+ # git:, gist: and github: dependencies.
+ #
+ # ref: ::
+ # Use the given commit name or SHA for git:, gist: and github:
+ # dependencies.
+ #
+ # branch: ::
+ # Use the given branch for git:, gist: and github: dependencies.
+ #
+ # tag: ::
+ # Use the given tag for git:, gist: and github: dependencies.
def gem name, *requirements
options = requirements.pop if requirements.last.kind_of?(Hash)
@@ -211,9 +359,20 @@ class Gem::RequestSet::GemDependencyAPI
source_set = false
- source_set ||= gem_path name, options
- source_set ||= gem_git name, options
- source_set ||= gem_github name, options
+ source_set ||= gem_path name, options
+ source_set ||= gem_git name, options
+ source_set ||= gem_git_source name, options
+
+ duplicate = @dependencies.include? name
+
+ @dependencies[name] =
+ if requirements.empty? and not source_set then
+ nil
+ elsif source_set then
+ '!'
+ else
+ requirements
+ end
return unless gem_platforms options
@@ -225,6 +384,12 @@ class Gem::RequestSet::GemDependencyAPI
gem_requires name, options
+ if duplicate then
+ warn <<-WARNING
+Gem dependencies file #{@path} requires #{name} more than once.
+ WARNING
+ end
+
@set.gem name, *requirements
end
@@ -258,21 +423,27 @@ class Gem::RequestSet::GemDependencyAPI
private :gem_git
##
- # Handles the github: option from +options+ for gem +name+.
+ # Handles a git gem option from +options+ for gem +name+ for a git source
+ # registered through git_source.
#
- # Returns +true+ if the path option was handled.
+ # Returns +true+ if the custom source option was handled.
- def gem_github name, options # :nodoc:
- return unless path = options.delete(:github)
+ def gem_git_source name, options # :nodoc:
+ return unless git_source = (@git_sources.keys & options.keys).last
- options[:git] = "git://github.com/#{path}.git"
+ source_callback = @git_sources[git_source]
+ source_param = options.delete git_source
+
+ git_url = source_callback.call source_param
+
+ options[:git] = git_url
gem_git name, options
true
end
- private :gem_github
+ private :gem_git_source
##
# Handles the :group and :groups +options+ for the gem with the given
@@ -314,8 +485,9 @@ class Gem::RequestSet::GemDependencyAPI
# platform matches the current platform.
def gem_platforms options # :nodoc:
- platform_names = Array(options.delete :platforms)
- platform_names << @current_platform if @current_platform
+ platform_names = Array(options.delete :platform)
+ platform_names.concat Array(options.delete :platforms)
+ platform_names.concat @current_platforms if @current_platforms
return true if platform_names.empty?
@@ -343,7 +515,7 @@ class Gem::RequestSet::GemDependencyAPI
private :gem_platforms
##
- # Handles the require: option from +options+ and adds those files, or the
+ # Records the require: option from +options+ and adds those files, or the
# default file to the require list for +name+.
def gem_requires name, options # :nodoc:
@@ -362,6 +534,11 @@ class Gem::RequestSet::GemDependencyAPI
# :category: Gem Dependencies DSL
#
# Block form for specifying gems from a git +repository+.
+ #
+ # git 'https://github.com/rails/rails.git' do
+ # gem 'activesupport'
+ # gem 'activerecord'
+ # end
def git repository
@current_repository = repository
@@ -373,6 +550,15 @@ class Gem::RequestSet::GemDependencyAPI
end
##
+ # Defines a custom git source that uses +name+ to expand git repositories
+ # for use in gems built from git repositories. You must provide a block
+ # that accepts a git repository name for expansion.
+
+ def git_source name, &callback
+ @git_sources[name] = callback
+ end
+
+ ##
# Returns the basename of the file the dependencies were loaded from
def gem_deps_file # :nodoc:
@@ -383,6 +569,23 @@ class Gem::RequestSet::GemDependencyAPI
# :category: Gem Dependencies DSL
#
# Loads dependencies from a gemspec file.
+ #
+ # +options+ include:
+ #
+ # name: ::
+ # The name portion of the gemspec file. Defaults to searching for any
+ # gemspec file in the current directory.
+ #
+ # gemspec name: 'my_gem'
+ #
+ # path: ::
+ # The path the gemspec lives in. Defaults to the current directory:
+ #
+ # gemspec 'my_gem', path: 'gemspecs', name: 'my_gem'
+ #
+ # development_group: ::
+ # The group to add development dependencies to. By default this is
+ # :development. Only one group may be specified.
def gemspec options = {}
name = options.delete(:name) || '{,*}'
@@ -404,7 +607,20 @@ class Gem::RequestSet::GemDependencyAPI
##
# :category: Gem Dependencies DSL
+ #
# Block form for placing a dependency in the given +groups+.
+ #
+ # group :development do
+ # gem 'debugger'
+ # end
+ #
+ # group :development, :test do
+ # gem 'minitest'
+ # end
+ #
+ # Groups can be excluded at install time using `gem install -g --without
+ # development`. See `gem help install` and `gem help gem_dependencies` for
+ # further details.
def group *groups
@current_groups = groups
@@ -440,28 +656,72 @@ class Gem::RequestSet::GemDependencyAPI
##
# :category: Gem Dependencies DSL
#
- # Block form for restricting gems to a particular platform.
+ # Block form for restricting gems to a set of platforms.
+ #
+ # The gem dependencies platform is different from Gem::Platform. A platform
+ # gem.deps.rb platform matches on the ruby engine, the ruby version and
+ # whether or not windows is allowed.
+ #
+ # :ruby, :ruby_XY ::
+ # Matches non-windows, non-jruby implementations where X and Y can be used
+ # to match releases in the 1.8, 1.9, 2.0 or 2.1 series.
+ #
+ # :mri, :mri_XY ::
+ # Matches non-windows C Ruby (Matz Ruby) or only the 1.8, 1.9, 2.0 or
+ # 2.1 series.
+ #
+ # :mingw, :mingw_XY ::
+ # Matches 32 bit C Ruby on MinGW or only the 1.8, 1.9, 2.0 or 2.1 series.
+ #
+ # :x64_mingw, :x64_mingw_XY ::
+ # Matches 64 bit C Ruby on MinGW or only the 1.8, 1.9, 2.0 or 2.1 series.
+ #
+ # :mswin, :mswin_XY ::
+ # Matches 32 bit C Ruby on Microsoft Windows or only the 1.8, 1.9, 2.0 or
+ # 2.1 series.
+ #
+ # :mswin64, :mswin64_XY ::
+ # Matches 64 bit C Ruby on Microsoft Windows or only the 1.8, 1.9, 2.0 or
+ # 2.1 series.
+ #
+ # :jruby, :jruby_XY ::
+ # Matches JRuby or JRuby in 1.8 or 1.9 mode.
+ #
+ # :maglev ::
+ # Matches Maglev
+ #
+ # :rbx ::
+ # Matches non-windows Rubinius
+ #
+ # NOTE: There is inconsistency in what environment a platform matches. You
+ # may need to read the source to know the exact details.
- def platform what
- @current_platform = what
+ def platform *platforms
+ @current_platforms = platforms
yield
ensure
- @current_platform = nil
+ @current_platforms = nil
end
##
# :category: Gem Dependencies DSL
#
- # Block form for restricting gems to a particular platform.
+ # Block form for restricting gems to a particular set of platforms. See
+ # #platform.
alias :platforms :platform
##
# :category: Gem Dependencies DSL
- # Restricts this gem dependencies file to the given ruby +version+. The
- # +:engine+ options from Bundler are currently ignored.
+ #
+ # Restricts this gem dependencies file to the given ruby +version+.
+ #
+ # You may also provide +engine:+ and +engine_version:+ options to restrict
+ # this gem dependencies file to a particular ruby engine and its engine
+ # version. This matching is performed by using the RUBY_ENGINE and
+ # engine_specific VERSION constants. (For JRuby, JRUBY_VERSION).
def ruby version, options = {}
engine = options[:engine]
@@ -471,6 +731,8 @@ class Gem::RequestSet::GemDependencyAPI
'you must specify engine_version along with the ruby engine' if
engine and not engine_version
+ return true if @installing
+
unless RUBY_VERSION == version then
message = "Your Ruby version is #{RUBY_VERSION}, " +
"but your #{gem_deps_file} requires #{version}"
@@ -503,7 +765,16 @@ class Gem::RequestSet::GemDependencyAPI
##
# :category: Gem Dependencies DSL
#
- # Sets +url+ as a source for gems for this dependency API.
+ # Sets +url+ as a source for gems for this dependency API. RubyGems uses
+ # the default configured sources if no source was given. If a source is set
+ # only that source is used.
+ #
+ # This method differs in behavior from Bundler:
+ #
+ # * The +:gemcutter+, # +:rubygems+ and +:rubyforge+ sources are not
+ # supported as they are deprecated in bundler.
+ # * The +prepend:+ option is not supported. If you wish to order sources
+ # then list them in your preferred order.
def source url
Gem.sources.clear if @default_sources
diff --git a/lib/rubygems/request_set/lockfile.rb b/lib/rubygems/request_set/lockfile.rb
index 0433d2a7fc..2901dba871 100644
--- a/lib/rubygems/request_set/lockfile.rb
+++ b/lib/rubygems/request_set/lockfile.rb
@@ -49,11 +49,14 @@ class Gem::RequestSet::Lockfile
# Creates a new Lockfile for the given +request_set+ and +gem_deps_file+
# location.
- def initialize request_set, gem_deps_file
+ def initialize request_set, gem_deps_file, dependencies = nil
@set = request_set
+ @dependencies = dependencies
@gem_deps_file = File.expand_path(gem_deps_file)
@gem_deps_dir = File.dirname(@gem_deps_file)
+ @gem_deps_file.untaint unless gem_deps_file.tainted?
+
@current_token = nil
@line = 0
@line_pos = 0
@@ -64,19 +67,42 @@ class Gem::RequestSet::Lockfile
def add_DEPENDENCIES out # :nodoc:
out << "DEPENDENCIES"
- @requests.sort_by { |r| r.name }.each do |request|
- spec = request.spec
-
- if [Gem::Resolver::VendorSpecification,
- Gem::Resolver::GitSpecification].include? spec.class then
- out << " #{request.name}!"
+ dependencies =
+ if @dependencies then
+ @dependencies.sort_by { |name,| name }.map do |name, requirement|
+ requirement_string =
+ if '!' == requirement then
+ requirement
+ else
+ Gem::Requirement.new(requirement).for_lockfile
+ end
+
+ [name, requirement_string]
+ end
else
- requirement = request.request.dependency.requirement
-
- out << " #{request.name}#{requirement.for_lockfile}"
+ @requests.sort_by { |r| r.name }.map do |request|
+ spec = request.spec
+ name = request.name
+ requirement = request.request.dependency.requirement
+
+ requirement_string =
+ if [Gem::Resolver::VendorSpecification,
+ Gem::Resolver::GitSpecification].include? spec.class then
+ "!"
+ else
+ requirement.for_lockfile
+ end
+
+ [name, requirement_string]
+ end
end
+
+ dependencies = dependencies.map do |name, requirement_string|
+ " #{name}#{requirement_string}"
end
+ out.concat dependencies
+
out << nil
end
@@ -93,12 +119,15 @@ class Gem::RequestSet::Lockfile
out << " specs:"
requests.sort_by { |request| request.name }.each do |request|
+ next if request.spec.name == 'bundler'
platform = "-#{request.spec.platform}" unless
Gem::Platform::RUBY == request.spec.platform
out << " #{request.name} (#{request.version}#{platform})"
request.full_spec.dependencies.sort.each do |dependency|
+ next if dependency.type == :development
+
requirement = dependency.requirement
out << " #{dependency.name}#{requirement.for_lockfile}"
end
@@ -166,9 +195,8 @@ class Gem::RequestSet::Lockfile
out << "PLATFORMS"
platforms = @requests.map { |request| request.spec.platform }.uniq
- platforms.delete Gem::Platform::RUBY if platforms.length > 1
- platforms.each do |platform|
+ platforms.sort.each do |platform|
out << " #{platform}"
end
@@ -250,7 +278,7 @@ class Gem::RequestSet::Lockfile
Gem::Resolver::VendorSet === set
}.map { |set|
set.specs[name]
- }.first
+ }.compact.first
requirements << spec.version
when :l_paren then
@@ -277,26 +305,33 @@ class Gem::RequestSet::Lockfile
end
def parse_GEM # :nodoc:
- get :entry, 'remote'
- _, data, = get :text
+ sources = []
+
+ while [:entry, 'remote'] == peek.first(2) do
+ get :entry, 'remote'
+ _, data, = get :text
+ skip :newline
- source = Gem::Source.new data
+ sources << Gem::Source.new(data)
+ end
- skip :newline
+ sources << Gem::Source.new(Gem::DEFAULT_HOST) if sources.empty?
get :entry, 'specs'
skip :newline
- set = Gem::Resolver::LockSet.new source
- last_spec = nil
+ set = Gem::Resolver::LockSet.new sources
+ last_specs = nil
while not @tokens.empty? and :text == peek.first do
_, name, column, = get :text
case peek[0]
when :newline then
- last_spec.add_dependency Gem::Dependency.new name if column == 6
+ last_specs.each do |spec|
+ spec.add_dependency Gem::Dependency.new name if column == 6
+ end
when :l_paren then
get :l_paren
@@ -308,11 +343,13 @@ class Gem::RequestSet::Lockfile
platform =
platform ? Gem::Platform.new(platform) : Gem::Platform::RUBY
- last_spec = set.add name, version, platform
+ last_specs = set.add name, version, platform
else
dependency = parse_dependency name, data
- last_spec.add_dependency dependency
+ last_specs.each do |spec|
+ spec.add_dependency dependency
+ end
end
get :r_paren
@@ -337,11 +374,21 @@ class Gem::RequestSet::Lockfile
skip :newline
+ type, value = peek.first 2
+ if type == :entry and %w[branch ref tag].include? value then
+ get
+ get :text
+
+ skip :newline
+ end
+
get :entry, 'specs'
skip :newline
set = Gem::Resolver::GitSet.new
+ set.root_dir = @set.install_dir
+
last_spec = nil
while not @tokens.empty? and :text == peek.first do
@@ -360,7 +407,7 @@ class Gem::RequestSet::Lockfile
else
dependency = parse_dependency name, data
- last_spec.spec.dependencies << dependency
+ last_spec.add_dependency dependency
end
get :r_paren
@@ -403,7 +450,7 @@ class Gem::RequestSet::Lockfile
else
dependency = parse_dependency name, data
- last_spec.spec.dependencies << dependency
+ last_spec.dependencies << dependency
end
get :r_paren
@@ -432,7 +479,7 @@ class Gem::RequestSet::Lockfile
# the first token of the requirements and returns a Gem::Dependency object.
def parse_dependency name, op # :nodoc:
- return Gem::Dependency.new name unless peek[0] == :text
+ return Gem::Dependency.new name, op unless peek[0] == :text
_, version, = get :text
@@ -575,8 +622,10 @@ class Gem::RequestSet::Lockfile
# Writes the lock file alongside the gem dependencies file
def write
+ content = to_s
+
open "#{@gem_deps_file}.lock", 'w' do |io|
- io.write to_s
+ io.write content
end
end
diff --git a/lib/rubygems/requirement.rb b/lib/rubygems/requirement.rb
index ece9d00f38..8b6a81612c 100644
--- a/lib/rubygems/requirement.rb
+++ b/lib/rubygems/requirement.rb
@@ -8,6 +8,9 @@ Gem.load_yaml if defined? ::YAML
##
# A Requirement is a set of one or more version restrictions. It supports a
# few (<tt>=, !=, >, <, >=, <=, ~></tt>) different restriction operators.
+#
+# See Gem::Version for a description on how versions and requirements work
+# together in RubyGems.
class Gem::Requirement
OPS = { #:nodoc:
diff --git a/lib/rubygems/resolver.rb b/lib/rubygems/resolver.rb
index 65e92bbf29..ef17d682ac 100644
--- a/lib/rubygems/resolver.rb
+++ b/lib/rubygems/resolver.rb
@@ -1,4 +1,3 @@
-require 'rubygems'
require 'rubygems/dependency'
require 'rubygems/exceptions'
require 'rubygems/util/list'
@@ -21,17 +20,24 @@ class Gem::Resolver
DEBUG_RESOLVER = !ENV['DEBUG_RESOLVER'].nil?
+ require 'pp' if DEBUG_RESOLVER
+
##
# Contains all the conflicts encountered while doing resolution
attr_reader :conflicts
##
- # Set to true if development dependencies should be considered.
+ # Set to true if all development dependencies should be considered.
attr_accessor :development
##
+ # Set to true if immediate development dependencies should be considered.
+
+ attr_accessor :development_shallow
+
+ ##
# When true, no dependencies are looked up for requested gems.
attr_accessor :ignore_dependencies
@@ -44,6 +50,12 @@ class Gem::Resolver
attr_reader :stats
##
+ # Hash of gems to skip resolution. Keyed by gem name, with arrays of
+ # gem specifications as values.
+
+ attr_accessor :skip_gems
+
+ ##
# When a missing dependency, don't stop. Just go on and record what was
# missing.
@@ -100,26 +112,27 @@ class Gem::Resolver
@conflicts = []
@development = false
+ @development_shallow = false
@ignore_dependencies = false
@missing = []
+ @skip_gems = {}
@soft_missing = false
@stats = Gem::Resolver::Stats.new
end
def explain stage, *data # :nodoc:
- if DEBUG_RESOLVER
- d = data.map { |x| x.inspect }.join(", ")
- STDOUT.printf "%20s %s\n", stage.to_s.upcase, d
- end
+ return unless DEBUG_RESOLVER
+
+ d = data.map { |x| x.pretty_inspect }.join(", ")
+ $stderr.printf "%10s %s\n", stage.to_s.upcase, d
end
- def explain_list stage, data # :nodoc:
- if DEBUG_RESOLVER
- STDOUT.printf "%20s (%d entries)\n", stage.to_s.upcase, data.size
- data.each do |d|
- STDOUT.printf "%20s %s\n", "", d
- end
- end
+ def explain_list stage # :nodoc:
+ return unless DEBUG_RESOLVER
+
+ data = yield
+ $stderr.printf "%10s (%d entries)\n", stage.to_s.upcase, data.size
+ PP.pp data, $stderr unless data.empty?
end
##
@@ -132,6 +145,7 @@ class Gem::Resolver
spec = possible.pop
explain :activate, [spec.full_name, possible.size]
+ explain :possible, possible
activation_request =
Gem::Resolver::ActivationRequest.new spec, dep, possible
@@ -142,8 +156,15 @@ class Gem::Resolver
def requests s, act, reqs=nil # :nodoc:
return reqs if @ignore_dependencies
+ s.fetch_development_dependencies if @development
+
s.dependencies.reverse_each do |d|
next if d.type == :development and not @development
+ next if d.type == :development and @development_shallow and
+ act.development?
+ next if d.type == :development and @development_shallow and
+ act.parent
+
reqs.add Gem::Resolver::DependencyRequest.new(d, act)
@stats.requirement!
end
@@ -186,6 +207,15 @@ class Gem::Resolver
def find_possible dependency # :nodoc:
all = @set.find_all dependency
+
+ if (skip_dep_gems = skip_gems[dependency.name]) && !skip_dep_gems.empty?
+ matching = all.select do |api_spec|
+ skip_dep_gems.any? { |s| api_spec.version == s.version }
+ end
+
+ all = matching unless matching.empty?
+ end
+
matching_platform = select_local_platforms all
return matching_platform, all
@@ -270,8 +300,8 @@ class Gem::Resolver
dep = needed.remove
explain :try, [dep, dep.requester ? dep.requester.request : :toplevel]
- explain_list :next5, needed.next5
- explain_list :specs, Array(specs).map { |x| x.full_name }.sort
+ explain_list(:next5) { needed.next5 }
+ explain_list(:specs) { Array(specs).map { |x| x.full_name }.sort }
# If there is already a spec activated for the requested name...
if specs && existing = specs.find { |s| dep.name == s.name }
@@ -403,7 +433,10 @@ class Gem::Resolver
@missing << dep
unless @soft_missing
- raise Gem::UnsatisfiableDependencyError.new(dep, platform_mismatch)
+ exc = Gem::UnsatisfiableDependencyError.new dep, platform_mismatch
+ exc.errors = @set.errors
+
+ raise exc
end
end
diff --git a/lib/rubygems/resolver/activation_request.rb b/lib/rubygems/resolver/activation_request.rb
index 2d48cfa927..56c6363e4f 100644
--- a/lib/rubygems/resolver/activation_request.rb
+++ b/lib/rubygems/resolver/activation_request.rb
@@ -39,6 +39,13 @@ class Gem::Resolver::ActivationRequest
end
##
+ # Is this activation request for a development dependency?
+
+ def development?
+ @request.development?
+ end
+
+ ##
# Downloads a gem at +path+ and returns the file path.
def download path
diff --git a/lib/rubygems/resolver/api_set.rb b/lib/rubygems/resolver/api_set.rb
index 5475e626e6..dda3579878 100644
--- a/lib/rubygems/resolver/api_set.rb
+++ b/lib/rubygems/resolver/api_set.rb
@@ -34,6 +34,8 @@ class Gem::Resolver::APISet < Gem::Resolver::Set
@data = Hash.new { |h,k| h[k] = [] }
@source = Gem::Source.new @uri
+
+ @to_fetch = []
end
##
@@ -45,6 +47,10 @@ class Gem::Resolver::APISet < Gem::Resolver::Set
return res unless @remote
+ if @to_fetch.include?(req.name)
+ prefetch_now
+ end
+
versions(req.name).each do |ver|
if req.dependency.match? req.name, ver[:number]
res << Gem::Resolver::APISpecification.new(self, ver)
@@ -61,9 +67,13 @@ class Gem::Resolver::APISet < Gem::Resolver::Set
def prefetch reqs
return unless @remote
names = reqs.map { |r| r.dependency.name }
- needed = names - @data.keys
+ needed = names - @data.keys - @to_fetch
+
+ @to_fetch += needed
+ end
- return if needed.empty?
+ def prefetch_now
+ needed, @to_fetch = @to_fetch, []
uri = @dep_uri + "?gems=#{needed.sort.join ','}"
str = Gem::RemoteFetcher.fetcher.fetch_path uri
diff --git a/lib/rubygems/resolver/api_specification.rb b/lib/rubygems/resolver/api_specification.rb
index 67052af82e..bbd5a6427b 100644
--- a/lib/rubygems/resolver/api_specification.rb
+++ b/lib/rubygems/resolver/api_specification.rb
@@ -34,6 +34,12 @@ class Gem::Resolver::APISpecification < Gem::Resolver::Specification
@dependencies == other.dependencies
end
+ def fetch_development_dependencies # :nodoc:
+ spec = source.fetch_spec Gem::NameTuple.new @name, @version, @platform
+
+ @dependencies = spec.dependencies
+ end
+
def installable_platform? # :nodoc:
Gem::Platform.match @platform
end
diff --git a/lib/rubygems/resolver/best_set.rb b/lib/rubygems/resolver/best_set.rb
index 20bb94827b..7e2d7e2647 100644
--- a/lib/rubygems/resolver/best_set.rb
+++ b/lib/rubygems/resolver/best_set.rb
@@ -28,6 +28,10 @@ class Gem::Resolver::BestSet < Gem::Resolver::ComposedSet
pick_sets if @remote and @sets.empty?
super
+ rescue Gem::RemoteFetcher::FetchError => e
+ replace_failed_api_set e
+
+ retry
end
def prefetch reqs # :nodoc:
@@ -46,5 +50,29 @@ class Gem::Resolver::BestSet < Gem::Resolver::ComposedSet
end
end
+ ##
+ # Replaces a failed APISet for the URI in +error+ with an IndexSet.
+ #
+ # If no matching APISet can be found the original +error+ is raised.
+ #
+ # The calling method must retry the exception to repeat the lookup.
+
+ def replace_failed_api_set error # :nodoc:
+ uri = error.uri
+ uri = URI uri unless URI === uri
+ uri.query = nil
+
+ raise error unless api_set = @sets.find { |set|
+ Gem::Resolver::APISet === set and set.dep_uri == uri
+ }
+
+ index_set = Gem::Resolver::IndexSet.new api_set.source
+
+ @sets.map! do |set|
+ next set unless set == api_set
+ index_set
+ end
+ end
+
end
diff --git a/lib/rubygems/resolver/composed_set.rb b/lib/rubygems/resolver/composed_set.rb
index 6f912b0afe..5b08f128ed 100644
--- a/lib/rubygems/resolver/composed_set.rb
+++ b/lib/rubygems/resolver/composed_set.rb
@@ -22,6 +22,18 @@ class Gem::Resolver::ComposedSet < Gem::Resolver::Set
end
##
+ # When +allow_prerelease+ is set to +true+ prereleases gems are allowed to
+ # match dependencies.
+
+ def prerelease= allow_prerelease
+ super
+
+ sets.each do |set|
+ set.prerelease = allow_prerelease
+ end
+ end
+
+ ##
# Sets the remote network access for all composed sets.
def remote= remote
@@ -30,6 +42,10 @@ class Gem::Resolver::ComposedSet < Gem::Resolver::Set
@sets.each { |set| set.remote = remote }
end
+ def errors
+ @errors + @sets.map { |set| set.errors }.flatten
+ end
+
##
# Finds all specs matching +req+ in all sets.
diff --git a/lib/rubygems/resolver/conflict.rb b/lib/rubygems/resolver/conflict.rb
index 8830e8d1fb..902c286b6b 100644
--- a/lib/rubygems/resolver/conflict.rb
+++ b/lib/rubygems/resolver/conflict.rb
@@ -52,11 +52,40 @@ class Gem::Resolver::Conflict
def explanation
activated = @activated.spec.full_name
- requirement = @failed_dep.dependency.requirement
+ dependency = @failed_dep.dependency
+ requirement = dependency.requirement
+ alternates = dependency.matching_specs.map { |spec| spec.full_name }
- " Activated %s via:\n %s\n instead of (%s) via:\n %s\n" % [
- activated, request_path(@activated).join(', '),
- requirement, request_path(requester).join(', '),
+ unless alternates.empty? then
+ matching = <<-MATCHING.chomp
+
+ Gems matching %s:
+ %s
+ MATCHING
+
+ matching = matching % [
+ dependency,
+ alternates.join(', '),
+ ]
+ end
+
+ explanation = <<-EXPLANATION
+ Activated %s
+ which does not match conflicting dependency (%s)
+
+ Conflicting dependency chains:
+ %s
+
+ versus:
+ %s
+%s
+ EXPLANATION
+
+ explanation % [
+ activated, requirement,
+ request_path(@activated).reverse.join(", depends on\n "),
+ request_path(@failed_dep).reverse.join(", depends on\n "),
+ matching,
]
end
@@ -95,10 +124,19 @@ class Gem::Resolver::Conflict
path = []
while current do
- requirement = current.request.dependency.requirement
- path << "#{current.spec.full_name} (#{requirement})"
+ case current
+ when Gem::Resolver::ActivationRequest then
+ path <<
+ "#{current.request.dependency}, #{current.spec.version} activated"
+
+ current = current.parent
+ when Gem::Resolver::DependencyRequest then
+ path << "#{current.dependency}"
- current = current.parent
+ current = current.requester
+ else
+ raise Gem::Exception, "[BUG] unknown request class #{current.class}"
+ end
end
path = ['user request (gem command or Gemfile)'] if path.empty?
diff --git a/lib/rubygems/resolver/dependency_request.rb b/lib/rubygems/resolver/dependency_request.rb
index 1d51db4945..79690bec4c 100644
--- a/lib/rubygems/resolver/dependency_request.rb
+++ b/lib/rubygems/resolver/dependency_request.rb
@@ -35,7 +35,26 @@ class Gem::Resolver::DependencyRequest
end
##
- # Does this dependency request match +spec+
+ # Is this dependency a development dependency?
+
+ def development?
+ @dependency.type == :development
+ end
+
+ ##
+ # Does this dependency request match +spec+?
+ #
+ # NOTE: #match? only matches prerelease versions when #dependency is a
+ # prerelease dependency.
+
+ def match? spec, allow_prerelease = false
+ @dependency.match? spec, nil, allow_prerelease
+ end
+
+ ##
+ # Does this dependency request match +spec+?
+ #
+ # NOTE: #matches_spec? matches prerelease versions. See also #match?
def matches_spec?(spec)
@dependency.matches_spec? spec
diff --git a/lib/rubygems/resolver/git_set.rb b/lib/rubygems/resolver/git_set.rb
index d32710e3d6..5f1b368ac1 100644
--- a/lib/rubygems/resolver/git_set.rb
+++ b/lib/rubygems/resolver/git_set.rb
@@ -80,7 +80,7 @@ class Gem::Resolver::GitSet < Gem::Resolver::Set
prefetch nil
specs.values.select do |spec|
- req.matches_spec? spec
+ req.match? spec
end
end
diff --git a/lib/rubygems/resolver/git_specification.rb b/lib/rubygems/resolver/git_specification.rb
index 113e7ea9de..55e180e525 100644
--- a/lib/rubygems/resolver/git_specification.rb
+++ b/lib/rubygems/resolver/git_specification.rb
@@ -12,11 +12,15 @@ class Gem::Resolver::GitSpecification < Gem::Resolver::SpecSpecification
@source == other.source
end
+ def add_dependency dependency # :nodoc:
+ spec.dependencies << dependency
+ end
+
##
# Installing a git gem only involves building the extensions and generating
# the executables.
- def install options
+ def install options = {}
require 'rubygems/installer'
installer = Gem::Installer.new '', options
@@ -31,5 +35,25 @@ class Gem::Resolver::GitSpecification < Gem::Resolver::SpecSpecification
installer.run_post_install_hooks
end
+ def pretty_print q # :nodoc:
+ q.group 2, '[GitSpecification', ']' do
+ q.breakable
+ q.text "name: #{name}"
+
+ q.breakable
+ q.text "version: #{version}"
+
+ q.breakable
+ q.text 'dependencies:'
+ q.breakable
+ q.pp dependencies
+
+ q.breakable
+ q.text "source:"
+ q.breakable
+ q.pp @source
+ end
+ end
+
end
diff --git a/lib/rubygems/resolver/index_set.rb b/lib/rubygems/resolver/index_set.rb
index ef01f0f0ad..7c56c2bf99 100644
--- a/lib/rubygems/resolver/index_set.rb
+++ b/lib/rubygems/resolver/index_set.rb
@@ -18,7 +18,9 @@ class Gem::Resolver::IndexSet < Gem::Resolver::Set
@all = Hash.new { |h,k| h[k] = [] }
- list, = @f.available_specs :released
+ list, errors = @f.available_specs :complete
+
+ @errors.concat errors
list.each do |uri, specs|
specs.each do |n|
@@ -41,7 +43,7 @@ class Gem::Resolver::IndexSet < Gem::Resolver::Set
name = req.dependency.name
@all[name].each do |uri, n|
- if req.dependency.match? n then
+ if req.match? n, @prerelease then
res << Gem::Resolver::IndexSpecification.new(
self, n.name, n.version, uri, n.platform)
end
diff --git a/lib/rubygems/resolver/installed_specification.rb b/lib/rubygems/resolver/installed_specification.rb
index a9438129fb..2a2b89a6c2 100644
--- a/lib/rubygems/resolver/installed_specification.rb
+++ b/lib/rubygems/resolver/installed_specification.rb
@@ -14,7 +14,7 @@ class Gem::Resolver::InstalledSpecification < Gem::Resolver::SpecSpecification
# This is a null install as this specification is already installed.
# +options+ are ignored.
- def install options
+ def install options = {}
yield nil
end
@@ -29,6 +29,24 @@ class Gem::Resolver::InstalledSpecification < Gem::Resolver::SpecSpecification
super
end
+ def pretty_print q # :nodoc:
+ q.group 2, '[InstalledSpecification', ']' do
+ q.breakable
+ q.text "name: #{name}"
+
+ q.breakable
+ q.text "version: #{version}"
+
+ q.breakable
+ q.text "platform: #{platform}"
+
+ q.breakable
+ q.text 'dependencies:'
+ q.breakable
+ q.pp spec.dependencies
+ end
+ end
+
##
# The source for this specification
diff --git a/lib/rubygems/resolver/installer_set.rb b/lib/rubygems/resolver/installer_set.rb
index 045c893fdc..f53b496dc7 100644
--- a/lib/rubygems/resolver/installer_set.rb
+++ b/lib/rubygems/resolver/installer_set.rb
@@ -21,6 +21,11 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set
attr_accessor :ignore_installed # :nodoc:
##
+ # The remote_set looks up remote gems for installation.
+
+ attr_reader :remote_set # :nodoc:
+
+ ##
# Creates a new InstallerSet that will look for gems in +domain+.
def initialize domain
@@ -34,11 +39,53 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set
@always_install = []
@ignore_dependencies = false
@ignore_installed = false
+ @local = {}
@remote_set = Gem::Resolver::BestSet.new
@specs = {}
end
##
+ # Looks up the latest specification for +dependency+ and adds it to the
+ # always_install list.
+
+ def add_always_install dependency
+ request = Gem::Resolver::DependencyRequest.new dependency, nil
+
+ found = find_all request
+
+ found.delete_if { |s|
+ s.version.prerelease? and not s.local?
+ } unless dependency.prerelease?
+
+ found = found.select do |s|
+ Gem::Source::SpecificFile === s.source or
+ Gem::Platform::RUBY == s.platform or
+ Gem::Platform.local === s.platform
+ end
+
+ if found.empty? then
+ exc = Gem::UnsatisfiableDependencyError.new request
+ exc.errors = errors
+
+ raise exc
+ end
+
+ newest = found.max_by do |s|
+ [s.version, s.platform == Gem::Platform::RUBY ? -1 : 1]
+ end
+
+ @always_install << newest.spec
+ end
+
+ ##
+ # Adds a local gem requested using +dep_name+ with the given +spec+ that can
+ # be loaded and installed using the +source+.
+
+ def add_local dep_name, spec, source
+ @local[dep_name] = [spec, source]
+ end
+
+ ##
# Should local gems should be considered?
def consider_local? # :nodoc:
@@ -53,6 +100,13 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set
end
##
+ # Errors encountered while resolving gems
+
+ def errors
+ @errors + @remote_set.errors
+ end
+
+ ##
# Returns an array of IndexSpecification objects matching DependencyRequest
# +req+.
@@ -62,30 +116,53 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set
dep = req.dependency
return res if @ignore_dependencies and
- @always_install.none? { |spec| dep.matches_spec? spec }
+ @always_install.none? { |spec| dep.match? spec }
name = dep.name
dep.matching_specs.each do |gemspec|
- next if @always_install.include? gemspec
+ next if @always_install.any? { |spec| spec.name == gemspec.name }
res << Gem::Resolver::InstalledSpecification.new(self, gemspec)
end unless @ignore_installed
if consider_local? then
+ matching_local = @local.values.select do |spec, _|
+ req.match? spec
+ end.map do |spec, source|
+ Gem::Resolver::LocalSpecification.new self, spec, source
+ end
+
+ res.concat matching_local
+
local_source = Gem::Source::Local.new
- if spec = local_source.find_gem(name, dep.requirement) then
+ if local_spec = local_source.find_gem(name, dep.requirement) then
res << Gem::Resolver::IndexSpecification.new(
- self, spec.name, spec.version, local_source, spec.platform)
+ self, local_spec.name, local_spec.version,
+ local_source, local_spec.platform)
end
end
+ res.delete_if do |spec|
+ spec.version.prerelease? and not dep.prerelease?
+ end
+
res.concat @remote_set.find_all req if consider_remote?
res
end
+ def prefetch(reqs)
+ @remote_set.prefetch(reqs)
+ end
+
+ def prerelease= allow_prerelease
+ super
+
+ @remote_set.prerelease = allow_prerelease
+ end
+
def inspect # :nodoc:
always_install = @always_install.map { |s| s.full_name }
@@ -108,6 +185,15 @@ class Gem::Resolver::InstallerSet < Gem::Resolver::Set
end
end
+ ##
+ # Has a local gem for +dep_name+ been added to this set?
+
+ def local? dep_name # :nodoc:
+ spec, = @local[dep_name]
+
+ spec
+ end
+
def pretty_print q # :nodoc:
q.group 2, '[InstallerSet', ']' do
q.breakable
diff --git a/lib/rubygems/resolver/local_specification.rb b/lib/rubygems/resolver/local_specification.rb
index dcca6c736a..20a283f0ba 100644
--- a/lib/rubygems/resolver/local_specification.rb
+++ b/lib/rubygems/resolver/local_specification.rb
@@ -12,5 +12,30 @@ class Gem::Resolver::LocalSpecification < Gem::Resolver::SpecSpecification
super
end
+ def local? # :nodoc:
+ true
+ end
+
+ def pretty_print q # :nodoc:
+ q.group 2, '[LocalSpecification', ']' do
+ q.breakable
+ q.text "name: #{name}"
+
+ q.breakable
+ q.text "version: #{version}"
+
+ q.breakable
+ q.text "platform: #{platform}"
+
+ q.breakable
+ q.text 'dependencies:'
+ q.breakable
+ q.pp dependencies
+
+ q.breakable
+ q.text "source: #{@source.path}"
+ end
+ end
+
end
diff --git a/lib/rubygems/resolver/lock_set.rb b/lib/rubygems/resolver/lock_set.rb
index f4987576ec..4ede5971fb 100644
--- a/lib/rubygems/resolver/lock_set.rb
+++ b/lib/rubygems/resolver/lock_set.rb
@@ -6,13 +6,16 @@ class Gem::Resolver::LockSet < Gem::Resolver::Set
attr_reader :specs # :nodoc:
##
- # Creates a new LockSet from the given +source+
+ # Creates a new LockSet from the given +sources+
- def initialize source
+ def initialize sources
super()
- @source = Gem::Source::Lock.new source
- @specs = []
+ @sources = sources.map do |source|
+ Gem::Source::Lock.new source
+ end
+
+ @specs = []
end
##
@@ -25,13 +28,14 @@ class Gem::Resolver::LockSet < Gem::Resolver::Set
def add name, version, platform # :nodoc:
version = Gem::Version.new version
- spec =
- Gem::Resolver::LockSpecification.new self, name, version, @source,
+ specs = @sources.map do |source|
+ Gem::Resolver::LockSpecification.new self, name, version, source,
platform
+ end
- @specs << spec
+ @specs.concat specs
- spec
+ specs
end
##
@@ -40,7 +44,7 @@ class Gem::Resolver::LockSet < Gem::Resolver::Set
def find_all req
@specs.select do |spec|
- req.matches_spec? spec
+ req.match? spec
end
end
diff --git a/lib/rubygems/resolver/lock_specification.rb b/lib/rubygems/resolver/lock_specification.rb
index 4bc21b9402..0013171469 100644
--- a/lib/rubygems/resolver/lock_specification.rb
+++ b/lib/rubygems/resolver/lock_specification.rb
@@ -23,7 +23,7 @@ class Gem::Resolver::LockSpecification < Gem::Resolver::Specification
# This is a null install as a locked specification is considered installed.
# +options+ are ignored.
- def install options
+ def install options = {}
destination = options[:install_dir] || Gem.dir
if File.exist? File.join(destination, 'specifications', spec.spec_name) then
@@ -41,10 +41,36 @@ class Gem::Resolver::LockSpecification < Gem::Resolver::Specification
@dependencies << dependency
end
+ def pretty_print q # :nodoc:
+ q.group 2, '[LockSpecification', ']' do
+ q.breakable
+ q.text "name: #{@name}"
+
+ q.breakable
+ q.text "version: #{@version}"
+
+ unless @platform == Gem::Platform::RUBY then
+ q.breakable
+ q.text "platform: #{@platform}"
+ end
+
+ unless @dependencies.empty? then
+ q.breakable
+ q.text 'dependencies:'
+ q.breakable
+ q.pp @dependencies
+ end
+ end
+ end
+
##
# A specification constructed from the lockfile is returned
def spec
+ @spec ||= Gem::Specification.find { |spec|
+ spec.name == @name and spec.version == @version
+ }
+
@spec ||= Gem::Specification.new do |s|
s.name = @name
s.version = @version
diff --git a/lib/rubygems/resolver/set.rb b/lib/rubygems/resolver/set.rb
index f053b65e15..b26dc45c7b 100644
--- a/lib/rubygems/resolver/set.rb
+++ b/lib/rubygems/resolver/set.rb
@@ -9,8 +9,20 @@ class Gem::Resolver::Set
attr_accessor :remote
+ ##
+ # Errors encountered when resolving gems
+
+ attr_accessor :errors
+
+ ##
+ # When true, allows matching of requests to prerelease gems.
+
+ attr_accessor :prerelease
+
def initialize # :nodoc:
- @remote = true
+ @prerelease = false
+ @remote = true
+ @errors = []
end
##
diff --git a/lib/rubygems/resolver/spec_specification.rb b/lib/rubygems/resolver/spec_specification.rb
index 0c411bdf5f..1350e8a7ab 100644
--- a/lib/rubygems/resolver/spec_specification.rb
+++ b/lib/rubygems/resolver/spec_specification.rb
@@ -4,8 +4,6 @@
class Gem::Resolver::SpecSpecification < Gem::Resolver::Specification
- attr_reader :spec # :nodoc:
-
##
# A SpecSpecification is created for a +set+ for a Gem::Specification in
# +spec+. The +source+ is either where the +spec+ came from, or should be
diff --git a/lib/rubygems/resolver/specification.rb b/lib/rubygems/resolver/specification.rb
index d158225474..4d77293262 100644
--- a/lib/rubygems/resolver/specification.rb
+++ b/lib/rubygems/resolver/specification.rb
@@ -31,6 +31,14 @@ class Gem::Resolver::Specification
attr_reader :source
##
+ # The Gem::Specification for this Resolver::Specification.
+ #
+ # Implementers, note that #install updates @spec, so be sure to cache the
+ # Gem::Specification in @spec when overriding.
+
+ attr_reader :spec
+
+ ##
# The version of the gem for this specification.
attr_reader :version
@@ -48,6 +56,13 @@ class Gem::Resolver::Specification
end
##
+ # Fetches development dependencies if the source does not provide them by
+ # default (see APISpecification).
+
+ def fetch_development_dependencies # :nodoc:
+ end
+
+ ##
# The name and version of the specification.
#
# Unlike Gem::Specification#full_name, the platform is not included.
@@ -61,8 +76,11 @@ class Gem::Resolver::Specification
# install method yields a Gem::Installer instance, which indicates the
# gem will be installed, or +nil+, which indicates the gem is already
# installed.
+ #
+ # After installation #spec is updated to point to the just-installed
+ # specification.
- def install options
+ def install options = {}
require 'rubygems/installer'
destination = options[:install_dir] || Gem.dir
@@ -75,7 +93,7 @@ class Gem::Resolver::Specification
yield installer if block_given?
- installer.install
+ @spec = installer.install
end
##
@@ -85,5 +103,8 @@ class Gem::Resolver::Specification
Gem::Platform.match spec.platform
end
+ def local? # :nodoc:
+ false
+ end
end
diff --git a/lib/rubygems/resolver/vendor_set.rb b/lib/rubygems/resolver/vendor_set.rb
index 6e867073be..614bd05382 100644
--- a/lib/rubygems/resolver/vendor_set.rb
+++ b/lib/rubygems/resolver/vendor_set.rb
@@ -43,6 +43,8 @@ class Gem::Resolver::VendorSet < Gem::Resolver::Set
@specs[spec.name] = spec
@directories[spec] = directory
+
+ spec
end
##
@@ -51,7 +53,7 @@ class Gem::Resolver::VendorSet < Gem::Resolver::Set
def find_all req
@specs.values.select do |spec|
- req.matches_spec? spec
+ req.match? spec
end.map do |spec|
source = Gem::Source::Vendor.new @directories[spec]
Gem::Resolver::VendorSpecification.new self, spec, source
diff --git a/lib/rubygems/resolver/vendor_specification.rb b/lib/rubygems/resolver/vendor_specification.rb
index c6a8e58d9b..a99b5f3cc1 100644
--- a/lib/rubygems/resolver/vendor_specification.rb
+++ b/lib/rubygems/resolver/vendor_specification.rb
@@ -16,7 +16,7 @@ class Gem::Resolver::VendorSpecification < Gem::Resolver::SpecSpecification
# This is a null install as this gem was unpacked into a directory.
# +options+ are ignored.
- def install options
+ def install options = {}
yield nil
end
diff --git a/lib/rubygems/security/policy.rb b/lib/rubygems/security/policy.rb
index 7238b2e477..b9bcb17525 100644
--- a/lib/rubygems/security/policy.rb
+++ b/lib/rubygems/security/policy.rb
@@ -218,6 +218,7 @@ class Gem::Security::Policy
# against
else
alert_warning "#{full_name} is not signed"
+ return
end
end
diff --git a/lib/rubygems/server.rb b/lib/rubygems/server.rb
index ca6dc683f5..7655be22ce 100644
--- a/lib/rubygems/server.rb
+++ b/lib/rubygems/server.rb
@@ -530,6 +530,36 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
end
end
+ def prerelease_specs req, res
+ reset_gems
+
+ res['content-type'] = 'application/x-gzip'
+
+ add_date res
+
+ specs = Gem::Specification.select do |spec|
+ spec.version.prerelease?
+ end.sort.map do |spec|
+ platform = spec.original_platform || Gem::Platform::RUBY
+ [spec.name, spec.version, platform]
+ end
+
+ specs = Marshal.dump specs
+
+ if req.path =~ /\.gz$/ then
+ specs = Gem.gzip specs
+ res['content-type'] = 'application/x-gzip'
+ else
+ res['content-type'] = 'application/octet-stream'
+ end
+
+ if req.request_method == 'HEAD' then
+ res['content-length'] = specs.length
+ else
+ res.body << specs
+ end
+ end
+
def quick(req, res)
reset_gems
@@ -537,7 +567,7 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
add_date res
case req.request_uri.path
- when %r|^/quick/(Marshal.#{Regexp.escape Gem.marshal_version}/)?(.*?)-([0-9.]+)(-.*?)?\.gemspec\.rz$| then
+ when %r|^/quick/(Marshal.#{Regexp.escape Gem.marshal_version}/)?(.*?)-([0-9.]+[^-]*?)(-.*?)?\.gemspec\.rz$| then
marshal_format, name, version, platform = $1, $2, $3, $4
specs = Gem::Specification.find_all_by_name name, version
@@ -757,6 +787,11 @@ div.method-source-code pre { color: #ffdead; overflow: hidden; }
@server.mount_proc "/latest_specs.#{Gem.marshal_version}.gz",
method(:latest_specs)
+ @server.mount_proc "/prerelease_specs.#{Gem.marshal_version}",
+ method(:prerelease_specs)
+ @server.mount_proc "/prerelease_specs.#{Gem.marshal_version}.gz",
+ method(:prerelease_specs)
+
@server.mount_proc "/quick/", method(:quick)
@server.mount_proc("/gem-server-rdoc-style.css") do |req, res|
diff --git a/lib/rubygems/source.rb b/lib/rubygems/source.rb
index 7f34e43528..4858ffb5ba 100644
--- a/lib/rubygems/source.rb
+++ b/lib/rubygems/source.rb
@@ -78,15 +78,21 @@ class Gem::Source
# Returns a Set that can fetch specifications from this source.
def dependency_resolver_set # :nodoc:
+ return Gem::Resolver::IndexSet.new self if 'file' == api_uri.scheme
+
bundler_api_uri = api_uri + './api/v1/dependencies'
begin
fetcher = Gem::RemoteFetcher.fetcher
- fetcher.fetch_path bundler_api_uri, nil, true
+ response = fetcher.fetch_path bundler_api_uri, nil, true
rescue Gem::RemoteFetcher::FetchError
Gem::Resolver::IndexSet.new self
else
- Gem::Resolver::APISet.new bundler_api_uri
+ if response.respond_to? :uri then
+ Gem::Resolver::APISet.new response.uri
+ else
+ Gem::Resolver::APISet.new bundler_api_uri
+ end
end
end
@@ -100,6 +106,8 @@ class Gem::Source
def cache_dir(uri)
# Correct for windows paths
escaped_path = uri.path.sub(/^\/([a-z]):\//i, '/\\1-/')
+ escaped_path.untaint
+
File.join Gem.spec_cache_dir, "#{uri.host}%#{uri.port}", File.dirname(escaped_path)
end
diff --git a/lib/rubygems/source/git.rb b/lib/rubygems/source/git.rb
index 2e3fa03730..fb9cbce2fb 100644
--- a/lib/rubygems/source/git.rb
+++ b/lib/rubygems/source/git.rb
@@ -51,7 +51,7 @@ class Gem::Source::Git < Gem::Source
# will be checked out when the gem is installed.
def initialize name, repository, reference, submodules = false
- super(nil)
+ super repository
@name = name
@repository = repository
@@ -67,7 +67,7 @@ class Gem::Source::Git < Gem::Source
case other
when Gem::Source::Git then
0
- when Gem::Source::Installed,
+ when Gem::Source::Vendor,
Gem::Source::Lock then
-1
when Gem::Source then
@@ -101,7 +101,7 @@ class Gem::Source::Git < Gem::Source
Dir.chdir install_dir do
system @git, 'fetch', '--quiet', '--force', '--tags', install_dir
- success = system @git, 'reset', '--quiet', '--hard', @reference
+ success = system @git, 'reset', '--quiet', '--hard', rev_parse
success &&=
Gem::Util.silent_system @git, 'submodule', 'update',
diff --git a/lib/rubygems/source/installed.rb b/lib/rubygems/source/installed.rb
index 6d343c2439..bd05c75af1 100644
--- a/lib/rubygems/source/installed.rb
+++ b/lib/rubygems/source/installed.rb
@@ -12,7 +12,8 @@ class Gem::Source::Installed < Gem::Source
def <=> other
case other
- when Gem::Source::Lock,
+ when Gem::Source::Git,
+ Gem::Source::Lock,
Gem::Source::Vendor then
-1
when Gem::Source::Installed then
@@ -31,5 +32,9 @@ class Gem::Source::Installed < Gem::Source
nil
end
+ def pretty_print q # :nodoc:
+ q.text '[Installed]'
+ end
+
end
diff --git a/lib/rubygems/source/specific_file.rb b/lib/rubygems/source/specific_file.rb
index a7b6c53542..250a839203 100644
--- a/lib/rubygems/source/specific_file.rb
+++ b/lib/rubygems/source/specific_file.rb
@@ -5,6 +5,11 @@
class Gem::Source::SpecificFile < Gem::Source
##
+ # The path to the gem for this specific file.
+
+ attr_reader :path
+
+ ##
# Creates a new SpecificFile for the gem in +file+
def initialize(file)
@@ -37,7 +42,7 @@ class Gem::Source::SpecificFile < Gem::Source
end
def pretty_print q # :nodoc:
- q.group 2, '[Local:', ']' do
+ q.group 2, '[SpecificFile:', ']' do
q.breakable
q.text @path
end
diff --git a/lib/rubygems/spec_fetcher.rb b/lib/rubygems/spec_fetcher.rb
index 12b8fb27d8..4967c4a40b 100644
--- a/lib/rubygems/spec_fetcher.rb
+++ b/lib/rubygems/spec_fetcher.rb
@@ -186,7 +186,7 @@ class Gem::SpecFetcher
def suggest_gems_from_name gem_name
gem_name = gem_name.downcase.tr('_-', '')
max = gem_name.size / 2
- names = available_specs(:complete).first.values.flatten(1)
+ names = available_specs(:latest).first.values.flatten(1)
matches = names.map { |n|
next unless n.match_platform?
@@ -258,18 +258,11 @@ class Gem::SpecFetcher
# etc.). If +gracefully_ignore+ is true, errors are ignored.
def tuples_for(source, type, gracefully_ignore=false) # :nodoc:
- cache = @caches[type]
-
- tuples =
- begin
- cache[source.uri] ||=
- source.load_specs(type).sort_by { |tup| tup.name }
- rescue Gem::RemoteFetcher::FetchError
- raise unless gracefully_ignore
- []
- end
-
- tuples
+ @caches[type][source.uri] ||=
+ source.load_specs(type).sort_by { |tup| tup.name }
+ rescue Gem::RemoteFetcher::FetchError
+ raise unless gracefully_ignore
+ []
end
end
diff --git a/lib/rubygems/specification.rb b/lib/rubygems/specification.rb
index f4e609a5eb..975a2e3f9a 100644
--- a/lib/rubygems/specification.rb
+++ b/lib/rubygems/specification.rb
@@ -14,12 +14,6 @@ require 'rubygems/basic_specification'
require 'rubygems/stub_specification'
require 'rubygems/util/stringio'
-# :stopdoc:
-# date.rb can't be loaded for `make install` due to miniruby
-# Date is needed for old gems that stored #date as Date instead of Time.
-class Date; end
-# :startdoc:
-
##
# The Specification class contains the information for a Gem. Typically
# defined in a .gemspec file or a Rakefile, and looks like this:
@@ -218,9 +212,11 @@ class Gem::Specification < Gem::BasicSpecification
# Usage:
#
# # If all library files are in the root directory...
- # spec.require_path = '.'
+ # spec.require_paths = ['.']
- attr_writer :require_paths
+ def require_paths=(val)
+ @require_paths = Array(val)
+ end
##
# The version of RubyGems used to create this gem.
@@ -373,7 +369,9 @@ class Gem::Specification < Gem::BasicSpecification
##
# A long description of this gem
#
- # The description should be more detailed than the summary.
+ # The description should be more detailed than the summary but not
+ # excessively long. A few paragraphs is a recommended length with no
+ # examples or formatting.
#
# Usage:
#
@@ -413,6 +411,16 @@ class Gem::Specification < Gem::BasicSpecification
attr_accessor :post_install_message
##
+ # The version of Ruby required by this gem
+
+ attr_reader :required_ruby_version
+
+ ##
+ # The RubyGems version required by this gem
+
+ attr_reader :required_rubygems_version
+
+ ##
# The key used to sign this gem. See Gem::Security for details.
attr_accessor :signing_key
@@ -472,6 +480,9 @@ class Gem::Specification < Gem::BasicSpecification
# found in bindir. These files must be executable Ruby files. Files that
# use bash or other interpreters will not work.
#
+ # Executables included may only be ruby scripts, not scripts for other
+ # languages or compiled binaries.
+ #
# Usage:
#
# spec.executables << 'rake'
@@ -532,20 +543,26 @@ class Gem::Specification < Gem::BasicSpecification