Commit graph

9854 commits

Author SHA1 Message Date
Samuel Williams
04ddb7e808 Update Socket#accept to use rb_io_blocking_region. 2024-10-09 23:48:53 +13:00
Samuel Williams
3031bf6bd4 Update UDPSocket#send to use rb_io_blocking_region. 2024-10-09 23:48:53 +13:00
Samuel Williams
823f29a36e Update IPSocket to use rb_io_descriptor and rb_io_mode. 2024-10-09 21:05:01 +13:00
Samuel Williams
d78bf43708 Update UNIXSocket to use rb_io_blocking_region. 2024-10-09 21:05:01 +13:00
Samuel Williams
dee15211c1 Update BasicSocket to use rb_io_blocking_region. 2024-10-09 21:05:01 +13:00
Hiroshi SHIBATA
4eda289a13 Sync from ruby/win32-registry 2024-10-09 13:55:45 +09:00
Nobuyoshi Nakada
9a90cd2284 Cast via uintptr_t function pointer between object pointer
- ISO C forbids conversion of function pointer to object pointer type
- ISO C forbids conversion of object pointer to function pointer type
2024-10-08 23:29:49 +09:00
Jean Boussier
613694734e [ruby/json] generator.c: better fix for comparison of integers of different signs
c372dc9268
2024-10-08 12:22:42 +00:00
Hiroshi SHIBATA
02d4703eed Extract ext/win32/lib/win32/sspi.rb to ruby/win32-sspi 2024-10-08 17:11:44 +09:00
Hiroshi SHIBATA
c684164534 Fixed C23 compilation error with ruby/ruby master 2024-10-08 14:10:05 +09:00
Hiroshi SHIBATA
8a79f345a2 [ruby/json] Unicode string like § is not allowed in C files at ruby/ruby repo
53409bcc74
2024-10-08 14:10:05 +09:00
Jean Boussier
ea9d34082f [ruby/json] Fix compilation warning
```
generator.c:69:27: warning: comparison of integers of different signs: 'short' and 'unsigned long' [-Wsign-compare]
            for (i = 1; i < ch_len; i++) {
```

ff8edcd47c
2024-10-08 14:10:05 +09:00
Luke T. Shumaker
934d67b415 [ruby/json] generator.c: Optimize by combining calls to fbuffer_append
62301c0bc3
2024-10-08 14:10:05 +09:00
Luke T. Shumaker
74d459fd52 [ruby/json] Adjust to the CVTUTF code being gone
I, Luke T. Shumaker, am the sole author of the added code.

I did not reference CVTUTF when writing it.  I did reference the
Unicode standard (15.0.0), the Wikipedia article on UTF-8, and the
Wikipedia article on UTF-16.  When I saw some tests fail, I did
reference the old deleted code (but a JSON-specific part, inherently
not as based on CVTUTF) to determine that script_safe should also
escape U+2028 and U+2029.

I targeted simplicity and clarity when writing the code--it can likely
be optimized.  In my mind, the obvious next optimization is to have it
combine contiguous non-escaped characters into just one call to
fbuffer_append(), instead of calling fbuffer_append() for each
character.

Regarding the use of the "modern" types `uint32_t`, `uint16_t`, and
`bool`:
 - ruby.h is guaranteed to give us uint32_t and uint16_t.
 - Since Ruby 3.0.0, ruby.h is guaranteed to give us bool... but we
   support down to Ruby 2.3.  But, ruby.h is guaranteed to give us
   HAVE_STDBOOL_H for the C99 stdbool.h; so use that to include
   stdbool.h if we can, and if not then fall back to a copy of the
   same bool definition that Ruby 3.0.5 uses with C89.

c96351f874
2024-10-08 14:10:05 +09:00
Luke T. Shumaker
6e47968929 [ruby/json] Delete code that is based on CVTUTF
I did this based on manual inspection, comparing the code to my re-created
history of CVTUTF at https://git.lukeshu.com/2git/cvtutf/ (created by the
scripts at https://git.lukeshu.com/2git/cvtutf-make/)

