Yukihiro "Matz" Matsumoto
00f5ddc9ae
Use mrb_funcall_id() extensively.
...
Except for support files e.g. `mruby-test/driver.c`, which are not
target of symbol collection via `rake gensym`.
2020-10-12 16:20:58 +09:00
Yukihiro "Matz" Matsumoto
eddd324979
Add MRB_SYM() for inline symbols.
2020-10-12 16:20:41 +09:00
Yukihiro "Matz" Matsumoto
5e55b61c44
Fix mrb_int and size_t combination warnings.
2020-08-11 15:06:51 +09:00
Yukihiro "Matz" Matsumoto
faed5054f8
Initialized local variables in mrb_hash_shift().
2020-08-03 15:53:50 +09:00
KOBAYASHI Shuji
0c88c71786
Use type tag for hash code in ht_hash_func()
...
The function corresponding to `ht_hash_func()` was as follows in the days of
khash implementation (before d78acc7a ).
```c
mrb_hash_ht_hash_func(mrb_state *mrb, mrb_value key)
{
enum mrb_vtype t = mrb_type(key);
...
switch (t) {
...
default:
hv = mrb_funcall(mrb, key, "hash", 0);
h = (khint_t)t ^ (khint_t)mrb_fixnum(hv);
break;
}
...
}
```
When switched to the segmented list implementation (d78acc7a ), this function
was changed as follows.
```c
sg_hash_func(mrb_state *mrb, seglist *t, mrb_value key)
{
enum mrb_vtype tt = mrb_type(key);
...
switch (tt) {
...
default:
hv = mrb_funcall(mrb, key, "hash", 0);
h = (size_t)t ^ (size_t)mrb_fixnum(hv);
break;
}
...
}
```
Since the argument `t` was added, the variable for type tag was changed from
`t` to `tt`, but the variable used in the expression of `h` remained `t`.
Probably this is an omission of change, so fixed it.
2020-07-25 16:59:02 +09:00
Yukihiro "Matz" Matsumoto
e7599050dc
Fix a bug with ht_index called with size==0; fix #5046
...
It happens when a hash made empty calls `rehash`.
2020-07-23 07:06:35 +09:00
Rory O'Connell
f74d370c15
mrb_ prefix convention
2020-07-15 19:57:22 -07:00
Rory OConnell
e7bd7d0eaf
Use size of hash's table in calculation
2020-07-13 15:58:50 -07:00
Yukihiro "Matz" Matsumoto
49ae2a69f2
Add mrb_get_arg1() that retrieves single (and only) argument.
...
`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-06-20 12:49:46 +09:00
Yukihiro "Matz" Matsumoto
106f4c4e9d
Add proper casts to silence VC warnings.
2020-06-05 16:04:30 +09:00
KOBAYASHI Shuji
bc929656fb
Unify eql? receiver in Hash according to Ruby
...
### Example
```ruby
# example.rb
class A
def eql?(o)
p self.class
super
end
def hash
1
end
end
class B < A; end
h = {A.new => 1}
h[B.new]
```
#### Before this patch:
```console
$ bin/mruby example.rb
A
```
#### After this patch (same as Ruby)
```console
$ bin/mruby example.rb
B
```
2020-05-15 21:17:24 +09:00
Yukihiro "Matz" Matsumoto
c0a6439a69
Avoid implicit integer casting in backtrace.c and hash.c.
2020-01-31 09:25:10 +09:00
Yukihiro "Matz" Matsumoto
9174b18f34
Rename mrb_num_args_error to mrb_argnum_error; ref #4863
2020-01-01 22:37:14 +09:00
KOBAYASHI Shuji
81de1f159c
Add mrb_num_args_error() for "wrong number of arguments" error
...
To unify the style of messages.
2019-12-12 11:45:58 +09:00
KOBAYASHI Shuji
7a06e49008
Fix argument specs to Hash
2019-11-02 17:37:43 +09:00
KOBAYASHI Shuji
feaf80d899
Use type predicate macros instead of mrb_type if possible
...
For efficiency with `MRB_WORD_BOXING` (implement type predicate macros for
all `enum mrb_vtype`).
2019-09-26 22:23:27 +09:00
Yukihiro "Matz" Matsumoto
57d7fe94a9
Add a macro mrb_frozen_p that points to MRB_FROZEN_P.
2019-09-14 23:21:44 +09:00
Yukihiro "Matz" Matsumoto
8294ce9fd4
It was too early to check key for undef; ref #4534
2019-07-04 23:11:57 +09:00
Yukihiro "Matz" Matsumoto
23783a4430
Skip copying delete keys in a hash; fix #4534
2019-06-27 09:35:58 +09:00
KOBAYASHI Shuji
28de6b0da1
Refine Hash#rehash example [ci skip]
...
Previous example doesn't work because string key (frozen) can't be modified.
2019-06-22 19:07:01 +09:00
dearblue
d328808892
Fix memory leak for hash table index if occur out of memory
2019-04-14 17:55:20 +09:00
KOBAYASHI Shuji
e3beef065c
Extract frozen checking to function
2019-04-09 18:23:11 +09:00
Yukihiro "Matz" Matsumoto
ef93ff6405
Should not copy keys&values when a hash table is empty; fix #4270
2019-02-11 15:20:34 +09:00
Yukihiro "Matz" Matsumoto
ccc5edc60d
Small refactoring of #4188
2018-12-17 16:00:22 +09:00
dearblue
62dd4d89fc
Add mrb_hash_size() function.
2018-12-14 21:41:07 +09:00
Yukihiro "Matz" Matsumoto
60da293d5c
Avoid using floating point number for HT_SEG_INCREASE_RATIO; ref #4182
2018-12-11 10:54:47 +09:00
Yukihiro "Matz" Matsumoto
265171a28c
Rename ht_foreach_func to mrb_hash_foreach_func.
2018-12-11 10:41:26 +09:00
Yukihiro "Matz" Matsumoto
378c728338
Update comments.
2018-12-11 09:04:08 +09:00
Yukihiro "Matz" Matsumoto
c0d91a14e7
Add API function mrb_hash_foreach() to iterate over items in a hash.
2018-12-11 09:01:05 +09:00
Yukihiro "Matz" Matsumoto
610bcc88c2
Removed to_hash conversion method.
2018-11-19 12:08:28 +09:00
Yukihiro "Matz" Matsumoto
25d390d6cc
Improve Hash table using variable sized segments.
2018-11-19 09:30:15 +09:00
Yukihiro "Matz" Matsumoto
180b73fec4
The key or value object could be reclaimed by GC; fix #4164
...
The GC may occur between `sg_shift` and `mrb_assoc_new`, in which
case `key` and `value` could be freed even tough they are still alive.
The issue is found and fixed by https://hackerone.com/hexodus
2018-11-16 01:04:57 +09:00
Yukihiro "Matz" Matsumoto
80b5a56f51
Need to freeze string keys.
2018-10-20 19:02:12 +09:00
Yukihiro "Matz" Matsumoto
e5f160dc7e
Should not compare undef (deleted) key in hashes; fix #4136
2018-10-12 19:00:45 +09:00
Yukihiro "Matz" Matsumoto
249fef7dc4
Add NULL check in sg_compact(); fix #4139
2018-10-12 08:30:57 +09:00
Yukihiro "Matz" Matsumoto
82e00ce60f
Hash#delete should return the deleted value; fix #4133
2018-10-12 08:25:54 +09:00
Yukihiro "Matz" Matsumoto
54ec08c7f1
Implement Hash#rehash in C using sg_compact().
2018-09-26 23:09:48 +09:00
Yukihiro "Matz" Matsumoto
d78acc7afe
Add index to larger segment lists for performance
2018-09-26 23:09:48 +09:00
Yukihiro "Matz" Matsumoto
8ffd4e47fb
Use mrb_undef_value for delete mark instead of shifting Hash entry table.
...
That means entry table should be compacted periodically by `sg_compact()`.
2018-09-26 23:09:48 +09:00
Yukihiro "Matz" Matsumoto
e8dcfe1745
Use segmented list to implement Hash [Experimental]
...
I know it's not hash at all, but reduce memory consumption.
2018-09-26 12:55:22 +09:00
Yukihiro "Matz" Matsumoto
0b44e802a9
Need to check if merging hash is empty; fix #4107
2018-09-06 23:30:32 +09:00
Yukihiro "Matz" Matsumoto
f6564dd83e
Add new function mrb_ensure_hash_type(); ref #4097
...
Unlike `mrb_check_hash_type()` that returns `nil` if the argument is
not a `Hash`, `mrb_ensure_hash_type()` raises a `TypeError` exception.
2018-08-30 22:30:36 +09:00
Yukihiro "Matz" Matsumoto
3554fc54de
Add a new function mrb_hash_merge().
2018-08-25 09:41:21 +09:00
Yukihiro "Matz" Matsumoto
8c9e712784
Keyword argument implemented.
2018-07-30 22:58:01 +09:00
Yukihiro "Matz" Matsumoto
395260747a
Instead of defining Hash#dup, we should define Hash#initialize_copy.
...
`Hash#clone` did not work properly; fix #4030
2018-06-01 22:40:42 +09:00
Yukihiro "Matz" Matsumoto
bbb0882343
Modifying frozen objects will raise FrozenError.
...
`FrozenError` is a subclass of `RuntimeError` which used to be
raised. [Ruby2.5]
2017-12-12 18:41:18 +09:00
Yukihiro "Matz" Matsumoto
9b2454c94d
Leave hash->ht to be NULL if initial capacity is zero.
2017-11-19 03:46:58 +09:00
YAMAMOTO Masaya
acdc2d1f24
Add MRB_WITHOUT_FLOAT
2017-10-11 17:58:11 +09:00
Tomasz Dąbrowski
7d98055862
fix: src\hash.c(139): warning C4244: 'function': conversion from 'mrb_int' to 'khint_t', possible loss of data
2017-09-27 22:22:05 +02:00
Tomasz Dąbrowski
8cef3f946c
fix: src\hash.c(40): warning C4244: '=': conversion from 'mrb_int' to 'khint_t', possible loss of data
2017-09-27 22:22:05 +02:00