Commit Graph

5824 Commits

Author SHA1 Message Date
dearblue f48ac7469b Simplify OP_RETURN_BLK and `OP_BREAK
- There was some unnecessary complexity in `OP_BREAK` introduced in commit ad2e626 (#6282).
  - Since `mrb->c` is never NULL, there is no need to check it with `MRB_ENV_ONSTACK_P()` beforehand.
2024-06-08 13:46:28 +09:00
Yukihiro "Matz" Matsumoto 5072358276 vm.c: remove unnecessary type cast to blk; ref #6282 2024-06-03 19:45:53 +09:00
Yukihiro "Matz" Matsumoto dcdd94c04c Merge pull request #6282 from dearblue/orphan-block
Delegate the care of a directly given block from `cipop()` to `cipush()`
2024-06-02 22:02:58 +09:00
dearblue d0b06446f2 Simplify uvenv()
The part removed in this patch was introduced by commit c7c9543bed.

The current mechanism should be able to trace from block objects created by `eval` to higher level blocks without any problems.
2024-06-01 20:36:22 +09:00
Yukihiro "Matz" Matsumoto 00a874cff6 Merge pull request #6281 from dearblue/binding
Fixes local variables in `mruby-binding`.
2024-05-31 22:56:04 +09:00
Yukihiro "Matz" Matsumoto 8d79cfdc83 Merge pull request #6280 from dearblue/env
Remove `MRB_ENV_CLOSED` flag
2024-05-31 22:50:56 +09:00
Yukihiro "Matz" Matsumoto 7b9b0997e0 string.c: adjust local variable declarations 2024-05-31 22:49:25 +09:00
dearblue ad2e626e7a Delegate the care of a directly given block from cipop() to cipush()
Outlines:
  - Removed `mrb_callinfo::blk`
  - Added `mrb_callinfo::flags`
  - Added `MRB_CI_COMPANION_BLOCK` flag
2024-05-31 22:03:15 +09:00
dearblue e82b36035e Fixes local variables in mruby-binding.
There are two issues to be fixed:
  - `mrb_irep` could leak if `mrb_calloc()` encountered an out-of-memory exception
  - `mrb_proc_merge_lvar()` allocated one extra variable name.

`irep->lv` can always refer to only one less range than `irep->nlocals`.
Also, when `mrb_proc_merge_lvar()` extends `irep->lv`, `mrb_realloc()` with `NULL` has the same behavior as `mrb_malloc()`.
2024-05-30 21:25:30 +09:00
dearblue 7ab6386cc6 Remove MRB_ENV_CLOSED flag
Set `env->cxt` to `NULL` when it is detached from the call frame.
In other words, we can determine if `env->cxt` is `NULL` or not.

Also, `mruby-binding` had been setting `env->cxt` unnecessarily, so this has been fixed.
2024-05-30 21:09:49 +09:00
Sutou Kouhei c258ead85b Include headers for malloc() explicitly; fix #6277
We need to include stdlib.h and malloc.h to use malloc()/free() but
they aren't included in src/string.c with WIN32_LEAN_AND_MEAN. It
generates build time warnings.

We can solve this by including stdlib.h and malloc.h explicitly.
2024-05-29 09:45:36 +09:00
dearblue 177debacc5 Always run atexit on the top-level call frame
In the following example, the fiber context and call stack may be in an incomplete state.
  - In case another thread running mruby is terminated abnormally
  - In case of a global jump that is out of management by mruby
2024-05-26 21:17:00 +09:00
Yukihiro "Matz" Matsumoto 20cf58d1d3 Merge pull request #6273 from dearblue/closing
Improvements to `mrb_protect_atexit()`
2024-05-25 16:48:56 +09:00
Yukihiro "Matz" Matsumoto 68e093729b string.c: refactor bit operation (e.g. SWAR)
To generate a bit mask of `0x8080...` of the word size, we prepare
`MASK01` which is `0x0101...` and multiply masking word (e.g., `0x80).
2024-05-25 16:39:32 +09:00
Yukihiro "Matz" Matsumoto bd7efbe75f string.c: check if the index points character boundary; fix #6267 2024-05-25 16:39:31 +09:00
dearblue b12ea17d0b Improvements to mrb_protect_atexit()
- Initialize the GC arena each time `atexit` is called.
  - To reduce the overhead of `MRB_TRY()`, an internal loop is also performed.
2024-05-25 10:48:16 +09:00
Yukihiro "Matz" Matsumoto aac9e4cf0d Merge pull request #6261 from leviongit/range/to_a
fix: `to_a` integer ranges with `begin > end` failing
2024-05-09 17:07:51 +09:00
leviongit fff07ca182 fix: to_a integer ranges with begin > end failing
example of failure:
```rb
(-1..-4).to_a
```

expected result:
```rb
(-1..-4).to_a
```
2024-05-08 23:10:28 +02:00
dearblue dea5c9e1dc Remove exc_caught from mrb_vm_exec()
Only go to exception handling if `mrb->exc` is non-null.

This may cause some compatibility problems, but I doubt that it is necessary to maintain that compatibility.
Here is how I see the incompatibility with the change at this time:
  - If `mrb->exc` is non-null and `mrb_vm_exec()` is called, an exception will be thrown immediately.
  - If `MRB_THROW()` is used while `mrb->exc` is `NULL`, it will not go to exception handling.
