Commit Graph

6252 Commits

Author SHA1 Message Date
Yukihiro "Matz" Matsumoto f4fb41b528 kernel.c: regression on struct/array/hash == override with super; fix #6660
when overriding struct#==, array#==, or hash#== with super, the recursion
detection incorrectly treated the super call as a circular reference. this
was caused by commit 5ca2d442 which added recursion detection.

the fix introduces mrb_recursive_func_p that starts from ci[-2] instead of
ci[-1], skipping the immediate parent frame which may be a ruby override
calling super. equality methods (==, eql?) now use this function, while
inspect methods keep using mrb_recursive_method_p for immediate circular
reference detection.

Co-authored-by: Claude <noreply@anthropic.com>
2025-11-12 10:25:37 +09:00
Yukihiro "Matz" Matsumoto a9ed9190d3 class.c: combine variable declaration with initialization 2025-11-08 14:09:16 +09:00
Yukihiro "Matz" Matsumoto b99233bc45 etc.c: combine variable declaration with initialization 2025-11-08 14:08:23 +09:00
Yukihiro "Matz" Matsumoto b592d02d63 gc.c: combine variable declaration with initialization 2025-11-08 14:07:41 +09:00
Yukihiro "Matz" Matsumoto 33ec660cff kernel.c: combine variable declaration with initialization 2025-11-08 14:07:00 +09:00
Yukihiro "Matz" Matsumoto 9f91d5d1a2 load.c: combine variable declaration with initialization 2025-11-08 14:06:11 +09:00
Yukihiro "Matz" Matsumoto 717ac087ff object.c: combine variable declaration with initialization 2025-11-08 14:05:27 +09:00
Yukihiro "Matz" Matsumoto ed82cea4ca proc.c: combine variable declaration with initialization 2025-11-08 14:04:39 +09:00
Yukihiro "Matz" Matsumoto fa8c460c61 range.c: combine variable declaration with initialization 2025-11-08 14:04:11 +09:00
Yukihiro "Matz" Matsumoto 098812d10c string.c: combine variable declaration with initialization 2025-11-08 13:58:43 +09:00
Yukihiro "Matz" Matsumoto 1d3393caf5 variable.c: combine variable declaration with initialization 2025-11-08 13:57:32 +09:00
Yukihiro "Matz" Matsumoto 2c47e84cab Merge pull request #6656 from dearblue/combination_init.2 2025-10-29 11:01:29 +09:00
Yukihiro "Matz" Matsumoto eb398971bf array.c: fix use-after-realloc in Array#sort!; fix #6649
add length check to detect array modification during sort. when realloc()
shrinks an array in-place, it may return the same pointer, defeating the
pointer-only check. the new check catches both pointer changes and length
changes, preventing out-of-bounds access.

the fix captures array pointer and length at the start of each comparison,
then validates both after user code executes. this detects modifications
even when realloc() returns the original pointer.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-27 15:06:14 +09:00
dearblue c28223ac5b Fix integer overflow in allocation size calculation
Passing a large integer value as the first argument to `Array#ary_combination_init` could cause an incorrect memory allocation due to integer overflow.
This would result in an invalid write during the subsequent zero-fill of the memory.

