[#106355] [Ruby master Bug#18373] RBS build failure: '/include/x86_64-linux/ruby/config.h', needed by 'constants.o'. — "vo.x (Vit Ondruch)" <noreply@...>

Issue #18373 has been reported by vo.x (Vit Ondruch).

28 messages 2021/12/01

[#106356] [Ruby master Bug#18374] make: Circular spec/ruby/optional/capi/ext/array_spec.c <- spec/ruby/optional/capi/ext/array_spec.c dependency dropped. — "vo.x (Vit Ondruch)" <noreply@...>

Issue #18374 has been reported by vo.x (Vit Ondruch).

8 messages 2021/12/01

[#106360] [Ruby master Feature#18376] Version comparison API — "vo.x (Vit Ondruch)" <noreply@...>

Issue #18376 has been reported by vo.x (Vit Ondruch).

28 messages 2021/12/01

[#106543] [Ruby master Bug#18396] An unexpected "hash value omission" syntax error when parentheses call expr follows — "koic (Koichi ITO)" <noreply@...>

Issue #18396 has been reported by koic (Koichi ITO).

10 messages 2021/12/08

[#106596] [Ruby master Misc#18399] DevMeeting-2022-01-13 — "mame (Yusuke Endoh)" <noreply@...>

Issue #18399 has been reported by mame (Yusuke Endoh).

11 messages 2021/12/09

[#106621] [Ruby master Misc#18404] 3.1 documentation problems tracking ticket — "zverok (Victor Shepelev)" <noreply@...>

Issue #18404 has been reported by zverok (Victor Shepelev).

16 messages 2021/12/11

[#106634] [Ruby master Bug#18407] Behavior difference between integer and string flags to File creation — deivid <noreply@...>

Issue #18407 has been reported by deivid (David Rodr鱈guez).

12 messages 2021/12/13

[#106644] [Ruby master Bug#18408] Rightward assignment into instance variable — "Dan0042 (Daniel DeLorme)" <noreply@...>

Issue #18408 has been reported by Dan0042 (Daniel DeLorme).

23 messages 2021/12/13

[#106686] [Ruby master Bug#18409] Crash (free(): invalid pointer) if LD_PRELOAD doesn't explicitly include libjemalloc.so.2 — "itay-grudev (Itay Grudev)" <noreply@...>

Issue #18409 has been reported by itay-grudev (Itay Grudev).

7 messages 2021/12/15

[#106730] [Ruby master Bug#18417] IO::Buffer problems — "zverok (Victor Shepelev)" <noreply@...>

Issue #18417 has been reported by zverok (Victor Shepelev).

9 messages 2021/12/19

[#106784] [CommonRuby Feature#18429] Configure ruby-3.0.3 on Solaris 10 Unknown keyword 'URL' in './ruby.tmp.pc' — "dklein (Dmitri Klein)" <noreply@...>

Issue #18429 has been reported by dklein (Dmitri Klein).

32 messages 2021/12/23

[#106828] [Ruby master Bug#18435] Calling `protected` on ancestor method changes result of `instance_methods(false)` — "ufuk (Ufuk Kayserilioglu)" <noreply@...>

Issue #18435 has been reported by ufuk (Ufuk Kayserilioglu).

23 messages 2021/12/26

[#106833] [Ruby master Feature#18438] Add `Exception#additional_message` to show additional error information — "mame (Yusuke Endoh)" <noreply@...>

Issue #18438 has been reported by mame (Yusuke Endoh).

30 messages 2021/12/27

[#106834] [Ruby master Bug#18439] Support YJIT for VC++ — "usa (Usaku NAKAMURA)" <noreply@...>

Issue #18439 has been reported by usa (Usaku NAKAMURA).

11 messages 2021/12/27

[#106851] [Ruby master Bug#18442] Make Ruby 3.0.3 on Solaris 10 with "The following command caused the error: cc -D_STDC_C99= " — "dklein (Dmitri Klein)" <noreply@...>

Issue #18442 has been reported by dklein (Dmitri Klein).

8 messages 2021/12/27

[#106928] [Ruby master Bug#18454] YJIT slowing down key Discourse benchmarks — "sam.saffron (Sam Saffron)" <noreply@...>

Issue #18454 has been reported by sam.saffron (Sam Saffron).

8 messages 2021/12/31

[ruby-core:106557] [Ruby master Feature#18397] Remove documentation that Qfalse == 0 in `extension.rdoc`, instead encourage use of RTEST

From: "jemmai (Jemma Issroff)" <noreply@...>
Date: 2021-12-08 18:34:18 UTC
List: ruby-core #106557
Issue #18397 has been reported by jemmai (Jemma Issroff).

----------------------------------------
Feature #18397: Remove documentation that Qfalse == 0 in `extension.rdoc`, instead encourage use of RTEST
https://bugs.ruby-lang.org/issues/18397

* Author: jemmai (Jemma Issroff)
* Status: Open
* Priority: Normal
----------------------------------------
Currently, [the extension documentation](https://github.com/ruby/ruby/blob/master/doc/extension.rdoc#label-Convert+VALUE+into+C+Data) states that “Qfalse is false in C (i.e. 0).” Instead, we should encourage the use of RTEST in documentation so that we can change the value of Qfalse in the future. 

**Why would we want to change Qfalse away from 0?**

Method calls on objects are one of the most common operations in Ruby. Each time this happens, Ruby needs to resolve the class of the object for method lookup. If the object is a Heap object, this means that Ruby must first check that the handle is a heap object pointer, so it can resolve the class by dereferencing the pointer.

Under CRuby’s current value tagging scheme, there are at least 2 comparisons necessary across 4 machine instructions to do this check. In YJIT, for example, this looks like the following:

```
; assume VALUE is in rax
heap_object_p:
test rax, immediate_flags
jnz not_heap_object          
cmp rax, Qnil 
jbe not_heap_object
```

This is because Qfalse is all 0 bits, whereas other types, like Qnil, Qtrue, flonums, etc, all have toggled bits. This means that [`RB_SPECIAL_CONST_P`](https://github.com/ruby/ruby/blob/715a51a0d6963f9d727191d4e1ad0690fd28c4dd/include/ruby/internal/special_consts.h#L252-L263) (which we negate to check if a handle is a heap pointer), has two distinct operations:  `RB_IMMEDIATE_P(obj) || ! RB_TEST(obj)`. 

If, however, `Qfalse` was not 0, we could instead rework the value tagging scheme so that all of this could be done with one operation, similar to the existing [`RB_IMMEDIATE_P`](https://github.com/ruby/ruby/blob/715a51a0d6963f9d727191d4e1ad0690fd28c4dd/include/ruby/internal/special_consts.h#L233-L247) check. In an ideal world, the check could look something like this, where `Qfalse` is included in `immediate_flags`:

```
; assume VALUE is in rax
heap_object_p:
test rax, immediate_flags
jnz not_heap_object          
```

This could yield performance benefits in the Ruby Interpreter, YJIT and MJIT because it would speed up any method calls on an object.

**Why does the current documentation make it difficult to do this?**

One current barrier to changing Qfalse away from 0 is that the extension documentation guarantees that in CRuby `Qfalse == 0`. This means that native extensions can (and do!) rely on this fact, and use Qfalse and 0 interchangeably. 

In fact, even in CRuby itself, there are several examples of when we make implicit assumptions about Qfalse. For instance, using a VALUE as the sole condition in an if statement to check for Qfalse, using MEMZERO to fill a buffer with Qfalse, using calloc to get a buffer filled with Qfalse, and many more.

**How could changing the documentation help?**

If we remove the documentation stating that Qfalse is 0, and instead add documentation insisting on the use of [`RTEST`](https://github.com/ruby/ruby/blob/715a51a0d6963f9d727191d4e1ad0690fd28c4dd/include/ruby/internal/special_consts.h#L123-L149), we will position ourselves to be able to more easily change the value of Qfalse away from 0 in the future.

**Proposed new documentation**

See [this PR](https://github.com/ruby/ruby/pull/5230) or the attached patch for the specific proposed new documentation.

---Files--------------------------------
update_qfalse_docs.patch (719 Bytes)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next