0819553144
2024-10-08 14:10:05 +09:00
Jean Boussier
bad4ad63bf [ruby/json] Update all links to the repository following transfert
1edfeb8f10
2024-10-08 14:10:05 +09:00
Misaki Shioi
32c733f57b
[DOC] Add some descriptions for options of Socket::tcp 2024-10-07 15:28:32 +09:00
schneems
3c54b8e920 Allow method chaining with Pathname#mkpath
Currently in my code when I want to create a pathname object and create a path at the same time I must use tap

```
path = Pathname.new("/tmp/new").tap(&:mkpath)
```

I think it would be cleaner to be able to chain on the results of these methods instead:

```
path = Pathname.new("/tmp/new").mkpath
```
2024-10-04 12:21:27 +09:00
schneems
08346e7267 Introduce Pathname.mktmpdir
When I want to create a tmpdir I often want to manipulate it as a pathname. By introducing Pathname.mktmpdir I can get this behavior. 

Currently I must:

```ruby
Dir.mktmpdir do |dir|
  dir = Pathname(dir)
  # ... code
end
```

I would like to be able to instead:

```ruby
Pathname.mktmpdir do |dir|
  # ... code
end
```
2024-10-04 11:15:33 +09:00
Jean Boussier
4cd893b048 [flori/json] Optimize key type check in json_object_i
Rather than checking the class we can check the type.
This is very subtly different for String subclasses, but I think it's
OK.

We also save on checking the type again in the fast path.

772a0201ab
2024-10-03 14:20:34 +09:00
Jean Boussier
57282c62a0 [flori/json] Optimize fbuffer_inc_capa
On my `JSON.dump` benchmark it shows up as 6% of runtime, compared
to 40% for `convert_UTF8_to_JSON`.

Since the vast majority of the time this function is called we
still have some buffer capacity, we might as well check that
first and skip the expensive loop etc.

With this change my profiler now report this function as 0.7%,
so almost 10x better.

a7206bf2db
2024-10-03 14:20:34 +09:00
Jean Boussier
630c681321 [flori/json] JSON.dump: avoid redundant UTF-8 validation
Given that we called `rb_enc_str_asciionly_p`, if the string encoding
isn't valid UTF-8, we can't know it very cheaply by checking the
encoding and coderange that was just computed by Ruby, rather than
to do it ourselves.

Also Ruby might have already computed that earlier.

4b04c469d5
2024-10-03 14:20:34 +09:00
Nobuyoshi Nakada
d40db5cfec
[DOC] [pty] Add clean up to PTY.spawn 2024-10-03 12:38:01 +09:00
Nobuyoshi Nakada
f5d9d9b5f8
win32/sspi: Use start_with? to see prefix 2024-09-29 21:00:26 +09:00
Nobuyoshi Nakada
25eb9bded8
win32/sspi: Rafactor pack/unpack 2024-09-29 21:00:26 +09:00
Nobuyoshi Nakada
30230ed9e6
win32/sspi: For Ractor use a constant instead of a class variable 2024-09-29 21:00:26 +09:00
Nobuyoshi Nakada
fc2f196cb8
win32/sspi: Fix missing A suffix in an API constant name 2024-09-29 21:00:26 +09:00
Nobuyoshi Nakada
b7bca0ebdc
win32/sspi: Fix Win32::SSPI::SSPIResult#== with Integer
The values of `@@map` are `Symbol`s and `@value` should be an
`Integer` since unpacked as unsigned long, so this comparison should
be false always.  Probably comparison with `Symbol` was intended.
2024-09-29 21:00:26 +09:00
Nobuyoshi Nakada
1179c86384
win32/sspi: Already Fixnum has been removed years ago 2024-09-29 21:00:25 +09:00
Nobuyoshi Nakada
a3fd24e22e [ruby/digest] Import patches for old macOS from MacPorts
07a5db2f77
2024-09-26 04:56:36 +00:00
Peter Zhu
407f8b8716 Fix memory leak in Ripper for indented heredocs
The allocated parser string is never freed, which causes a memory leak.