To resolve the issue, it has been replaced with `mrb_calloc()`.
However, since the current `mrb_calloc()` returns `NULL` due to overflow, it has been modified to raise an exception as a clear error.
2025-10-26 21:02:20 +09:00
Yukihiro "Matz" Matsumoto 00e7474cce array.c: combine variable declaration with initialization 2025-10-25 23:27:08 +09:00
Yukihiro "Matz" Matsumoto 7eb6ca686c class.c: combine variable declaration with initialization 2025-10-25 23:14:52 +09:00
Yukihiro "Matz" Matsumoto f432f1772d dump.c: combine variable declaration with initialization 2025-10-25 23:10:24 +09:00
Yukihiro "Matz" Matsumoto 35f2e97d40 kernel.c: combine variable declaration with initialization 2025-10-25 22:37:31 +09:00
Yukihiro "Matz" Matsumoto d33aaecf39 numeric.c: combine variable declaration with initialization 2025-10-25 21:58:39 +09:00
Yukihiro "Matz" Matsumoto b171abade2 range.c: combine variable declaration with initialization 2025-10-25 19:48:14 +09:00
Yukihiro "Matz" Matsumoto 905bb7366b string.c: combine variable declaration with initialization 2025-10-25 15:50:41 +09:00
Yukihiro "Matz" Matsumoto 516d2bcc52 symbol.c: combine variable declaration with initialization 2025-10-25 15:39:32 +09:00
Yukihiro "Matz" Matsumoto 0211004cf2 variable.c: combine variable declaration with initialization 2025-10-25 09:36:48 +09:00
Yukihiro "Matz" Matsumoto 0bfc2164ed vm.c: combine variable declaration with initialization 2025-10-25 09:19:14 +09:00
Yukihiro "Matz" Matsumoto 12268dc3ef revert "array.c: hoist RARRAY_PTR calls in comparison operator"; fix #6652
this reverts commit 04af58db89 which caused use-after-free vulnerability.
cached array pointers become invalid when mrb_cmp() executes user's <=>
method that can modify arrays during iteration

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-25 08:39:01 +09:00
Yukihiro "Matz" Matsumoto 036b40e265 gc.c: combine variable declaration with initialization
Co-authored-by: Claude <noreply@anthropic.com>
2025-10-23 11:34:21 +09:00
Yukihiro "Matz" Matsumoto 04af58db89 array.c: hoist RARRAY_PTR calls in comparison operator
Optimizes Array#<=> by hoisting RARRAY_PTR calls outside the loop to
avoid repeated conditional checks. This is a frequently used operation
for array comparisons and sorting.

Before: 2 RARRAY_PTR calls per iteration (checks embed vs heap twice)
After: 2 RARRAY_PTR calls total (pointers cached outside loop)

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-22 12:06:46 +09:00
Yukihiro "Matz" Matsumoto d1a48c03e2 gc.c: add mrbc stub for mrb_task_mark_all
added forward declaration in gc.c and stub implementation in mrbc stub.c
for mrb_task_mark_all to avoid link errors when mrbc is built without
mruby-task gem.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 12:41:39 +09:00
Yukihiro "Matz" Matsumoto 14b761e200 vm.c: suppress GCC 12+ dangling pointer warning for jmpbuf
add pragma to suppress -Wdangling-pointer warning for intentional
stack variable address storage in exception handling. the pointer
is safely managed and cleared before function returns.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-11 11:10:16 +09:00
Yukihiro "Matz" Matsumoto e7cbd8cc28 mruby-task: add gc protection and optimize task operations
Implements dual-mechanism GC protection and optimizes task lookup
using pointer arithmetic based on PicoRuby reference implementation.

GC Protection:
- Add mrb_gc_register/unregister to protect Task objects
- Implement mrb_task_mark_all() to mark task contexts during GC
- Store proc reference in mrb_task to prevent premature collection
- Integrate marking into gc.c root_scan_phase

Performance Optimizations:
- Add MRB2TASK macro for O(1) context-to-task conversion
- Optimize Task.current: O(n) queue search -> O(1) pointer arithmetic
- Optimize Task.pass: simplify to root context check
- Optimize Task.join: use MRB2TASK for current task lookup

Bug Fixes:
- Fix MRB_TASK_CREATED/STOPPED to use MRB_FIBER_TERMINATED
- Add safety check to prevent execution of terminated tasks
- Initialize callinfo PC to bytecode start in task_init_context

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:23 +09:00
Yukihiro "Matz" Matsumoto 47dfb771cf mruby-task: fix cooperative task yielding with Task.pass
this patch fixes several critical issues in the task scheduler:

1. vm integration for computed goto dispatch mode:
   - added task switching check in NEXT macro for computed goto
   - previous implementation only worked with switch dispatch mode
   - now Task.pass properly yields control to other tasks

2. task lifecycle tracking:
   - added 'started' flag to mrb_task structure
   - fixed first-run detection to avoid popping callinfo multiple times
   - vm overwrites context status during execution, making it unreliable

3. removed mrblib/task.rb:
   - empty Ruby method stubs were overriding C implementations
   - all task methods now properly implemented in C

