summaryrefslogtreecommitdiff
path: root/ext
AgeCommit message (Collapse)Author
2021-12-24[ruby/bigdecimal] Add BigDecimal#precision_scaleKenta Murata
https://github.com/ruby/bigdecimal/commit/c019caeaba
2021-12-24[ruby/bigdecimal] [Doc] Add documentation of BigDecimal#n_significant_digitsKenta Murata
https://github.com/ruby/bigdecimal/commit/ceaf16b03e
2021-12-24[ruby/bigdecimal] Add BigDecimal#scaleKenta Murata
Fixes GH-198. https://github.com/ruby/bigdecimal/commit/4fbec55680
2021-12-24[ruby/bigdecimal] Set rounding mode in exampleBurdetteLamar
https://github.com/ruby/bigdecimal/commit/8fc83dd2fe
2021-12-24[ruby/bigdecimal] Set rounding mode in exampleBurdetteLamar
https://github.com/ruby/bigdecimal/commit/42c999f728
2021-12-24[ruby/bigdecimal] Enhanced RDoc for selected methodsBurdetteLamar
https://github.com/ruby/bigdecimal/commit/0de9298d15
2021-12-24[ruby/bigdecimal] Enhanced RDoc for selected methodsBurdetteLamar
https://github.com/ruby/bigdecimal/commit/6139ea1092
2021-12-24[ruby/bigdecimal] Fix BigDecimal#precision for single DECDIG caseKenta Murata
Fix GH-205 https://github.com/ruby/bigdecimal/commit/7d198394a2
2021-12-24[ruby/bigdecimal] Keep obj-to-Real link when VpReallocReal returns different ↵Kenta Murata
pointer https://github.com/ruby/bigdecimal/commit/252748de17
2021-12-24[ruby/bigdecimal] Fix the precision of the adjusted quotientKenta Murata
https://github.com/ruby/bigdecimal/commit/8dc8cd339d
2021-12-24[ruby/bigdecimal] Let BigDecimal_DoDivmod use the same precision calculation ↵Kenta Murata
as BigDecimal_divide https://github.com/ruby/bigdecimal/commit/11cb2c8840
2021-12-24[ruby/bigdecimal] Use larger precision in divide for irrational or recurring ↵Kenta Murata
results Just in case for irrational or recurring results, the precision of the quotient is set to at least more than 2*Float::DIG plus alpha. [Bug #13754] [Fix GH-94] https://github.com/ruby/bigdecimal/commit/99442c75d3
2021-12-24[ruby/bigdecimal] Fix trailing zeros handling in rb_uint64_convert_to_BigDecimalKenta Murata
Fix GH-192 https://github.com/ruby/bigdecimal/commit/eebc98b85a
2021-12-24[ruby/bigdecimal] Respond to reviewBurdetteLamar
https://github.com/ruby/bigdecimal/commit/f528a0006e
2021-12-24[ruby/bigdecimal] Respond to reviewBurdetteLamar
https://github.com/ruby/bigdecimal/commit/4eadcdf0a6
2021-12-24[ruby/bigdecimal] Respond to reviewBurdetteLamar
https://github.com/ruby/bigdecimal/commit/6d69422e37
2021-12-24[ruby/bigdecimal] Respond to review for #precisionBurdetteLamar
https://github.com/ruby/bigdecimal/commit/681cd2d81d
2021-12-24[ruby/bigdecimal] Enhanced RDoc for bigdecimal.cBurdetteLamar
https://github.com/ruby/bigdecimal/commit/3a35f92f8b
2021-12-24[ruby/bigdecimal] Enhanced RDoc for bigdecimal.cBurdetteLamar
https://github.com/ruby/bigdecimal/commit/31a7a37426
2021-12-24[ruby/bigdecimal] Fix negative Bignum conversionJean Boussier
Introduced in https://github.com/ruby/bigdecimal/commit/4792a917d806 `rb_absint_size` return the number of bytes needed to fit the absolute integer, but negative integers need the sign, so one more bit, and potentially one more byte. https://github.com/ruby/bigdecimal/commit/0f3d5d0eb7
2021-12-24[ruby/bigdecimal] VpCheckException: improve grammarOlle Jonsson
I added a space before the parenthesis, too. https://github.com/ruby/bigdecimal/commit/159af10b17
2021-12-23Install ruby/digest.h when from ext/digestNobuyoshi Nakada
2021-12-20[ruby/openssl] pkey: use EVP_PKEY_CTX_new_from_name() on OpenSSL 3.0Kazuki Yamaguchi
Replace EVP_PKEY_CTX_new_id() with the new EVP_PKEY_CTX_new_from_name() which takes the algorithm name in a string instead of in an NID. https://github.com/ruby/openssl/commit/d6535d13d1
2021-12-20[ruby/openssl] pkey: assume a pkey always has public key components on ↵Kazuki Yamaguchi
OpenSSL 3.0 OpenSSL 3.0's EVP_PKEY_get0() returns NULL for provider-backed pkeys. This causes segfault because it was supposed to never return NULL before. We can't check the existence of public key components in this way on OpenSSL 3.0. Let's just skip it for now. https://github.com/ruby/openssl/commit/ccdb6f7bfa
2021-12-20[ruby/openssl] ssl: add constants for new SSL_OP_* flagsKazuki Yamaguchi
Add all SSL_OP_* constants defined in OpenSSL 3.0.0 which are not specific to DTLS. https://github.com/ruby/openssl/commit/b1ee2f23b2
2021-12-20[ruby/openssl] engine: disable OpenSSL::Engine on OpenSSL 3.0Kazuki Yamaguchi
The entire ENGINE API is deprecated in OpenSSL 3.0 in favor of the new "Provider" concept. OpenSSL::Engine will not be defined when compiled with OpenSSL 3.0. We would need a way to interact with providers from Ruby programs, but since the concept is completely different from the ENGINE API, it will not be through the current OpenSSL::Engine interface. https://github.com/ruby/openssl/commit/69a27d8de4
2021-12-20[ruby/openssl] hmac: fix wrong usage of EVP_DigestSignFinal()Kazuki Yamaguchi
According to the manpage, the "siglen" parameter must be initialized beforehand. https://github.com/ruby/openssl/commit/6a60c7b2e7
2021-12-20[ruby/openssl] pkey: deprecate PKey#set_* methodsKazuki Yamaguchi
OpenSSL 3.0 made EVP_PKEY immutable. This means we can only have a const pointer of the low level struct and the following methods can no longer be provided when linked against OpenSSL 3.0: - OpenSSL::PKey::RSA#set_key - OpenSSL::PKey::RSA#set_factors - OpenSSL::PKey::RSA#set_crt_params - OpenSSL::PKey::DSA#set_pqg - OpenSSL::PKey::DSA#set_key - OpenSSL::PKey::DH#set_pqg - OpenSSL::PKey::DH#set_key - OpenSSL::PKey::EC#group= - OpenSSL::PKey::EC#private_key= - OpenSSL::PKey::EC#public_key= There is no direct replacement for this functionality at the moment. I plan to introduce a wrapper around EVP_PKEY_fromdata(), which takes all key components at once to construct an EVP_PKEY. https://github.com/ruby/openssl/commit/6848d2d969
2021-12-20[ruby/openssl] pkey/ec: deprecate OpenSSL::PKey::EC#generate_key!Kazuki Yamaguchi
OpenSSL::PKey::EC#generate_key! will not work on OpenSSL 3.0 because keys are made immutable. Users should use OpenSSL::PKey.generate_key instead. https://github.com/ruby/openssl/commit/5e2e66cce8
2021-12-20[ruby/openssl] pkey/dh: deprecate OpenSSL::PKey::DH#generate_key!Kazuki Yamaguchi
OpenSSL::PKey::DH#generate_key! will not work on OpenSSL 3.0 because keys are made immutable. Users should use OpenSSL::PKey.generate_key instead. https://github.com/ruby/openssl/commit/8ee6a582c7
2021-12-20[ruby/openssl] pkey/ec: avoid using EC#public_key= in EC#dh_compute_keyKazuki Yamaguchi
Similarly to DH#compute_key, work around it by constructing a SubjectPublicKeyInfo. This should be considered as a temporary implementation. https://github.com/ruby/openssl/commit/fc9aabc18d
2021-12-20[ruby/openssl] pkey/dh: avoid using DH#set_key in DH#compute_keyKazuki Yamaguchi
DH#set_key will not work on OpenSSL 3.0 because keys are immutable. For now, let's reimplement DH#compute_key by manually constructing a DER-encoded SubjectPublicKeyInfo structure and feeding it to OpenSSL::PKey.read. Eventually, we should implement a new method around EVP_PKEY_fromdata() and use it instead. https://github.com/ruby/openssl/commit/46ca47060c
2021-12-20[ruby/openssl] pkey: use EVP_PKEY_dup() if availableKazuki Yamaguchi
We can use it to implement OpenSSL::PKey::PKey#initialize_copy. This should work on all key types, not just DH/DSA/EC/RSA types. https://github.com/ruby/openssl/commit/66cd8cbaaf
2021-12-20[ruby/openssl] pkey: allocate EVP_PKEY on #initializeKazuki Yamaguchi
Allocate an EVP_PKEY when the content is ready: when #initialize or #initialize_copy is called, rather than when a T_DATA is allocated. This is more natural because the lower level API has been deprecated and an EVP_PKEY is becoming the minimum unit of handling keys. https://github.com/ruby/openssl/commit/74f6c61756
2021-12-20[ruby/openssl] pkey: do not check NULL argument in ossl_pkey_new()Kazuki Yamaguchi
Passing NULL to ossl_pkey_new() makes no sense in the first place, and in fact it is ensured not to be NULL in all cases. https://github.com/ruby/openssl/commit/316cb2a41f
2021-12-20[ruby/openssl] pkey: use OSSL_DECODER to load encrypted PEM on OpenSSL 3.0Kazuki Yamaguchi
OpenSSL 3.0 has rewritten routines to load pkeys (PEM_read_bio_* and d2i_* functions) around the newly introduced OSSL_DECODER API. This comes with a slight behavior change. They now decrypt and parse each encountered PEM block, then check the kind of the block. This used to be the reverse: they checked the PEM header to see the kind, and then decrypted the content. This means that the password callback may now be called repeatedly. Let's use the OSSL_DECODER API directly on OpenSSL 3.0 so that the return value from the password callback will be reused automatically. https://github.com/ruby/openssl/commit/a84ea531bb
2021-12-20[ruby/psych] psych depends stringio only CRubyHiroshi SHIBATA
https://github.com/ruby/psych/commit/e7bbf26cb2
2021-12-20[ruby/psych] Bump version to 4.0.3Hiroshi SHIBATA
https://github.com/ruby/psych/commit/75ab76e788
2021-12-13Remove `NODE_DASGN_CURR` [Feature #18406]Nobuyoshi Nakada
This `NODE` type was used in pre-YARV implementation, to improve the performance of assignment to dynamic local variable defined at the innermost scope. It has no longer any actual difference with `NODE_DASGN`, except for the node dump. Notes: Merged: https://github.com/ruby/ruby/pull/5251
2021-12-12[ruby/cgi] Check integer overflow in long rangeNobuyoshi Nakada
https://hackerone.com/reports/1328463 https://github.com/ruby/cgi/commit/ccaf6027e0
2021-12-09[ruby/io-wait] Bump up 0.2.1Hiroshi SHIBATA
https://github.com/ruby/io-wait/commit/c97ab9a212
2021-12-09ext/ripper/lib/ripper/lexer.rb: Do not deprecate Ripper::Lexer::State#[]Yusuke Endoh
The old code of IRB still uses this method. The warning is noisy on rails console. In principle, Ruby 3.1 deprecates nothing, so let's avoid the deprecation for the while. I think It is not so hard to continue to maintain it as it is a trivial shim. https://github.com/ruby/ruby/pull/5093 Notes: Merged: https://github.com/ruby/ruby/pull/5219
2021-12-02[Bug #18382] Fix crash in compaction for ObjectSpace.trace_object_allocationsPeter Zhu
ObjectSpace.trace_object_allocations can crash when auto-compaction is enabled. Notes: Merged: https://github.com/ruby/ruby/pull/5202
2021-12-02Define Ripper::Lexer::Elem#to_sNobuyoshi Nakada
Alias `#inspect` as `#to_s` also in the new `Ripper::Lexer::Elem` class, so that `puts Ripper::Lexer.new(code).scan` shows the attributes.
2021-12-02Deprecate `Lexer::Elem#[]` and `Lexer::State#[]`schneems
Discussed in https://github.com/ruby/ruby/pull/5093#issuecomment-964426481. > it would be enough to mimic only [] for almost all cases This adds back the `Lexer::Elem#[]` and `Lexer::State#[]` and adds deprecation warnings for them.
2021-12-02Only iterate Lexer heredoc arraysschneems
The last element in the `@buf` may be either an array or an `Elem`. In the case it is an `Elem` we iterate over every element, when we do not need to. This check guards that case by ensuring that we only iterate over an array of elements. Notes: Merged: https://github.com/ruby/ruby/pull/5093
2021-12-02~1.10x faster Change Ripper.lex structs to classesschneems
## Concept I am proposing we replace the Struct implementation of data structures inside of ripper with real classes. This will improve performance and the implementation is not meaningfully more complicated. ## Example Struct versus class comparison: ```ruby Elem = Struct.new(:pos, :event, :tok, :state, :message) do def initialize(pos, event, tok, state, message = nil) super(pos, event, tok, State.new(state), message) end # ... def to_a a = super a.pop unless a.empty? a end end class ElemClass attr_accessor :pos, :event, :tok, :state, :message def initialize(pos, event, tok, state, message = nil) @pos = pos @event = event @tok = tok @state = State.new(state) @message = message end def to_a if @message [@pos, @event, @tok, @state, @message] else [@pos, @event, @tok, @state] end end end # stub state class creation for now class State; def initialize(val); end; end ``` ## MicroBenchmark creation ```ruby require 'benchmark/ips' require 'ripper' pos = [1, 2] event = :on_nl tok = "\n".freeze state = Ripper::EXPR_BEG Benchmark.ips do |x| x.report("struct") { Elem.new(pos, event, tok, state) } x.report("class ") { ElemClass.new(pos, event, tok, state) } x.compare! end; nil ``` Gives ~1.2x faster creation: ``` Warming up -------------------------------------- struct 263.983k i/100ms class 303.367k i/100ms Calculating ------------------------------------- struct 2.638M (± 5.9%) i/s - 13.199M in 5.023460s class 3.171M (± 4.6%) i/s - 16.078M in 5.082369s Comparison: class : 3170690.2 i/s struct: 2638493.5 i/s - 1.20x (± 0.00) slower ``` ## MicroBenchmark `to_a` (Called by Ripper.lex for every element) ```ruby require 'benchmark/ips' require 'ripper' pos = [1, 2] event = :on_nl tok = "\n".freeze state = Ripper::EXPR_BEG struct = Elem.new(pos, event, tok, state) from_class = ElemClass.new(pos, event, tok, state) Benchmark.ips do |x| x.report("struct") { struct.to_a } x.report("class ") { from_class.to_a } x.compare! end; nil ``` Gives 1.46x faster `to_a`: ``` Warming up -------------------------------------- struct 612.094k i/100ms class 893.233k i/100ms Calculating ------------------------------------- struct 6.121M (± 5.4%) i/s - 30.605M in 5.015851s class 8.931M (± 7.9%) i/s - 44.662M in 5.039733s Comparison: class : 8930619.0 i/s struct: 6121358.9 i/s - 1.46x (± 0.00) slower ``` ## MicroBenchmark data access ```ruby require 'benchmark/ips' require 'ripper' pos = [1, 2] event = :on_nl tok = "\n".freeze state = Ripper::EXPR_BEG struct = Elem.new(pos, event, tok, state) from_class = ElemClass.new(pos, event, tok, state) Benchmark.ips do |x| x.report("struct") { struct.pos[1] } x.report("class ") { from_class.pos[1] } x.compare! end; nil ``` Gives ~1.17x faster data access: ``` Warming up -------------------------------------- struct 1.694M i/100ms class 1.868M i/100ms Calculating ------------------------------------- struct 16.149M (± 6.8%) i/s - 81.318M in 5.060633s class 18.886M (± 2.9%) i/s - 95.262M in 5.048359s Comparison: class : 18885669.6 i/s struct: 16149255.8 i/s - 1.17x (± 0.00) slower ``` ## Full benchmark integration of this inside of Ripper.lex Inside of this repo with this commit ``` $ cd ext/ripper $ make $ cat test.rb file = File.join(__dir__, "../../array.rb") source = File.read(file) bench = Benchmark.measure do 10_000.times.each do Ripper.lex(source) end end puts bench ``` Then execute with and without this change 50 times: ``` rm new.txt rm old.txt for i in {0..50} do `ruby -Ilib -rripper -rbenchmark ./test.rb >> new.txt` `ruby -rripper -rbenchmark ./test.rb >> old.txt` done ``` I used derailed benchmarks internals to compare the results: ``` dir = Pathname(".") branch_info = {} branch_info["old"] = { desc: "Struct lex", time: Time.now, file: dir.join("old.txt"), name: "old" } branch_info["new"] = { desc: "Class lex", time: Time.now, file: dir.join("new.txt"), name: "new" } stats = DerailedBenchmarks::StatsFromDir.new(branch_info) stats.call.banner ``` Which gave us: ``` ❤️ ❤️ ❤️ (Statistically Significant) ❤️ ❤️ ❤️ [new] (3.3139 seconds) "Class lex" ref: "new" FASTER 🚀🚀🚀 by: 1.1046x [older/newer] 9.4700% [(older - newer) / older * 100] [old] (3.6606 seconds) "Struct lex" ref: "old" Iterations per sample: Samples: 51 Test type: Kolmogorov Smirnov Confidence level: 99.0 % Is significant? (max > critical): true D critical: 0.30049534876137013 D max: 0.9607843137254902 Histograms (time ranges are in seconds): [new] description: [old] description: "Class lex" "Struct lex" ┌ ┐ ┌ ┐ [3.0, 3.3) ┤▇ 1 [3.0, 3.3) ┤ 0 [3.3, 3.6) ┤▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 47 [3.3, 3.6) ┤ 0 [3.5, 3.8) ┤▇▇ 2 [3.5, 3.8) ┤▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 46 [3.8, 4.1) ┤▇ 1 [3.8, 4.1) ┤▇▇▇ 4 [4.0, 4.3) ┤ 0 [4.0, 4.3) ┤ 0 [4.3, 4.6) ┤ 0 [4.3, 4.6) ┤▇ 1 └ ┘ └ ┘ # of runs in range # of runs in range ``` To sum this up, the "new" version of this code (using real classes instead of structs) is 10% faster across 50 runs with a statistical significance confidence level of 99%. Histograms are for visual checksum. Notes: Merged: https://github.com/ruby/ruby/pull/5093
2021-11-25[ruby/win32ole] Fix typos [ci skip]Nobuyoshi Nakada
https://github.com/ruby/win32ole/commit/8d46bd0c93 Notes: Merged: https://github.com/ruby/ruby/pull/5175
2021-11-25[ruby/win32ole] LICENSEHiroshi SHIBATA
https://github.com/ruby/win32ole/commit/62fd78078b Notes: Merged: https://github.com/ruby/ruby/pull/5175
2021-11-25Keep the generated source files when clean [Bug #18363]Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/5174