- 10 6月, 2020 1 次提交
-
-
由 Aaron Patterson 提交于
This reverts commit 02b216e5. This reverts commit 9b8825b6. I found that combining sweep and move is not safe. I don't think that we can do compaction concurrently with _anything_ unless there is a read barrier installed. Here is a simple example. A class object is freed, and during it's free step, it tries to remove itself from its parent's subclass list. However, during the sweep step, the parent class was moved and the "currently being freed" class didn't have references updated yet. So we get a segv like this: ``` (lldb) bt * thread #1, name = 'ruby', stop reason = signal SIGSEGV * frame #0: 0x0000560763e344cb ruby`rb_st_lookup at st.c:320:43 frame #1: 0x0000560763e344cb ruby`rb_st_lookup(tab=0x2f7469672f6e6f72, key=3809, value=0x0000560765bf2270) at st.c:1010 frame #2: 0x0000560763e8f16a ruby`rb_search_class_path at variable.c:99:9 frame #3: 0x0000560763e8f141 ruby`rb_search_class_path at variable.c:145 frame #4: 0x0000560763e8f141 ruby`rb_search_class_path(klass=94589785585880) at variable.c:191 frame #5: 0x0000560763ec744e ruby`rb_vm_bugreport at vm_dump.c:996:17 frame #6: 0x0000560763f5b958 ruby`rb_bug_for_fatal_signal at error.c:675:5 frame #7: 0x0000560763e27dad ruby`sigsegv(sig=<unavailable>, info=<unavailable>, ctx=<unavailable>) at signal.c:955:5 frame #8: 0x00007f8b891d33c0 libpthread.so.0`___lldb_unnamed_symbol1$$libpthread.so.0 + 1 frame #9: 0x0000560763efa8bb ruby`rb_class_remove_from_super_subclasses(klass=94589790314280) at class.c:93:56 frame #10: 0x0000560763d10cb7 ruby`gc_sweep_step at gc.c:2674:2 frame #11: 0x0000560763d1187b ruby`gc_sweep at gc.c:4540:2 frame #12: 0x0000560763d101f0 ruby`gc_start at gc.c:6797:6 frame #13: 0x0000560763d15153 ruby`rb_gc_compact at gc.c:7479:12 frame #14: 0x0000560763eb4eb8 ruby`vm_exec_core at vm_insnhelper.c:5183:13 frame #15: 0x0000560763ea9bae ruby`rb_vm_exec at vm.c:1953:22 frame #16: 0x0000560763eac08d ruby`rb_yield at vm.c:1132:9 frame #17: 0x0000560763edb4f2 ruby`rb_ary_collect at array.c:3186:9 frame #18: 0x0000560763e9ee15 ruby`vm_call_cfunc_with_frame at vm_insnhelper.c:2575:12 frame #19: 0x0000560763eb2e66 ruby`vm_exec_core at vm_insnhelper.c:4177:11 frame #20: 0x0000560763ea9bae ruby`rb_vm_exec at vm.c:1953:22 frame #21: 0x0000560763eac08d ruby`rb_yield at vm.c:1132:9 frame #22: 0x0000560763edb4f2 ruby`rb_ary_collect at array.c:3186:9 frame #23: 0x0000560763e9ee15 ruby`vm_call_cfunc_with_frame at vm_insnhelper.c:2575:12 frame #24: 0x0000560763eb2e66 ruby`vm_exec_core at vm_insnhelper.c:4177:11 frame #25: 0x0000560763ea9bae ruby`rb_vm_exec at vm.c:1953:22 frame #26: 0x0000560763ceee01 ruby`rb_ec_exec_node(ec=0x0000560765afa530, n=0x0000560765b088e0) at eval.c:296:2 frame #27: 0x0000560763cf3b7b ruby`ruby_run_node(n=0x0000560765b088e0) at eval.c:354:12 frame #28: 0x0000560763cee4a3 ruby`main(argc=<unavailable>, argv=<unavailable>) at main.c:50:9 frame #29: 0x00007f8b88e560b3 libc.so.6`__libc_start_main + 243 frame #30: 0x0000560763cee4ee ruby`_start + 46 (lldb) f 9 frame #9: 0x0000560763efa8bb ruby`rb_class_remove_from_super_subclasses(klass=94589790314280) at class.c:93:56 90 91 *RCLASS_EXT(klass)->parent_subclasses = entry->next; 92 if (entry->next) { -> 93 RCLASS_EXT(entry->next->klass)->parent_subclasses = RCLASS_EXT(klass)->parent_subclasses; 94 } 95 xfree(entry); 96 } (lldb) command script import -r misc/lldb_cruby.py lldb scripts for ruby has been installed. (lldb) rp entry->next->klass (struct RMoved) $1 = (flags = 30, destination = 94589792806680, next = 94589784369160) (lldb) ```
-
- 30 5月, 2020 1 次提交
-
-
由 Aaron Patterson 提交于
-
- 25 5月, 2020 1 次提交
-
-
由 Hiroshi SHIBATA 提交于
-
- 21 4月, 2020 1 次提交
-
-
由 Nobuyoshi Nakada 提交于
-
- 17 4月, 2020 2 次提交
-
-
由 Kazuhiro NISHIYAMA 提交于
-
由 Nobuyoshi Nakada 提交于
-
- 15 4月, 2020 1 次提交
-
-
由 Nobuyoshi Nakada 提交于
Instead of SignalException for SIGPIPE, raise `Errno::EPIPE` with instance variable `signo` and re-send that signal at exit. [Feature #14413]
-
- 12 4月, 2020 1 次提交
-
-
由 Nobuyoshi Nakada 提交于
View the help message wth pager designed by RUBY_PAGER or PAGER environment variable, unless that value is empty.
-
- 11 4月, 2020 1 次提交
-
-
由 Nobuyoshi Nakada 提交于
Raise `SignalException` for SIGPIPE to abort when EPIPE occurs.
-
- 10 4月, 2020 4 次提交
-
-
由 Nobuyoshi Nakada 提交于
-
由 Nobuyoshi Nakada 提交于
-
由 Nobuyoshi Nakada 提交于
-
由 Nobuyoshi Nakada 提交于
[Feature #15921]
-
- 08 4月, 2020 1 次提交
-
-
由 卜部昌平 提交于
Split ruby.h
-
- 18 3月, 2020 2 次提交
-
-
由 Kazuhiro NISHIYAMA 提交于
-
由 Jeremy Evans 提交于
Previously, passing a keyword splat to a method always allocated a hash on the caller side, and accepting arbitrary keywords in a method allocated a separate hash on the callee side. Passing explicit keywords to a method that accepted a keyword splat did not allocate a hash on the caller side, but resulted in two hashes allocated on the callee side. This commit makes passing a single keyword splat to a method not allocate a hash on the caller side. Passing multiple keyword splats or a mix of explicit keywords and a keyword splat still generates a hash on the caller side. On the callee side, if arbitrary keywords are not accepted, it does not allocate a hash. If arbitrary keywords are accepted, it will allocate a hash, but this commit uses a callinfo flag to indicate whether the caller already allocated a hash, and if so, the callee can use the passed hash without duplicating it. So this commit should make it so that a maximum of a single hash is allocated during method calls. To set the callinfo flag appropriately, method call argument compilation checks if only a single keyword splat is given. If only one keyword splat is given, the VM_CALL_KW_SPLAT_MUT callinfo flag is not set, since in that case the keyword splat is passed directly and not mutable. If more than one splat is used, a new hash needs to be generated on the caller side, and in that case the callinfo flag is set, indicating the keyword splat is mutable by the callee. In compile_hash, used for both hash and keyword argument compilation, if compiling keyword arguments and only a single keyword splat is used, pass the argument directly. On the caller side, in vm_args.c, the callinfo flag needs to be recognized and handled. Because the keyword splat argument may not be a hash, it needs to be converted to a hash first if not. Then, unless the callinfo flag is set, the hash needs to be duplicated. The temporary copy of the callinfo flag, kw_flag, is updated if a hash was duplicated, to prevent the need to duplicate it again. If we are converting to a hash or duplicating a hash, we need to update the argument array, which can including duplicating the positional splat array if one was passed. CALLER_SETUP_ARG and a couple other places needs to be modified to handle similar issues for other types of calls. This includes fairly comprehensive tests for different ways keywords are handled internally, checking that you get equal results but that keyword splats on the caller side result in distinct objects for keyword rest parameters. Included are benchmarks for keyword argument calls. Brief results when compiled without optimization: def kw(a: 1) a end def kws(**kw) kw end h = {a: 1} kw(a: 1) # about same kw(**h) # 2.37x faster kws(a: 1) # 1.30x faster kws(**h) # 2.19x faster kw(a: 1, **h) # 1.03x slower kw(**h, **h) # about same kws(a: 1, **h) # 1.16x faster kws(**h, **h) # 1.14x faster
-
- 16 3月, 2020 1 次提交
-
-
由 Yusuke Endoh 提交于
As a semantics, Hash#each yields a 2-element array (pairs of keys and values). So, `{ a: 1 }.each(&->(k, v) { })` should raise an exception due to lambda's arity check. However, the optimization that avoids Array allocation by using rb_yield_values for blocks whose arity is more than 1 (introduced at b9d29603 and some commits), seemed to overlook the lambda case, and wrongly allowed the code above to work. This change experimentally attempts to make it strict; now the code above raises an ArgumentError. This is an incompatible change; if the compatibility issue is bigger than our expectation, it may be reverted (until Ruby 3.0 release). [Bug #12706]
-
- 11 3月, 2020 2 次提交
-
-
由 Takashi Kokubun 提交于
-
由 Takashi Kokubun 提交于
* Let Net::HTTP.get take request headers * Add more test cases for no header usages * Add examples with request headers * Add a NEWS entry [ci skip] [Feature #16686]
-
- 10 3月, 2020 2 次提交
-
-
由 Nobuyoshi Nakada 提交于
-
由 Nobuyoshi Nakada 提交于
-
- 09 3月, 2020 1 次提交
-
-
由 Jeremy Evans 提交于
-
- 03 3月, 2020 1 次提交
-
-
由 Nobuyoshi Nakada 提交于
As the headings become link anchors, remove less useful notes. [ci skip]
-
- 29 2月, 2020 3 次提交
-
-
由 Nobuyoshi Nakada 提交于
-
由 Nobuyoshi Nakada 提交于
-
由 Jeremy Evans 提交于
-
- 19 2月, 2020 1 次提交
-
-
由 Nobuyoshi Nakada 提交于
-
- 17 2月, 2020 4 次提交
-
-
由 Marcus Stollsteimer 提交于
-
由 Marcus Stollsteimer 提交于
-
由 Marcus Stollsteimer 提交于
-
由 Marcus Stollsteimer 提交于
-
- 12 2月, 2020 1 次提交
-
-
由 Jeremy Evans 提交于
This behavior was deprecated in 2.7 and scheduled to be removed in 3.0. Calling yield in a class definition outside a method is now a SyntaxError instead of a LocalJumpError, as well.
-
- 24 1月, 2020 1 次提交
-
-
由 NARUSE, Yui 提交于
[Feature #16555] https://github.com/ruby/ruby/pull/2858
-
- 23 1月, 2020 1 次提交
-
-
由 Jeremy Evans 提交于
These were all deprecated in Ruby 2.7.
-
- 19 1月, 2020 2 次提交
-
-
由 Nobuyoshi Nakada 提交于
It is not set by default in the Github viewer.
-
由 Nobuyoshi Nakada 提交于
Sort the results which matched single wildcard or character set in binary ascending order, unless `sort: false` is given. The order of an Array of pattern strings and braces are not affected.
-
- 18 1月, 2020 3 次提交
-
-
由 Nobuyoshi Nakada 提交于
As the only h2 did not have its exclusively owned body text, merged it to the first paragraph. Then pulled up h3 and deeper headings.
-
由 Nobuyoshi Nakada 提交于
-
由 Nobuyoshi Nakada 提交于
* The definition lists extensions of the RDoc Markdown parser does not support nesting. * The RDoc Markdown parser requires more indents for nested lists.
-
- 16 1月, 2020 1 次提交
-
-
由 Hiroshi SHIBATA 提交于
[Feature #16484][ruby-core:96682]
-