summaryrefslogtreecommitdiff
path: root/string.c
Commit message (Collapse)AuthorAgeFilesLines
* Set STR_SHARED_ROOT flag on root of stringPeter Zhu2023-01-091-0/+1
|
* Fix re-embedding of strings during compactionPeter Zhu2023-01-091-4/+8
| | | | | | | | | The reference updating code for strings is not re-embedding strings because the code is incorrectly wrapped inside of a `if (STR_SHARED_P(obj))` clause. Shared strings can't be re-embedded so this ends up being a no-op. This means that strings can be moved to a large size pool during compaction, but won't be re-embedded, which would waste the space.
* [Bug #19319] Fix crash in rb_str_casemapPeter Zhu2023-01-061-0/+2
| | | | | | | | | | | | | | | The following code crashes on my machine: ``` GC.stress = true str = "testing testing testing" puts str.capitalize ``` We need to ensure that the object `buffer_anchor` remains on the stack so it does not get GC'd.
* [DOC] Fix typoNobuyoshi Nakada2022-12-221-2/+2
|
* Introduce encoding check macroS-H-GAMELINKS2022-12-021-1/+1
|
* Make String#rstrip{,!} raise Encoding::CompatibilityError for broken coderangeJeremy Evans2022-11-241-0/+3
| | | | | | | | | | | | | | | | It's questionable whether we want to allow rstrip to work for strings where the broken coderange occurs before the trailing whitespace and not after, but this approach is probably simpler, and I don't think users should expect string operations like rstrip to work on broken strings. In some cases, this changes rstrip to raise Encoding::CompatibilityError instead of ArgumentError. However, as the problem is related to an encoding issue in the receiver, and due not due to an issue with an argument, I think Encoding::CompatibilityError is the more appropriate error. Fixes [Bug #18931]
* Using UNDEF_P macroS-H-GAMELINKS2022-11-161-4/+4
|
* Rewrite Symbol#to_sym and #intern in Ruby (#6683)Takashi Kokubun2022-11-151-19/+0
|
* Use string's capacity to determine if reembeddablePeter Zhu2022-11-141-1/+1
| | | | | | | | During auto-compaction, using length to determine whether or not a string can be re-embedded may be a problem for newly created strings. This is because usually it requires a malloc before setting the length. If the malloc triggers compaction, then the string may be re-embedded and can cause crashes.
* Make str_alloc_heap return a STR_NOEMBED stringPeter Zhu2022-11-031-29/+24
| | | | | This commit refactors str_alloc_heap to return a string with the STR_NOEMBED flag set.
* Correcting example for swapcase! methodVaevictusnet2022-10-041-1/+1
| | | Example, line 3, swapcase! was incorrect. implied that the swapcase! did /not/ change the starting string.
* Fix bug when slicing a string with broken encodingPeter Zhu2022-09-281-0/+1
| | | | | | | Commit aa2a428 introduced a bug where non-embedded string slices copied the encoding of the original string. If the original string had a broken encoding but the slice has valid encoding, then the slice would be incorrectly marked as broken encoding.
* Make string slices views rather than copiesPeter Zhu2022-09-281-7/+9
| | | | | Just like commit 1c16645 for arrays, this commit changes string slices to be a view rather than a copy even if it can be allocated through VWA.
* Refactor str_substr and str_subseqPeter Zhu2022-09-261-37/+21
| | | | | | | | This commit extracts common code between str_substr and rb_str_subseq into a function called str_subseq. This commit also applies optimizations in commit 2e88bca to rb_str_subseq.
* string.c: don't create a frozen copy for str_new_sharedJean Boussier2022-09-261-4/+2
| | | | | | | | str_new_shared already has all the necessary logic to do this and is also smart enough to skip this step if the source string is already a shared string itself. This saves a useless String allocation on each call.
* Fix coderange calculation in String#bKazuki Yamaguchi2022-09-261-14/+16
| | | | | | | | | Leave the new coderange unknown if the original encoding is not ASCII-compatible. Non-ASCII-compatible encoding strings with valid or broken coderange can end up as ascii-only. Fixes 9a8f6e392fbd ("Cheaply derive code range for String#b return value", 2022-07-25).
* Revert "Revert "error.c: Let Exception#inspect inspect its message""Yusuke Endoh2022-09-231-1/+1
| | | | | | This reverts commit b9f030954a8a1572032f3548b39c5b8ac35792ce. [Bug #18170]
* Remove get_actual_encoding() and the dynamic endian detection for dummy ↵Benoit Daloze2022-09-121-52/+9
| | | | | | | | UTF-16/UTF-32 * And simplify callers of get_actual_encoding(). * See [Feature #18949]. * See https://github.com/ruby/ruby/pull/6322#issuecomment-1242758474
* Avoid unnecessary copying when removing the leading part of a stringKazuki Yamaguchi2022-09-091-1/+0
| | | | | | | | | | Remove the superfluous str_modify_keep_cr() call from rb_str_update(). It ends up calling either rb_str_drop_bytes() or rb_str_splice_0(), which already does checks if necessary. The extra call makes the string "independent". This is not always wanted, in other words, it can keep the same shared root when merely removing the leading part of a shared string.
* rb_str_concat_literals: use rb_str_buf_appendJean Boussier2022-09-081-2/+1
| | | | That's about 1.30x faster.
* [DOC] non-positive `base` in `Kernel#Integer` and `String#to_i`Nobuyoshi Nakada2022-09-081-4/+14
|
* [Bug #18973] Promote US-ASCII to ASCII-8BIT when adding 8-bit charNobuyoshi Nakada2022-08-311-8/+24
|
* [DOC] Fix a typo [ci skip]Nobuyoshi Nakada2022-08-271-1/+1
|
* Check if encoding capable object before check if ASCII compatibleNobuyoshi Nakada2022-08-201-0/+3
|
* rb_str_resize: Only clear coderange on truncationJean Boussier2022-08-181-7/+6
| | | | | If we are expanding the string or only stripping extra capacity then coderange won't change, so clearing it is wasteful.
* Fix inspect for unicode codepoint 0x85Jeremy Evans2022-08-111-1/+9
| | | | | | | | | | | | This is an inelegant hack, by manually checking for this specific code point in rb_str_inspect. Some testing indicates that this is the only code point affected. It's possible a better fix would be inside of lower-level encoding code, such that rb_enc_isprint would return false and not true for codepoint 0x85. Fixes [Bug #16842]
* Adjust indent [ci skip]Nobuyoshi Nakada2022-07-261-10/+10
|
* Cheaply derive code range for String#b return valueKevin Menard2022-07-261-1/+17
| | | | The result of String#b is a string with an ASCII_8BIT/BINARY encoding. That encoding is ASCII-compatible and has no byte sequences that are invalid for the encoding. If we know the receiver's code range, we can derive the resulting string's code range without needing to perform a full code range scan.
* rb_str_buf_append: add a fast path for ENC_CODERANGE_VALIDJean Boussier2022-07-251-3/+18
| | | | | | | | | | | | | | | | | | | | | | If the RHS has valid encoding, and both strings have the same encoding, we can use the fast path. However we need to update the LHS coderange. ``` compare-ruby: ruby 3.2.0dev (2022-07-21T14:46:32Z master cdbb9b8555) [arm64-darwin21] built-ruby: ruby 3.2.0dev (2022-07-25T07:25:41Z string-concat-vali.. 11a2772bdd) [arm64-darwin21] warming up... | |compare-ruby|built-ruby| |:-------------------|-----------:|---------:| |binary_concat_7bit | 554.816k| 556.460k| | | -| 1.00x| |utf8_concat_7bit | 556.367k| 555.101k| | | 1.00x| -| |utf8_concat_UTF8 | 412.555k| 556.824k| | | -| 1.35x| ```
* Expand tabs [ci skip]Takashi Kokubun2022-07-211-2861/+2861
| | | | [Misc #18891]
* Make String#each_line work correctly with paragraph separator and chompJeremy Evans2022-07-211-2/+7
| | | | | | | | | | Previously, it was including one newline when chomp was used, which is inconsistent with IO#each_line behavior. This makes behavior consistent with IO#each_line, chomping all paragraph separators (multiple consecutive newlines), but not single newlines. Partially Fixes [Bug #18768]
* string.c: use str_enc_fastpath in TERM_LENJean Boussier2022-07-211-15/+15
| | | | | | | | | | | | | | | | | | | | | | | Not having to fetch the rb_encoding save a significant amount of time. Additionally, even when we have to fetch it, we can do it faster using `ENCODING_GET` rather than `rb_enc_get`. ``` compare-ruby: ruby 3.2.0dev (2022-07-19T08:41:40Z master cb9fd920a3) [arm64-darwin21] built-ruby: ruby 3.2.0dev (2022-07-21T11:16:16Z faster-buffer-conc.. 4f001f0748) [arm64-darwin21] warming up... | |compare-ruby|built-ruby| |:---------------------|-----------:|---------:| |binary_concat_utf8 | 510.580k| 565.600k| | | -| 1.11x| |binary_concat_binary | 512.653k| 571.483k| | | -| 1.11x| |utf8_concat_utf8 | 511.396k| 566.879k| | | -| 1.11x| ```
* str_buf_cat: preserve coderange when going through fastpathJean Boussier2022-07-191-6/+14
| | | | | | | | | | | | | | | | | | | | | | | | | | | rb_str_modify clear the coderange, which in this case isn't necessary. ``` compare-ruby: ruby 3.2.0dev (2022-07-12T15:01:11Z master 71aec68566) [arm64-darwin21] built-ruby: ruby 3.2.0dev (2022-07-19T07:17:01Z faster-buffer-conc.. 3cad62aab4) [arm64-darwin21] warming up... | |compare-ruby|built-ruby| |:---------------------|-----------:|---------:| |binary_concat_utf8 | 360.617k| 605.091k| | | -| 1.68x| |binary_concat_binary | 446.650k| 605.053k| | | -| 1.35x| |utf8_concat_utf8 | 454.166k| 597.311k| | | -| 1.32x| ``` ``` | |compare-ruby|built-ruby| |:-----------|-----------:|---------:| |erb_render | 1.790M| 2.045M| | | -| 1.14x| ```
* rb_str_buf_append: fastpath to str_buf_catJean Boussier2022-07-191-3/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | | If the LHS is ASCII compatible and the RHS is 7BIT we can directly concat without being concerned about anything else. Benchmark: ``` compare-ruby: ruby 3.2.0dev (2022-07-12T15:01:11Z master 71aec68566) [arm64-darwin21] built-ruby: ruby 3.2.0dev (2022-07-13T10:13:53Z faster-buffer-conc.. a04c10476d) [arm64-darwin21] warming up... | |compare-ruby|built-ruby| |:---------------------|-----------:|---------:| |binary_append_utf8 | 385.315k| 573.663k| | | -| 1.49x| |binary_append_binary | 446.579k| 574.898k| | | -| 1.29x| |utf8_append_utf8 | 430.936k| 573.394k| | | -| 1.33x| ``` Note that in the benchmark, the RHS always have a precomputed coderange. So the benchmark never enter the slowpath of having to scan the RHS. However it's extremly likely that we'll end up scanning it anyway in rb_enc_cr_str_buf_cat
* Rename ENCINDEX_ASCII to ENCINDEX_ASCII_8BITJean Boussier2022-07-191-2/+2
| | | | Otherwise it's way too easy to confuse it with US_ASCII.
* [DOC] Correct call-seq directive in string.c (#6131)Burdette Lamar2022-07-131-1/+1
| | | Correct call-seq directive in string.c
* Using is_ascii_string to check encodingS-H-GAMELINKS2022-06-171-3/+3
|
* Remove unused and accidentally public rb_str_shared_root_p()Alan Wu2022-06-161-6/+0
| | | | | | | This function was added to a public header in [1] probably unintentionally since it's not used anywhere, exposes implementation details, and isn't related to the goals of that pull request. [1]: 56cc3e99b6b9ec004255280337f6b8353f5e5b06
* Add placeholder to let braces matchNobuyoshi Nakada2022-06-141-6/+6
|
* Move String RVALUES between poolsMatt Valentine-House2022-06-131-4/+73
| | | | | And re-embed any strings that can now fit inside the slot they've been moved to
* [DOC] Fix markup for `String` (#5984)Alexander Ilyin2022-06-091-1/+1
| | | | | | * Add missing space for `String#start_with?`. * Add missing pluses for `String#tr` and `Methods for Converting to New String` label. * Move quote into the tag for `Whitespace in Strings` label.
* Revert "error.c: Let Exception#inspect inspect its message"Yusuke Endoh2022-06-071-1/+1
| | | | This reverts commit 9d927204e7b86eb00bfd07a060a6383139edf741.
* error.c: Let Exception#inspect inspect its messageYusuke Endoh2022-06-071-1/+1
| | | | | | | | | | | | ... only when the message string has a newline. `p StandardError.new("foo\nbar")` now prints `#<StandardError: "foo\nbar">' instead of: #<StandardError: bar> [Bug #18170]
* [Feature #18595] Alias String#-@ as String#dedupJean Boussier2022-05-201-1/+4
|
* [DOC] Move the documentations of moved Symbol methodsNobuyoshi Nakada2022-04-141-45/+2
|
* [DOC] Enhanced RDoc for Symbol (#5796)Burdette Lamar2022-04-131-41/+31
| | | | | | | | | | | | | | | Treats: #[] #length #empty? #upcase #downcase #capitalize #swapcase #start_with? #end_with? #encoding ::all_symbols
* Enforce literals on the second argumentsNobuyoshi Nakada2022-04-131-1/+1
|
* Enhanced RDoc for Symbol (#5795)Burdette Lamar2022-04-121-92/+80
| | | | | | | | | | | | | | | | | | | Treats: #== #inspect #name #to_s #to_sym #to_proc #succ #<=> #casecmp #casecmp? #=~ #match #match?
* Fix some RDoc links (#5778)Burdette Lamar2022-04-081-11/+11
|
* All-in-one RDoc for class String (#5777)Burdette Lamar2022-04-071-416/+0
|