2024-05-05 21:30:18 +09:00
Yukihiro "Matz" Matsumoto 86b1c8ff87 string.c (utf8_strlen): add assertion utf8_len <= byte_len 2024-05-03 07:50:40 +09:00
Yukihiro "Matz" Matsumoto 2c8cde2ba7 codedump.c: move variable declarations to initialization place 2024-04-30 22:17:22 +09:00
Yukihiro "Matz" Matsumoto fa213a2d89 string.c (search_nonascii): prevent buffer overrun; ref #6255 2024-04-29 16:35:08 +09:00
Yukihiro "Matz" Matsumoto 714ef4c4fd string.c (mrb_utf8_strlen): handle invalid UTF-8 sequence; fix #6255
Previous SWAR version assumes valid UTF-8 to count number of code points
in the string, but we need to handle invalid sequence as well. We now
use `search_nonascii` to skip counting single byte characters for
performance. The new version is even faster than SWAR version (probably
because `search_nonascii` uses SSE2 on Intel compatible CPU (which I use).
2024-04-29 15:37:22 +09:00
Yukihiro "Matz" Matsumoto c9ae8df2c2 error.c: move variable declaration to initialization 2024-04-29 14:42:49 +09:00
Yukihiro "Matz" Matsumoto 598dca7a08 debug.c: move local variable declarations to initialization place 2024-04-27 08:40:36 +09:00
Yukihiro "Matz" Matsumoto 7edbff8c83 Merge pull request #6253 from dearblue/fiber-sweep
Allow recycling fibers by GC if not referenced directly
2024-04-25 11:34:08 +09:00
Yukihiro "Matz" Matsumoto 22518b5b78 Merge pull request #6244 from dearblue/mrb_vm_run
Revise scope of role of `mrb_vm_run()`
2024-04-24 08:45:29 +09:00
dearblue f1c9260ada Allow recycling fibers by GC if not referenced directly
The patch assumes that `struct REnv::cxt` only performs checks with the `OP_BREAK` and `OP_RETURN_BLK` instructions, and does not reference the entity.
Therefore, by changing to a weak reference, it is possible to collect fibers that are no longer directly referenced while in the suspended state.

However, we need to detach the living env objects that remain in the call stack of the fiber.
So, in effect, it involves a revert of following commits.
  - commit a3365d8b3f
  - commit 57ffa1c150

Examples of the effects of change are shown below.
Note that it was built with `rake MRUBY_CONFIG=host-debug`.

```ruby
f = Fiber.new { (x, y, z) = "X", "Y", "Z"; Fiber.yield -> { [x, y, z] } }
g = f.resume
GC.start
p ObjectSpace.memsize_of_all
# => 59532
g.call
# => ["X", "Y", "Z"]
f = nil
GC.start
ObjectSpace.memsize_of_all
# BEFORE => 59532
# AFTER  => 58044
g.call
# => ["X", "Y", "Z"]
```
2024-04-23 22:30:32 +09:00
dearblue c8c7d1ab23 Don't mrb_realloc_simple() call mrb_full_gc() in the sweep phase
`mrb_env_unshare()` calls `mrb_realloc_simple()` and follows `mrb_full_gc()` to avoid an infinite loop where `mrb_env_unshare()` is called again.
This does not occur at this time, but may occur in subsequent patches.
2024-04-23 22:25:54 +09:00
John Bampton 67c5ced277 Fix spelling 2024-04-22 18:00:27 +10:00
John Bampton f9c2ea2f11 Fix grammar in src/vm.c; catched -> caught
Saying 'catched' instead of 'caught' is a grammatical error
2024-04-22 00:01:21 +10:00
dearblue 5aa20f41ef Revise scope of role of mrb_vm_run()
`mrb_vm_run()` is,
  - It does not change the fiber context.
  - When control is returned, only one ci prepared by the caller is popped.
    If the ci equals cibase when called, the ci position does not change.

related commits:
  - commit 4e84bdb507
  - commit 34dd258c63
  - commit ebd6636a1e
  - commit c6736357a7
  - commit 23a4e7149d
  - commit 31a961acf1
2024-04-21 13:30:24 +09:00
Yukihiro "Matz" Matsumoto 4a27a18807 dump.c: adjust local variable declarations 2024-04-20 09:54:55 +09:00
Yukihiro "Matz" Matsumoto c445723fa4 enum.c: adjust local variable declaration 2024-04-19 16:20:36 +09:00
Yukihiro "Matz" Matsumoto 8350106896 etc.c: adjust local variable initializations 2024-04-18 15:49:19 +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
Yukihiro "Matz" Matsumoto aec67dcd17 Merge pull request #6237 from dearblue/env-strict
Stricter env objects to attach to ci
2024-04-15 13:59:32 +09:00
Yukihiro "Matz" Matsumoto 93c02e96d5 Merge pull request #6238 from dearblue/init-stack
Minimize zero initialization of the stack
2024-04-15 13:59:14 +09:00
Yukihiro "Matz" Matsumoto bc8b76a7a5 cdump.c: adjust local variable declarations 2024-04-15 00:01:11 +09:00
dearblue a4b57aa47b Minimize zero initialization of the stack 2024-04-13 22:22:39 +09:00
dearblue e3d51497cf Stricter env objects to attach to ci
- Don't create multiple envs on one ci.
  - Don't share a env to different ci.
  - Don't attach a closed env to any ci.

Changes in `envadjust()` can be simplified with those guarantees.
2024-04-13 22:13:04 +09:00
Yukihiro "Matz" Matsumoto 3174488851 backtrace.c: remove uninitialized local variable declaration 2024-04-13 16:17:47 +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 d761561be3 Merge pull request #6233 from dearblue/fiber-end-free
Free stack memory at end of fiber
2024-04-11 23:31:54 +09:00
Yukihiro "Matz" Matsumoto 1c021a5c3a hash.c (obj_eql): simplify the expression 2024-04-11 15:39:45 +09:00
Yukihiro "Matz" Matsumoto 6c4f5a34cc Revert "object.c (mrb_eql): avoid mrb_funcall_argv() when possible"
This reverts commit bc012deef9.
Ref #6168
2024-04-10 13:28:28 +09:00