summaryrefslogtreecommitdiffhomepage
path: root/src/string.c
AgeCommit message (Collapse)Author
2020-08-11Fix `mrb_int` and `size_t` combination warnings.Yukihiro "Matz" Matsumoto
2020-08-08Reintroduce `mrb_static_assert`; #5051Yukihiro "Matz" Matsumoto
Note that the home brew version of `mrb_static_assert` only works within the function body. This reverts commit 8f99689.
2020-08-06Remove `mrb_static_assert` from the core; #5051Yukihiro "Matz" Matsumoto
2020-07-06Avoid infinite loop when converting objects to strings.Yukihiro "Matz" Matsumoto
2020-06-25Use `mrb_get_argc()` to improve performance.Yukihiro "Matz" Matsumoto
2020-06-20Add `mrb_get_arg1()` that retrieves single (and only) argument.Yukihiro "Matz" Matsumoto
`mrb_get_arg1()` raises `ArgumentError` if the method does not receive one argument. And replaces all `mrb_get_args(mrb, "o", &arg)` by the new function.
2020-04-29Makes `mrb_any_to_s()` accept an object whose class is `NULL`dearblue
When using `mrb_any_to_s()` for debugging purposes, giving an object whose class is `NULL` no longer causes a SIGSEGV and no crash. This is achieved by making `mrb_class_name()` and `mrb_str_cat_cstr()` null safe.
2020-04-28Rename (and expose) UTF-8 related functions; ref #4712Yukihiro "Matz" Matsumoto
- mrb_utf8len() - returns the size of a UTF-8 char (in bytes) - mrb_utf8_strlen() - returns the length of a UTF-8 string (in char)
2020-04-28Fix UTF-8 boundary check; ref #4982Yukihiro "Matz" Matsumoto
2020-02-03Add explicit type cast to return value from `mrmchr`; ref #4940Yukihiro "Matz" Matsumoto
C++ is stricter in implicit type casting.
2020-02-03Use simple search for short strings in `mrb_memsearch_qs`; close #4940Yukihiro "Matz" Matsumoto
Differences from the PR #4940: * Use simple search for short strings only. * "short" means `m+n` is shorter than `MRB_QS_SHORT_STRING_LENGTH`. * The current default value for `MRB_QS_SHORT_STRING_LENGTH` is 2048.
2020-01-08Fix buffer overflow in `mrb_str_len_to_dbl`.Yukihiro "Matz" Matsumoto
Issue 19902: mruby:mruby_fuzzer: Stack-buffer-overflow in mrb_str_len_to_dbl
2020-01-07Check memory boundary in `mrb_str_len_to_dbl`.Yukihiro "Matz" Matsumoto
2020-01-06`"0x10".to_f` should be `0`, not `16.0`; fix #4924Yukihiro "Matz" Matsumoto
2020-01-06Check remaining string length before access to avoid OOB access.Yukihiro "Matz" Matsumoto
2020-01-06Need to preserve the original input string in `mrb_str_len_to_dbl`.Yukihiro "Matz" Matsumoto
2020-01-06Fix `mrb_str_len_to_dbl` to support Hexadecimal like `0x10`.Yukihiro "Matz" Matsumoto
2020-01-06Refactor `mrb_cstr_to_dbl`; ref #4920Yukihiro "Matz" Matsumoto
2020-01-06Avoid creating temporary objects in `read_irep_record_1`; close #4920Yukihiro "Matz" Matsumoto
The basic idea of this change is from @dearblue. Note: the arguments of `mrb_str_pool()` have changed, but the function is provided for internal use (No `MRB_API`). So basically you don't have to worry about the change.
2020-01-01Revert "SHARED string is not required when sharing POOL string" (75949836)KOBAYASHI Shuji
Because literal pool may be released by GC. #### Example: ```ruby s1 = eval('"abcdefghijklmnopqrstuvwxyz01"') GC.start p s1 #=> "\x00\x00\x00\x00\x00\x00\x00\x90\x00\x00\x00\x00\x00\x00\x00\x90\x03\x00stuvwxyz01" ```
2019-12-14Remove location info from `Exception#inspect`KOBAYASHI Shuji
Because location info (file name and line number) is kept in the backtrace, it should not be kept in the result of `inspect` (and the exception object itself), I think. ### Example ```ruby # example.rb begin raise "err" rescue => e p e end ``` #### Before this patch: ``` $ bin/mruby example.rb example.rb:2: err (RuntimeError) ``` #### After this patch: ``` $ bin/mruby example.rb err (RuntimeError) ```
2019-12-11Fix behavior of `Kernel#Integer` to numbers ending with `_` and spacesKOBAYASHI Shuji
#### Before this patch: ```ruby Integer("1_ ") #=> 1 ``` #### After this patch (same as Ruby): ```ruby Integer("1_ ") #=> ArgumentError ```
2019-12-10Fix behavior of `String#to_i`/`Kernel#Integer` to numbers starting with `_`KOBAYASHI Shuji
#### Before this patch: ```ruby Integer("_1") #=> 1 "_1".to_i #=> 1 ``` #### After this patch (same as Ruby): ```ruby Integer("_1") #=> ArgumentError "_1".to_i #=> 0 ```
2019-12-09Fix that `String#to_f` accepts consecutive `_` as a numeric expressionKOBAYASHI Shuji
Consecutive `_` is not allowed as a numeric expression: 1_2__3 #=> SyntaxError Float("1_2__3") #=> ArgumentError Integer("1_2__3") #=> ArgumentError "1_2__3".to_i #=> 12 But `String#to_f` accept it, so I fixed the issue. Before this patch: "1_2__3".to_f #=> 123 After this patch: "1_2__3".to_f #=> 12
2019-12-08Fix the error message of `Kernel#Float`KOBAYASHI Shuji
#### Before this patch: ``` $ bin/mruby -e 'Float("1_a")' -e:1: invalid string for float(a) (ArgumentError) ``` #### After this patch: ``` $ bin/mruby -e 'Float("1_a")' -e:1: invalid string for float("1_a") (ArgumentError) ```
2019-11-23Rename `BITSIZE` to `BIT` and `BIT` to `BIT_POS` for consistencyKOBAYASHI Shuji
The bit width terminology is unified to `BIT` according to `MRB_INT_BIT` and `CHAR_BIT`. Also the bit position terminology is unified to `BIT_POS`.
2019-11-21Introduce `mrb_ssize` type for buffer size on memory; ref #4483KOBAYASHI Shuji
Previously, `mrb_int` was used as the type that represents the buffer size on memory, but the sizes of `RString` and `RArray` exceed 6 words when `MRB_INT64` is enabled on 32-bit CPU. I don't think it is necessary to be able to represent the buffer size on memory that exceeds the virtual address space. Therefore, for this purpose, introduce `mrb_ssize` which doesn't exceed the sizes of `mrb_int` and pointer. I think all `mrb_int` used for this purpose should be changed to `mrb_ssize`, but currently only the members of the structures (`RString`, `mrb_shared_string`, `RArray` and `mrb_shared_array`) are changed.
2019-11-19Refactor `mrb_string_value_cstr`KOBAYASHI Shuji
- Keep `MRB_STR_ASCII` flag. - Avoid a string object creation.
2019-11-08Avoid unnecessary `Symbol#to_s` call; fix #4812Yukihiro "Matz" Matsumoto
2019-11-07Clear `MRB_STR_SHARED` flag in `mrb_str_modify_keep_ascii`; close #4807KOBAYASHI Shuji
2019-11-03Remove unused enum in `mrb_cstr_to_dbl`KOBAYASHI Shuji
2019-10-28Remove documents about `Regexp` argument from `String#{[],[]=}` [ci skip]KOBAYASHI Shuji
2019-10-27Refine `String#split` documentKOBAYASHI Shuji
2019-10-26Optimize `chars2bytes` with `MRB_UTF8_STRING` to ASCII only stringKOBAYASHI Shuji
### Benchmark (with `MRB_UTF8_STRING`) ``` $ mruby -e ' COUNT = 150000 SIZE = 10000 strs = Array.new(COUNT) do s = "a" * SIZE s.size # set `MRB_STR_ASCII` flag s end i = 0 t = Time.now while i < COUNT strs[i][-2..-1] = "" i += 1 end printf "%.2f sec\n", Time.now - t ' 1.10 sec # before 0.07 sec # after ```
2019-10-23Optimize `str_subseq` with `MRB_UTF8_STRING` to ASCII only stringKOBAYASHI Shuji
### Benchmark (with `MRB_UTF8_STRING`) ```ruby # benchmark.rb COUNT = 300000 SIZE = 10000 s = "a" * SIZE s.size # set `MRB_STR_ASCII` flag i = 0 while i < COUNT s[-1] i += 1 end ``` #### Before this patch: ``` $ time mruby benchmark.rb 2.06 real 2.05 user 0.00 sys ``` #### After this patch: ``` $ time mruby benchmark.rb 0.05 real 0.04 user 0.00 sys ```
2019-10-22Fix incorrect `MRB_STR_ASCII` flag update in `mrb_str_dump`KOBAYASHI Shuji
### Example (with `MRB_UTF8_STRING`) ```ruby s = "\u3042" p s.size s.dump p s.size ``` #### Before this patch: ``` 1 3 ``` #### After this patch: ``` 1 1 ```
2019-10-15Adjust `buf` size in `str_escape`KOBAYASHI Shuji
2019-10-12Merge pull request #4770 from ↵Yukihiro "Matz" Matsumoto
shuujii/sHARED-string-is-not-required-when-sharing-POOL-string SHARED string is not required when sharing POOL string
2019-10-12SHARED string is not required when sharing POOL stringKOBAYASHI Shuji
The heap string buffer of POOL string always exists, does not need to be released, and read only, so it can be shared as NOFREE string.
2019-10-12Rename `str_make_shared()` to `str_share()` in `src/string.c`KOBAYASHI Shuji
Because it may not create `struct mrb_shared_string`.
2019-10-10Integrate `mrb_str_inspect` and `mrb_str_dump`KOBAYASHI Shuji
2019-10-06Remove unnecessary function: `mrb_str_freeze`.Yukihiro "Matz" Matsumoto
2019-10-04Freeze strings from `nil.to_s`, `true.to_s`, `false.to_s`.Yukihiro "Matz" Matsumoto
This is an experimental changes in Ruby 2.7.
2019-09-27Simplify arguments check in `String#rindex`KOBAYASHI Shuji
Also fix document about type of the first argument.
2019-09-26Use type predicate macros instead of `mrb_type` if possibleKOBAYASHI Shuji
For efficiency with `MRB_WORD_BOXING` (implement type predicate macros for all `enum mrb_vtype`).
2019-09-25Rename symbol-to-string functions; close #4684Yukihiro "Matz" Matsumoto
* mrb_sym2name -> mrb_sym_name * mrb_sym2name_len -> mrb_sym_name_len * mrb_sym2str -> mrb_sym_str
2019-09-19Simplify arguments check in `String#index`KOBAYASHI Shuji
Also fix document about type of the first argument.
2019-09-14Add a macro `mrb_frozen_p` that points to `MRB_FROZEN_P`.Yukihiro "Matz" Matsumoto
2019-09-14Raise an error from `String#<=>` with a non string operand.Yukihiro "Matz" Matsumoto
2019-09-12Remove `$/` from mruby implementation.Yukihiro "Matz" Matsumoto
1. `$/` and other Perl-ish global variables are not defined in ISO. 2. The current Ruby policy do not encourage those variables. 3. Those variables has global effect and can cause troubles.