Added complete call-seq documentation for catch/throw functionality across
both Ruby and C implementations:
- Class documentation: explains exception raised for unmatched throws
- initialize: constructor with tag and value parameters, creates error
message with proper tag inspection and stores thrown values for debugging
- throw: transfers control to matching catch block with optional return value,
raises UncaughtThrowError if no matching catch found, supports both
single tag and tag+value forms with comprehensive usage examples
- find_catcher: searches call stack for matching catch block by comparing
tags using mrb_obj_eq, returns call stack index or 0 if not found
- catch_syms: pre-defined symbols (Object, new, call) used by catch bytecode
implementation for efficient symbol lookup
- catch_iseq: bytecode instruction sequence implementing catch method logic,
handles default tag creation (Object.new) and block parameter passing
- catch_irep: instruction representation containing bytecode metadata
for catch method execution
- catch_proc: procedure object used to identify catch blocks in call stack
during throw operations, marked with proper GC and scope flags
- mrb_mruby_catch_gem_init: defines catch and throw as private methods
in Kernel module, initializes symbols and sets up bytecode procedure
- mrb_mruby_catch_gem_final: cleanup function (currently no-op as
implementation uses static data structures)
Co-authored-by: Atlassian Rovo Dev
When there is a corresponding tag, the `RBreak` object is used to make a global jump.
Like CRuby, it can't be caught by `rescue`.
It is also the same as CRuby that it can be canceled in the middle by `ensure`.
### How to find the corresponding tag with `throw`
The called `catch` method remains in the call stack, and the tag also remains in the stack at that time.
So it is possible to find the called location by searching the two.
Note that no method can be given to the `proc` object specified in `RBreak`.
Therefore, inside the `catch` method, the argument block is called in a seemingly meaningless closure.
Also, as a countermeasure against `alias` etc., the `proc` object, which is the body of the `catch` method, is saved when mrbgem is initialized.
### Example
```ruby
begin
throw 1
rescue Exception => e
puts e.message
end
```
#### Before this patch:
```console
$ bin/mruby example.rb
uncaught throw :1
```
#### After this patch (same as Ruby):
```console
$ bin/mruby example.rb
uncaught throw 1
```