dearblue
e476d9a344
Need to restore the GC arena after some function calls
...
When calling `mrb_equal()` or `mrb_funcall()` family functions, the GC arena should be restored if the loop is repeated by a non-immediate return value.
In my opinion, restoring the GC arena is unnecessary when a non-immediate (true) value causes the function to return (e.g. the `mrb_ary_index_m()` function).
The patch does not take into account the case of recursive calls and may be incomplete.
2024-09-03 21:29:06 +09:00
Yukihiro "Matz" Matsumoto
540d976f7f
array.c (sort_cmp): mrb_cmp() may return -2 for errors
2024-08-27 22:36:24 +09:00
Yukihiro "Matz" Matsumoto
f35000f2a9
array.c (sort_cmp): comparing objects may be freed by GC; #6326
...
If comparing function (block or `<=>`) modifies the sorting array and GC
happens after the modification, objects passed to comparison may be
freed by GC.
2024-08-23 22:29:45 +09:00
Yukihiro "Matz" Matsumoto
58c70834d9
array.c (srot_cmp): need modify check after mrb_cmp as well; #6326
...
mrb_cmp() may also modify the sorting array internally.
2024-08-22 07:49:16 +09:00
Yukihiro "Matz" Matsumoto
752ebe6b7f
array.c (mrb_ary_sort_bang): check if array is modified in blocks
...
This address at least part of #6326 . CRuby copied the array internally,
but mruby avoid copying to reserve memory.
2024-08-21 18:31:46 +09:00
Yukihiro "Matz" Matsumoto
7c7ee5c244
array.c: implement Array#delete method in C
2024-07-02 11:45:20 +09:00
Yukihiro "Matz" Matsumoto
72bf46de22
array.c (mrb_ary_cmp): fixed wrong type casting
2024-06-30 18:19:52 +09:00
Yukihiro "Matz" Matsumoto
eee83ed7af
array.c: implement Array#index and Array#rindex in C
...
No need to override Array#index in mruby-array-ext. We can call
`to_enum` from C implemented methods.
2024-06-29 15:03:12 +09:00
Yukihiro "Matz" Matsumoto
dd808a0be4
array.c: implement Array#<=> in C
2024-06-29 15:03:12 +09:00
Yukihiro "Matz" Matsumoto
8cffa04def
array.c: implement Array#== and Array#eql? in C
...
It seems OK to call comparison from C method from measurement.
2024-06-29 08:32:06 +09:00
Yukihiro "Matz" Matsumoto
5b8de8d616
Array.c (mrb_ary_init): implement Array#initialize in C
2024-06-28 08:56:41 +09:00
Yukihiro "Matz" Matsumoto
5bd63d6232
array.c: replace sort! method implementation
...
- use heap sort (O(1)) instead of merge sort (O(n)) for better space
complexity.
- method implemented in C for better performance
As a result, simple sorting now consumes far less memory and is faster.
Since it's implemented in C, fiber context switching is not allowed from
comparison, but we consider the risk is minimal (no one switches context
in the comparison, right?)
2024-06-26 11:28:56 +09:00
Yukihiro "Matz" Matsumoto
c01899a8d3
Merge pull request #6235 from leviongit/array/delete
...
fix `Array#delete` always firing the block when deleting `nil`
2024-04-16 07:35:59 +09:00
leviongit
bb78c2cbc9
reimplement Array#delete with a helper method
2024-04-13 07:41:00 +02:00
leviongit
c04afb9e99
revert moving Array#delete to c
2024-04-13 06:52:37 +02:00
leviongit
d46e9a9480
fix shared array mistake
2024-04-12 18:12:51 +02:00
leviongit
14bd875d70
fix Array#delete
...
reimplement `Array#delete` in c, fixing `ary.delete(nil, &blk)` firing the block regardless of removal
minimal reproduction:
```rb
ary = [nil]
ret = ary.delete(nil) { "not deleted?" }
```
2024-04-12 17:30:03 +02:00
Yukihiro "Matz" Matsumoto
f30e8240d2
array.c: adjust local variable declarations
2024-04-12 18:07:51 +09:00
Yukihiro "Matz" Matsumoto
be3b93ecb9
array.c (ary_expand_capa): rename a conflicting local variable
2024-01-06 14:33:50 +09:00
Yukihiro "Matz" Matsumoto
d47f1b4df3
array.c (ary_expand_capa): remove unnecessary condition check
2024-01-06 14:32:54 +09:00
Yukihiro "Matz" Matsumoto
eb906bd4c1
array.c: use presyms to define the class
2023-11-07 21:40:44 +09:00
Yukihiro "Matz" Matsumoto
0443f14fd0
array.c,hash.c,numeric.c,string.c: use mrb_define_method_id()
...
For primary class libraries.
2023-10-23 15:23:08 +09:00
Yukihiro "Matz" Matsumoto
4c696ed9e3
array.c: set array size limitation again
...
Unlike strings, arrays occupies more memory. It is still arguable
whether the current limit (131072) is appropriate.
2023-10-13 18:01:21 +09:00
Yukihiro "Matz" Matsumoto
717f91e5c6
array.c (mrb_ary_last): avoid mrb_get_args()
2023-10-11 20:31:23 +09:00
Yukihiro "Matz" Matsumoto
2e3b482aa9
array.c, string.c: remove length limits on UNIX-ish OSes
...
- Linux
- MacOS
- FreeBSD
- OpenBSD
Send us a pull-request if you want to add your favorite OS here.
The size limitation will be done by malloc(3) on those OSes.
2023-09-23 19:57:44 +09:00
Yukihiro "Matz" Matsumoto
0eef05cc00
array.c (mrb_ary_to_s): use direct array access
2023-09-05 23:29:23 +09:00
Yukihiro "Matz" Matsumoto
d6d434eb3f
Inline loop variables everywhere
2023-07-13 08:05:00 +09:00
Yukihiro "Matz" Matsumoto
5cb0c7463b
array.c (mrb_ary_to_s): add recursive check to Array#inspect
2023-06-20 07:06:33 +09:00
Yukihiro "Matz" Matsumoto
89f7bb1056
use more lightweight mrb_funcall_argv instead of mrb_funcall_id
2023-06-12 14:22:04 +09:00
Yukihiro "Matz" Matsumoto
eea72ec84a
fix spaces in the type cast expressions (cosmetic changes)
2023-05-18 23:29:16 +09:00
Yukihiro "Matz" Matsumoto
235aaafef2
array.c (mrb_ary_aset): remove unnecessary ary_modify()
...
The `ary_modify()` is called in subsidiary functions.
2023-02-14 23:45:10 +09:00
Yukihiro "Matz" Matsumoto
2adb1043f4
array.c (mrb_ary_push_m): call mrb_ary_push() when argc == 1
2023-02-11 14:23:48 +09:00
Yukihiro "Matz" Matsumoto
4e5be5a288
array.c: avoid slower mrb_get_args() if possible
2023-01-25 14:10:03 +09:00
Yukihiro "Matz" Matsumoto
d1449c2622
array.c (mrb_ary_times): avoid multiple calls to mrb_get_args()
2023-01-24 15:23:30 +09:00
Yukihiro "Matz" Matsumoto
25faa74d23
array.c (mrb_ary_unshift_m): small refactoring
...
Unify size error by `ary_too_big()` function.
2022-12-04 22:45:35 +09:00
Yukihiro "Matz" Matsumoto
9c5dc42e59
small cosmetic changes.
...
I prefer `i++` style unless absolutely necessary.
This commit is an addition to 41e4148.
2022-11-19 17:11:56 +09:00
Yukihiro "Matz" Matsumoto
33f97bccba
array.c (mrb_ary_unshift): use mrb_get_argc() and mrb_get_argv().
2022-10-21 13:31:32 +09:00
Yukihiro "Matz" Matsumoto
da8ef29fba
array.c (mrb_ary_push_m): fixed a stupid bug.
2022-10-19 17:14:49 +09:00
Yukihiro "Matz" Matsumoto
bdb51d1af4
array.c (mrb_ary_push_m): adjust function order.
...
ary_modify() and ary_expand_capa() may cause garbage collection and may
make argv invalid (in the future).
2022-10-18 17:11:07 +09:00
Yukihiro "Matz" Matsumoto
3f286f1bfd
array.c: make ary_modify_check() an alias to mrb_check_frozen().
2022-10-17 21:59:22 +09:00
Yukihiro "Matz" Matsumoto
5b62fbc0fc
array.c (mrb_ary_concat_m): Array#concat to take multiple arguments.
2022-09-19 08:25:00 +09:00
Yukihiro "Matz" Matsumoto
13d909bd3c
array.c: new configuration MRB_ARY_LENGTH_MAX.
...
The default value is 2**17 entries. If you want to avoid the limitation,
set this value to 0.
2022-07-25 10:58:02 +09:00
Yukihiro "Matz" Matsumoto
f2bc7c305a
array.c (mrb_assoc_new): keep pointer in a local variable.
...
The optimizer may do the same, but tried to make it clear.
2022-06-30 10:09:34 +09:00
Yukihiro "Matz" Matsumoto
e2c4a8cef0
array.c (ary_check_too_big): make the function inline.
2022-06-30 09:57:30 +09:00
Yukihiro "Matz" Matsumoto
dcaf4083d5
src/bigint.c: implement multi-precision integer.
...
To enable multi-precision integer support, you need to link
`mruby-bigint` mrbgem. The gem itself is empty but it turns on
the "bigint" support.
2022-04-09 17:16:10 +09:00
Yukihiro "Matz" Matsumoto
b99c389ec3
internal.h: aggregate internal functions.
...
Internal functions can only be called from within the library.
Functions listed in `mruby/internal.h` can be called from:
* core (src/*.c)
* gems (mrbgems/**/*.c)
But not from the application linked with `libmruby`.
2022-04-02 18:25:13 +09:00
Yukihiro "Matz" Matsumoto
c5f2ac896c
array.c: refactoring allocation size error.
2022-03-13 19:58:57 +09:00
Yukihiro "Matz" Matsumoto
6e964bd1c6
array.c: check size bound by ARY_MAX_SIZE not MRB_INT_MAX.
2022-03-09 15:21:15 +09:00
Yukihiro "Matz" Matsumoto
1508da4740
array.c: check integer overflow in mrb_ary_set().
2022-03-01 15:04:08 +09:00
Yukihiro "Matz" Matsumoto
5305c5c84d
array.c: call mrb_ary_delete_at() directly from Array#slice!.
...
Avoid `mrb_funcall()`.
2022-02-26 14:21:35 +09:00