4. cleaned up task scheduler loop:
   - proper task completion detection using switching flag
   - round-robin scheduling for tasks at same priority
   - clean scheduler exit when all tasks complete

tasks now cooperatively yield with Task.pass and complete cleanly.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:21 +09:00
Yukihiro "Matz" Matsumoto 9ea37745ac vm.c: integrate task scheduler with vm dispatch loop
modify END_DISPATCH macro to check for context switches after each
bytecode instruction. when switching flag is set or task has stopped,
return from mrb_vm_exec to yield control back to scheduler.

add TASK_STOP macro to mark task completion in OP_STOP instruction.
this allows scheduler to detect when tasks finish execution.

the integration enables cooperative preemption at bytecode granularity
while maintaining compatibility with non-task builds.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-08 23:55:20 +09:00
Yukihiro "Matz" Matsumoto 6919e857a6 hash.c: initialize local variables to suppress warnings
initialize hash_code and eql variables to avoid uninitialized variable
warnings from compilers.

Co-authored-by: Claude <noreply@anthropic.com>
2025-10-03 19:46:28 +09:00
Yukihiro "Matz" Matsumoto 2ffe25636b vm.c: fix conversion warning in send_method visibility error path
Cast RARRAY_LEN result to int in send_method when handling visibility
errors to resolve C4244 warning about potential data loss from
mrb_ssize to int conversion. The cast is safe since n represents
argument count which should fit in int range.

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-22 23:46:55 +09:00
Yukihiro "Matz" Matsumoto c5d8c7210d symbol.c: fix pointer tagging for windows
SYMTBL_LITERAL_FLAG was defined as 1UL, which can be smaller
than uintptr_t on some platforms (e.g., Windows 64-bit). This
caused symtbl_get_ptr() to return a corrupted pointer.

Changed the flag to be explicitly cast to uintptr_t to ensure
correct behavior on all platforms.

Co-authored-by: Gemini <gemini@google.com>
2025-08-21 10:04:18 +09:00
Yukihiro "Matz" Matsumoto a8dbe48311 symbol.c: remove unused function sym_lit_p
The function sym_lit_p was not used anywhere in the codebase.

Co-authored-by: Gemini <gemini@google.com>
2025-08-21 07:23:14 +09:00
Yukihiro "Matz" Matsumoto 240fbe41f9 symbol.c: fix label at end of compound statement in sym_intern_common
Add a null statement after the 'heap_allocation' label to silence
warnings from C++ compilers.

Co-authored-by: Gemini <gemini@google.com>
2025-08-21 07:23:14 +09:00
Yukihiro "Matz" Matsumoto f167ae8145 symbol.c: simplify literal check in sym_intern_common
This commit simplifies the logic for checking if a symbol is a literal in the
`sym_intern_common` function by using the `lit = lit || mrb_ro_data_p(name);`
idiom.

Co-authored-by: Gemini <gemini@google.com>
2025-08-14 10:53:09 +09:00
Yukihiro "Matz" Matsumoto 8c08103151 symbol.c: remove duplicate code in sym_intern functions
This commit refactors the `sym_intern_linear_mode` and
`sym_intern_hash_mode` functions to remove duplicate code. A new
function `sym_intern_common` is created to contain the common code.

Co-authored-by: Gemini <gemini@google.com>
2025-08-14 10:53:09 +09:00
Yukihiro "Matz" Matsumoto 852216b939 symbol.c: implement LSB tagging for literal flags to save memory
Replace separate symflags array with LSB pointer tagging to store
symbol literal flags directly in string pointers. This eliminates
the need for a separate symflags allocation, saving 1/8 of symbol
table memory overhead (282 bytes measured improvement).

Key changes:
- Add LSB tagging helper functions (symtbl_get_ptr, symtbl_is_literal,
  symtbl_tag_literal)
- Store literal flag in LSB of mrb->symtbl[i] pointers (LSB=1 for
  literals)
- Remove symflags field from mrb_sym_hash_table struct
- Update all symbol access functions to use proper pointer untagging
- Maintain mrb_ro_data_p() detection for platform compatibility
- Fix potential crashes by ensuring untagged pointers in memory
  operations

