Граф коммитов

49 Коммитов

Автор SHA1 Сообщение Дата
Takashi Kokubun 200c5f4075
Add NEWS entries about JIT optimizations
and a related VM improvement.

JIT related commits:

* Code size reduction
  * Deduplicate functions on JIT compaction 818d6d3336
  * Avoid always inlining cold paths of ivar fcd2576290
  * Inline only fast path of rb_class_of b16a2aa938
  * Eliminate a call instruction on deopt 61b14bb32b
* Cold path partitioning
  * Mark method call slow paths as COLDFUNC 0e5a58b6bf
  * Mark vm_stackoverflow as NOINLINE COLDFUNC 9d71373c23
  * Create mjit_exec_slowpath and mark it as NOINLINE COLDFUNC 083a17a82a
* Primitive.attr! 'inline' / Integer#zero? 7561db8c00
  * Kernel#class 946e5cc668
  * (more to come...)
* Properly generate opt_send for cfunc cc 7982dc1dfd
* Optimize exivar access b736ea63bd
* Make JIT-ed leave leaf 151f8be40d
* Inline vm_call_cfunc b9d3ceee8f

VM:

* Enable fastpath on invokesuper 5c27681813
  * History: https://speakerdeck.com/k0kubun/ruby-3-samituto?slide=40 (in Japanese)
2020-06-26 01:33:54 -07:00
Takashi Kokubun 95b0fed371
Make Integer#zero? a separated method and builtin (#3226)
A prerequisite to fix https://bugs.ruby-lang.org/issues/15589 with JIT.
This commit alone doesn't make a significant difference yet, but I thought
this commit should be committed independently.

