dearblue
368f8a5da6
Don't use private structs with mrb_mt_foreach()
...
The `MRB_API` function `mrb_mt_foreach()` previously used the private structure `struct mt_elem`.
Therefore, use `mrb_method_t` instead.
2020-11-14 11:30:34 +09:00
KOBAYASHI Shuji
292a096118
Include size of iv table in ObjectSpace.memsize_of to Hash object
2020-11-13 16:59:45 +09:00
KOBAYASHI Shuji
ac4eb99629
Rename mrb_os_memsize_of_hash_table to mrb_hash_memsize
...
* The term `hash_table` can be misleading because the return value of this
function includes memory usage of entire `Hash` object, including not only
hash table part but also entry list part, etc.
* This function takes a `Hash` object as a receiver and is defined in
`src/hash.c`, so it is natural to have a `mrb_hash_` prefix.
2020-11-13 16:18:32 +09:00
Yukihiro "Matz" Matsumoto
af13cfb7d5
Merge pull request #5122 from shuujii/change-name-and-usage-of-presym-macros
...
Change name and usage of presym macros
2020-11-13 14:05:26 +09:00
KOBAYASHI Shuji
89f591485b
Change name and usage of presym macros
...
To be also able to build mruby without presym in the future. However,
`MRB_QSYM` has been removed and changed as follows:
### Example
| Type | Symbol | Previous Style | New Style |
|---------------------------|--------|------------------|----------------|
| Operator | & | MRB_QSYM(and) | MRB_OPSYM(and) |
| Class Variable | @@foo | MRB_QSYM(00_foo) | MRB_CVSYM(foo) |
| Instance Variable | @foo | MRB_QSYM(0_foo) | MRB_IVSYM(foo) |
| Method with Bang | foo! | MRB_QSYM(foo_b) | MRB_SYM_B(foo) |
| Method with Question mark | foo? | MRB_QSYM(foo_p) | MRB_SYM_Q(foo) |
| Mmethod with Equal | foo= | MRB_QSYM(foo_e) | MRB_SYM_E(foo) |
This change makes it possible to define, for example, `MRB_IVSYM(foo)` as
`mrb_intern_lit(mrb, "@" "foo")`, which is useful if we support building
without presym in the future.
2020-11-13 13:41:20 +09:00
KOBAYASHI Shuji
ff2ef44c0e
Remove unused argument of mrb_obj_iv_tbl_memsize
2020-11-12 20:19:41 +09:00
Yukihiro "Matz" Matsumoto
6a5e97b448
Merge pull request #5121 from shuujii/reduce-memory-usage-of-Hash-object
...
Reduce memory usage of Hash object
2020-11-10 21:56:42 +09:00
KOBAYASHI Shuji
f2d8db39be
Reduce memory usage of Hash object
...
## Implementation Summary
* Change entry list from segmented list to flat array.
* Change value of hash bucket from pointer to entry to index of entry list,
and represent it by variable length bits according to capacity of hash
buckets.
* Store management information about entry list and hash table to `struct
RHash` as much as possible.
## Benchmark Summary
Only the results of typical situations on 64-bit Word-boxing are present
here. For more detailed information, including consideration, see below
(although most of the body is written in Japanese).
* https://shuujii.github.io/mruby-hash-benchmark
### Memory Usage
Lower value is better.
| Hash Size | Baseline | New | Factor |
|----------:|--------------:|--------------:|-----------:|
| 16 | 344B | 256B | 0.74419x |
| 40 | 1,464B | 840B | 0.57377x |
| 200 | 8,056B | 3,784B | 0.46971x |
| 500 | 17,169B | 9,944B | 0.57949x |
### Performance
Higher value is better.
#### `mrb_hash_set`
| Hash Size | Baseline | New | Factor |
|----------:|--------------:|--------------:|-----------:|
| 16 | 1.41847M i/s | 1.36004M i/s | 0.95881x |
| 40 | 0.39224M i/s | 0.31888M i/s | 0.81296x |
| 200 | 0.03780M i/s | 0.04290M i/s | 1.13494x |
| 500 | 0.01225M i/s | 0.01314M i/s | 1.07275x |
#### `mrb_hash_get`
| Hash Size | Baseline | New | Factor |
|----------:|--------------:|--------------:|-----------:|
| 16 | 26.05920M i/s | 30.19543M i/s | 1.15872x |
| 40 | 44.26420M i/s | 32.75781M i/s | 0.74005x |
| 200 | 44.55171M i/s | 31.56926M i/s | 0.70860x |
| 500 | 39.19250M i/s | 29.73806M i/s | 0.75877x |
#### `mrb_hash_each`
| Hash Size | Baseline | New | Factor |
|----------:|--------------:|--------------:|-----------:|
| 16 | 25.11964M i/s | 30.34167M i/s | 1.20789x |
| 40 | 11.74253M i/s | 13.25539M i/s | 1.12884x |
| 200 | 2.01133M i/s | 2.97214M i/s | 1.47770x |
| 500 | 0.87411M i/s | 1.21178M i/s | 1.38631x |
#### `Hash#[]=`
| Hash Size | Baseline | New | Factor |
|----------:|--------------:|--------------:|-----------:|
| 16 | 0.50095M i/s | 0.56490M i/s | 1.12764x |
| 40 | 0.19132M i/s | 0.18392M i/s | 0.96129x |
| 200 | 0.03624M i/s | 0.03256M i/s | 0.89860x |
| 500 | 0.01527M i/s | 0.01236M i/s | 0.80935x |
#### `Hash#[]`
| Hash Size | Baseline | New | Factor |
|----------:|--------------:|--------------:|-----------:|
| 16 | 11.53211M i/s | 12.78806M i/s | 1.10891x |
| 40 | 15.26920M i/s | 13.37529M i/s | 0.87596x |
| 200 | 15.28550M i/s | 13.36410M i/s | 0.87430x |
| 500 | 14.57695M i/s | 12.75388M i/s | 0.87494x |
#### `Hash#each`
| Hash Size | Baseline | New | Factor |
|----------:|--------------:|--------------:|-----------:|
| 16 | 0.30462M i/s | 0.27080M i/s | 0.88898x |
| 40 | 0.12912M i/s | 0.11704M i/s | 0.90642x |
| 200 | 0.02638M i/s | 0.02402M i/s | 0.91071x |
| 500 | 0.01066M i/s | 0.00959M i/s | 0.89953x |
#### `Hash#delete`
| Hash Size | Baseline | New | Factor |
|----------:|--------------:|--------------:|-----------:|
| 16 | 7.84167M i/s | 6.96419M i/s | 0.88810x |
| 40 | 6.91292M i/s | 7.41427M i/s | 1.07252x |
| 200 | 3.75952M i/s | 7.32080M i/s | 1.94727x |
| 500 | 2.10754M i/s | 7.05963M i/s | 3.34970x |
#### `Hash#shift`
| Hash Size | Baseline | New | Factor |
|----------:|--------------:|--------------:|-----------:|
| 16 | 14.66444M i/s | 13.18876M i/s | 0.89937x |
| 40 | 11.95124M i/s | 11.10420M i/s | 0.92913x |
| 200 | 5.53681M i/s | 7.88155M i/s | 1.42348x |
| 500 | 2.96728M i/s | 5.40405M i/s | 1.82121x |
#### `Hash#dup`
| Hash Size | Baseline | New | Factor |
|----------:|--------------:|--------------:|-----------:|
| 16 | 0.15063M i/s | 5.37889M i/s | 35.71024x |
| 40 | 0.06515M i/s | 3.38196M i/s | 51.91279x |
| 200 | 0.01359M i/s | 1.46538M i/s | 107.84056x |
| 500 | 0.00559M i/s | 0.75411M i/s | 134.88057x |
### Binary Size
Lower value is better.
| File | Baseline | New | Factor |
|:-----------|--------------:|--------------:|----------:|
| mruby | 730,408B | 734,176B | 1.00519x |
| libmruby.a | 1,068,134B | 1,072,846B | 1.00441x |
## Other Fixes
The following issues have also been fixed in the parts where there was some
change this time.
* [Heap use-after-free in `Hash#value?`](https://gist.github.com/shuujii/30e4fcd5844a4112a0ecd4a5b3483101#file-heap-use-after-free-in-hash-value-md )
* [Heap use-after-free in `ht_hash_equal`](https://gist.github.com/shuujii/30e4fcd5844a4112a0ecd4a5b3483101#file-heap-use-after-free-in-ht_hash_equal-md )
* [Heap use-after-free in `ht_hash_func`](https://gist.github.com/shuujii/30e4fcd5844a4112a0ecd4a5b3483101#file-heap-use-after-free-in-ht_hash_func-md )
* [Heap use-after-free in `mrb_hash_merge`](https://gist.github.com/shuujii/30e4fcd5844a4112a0ecd4a5b3483101#file-heap-use-after-free-in-mrb_hash_merge-md )
* [Self-replacement does not work for `Hash#replace`](https://gist.github.com/shuujii/30e4fcd5844a4112a0ecd4a5b3483101#file-self-replacement-does-not-work-for-hash-replace-md )
* [Repeated deletes and inserts increase memory usage of `Hash`](https://gist.github.com/shuujii/30e4fcd5844a4112a0ecd4a5b3483101#file-repeated-deletes-and-inserts-increase-memory-usage-of-hash-md )
* [`Hash#rehash` does not reindex completely](https://gist.github.com/shuujii/30e4fcd5844a4112a0ecd4a5b3483101#file-hash-rehash-does-not-reindex-completely-md )
* `mrb_hash_delete_key` does not cause an error for frozen object
* `mrb_hash_new_capa` does not allocate required space first
* [`mrb_os_memsize_of_hash_table` result is incorrect](https://github.com/mruby/mruby/pull/5032#discussion_r457994075 )
2020-11-10 15:21:49 +09:00
Yukihiro "Matz" Matsumoto
352c4755b2
Merge pull request #5118 from dearblue/mrb_value
...
Define `mrb_value` in struct for Word/NaN boxing
2020-11-10 11:50:59 +09:00
Yukihiro "Matz" Matsumoto
0df460892c
Add range check before casting float to integer.
2020-11-09 11:35:54 +09:00
dearblue
926ec1dc7e
Define mrb_value in struct for Word/NaN boxing
...
This is to make it possible to distinguish between `mrb_value` and `mrb_sym` in C++ "Function overloading" and C11 "Generic selection".
2020-11-08 14:14:00 +09:00
dearblue
06d231d372
Suppress -Wunused-function
...
If no gem was specified, it was warning because `init_mrbgems()` was not used.
ref: #4250
2020-11-08 10:52:04 +09:00
Yukihiro "Matz" Matsumoto
8455344bf3
Skip too big left shift in flo_shift().
2020-11-06 12:52:18 +09:00
Yukihiro "Matz" Matsumoto
2a52ebcc56
Avoid negating MRB_INT_MIN which is impossible.
2020-11-06 12:51:44 +09:00
Yukihiro "Matz" Matsumoto
d93fc6593f
Fix wrong integer casting.
2020-11-06 12:42:43 +09:00
Yukihiro "Matz" Matsumoto
f77113e841
Fix a bug with printing (null) local variable name for a register.
2020-11-05 16:55:23 +09:00
Yukihiro "Matz" Matsumoto
d13df1536d
Add a new instruction OP_LOADI32.
...
That loads 32 bit integer bypassing pool access.
2020-11-04 14:01:04 +09:00
Yukihiro "Matz" Matsumoto
b7e8406f6c
Add new instructions to handle symbols/literals >255; fix #5109
...
New instructions:
* OP_LOADL16
* OP_LOADSYM16
* OP_STRING16
Size of pools, symbols are `int16_t` but offset representation in the
bytecode was 8 bits. Size of child `irep` array is `int16_t`, too but
this change does not address it.
2020-11-03 14:58:44 +09:00
Yukihiro "Matz" Matsumoto
0be5b266b6
format '%p' expects argument of type 'void *'; #5107
2020-11-02 23:04:12 +09:00
Yukihiro "Matz" Matsumoto
9233d28ac7
Make Ranges frozen as Ruby3.0.
2020-11-02 15:14:36 +09:00
Yukihiro "Matz" Matsumoto
78d185efb9
Merge pull request #5102 from dearblue/c++-exc
...
Fixed build with `conf.enable_cxx_exception`
2020-10-29 10:41:56 +09:00
KOBAYASHI Shuji
43863d5f01
Fix mrb_obj_id to Float
2020-10-28 23:03:26 +09:00
dearblue
336f0de8bb
Fixed build with conf.enable_cxx_exception
...
The problem was manifested by commit 5069fb15e4 .
2020-10-28 21:10:33 +09:00
dearblue
69a6bb1f12
Reorganize env_new() as mrb_env_new()
...
The `mrb_env_new()` function is a global function, but it is still treated as an internal function.
2020-10-24 22:29:31 +09:00
Yukihiro "Matz" Matsumoto
17247c51f2
Merge pull request #5099 from dearblue/getargs-array
...
Prohibit array changes by "a"/"*" specifier of `mrb_get_args()`
2020-10-23 15:43:18 +09:00
dearblue
edc49f9d26
Prohibit array changes by mrb_get_argv()
...
The `mrb_get_argv()` function will now return `const mrb_value *`.
This is because it is difficult for the caller to check if it is a splat argument (array object) and to write-barrier if necessary.
2020-10-22 23:22:29 +09:00
dearblue
f0a64329b1
Prohibit array changes by "a"/"*" specifier of mrb_get_args()
...
The "a"/"*" specifier of the `mrb_get_args()` function will now return `const mrb_value *`.
This is because it is difficult for the caller to check if it is an array object and write-barrier if necessary.
And it requires calling `mrb_ary_modify()` on the unmodified array object, which is also difficult (this is similar to #5087 ).
2020-10-22 22:55:35 +09:00
Yukihiro "Matz" Matsumoto
27492e53a0
Add startless range (another part of #5085 )
...
Ref #5093 ; close #5085
2020-10-16 17:29:23 +09:00
Yukihiro "Matz" Matsumoto
8d36393a5b
Remove uninitialized local variable warning.
...
Fix for #5093
2020-10-16 16:47:04 +09:00
Yukihiro "Matz" Matsumoto
6b457d2c00
Merge branch 'work_for_merge' of https://github.com/zubycz/mruby into zubycz-work_for_merge
2020-10-15 18:35:13 +09:00
Yukihiro "Matz" Matsumoto
c779413df3
Fix out of bound access in parse.y.
2020-10-15 18:32:27 +09:00
Yukihiro "Matz" Matsumoto
21e07d6113
Add indent to lv in the C dump.
2020-10-14 20:26:06 +09:00
taiyoslime
bec4d05340
Introduce endless range (a part of #5085 )
...
Co-Authored-By: n4o847 <22975590+n4o847@users.noreply.github.com >
Co-Authored-By: smallkirby <ssmallkirby@gmail.com >
2020-10-13 14:09:36 +09:00
Yukihiro "Matz" Matsumoto
82046ff26e
Revert "Add a new function mrb_exc_protect()."
...
This reverts commit 8746a6fe4e7bda8a0fbc0eaece9314ec51a0c255.
We already have `mrb_protect()`, `mrb_ensure()` and `mrb_rescue()`
functions. If you need to handle exceptions from C functions, use those
functions above.
2020-10-12 18:20:30 +09:00
Yukihiro "Matz" Matsumoto
3d6adccfbe
Add a new function mrb_exc_protect().
...
`mrb_exc_protect()` takes two C functions, `body` to be executed first,
and `resc` to be executed when an error happens during `body` execution.
Since `mrb_exc_protect()` should be compiled with the proper compiler,
we will not see the problem like #5088 that was caused by `setjmp()` and
`throw` mixture.
2020-10-12 18:20:29 +09:00
Yukihiro "Matz" Matsumoto
041351fb05
No need to get the irep record size twice.
2020-10-12 18:20:28 +09:00
Yukihiro "Matz" Matsumoto
34356974ee
Update MRB_FLOAT_FMT to always use double precision.
2020-10-12 18:20:28 +09:00
Yukihiro "Matz" Matsumoto
d2b548de60
Remove the length of `Float' pool from the binary dump.
...
Also fixed the size calculation of `irep` dump, that could cause memory
corruption.
2020-10-12 18:20:28 +09:00
Yukihiro "Matz" Matsumoto
356b719fef
Remove DEBUG_ONLY_EXPR() from CHECKPOINT_* macros; ref #5060
...
To allow C++ compilation. Fix suggested by @dearblue.
2020-10-12 18:20:27 +09:00
Yukihiro "Matz" Matsumoto
896338e219
Unify mrb_str_to_str to mrb_obj_as_string.
...
Redirect `mrb_str_to_str` to `mrb_obj_as_string` via C macro.
Inspired by #5082
2020-10-12 18:20:26 +09:00
Yukihiro "Matz" Matsumoto
bff79112a6
Dump/load 16 bits for ilen and slen in irep.
...
Those types are `uint16_t` in definition. Also we no longer need padding
for `iseq`.
2020-10-12 18:20:26 +09:00
Yukihiro "Matz" Matsumoto
618c589162
Should use PRId32 to dump .i32; ref #5084
...
The fix was proposed by @dearblue
2020-10-12 18:20:24 +09:00
Yukihiro "Matz" Matsumoto
12881ccb05
Use NULL instead of 0; close #2467
...
The PR was from @cubicdaiya.
2020-10-12 18:20:23 +09:00
Yukihiro "Matz" Matsumoto
a4c5824e59
Restore old function names for compatibility; ref #5070
...
- `mrb_check_intern()` to return `mrb_value`
- `mrb_intern_check()` to return `mrb_sym` [NEW]
Other new functions:
- `mrb_intern_check_cstr()`
- `mrb_intern_check_str()`
2020-10-12 18:20:19 +09:00
Yukihiro "Matz" Matsumoto
30424dfa74
Restore old function names for compatibility; fix #5070
...
Rename new functions:
- `mrb_convert_type(mrb,val,type,tname,method)`
=> `mrb_type_convert(mrb,val,type,tname,method)`
- `mrb_check_convert_type(mrb,val,type,tname,method)`
=> `mrb_type_convert_check(mrb,val,type,tname,method)`
Old names are defined by macros (support `tname` drop and
`char*` => `mrb_sym` conversion).
2020-10-12 18:20:18 +09:00
Yukihiro "Matz" Matsumoto
a127ded486
Fix warning from VC regarding implicit int conversion.
2020-10-12 18:20:17 +09:00
Yukihiro "Matz" Matsumoto
f9e781d83a
Avoid unsigned int; Use mrb_int instead.
2020-10-12 18:20:16 +09:00
Yukihiro "Matz" Matsumoto
fc8885f2f4
Use mrb_int extensively instead of int.
...
The mixture causes warnings on 64 bit Windows (VC).
2020-10-12 18:20:16 +09:00
Yukihiro "Matz" Matsumoto
fe1ad37bfb
Use goto to avoid problems with DIRECT_THREADED.
...
You can now use `NEXT` within `switch` statement like 7c087eb.
2020-10-12 18:20:16 +09:00
Yukihiro "Matz" Matsumoto
9e842b3a75
Extract div code in VM and make them shared by div methods.
2020-10-12 18:20:15 +09:00