summaryrefslogtreecommitdiff
path: root/string.c
Commit message (Collapse)AuthorAgeFilesLines
* [Feature #19474] Refactor NEWOBJ macrosMatt Valentine-House2023-04-061-8/+8
| | | | NEWOBJ_OF is now our canonical newobj macro. It takes an optional ec
* [Feature #19579] Remove !USE_RVARGC code (#7655)Peter Zhu2023-04-041-74/+7
| | | | | | | | | | | Remove !USE_RVARGC code [Feature #19579] The Variable Width Allocation feature was turned on by default in Ruby 3.2. Since then, we haven't received bug reports or backports to the non-Variable Width Allocation code paths, so we assume that nobody is using it. We also don't plan on maintaining the non-Variable Width Allocation code, so we are going to remove it.
* RJIT: Optimize String#bytesizeTakashi Kokubun2023-03-181-1/+1
|
* Stop exporting symbols for MJITTakashi Kokubun2023-03-061-7/+7
|
* Optimize String#getbyteTakashi Kokubun2023-03-051-1/+1
|
* rb_str_modify_expand: clear the string coderangeRômulo Ceccon2023-03-031-0/+1
| | | | | | | | | | [Bug #19468] b0b9f7201acab05c2a3ad92c3043a1f01df3e17f errornously stopped clearing the coderange. Since `rb_str_modify` clears it, `rb_str_modify_expand` should too.
* Fix spelling (#7389)John Bampton2023-02-271-1/+1
|
* Symbol#end_with? accepts Strings onlyAdam Daniels2023-02-271-1/+1
| | | | Regular expressions are not supported (same as String#end_with?).
* Remove (newly unneeded) remarks about aliasesBurdetteLamar2023-02-191-19/+0
|
* [DOC] Small adjustment for String method docszverok2023-02-191-1/+13
| | | | | * Hide freeze method (no useful docs, same as Object#freeze) * Add dedup to call-seq of str_uminus
* Rename rb_str_splice_{0,1} -> rb_str_update_{0,1}Matt Valentine-House2023-02-091-6/+6
|
* Remove alias macro rb_str_spliceMatt Valentine-House2023-02-091-7/+5
|
* Merge gc.h and internal/gc.hMatt Valentine-House2023-02-091-1/+0
| | | | [Feature #19425]
* Mark "mapping_buffer" as write barrier protectedJean Boussier2023-02-031-1/+2
| | | | It doesn't have any reference so it can be marked as protected.
* [Feature #19314] Add new arguments of String#bytespliceShugo Maeda2023-01-201-31/+76
| | | | | | | bytesplice(index, length, str, str_index, str_length) -> string bytesplice(range, str, str_range) -> string In these forms, the content of +self+ is replaced by str.byteslice(str_index, str_length) or str.byteslice(str_range); however the substring of +str+ is not allocated as a new string.
* String#bytesplice should return selfShugo Maeda2023-01-191-2/+2
| | | | | | | | In Feature #19314, we concluded that the return value of String#bytesplice should be changed from the source string to the receiver, because the source string is useless and confusing when extra arguments are added. This change should be included in Ruby 3.2.1.
* Use str_enc_copy_direct to improve performanceMatt Valentine-House2023-01-131-1/+1
| | | | | | | str_enc_copy_direct copies the string encoding over without checking the frozen status of the string. Because we know that we're safe here (we only use this function when interpolating strings on the stack via a concatstrings instruction) we can safely skip this check
* Remove MIN_PRE_ALLOC_SIZE from Strings.Matt Valentine-House2023-01-131-13/+4
| | | | | This optimisation is no longer helpful now that we use VWA to allocate strings in larger size pools where they can be embedded.
* Add str_enc_copy_directPeter Zhu2023-01-121-5/+19
| | | | | | | | | | | | | | | | | | | | | | | | | | This commit adds str_enc_copy_direct, which is like str_enc_copy but does not check the frozen status of str1 and does not check the validity of the encoding of str2. This makes certain string operations ~5% faster. ```ruby puts(Benchmark.measure do 100_000_000.times do "a".downcase end end) ``` Before this patch: ``` 7.587598 0.040858 7.628456 ( 7.669022) ``` After this patch: ``` 7.133128 0.039809 7.172937 ( 7.183124) ```
* 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]