[pull] master from mruby:master#182
Merged
pull[bot] merged 34 commits intosysfce2:masterfrom Jan 27, 2026
Merged
Conversation
The purpose is to avoid using the `MRB_TT_CPTR` object. The reasons are as follows: - The `MRB_WORD_BOXING` setting involves object creation. - If object creation fails, the `ary_set_t` data leaks memory.
Added error handling for file descriptors larger than FD_SETSIZE in mrb_hal_io_fdset_set and mrb_hal_io_fdset_isset functions, for posix hal. I actually don't know how to fix this on windows, or if it needs fixing.
This should fix it for Windows.
Add comprehensive benchmarks for measuring VM performance:
- vm_optimization_bench.rb: Ruby-level benchmarks covering dispatch,
arithmetic, method calls, array/hash access, loops, and recursion
- vm_dispatch_bench.c: C-level micro-benchmarks for precise measurement
These benchmarks are designed to measure the effect of potential VM
optimizations such as tail-call threading, register variables,
fused opcodes, and inline caching.
Usage:
# Ruby benchmark
./build/host/bin/mruby benchmark/vm_optimization_bench.rb
# C benchmark
cc -O2 -I include -I build/host/include \
benchmark/vm_dispatch_bench.c \
build/host/lib/libmruby.a -lm -o vm_dispatch_bench
./vm_dispatch_bench
Co-authored-by: Claude <noreply@anthropic.com>
- Add mrb_likely/mrb_unlikely macros to common.h for branch prediction - Optimize OP_GETIDX array fast path: - Cache RArray pointer to avoid repeated RARRAY() calls - Single ARY_EMBED_P check instead of two (via RARRAY_LEN + RARRAY_PTR) - Use unsigned comparison for bounds check - Add branch prediction hints for common cases - Convert switch statement to if-else chain for better branch prediction Benchmark shows ~3% improvement for array read operations. Co-authored-by: Claude <noreply@anthropic.com>
Replace 4-instruction sequence (GETCONST + STRING + SEND + RAISEIF) with single OP_MATCHERR instruction that raises NoMatchingPatternError with "pattern not matched" message. Bump RITE binary format version from 0300 to 0400 due to opcode number shift. Co-authored-by: Claude <noreply@anthropic.com>
Change OP_MATCHERR from Z format (unconditional) to B format (conditional on register). This allows fusing JMPIF + MATCHERR sequence into a single MATCHERR instruction for simple patterns. Before: JMPIF R2 target (4 bytes) + MATCHERR (1 byte) = 5 bytes After: MATCHERR R2 (2 bytes) Saves 3 bytes per pattern match with raise_on_fail. Co-authored-by: Claude <noreply@anthropic.com>
Fuse LOADSELF + RETURN sequence into single RETSELF instruction. Saves 2 bytes per occurrence (3 bytes -> 1 byte). Found 25 occurrences in mrblib, saving 50 bytes total. Co-authored-by: Claude <noreply@anthropic.com>
fuse MOVE+ADDI+MOVE and MOVE+SUBI+MOVE patterns into single instructions. ADDILV/SUBILV add/subtract an immediate to a local variable in-place. BBB format: a=local, b=working space for method call, c=immediate. saves 5 bytes per instance (9->4 bytes), 40 occurrences in stdlib. Co-authored-by: Claude <noreply@anthropic.com>
Fuses MOVE+LOADI_0+GETIDX pattern into single instruction. Saves 4 bytes per arr[0] access (7 bytes -> 3 bytes). Co-authored-by: Claude <noreply@anthropic.com>
TDEF fuses TCLASS+METHOD+DEF for normal method definitions. SDEF fuses SCLASS+METHOD+DEF for singleton method definitions. Saves 4 bytes per method definition (8 bytes -> 4 bytes). Falls back to unfused instructions if irep index exceeds 255. Co-authored-by: Claude <noreply@anthropic.com>
Singleton methods should always be public regardless of the enclosing scope's visibility setting. Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Add mrb_likely/mrb_unlikely hints to help CPU branch predictor: - stack overflow checks (mrb_unlikely) - exception checks (mrb_unlikely) - integer type checks in arithmetic (mrb_likely) - method dispatch fast path (mrb_likely) - argument validation errors (mrb_unlikely) - target class checks in method definition (mrb_unlikely) Co-authored-by: Claude <noreply@anthropic.com>
Bypass method dispatch when calling blocks via yield. The new OP_BLKCALL instruction directly invokes the proc without looking up Proc#call, resulting in 13-17% faster yield performance. Co-authored-by: Claude <noreply@anthropic.com>
Replace block.call(x) with yield x in core iteration methods to take advantage of the new OP_BLKCALL optimization. This improves Integer#times by 13% and Array#each by 7%. Methods updated: - Integer#times, Integer#upto, Integer#downto - Array#each, Array#each_index Co-authored-by: Claude <noreply@anthropic.com>
Both opcodes had nearly identical code for creating procs and defining methods. Now they share a common L_DEF_METHOD label, reducing code duplication by ~10 lines. Co-authored-by: Claude <noreply@anthropic.com>
Add a new opcode that returns nil without requiring LOADNIL + RETURN. This avoids loading nil into a register by setting the return value (v) directly. The implementation uses a separate label (L_RETURN_NIL) to bypass v = regs[a], preserving self in regs[0] for ensure blocks. Codegen applies peephole optimization to fuse LOADNIL + RETURN -> RETNIL. Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Rename boolean load opcodes for consistency with LOADNIL/LOADSELF. Backward compatibility aliases are provided in opcode.h. Co-authored-by: Claude <noreply@anthropic.com>
Add single-byte opcodes for returning true/false directly, completing the set of literal return opcodes (RETSELF, RETNIL, RETTRUE, RETFALSE). Codegen applies peephole optimization to fuse LOADTRUE/LOADFALSE + RETURN. Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
Change default stack growth from linear (+128) to exponential (1.5x). This reduces reallocation frequency while maintaining reasonable memory usage. The minimum growth is still MRB_STACK_GROWTH (128) to ensure small programs don't over-allocate. MRB_STACK_EXTEND_DOUBLING (2x growth) remains available for maximum performance when memory is not a concern. Co-authored-by: Claude <noreply@anthropic.com>
These opcodes use BB format instead of BBB, saving 1 byte per call. In the standard library, this saves ~790 bytes (568 SEND0 + 222 SSEND0). Co-authored-by: Claude <noreply@anthropic.com>
Preparation for future grammar simplification that may require parentheses for method calls with arguments on the right-hand side of assignments. Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
The first keyword argument was dropped because gen_hash() was called with callargs->keyword_args->cdr instead of callargs->keyword_args. Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
See Commits and Changes for more details.
Created by
pull[bot] (v2.0.0-alpha.4)
Can you help keep this open source service alive? 💖 Please sponsor : )