The following code leaks memory:

    Ripper.sexp_raw(DATA.read)

    __END__
    <<~EOF
      a
        #{1}
      a
    EOF
2024-09-25 08:56:14 -04:00
Josh Cooper
0d16c36d0a [win32/registry] Fallback to UTF-8 for unknown codepages
There are some codepages like cp708 for which no ruby encoding exists:

    $ ruby -e "Encoding.find('cp708')"
    Traceback (most recent call last):
    	1: from -e:1:in `<main>'
    -e:1:in `find': unknown encoding name - cp708 (ArgumentError)

win32/registry uses ENCODING to transcode error messages and expand environment
variables from UTF-16LE, so using UTF-8 seems like the best choice and is better
than a hard failure.

This should resolve [Bug #13831]
2024-09-25 10:43:31 +09:00
Jean Boussier
d31378dc91 [ruby/psych] Use String#match? over String#=~ when applicable
Save on allocating useless `MatchData` instances.

b2d9f16e58
2024-09-24 19:25:40 +00:00
S-H-GAMELINKS
95d26ee41e Reuse dedent_string function in rb_ruby_ripper_dedent_string function
This change is reduce Ruby C API dependency for Universal Parser.
Reuse dedent_string functions in rb_ruby_ripper_dedent_string functions and remove dependencies on rb_str_modify and rb_str_set_len from the parser.
2024-09-22 12:22:20 +09:00
NAITOH Jun
d81b0588bb
[ruby/strscan] Accept String as a pattern at non head
(https://github.com/ruby/strscan/pull/106)

It supports non-head match cases such as StringScanner#scan_until.

If we use a String as a pattern, we can improve match performance.
Here is a result of the including benchmark.

## CRuby

It shows String as a pattern is 1.18x faster than Regexp as a pattern.

```
$ benchmark-driver benchmark/check_until.yaml
Warming up --------------------------------------
              regexp     9.403M i/s -      9.548M times in 1.015459s (106.35ns/i)
          regexp_var     9.162M i/s -      9.248M times in 1.009479s (109.15ns/i)
              string     8.966M i/s -      9.274M times in 1.034343s (111.54ns/i)
          string_var    11.051M i/s -     11.190M times in 1.012538s (90.49ns/i)
Calculating -------------------------------------
              regexp    10.319M i/s -     28.209M times in 2.733707s (96.91ns/i)
          regexp_var    10.032M i/s -     27.485M times in 2.739807s (99.68ns/i)
              string     9.681M i/s -     26.897M times in 2.778397s (103.30ns/i)
          string_var    12.162M i/s -     33.154M times in 2.726046s (82.22ns/i)

Comparison:
          string_var:  12161920.6 i/s
              regexp:  10318949.7 i/s - 1.18x  slower
          regexp_var:  10031617.6 i/s - 1.21x  slower
              string:   9680843.7 i/s - 1.26x  slower
```

## JRuby

It shows String as a pattern is 2.11x faster than Regexp as a pattern.

```
$ benchmark-driver benchmark/check_until.yaml
Warming up --------------------------------------
              regexp     7.591M i/s -      7.544M times in 0.993780s (131.74ns/i)
          regexp_var     6.143M i/s -      6.125M times in 0.997038s (162.77ns/i)
              string    14.135M i/s -     14.079M times in 0.996067s (70.75ns/i)
          string_var    14.079M i/s -     14.057M times in 0.998420s (71.03ns/i)
Calculating -------------------------------------
              regexp     9.409M i/s -     22.773M times in 2.420268s (106.28ns/i)
          regexp_var    10.116M i/s -     18.430M times in 1.821820s (98.85ns/i)
              string    21.389M i/s -     42.404M times in 1.982519s (46.75ns/i)
          string_var    20.897M i/s -     42.237M times in 2.021187s (47.85ns/i)

Comparison:
              string:  21389191.1 i/s
          string_var:  20897327.5 i/s - 1.02x  slower
          regexp_var:  10116464.7 i/s - 2.11x  slower
              regexp:   9409222.3 i/s - 2.27x  slower
```

See:
be7815ec02/core/src/main/java/org/jruby/util/StringSupport.java (L1706-L1736)

---------

f9d96c446a

Co-authored-by: Sutou Kouhei <kou@clear-code.com>
2024-09-17 15:12:25 +09:00
Yusuke Endoh
0f3dc2f958 Prevent warnings "the block passed to ... may be ignored" 2024-09-13 16:52:38 +09:00
John Meade
efc77d535b [ruby/psych] Ensure strings with only underscores are not processed as Integer
A string similar to "0x____" should be treated as a string.
Currently it is processed as an Integer.

This alters the regex specified by http://yaml.org/type/int.html
to ensure at least one numerical symbol is present in the string
before converting to Integer.

81479b203e
2024-09-11 17:19:18 +00:00
Ivan Kuchin
6c16598a72 [ruby/pathname] use delete_prefix instead of sub in find method
delete_prefix with a string is easier to read than a regular expression
also it should be faster. It is available since ruby 2.5 and the gem requires
ruby 2.7.

0070f43f19
2024-09-11 04:49:08 +00:00
Nobuyoshi Nakada
f622548800 [ruby/resolv] Add spec extensions
3189d16b69
2024-09-10 08:33:32 +00:00
Hiroshi SHIBATA
2d4fdafa64 [ruby/psych] Bump up 5.2.0.beta1
a8b73bb80e
2024-09-09 06:46:51 +00:00
Juanjo Bazán
74872109be [ruby/psych] Unlimited line_width with -1
3b63a93dfc
2024-09-09 06:44:40 +00:00
Hiroshi SHIBATA
dbfabafe96 [ruby/psych] Make to load stringio lazily
9f5392d180
2024-09-09 06:43:35 +00:00
Gareth Jones
aed8e46118 [ruby/psych] docs: specify correct default fallback value
ce7946981d
2024-09-09 06:40:59 +00:00
Nobuyoshi Nakada
37712c1ed6
Prefer constants for shutdown over magic numbers 2024-09-06 21:58:01 +09:00
Nobuyoshi Nakada
7387a09791 [ruby/digest] Suppress md5 deprecation warnings by gcc as well as clang
76878e3201
2024-09-06 05:58:21 +00:00
Jean Boussier
63cbe3f6ac Proof of Concept: Allow to prevent fork from happening in known fork unsafe API
[Feature #20590]

For better of for worse, fork(2) remain the primary provider of
parallelism in Ruby programs. Even though it's frowned uppon in
many circles, and a lot of literature will simply state that only
async-signal safe APIs are safe to use after `fork()`, in practice
most APIs work well as long as you are careful about not forking
while another thread is holding a pthread mutex.

One of the APIs that is known cause fork safety issues is `getaddrinfo`.
If you fork while another thread is inside `getaddrinfo`, a mutex
may be left locked in the child, with no way to unlock it.

I think we could reduce the impact of these problem by preventing
in for the most notorious and common cases, by locking around
`fork(2)` and known unsafe APIs with a read-write lock.
2024-09-05 11:43:46 +02:00
Jean Boussier
d612f9fd34 [flori/json] Remove outdated ifdef checks
`json` requires Ruby 2.3, so `HAVE_RUBY_ENCODING_H` and `HAVE_RB_ENC_RAISE`
are always true.

5c8dc6b70a
2024-09-03 11:51:51 +09:00
Nobuyoshi Nakada
185602e696 [ruby/io-console] Fix mixing declarations and code for older versions
504292b487
2024-09-01 03:46:44 +00:00
Nobuyoshi Nakada
37db194c02 [ruby/io-console] Support older rubies
cad8169568
2024-09-01 03:46:43 +00:00
Nobuyoshi Nakada
afd12873e0
Update dependencies of io-console 2024-09-01 12:00:12 +09:00