This method override was discussed in [Misc #16961].
2020-06-20 14:55:09 -07:00
Hiroshi SHIBATA e92a9399cc Added sdbm entry to NEWS 2020-06-19 08:26:47 +09:00
Kazuhiro NISHIYAMA 42b4234ba4
Add links [ci skip] 2020-06-19 00:59:30 +09:00
Jeremy Evans c0591b8477 Update NEWS.md [ci skip] 2020-06-18 08:47:02 -07:00
Nobuyoshi Nakada 50c13eb718
NEWS about Hash#except ENV#except [Feature #15822] 2020-06-18 23:09:11 +09:00
Kazuki Tsujimoto ddded1157a
Introduce find pattern [Feature #16828] 2020-06-14 09:24:36 +09:00
Aaron Patterson 62ce8f96cd
Revert "Combine sweeping and moving"
This reverts commit 02b216e5a7.
This reverts commit 9b8825b6f9.

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)
```
2020-06-09 13:53:18 -07:00
Aaron Patterson 9b8825b6f9
Update NEWS / documentation with GC.start(compact:true) 2020-05-29 15:59:42 -07:00
Hiroshi SHIBATA 45ffab365d
Added entries about RubyGems and Bundler 2020-05-25 15:20:39 +09:00
Nobuyoshi Nakada bf11bf31e2
NEWS.md: the order of backtrace [Feature #8661] [ci skip] 2020-04-21 19:29:16 +09:00
Kazuhiro NISHIYAMA 92c8258858
Fix a typo [ci skip] 2020-04-17 17:59:43 +09:00
Nobuyoshi Nakada c817868705
NEWS.md: Mentioned the removal of NIL/TRUE/FALSE [ci skip] 2020-04-17 17:49:50 +09:00
Nobuyoshi Nakada 155f64e3c4
Raise EPIPE at broken pipe for the backward compatibility
Instead of SignalException for SIGPIPE, raise `Errno::EPIPE` with
instance variable `signo` and re-send that signal at exit.
[Feature #14413]
2020-04-15 21:05:39 +09:00
Nobuyoshi Nakada f22c4ff359 View the help message with PAGER [Feature #16754]
View the help message wth pager designed by RUBY_PAGER or PAGER
environment variable, unless that value is empty.
2020-04-12 14:58:13 +09:00
Nobuyoshi Nakada 6f28ebd585
Silence broken pipe error messages on STDOUT [Feature #14413]
Raise `SignalException` for SIGPIPE to abort when EPIPE occurs.
2020-04-11 09:30:19 +09:00
Nobuyoshi Nakada 302da060af
Reference to [Feature #16746] [ci skip] 2020-04-10 21:02:18 +09:00
Nobuyoshi Nakada e8f53692ca
Endless method definition [Feature #16746] 2020-04-10 18:02:15 +09:00
Nobuyoshi Nakada 878e21c6cd
R-assign is still experimental [Feature #15921] [ci skip] 2020-04-10 17:35:02 +09:00
Nobuyoshi Nakada 1b2d351b21
Rightward-assign by ASSOC
[Feature #15921]
2020-04-10 15:03:58 +09:00
卜部昌平 9e6e39c351
Merge pull request #2991 from shyouhei/ruby.h
Split ruby.h
2020-04-08 13:28:13 +09:00
Kazuhiro NISHIYAMA afd23ed049
Added link to the ticket [ci skip] 2020-03-18 13:57:03 +09:00
Jeremy Evans d2c41b1bff Reduce allocations for keyword argument hashes
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
2020-03-17 12:09:43 -07:00
Yusuke Endoh 47141797be hash.c: Do not use the fast path (rb_yield_values) for lambda blocks
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
b9d2960337 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]
2020-03-16 23:17:12 +09:00
Takashi Kokubun de4999ef23
Try to correct grammer of the NEWS entry [ci skip] 2020-03-10 22:29:40 -07:00
Takashi Kokubun e0512b29aa
Let Net::HTTP.get take request headers (#2957)
* 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]
2020-03-10 22:26:22 -07:00
Nobuyoshi Nakada bba2b70949
RDoc markdown parser needs explicit code block or more indents [ci skip] 2020-03-10 12:57:35 +09:00
Nobuyoshi Nakada 384feb6c51
Added link to the ticket [ci skip] 2020-03-10 12:43:49 +09:00
Jeremy Evans 9034cbd331 Update NEWS for autosplatting change [ci skip] 2020-03-09 08:11:13 -07:00
Nobuyoshi Nakada a8c5b9a2fd
[DOC] Separated parenthesized notes from subsection headings
As the headings become link anchors, remove less useful notes.
[ci skip]
2020-03-03 17:38:00 +09:00
Nobuyoshi Nakada 2b85591943
Fix up mark-ups in NEWS [ci skip] 2020-02-29 13:24:29 +09:00
Nobuyoshi Nakada 0333f3c03c
Missing links in NEWS [ci skip] 2020-02-29 12:20:49 +09:00
Jeremy Evans 99ff4d61ec Update NEWS [ci skip] 2020-02-28 16:12:13 -08:00
Nobuyoshi Nakada f0b815dc67
`Proc` made by `Symbol#to_proc` should be a lambda [Bug #16260] 2020-02-19 15:46:26 +09:00
Marcus Stollsteimer a9e10d3b8e NEWS.md: add missing ticket links 2020-02-16 21:00:49 +01:00
Marcus Stollsteimer 6ca0a62d21 NEWS.md: improve language; markup as list item 2020-02-16 21:00:41 +01:00
Marcus Stollsteimer 1126f58c62 NEWS.md: remove leading whitespace 2020-02-16 21:00:34 +01:00
Marcus Stollsteimer 3281f70d7c NEWS.md: fix method references; remove surplus brackets 2020-02-16 21:00:27 +01:00
Jeremy Evans 7a288df7b8 Make yield in singleton class definitions in methods a SyntaxError
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.
2020-02-11 12:44:23 -08:00
NARUSE, Yui 80bbc7f402 Add #verify_hostname= and #verify_hostname to skip hostname verification
[Feature #16555]
https://github.com/ruby/ruby/pull/2858
2020-01-24 15:17:02 +09:00
Jeremy Evans e91c39f1c0 Remove special handling of $SAFE and related C-APIs
These were all deprecated in Ruby 2.7.
2020-01-22 09:09:47 -08:00
Nobuyoshi Nakada 0ab93e098f NEWS.md: set code format explicitly [ci skip]
It is not set by default in the Github viewer.
2020-01-19 21:07:24 +09:00
Nobuyoshi Nakada 2f1081a451
Sort globbed results by default [Feature #8709]
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.
2020-01-19 14:46:01 +09:00
Nobuyoshi Nakada 79f0ed3529
NEWS.md: reduce headings level [ci skip]
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.
2020-01-18 17:46:52 +09:00
Nobuyoshi Nakada 59d255b940
NEWS.md: made ticket references links [ci skip] 2020-01-18 17:43:07 +09:00
Nobuyoshi Nakada a1ce1dc2a7
NEWS.md: fixed lists and indents [ci skip]
* The definition lists extensions of the RDoc Markdown parser does
  not support nesting.

* The RDoc Markdown parser requires more indents for nested lists.
2020-01-18 17:23:20 +09:00
Hiroshi SHIBATA 62baad9fe1
Removed xmlrpc and net-telnet from the bundled gems.
[Feature #16484][ruby-core:96682]
2020-01-16 16:56:53 +09:00
Yusuke Endoh 815807d2ab NEWS.md: mention "Freeze Regexp literals" [Feature #8948] 2020-01-15 12:43:49 +09:00
Yusuke Endoh 9feca5ceb9 NEWS.md: converted from NEWS
and NEWS is deleted
2020-01-15 12:42:47 +09:00