Works in both linear and hash table modes. All 1717 tests pass.
Memory usage reduced by 282 bytes compared to original implementation.

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-14 10:53:09 +09:00
Yukihiro "Matz" Matsumoto 47c4c1390b symbol.c: refactor complex macros to static inline functions
Converts sym_lit_p, sym_lit_set, and sym_flags_clear from complex
macros to clean static inline functions for better readability
and maintainability.

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-14 10:53:09 +09:00
Yukihiro "Matz" Matsumoto a217935e7d symbol.c: implement adaptive symbol table for memory efficiency
Replace fixed 256-element hash array in mrb_state with adaptive approach:
- Linear search for <=255 symbols (typical embedded use case)
- Hash table allocated on-demand when symbols exceed threshold
- Reduces mrb_state size by 1KB per instance (1068->36 bytes in symbol fields)
- Configurable threshold via MRB_SYMBOL_LINEAR_THRESHOLD in mrbconf.h

Co-authored-by: Claude <noreply@anthropic.com>
2025-08-14 10:53:08 +09:00
Yukihiro "Matz" Matsumoto c1605216ad kernel: remove duplicate MRB_RECURSIVE_P macros
Remove redundant definitions of MRB_RECURSIVE_P, MRB_RECURSIVE_UNARY_P,
and MRB_RECURSIVE_BINARY_P from src/kernel.c as they are already defined
in include/mruby.h.

Co-authored-by: Gemini <gemini@google.com>
2025-08-14 10:53:04 +09:00
Yukihiro "Matz" Matsumoto 8cd64f6e37 variable.c: improve binary search logic in bsearch_idx
Co-authored-by: Gemini <gemini@google.com>
2025-08-14 10:52:54 +09:00
Yukihiro "Matz" Matsumoto 50072c71ab variable.c: clarify memory allocation calls
Co-authored-by: Gemini <gemini@google.com>
2025-08-14 10:52:54 +09:00
Yukihiro "Matz" Matsumoto 41c5fc4dc6 variable.c: remove unused macros
Co-authored-by: Gemini <gemini@google.com>
2025-08-14 10:52:53 +09:00
Yukihiro "Matz" Matsumoto 4d92444317 hash.c: clarify EA growth and remove unused macro
Refactor the calculation of hash entry array capacity to explicitly use
integer arithmetic for the 1.2x growth factor. This change improves code
clarity without altering the existing growth behavior.

The EA_INCREASE_RATIO macro is no longer used after this refactoring, so
it has been removed for code cleanup.

Co-authored-by: Gemini <gemini@google.com>
2025-08-14 10:52:51 +09:00
Yukihiro "Matz" Matsumoto 0e91696397 dump.c: add type cast to retrieve bigint length from the pool
If bigint representation is too long, the retrieved length (without type
cast) can be considered as negative. To avoid the issue, we have to add
type cast before assignments.
2025-08-14 10:52:51 +09:00
Yukihiro "Matz" Matsumoto 6f5dd98951 hash.c: improve performance with quadratic probing
Replaces the linear probing collision resolution strategy with quadratic
probing. This change significantly improves hash table performance, especially
in high-collision scenarios, by mitigating the primary clustering issue
inherent in linear probing.

The new probing sequence, (step^2 + step) / 2, guarantees that every slot is
visited exactly once in a power-of-two-sized table.

Benchmark results on a high-collision test case show a ~9x improvement in both
insertion and lookup times.

Co-authored-by: Gemini <gemini@google.com>
2025-08-14 10:52:51 +09:00
Yukihiro "Matz" Matsumoto 57d398b105 hash.c: use value-based hash for numbers
Fixes a correctness bug where float and bignum hash codes were based on object
identity instead of their numerical value. This change introduces value-based
hashing for these types, ensuring that two numbers with the same value produce
the same hash code, as required by Ruby semantics.

- Floats are now hashed based on their bit representation.
- Bignums are hashed using the dedicated `mrb_bint_hash` function.

This change makes hash behavior correct and more performant by avoiding VM
callbacks for core numeric types.

Co-authored-by: Gemini <gemini@google.com>
2025-08-14 10:52:50 +09:00