Commit Graph

269 Commits

Author SHA1 Message Date
Yukihiro "Matz" Matsumoto d98d62ee35 hash.c: change __except to take array argument
mrb_get_args(mrb, "*", ...) internally allocates an array when
arguments are on the stack, so passing keys as direct arguments
did not actually avoid allocation. Change __except to take a
single array argument instead, which is simpler and GC-safe.

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-18 15:41:54 +09:00
Yukihiro "Matz" Matsumoto 1b14a3f72a hash.c: add __except method for pattern matching **rest
Add Hash#__except that returns a new hash excluding specified keys,
used by the compiler for **rest capture in hash patterns. Takes keys
as direct arguments to avoid array allocation. The compiler passes
matched key symbols directly on the stack via OP_SEND.

Co-authored-by: Claude <noreply@anthropic.com>
2026-02-16 18:16:27 +09:00
Yukihiro "Matz" Matsumoto d1178ec8eb hash.c, symbol.c, string.c, mruby-string-ext: undef lesser macro
Add #undef lesser after last usage to prevent macro redefinition
warnings when files are amalgamated into a single translation unit.

Co-authored-by: Claude <noreply@anthropic.com>
2026-01-01 10:23:21 +09:00
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 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 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 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
Yukihiro "Matz" Matsumoto 07b803e28a docs: replace xml-style markup with markdown in comments
Replace XML-style markup tags in comments with markdown equivalents:
- <code>...</code> to `...` (inline code)
- <tt>...</tt> to `...` (teletype/monospace)
- <i>...</i> to *...* (italics/emphasis)
- +...+ to `...` (parameter/variable references)

Updated 80+ files across core source, headers, mrbgems, and libraries
to use consistent markdown formatting in documentation comments.
Handled edge cases including special characters like <=> operators.

Co-authored-by: Atlassian Rovo Dev
2025-08-14 10:52:49 +09:00
Yukihiro "Matz" Matsumoto 2735340702 kernel.c: remove mrb_inspect_recursive_p(); #5531
And use mrb_recursive_method_p() and its helper methods.

Co-authored-by: Claude <noreply@anthropic.com>
2025-07-11 10:09:37 +09:00
Yukihiro "Matz" Matsumoto 419c8ebfb2 hash.c: add recursion detection to prevent SystemStackError; fix #5531
Add generalized recursion detection system and integrate it into Hash#==
and Hash#eql? to prevent infinite recursion with mutually recursive hash
structures. Uses call stack inspection for minimal memory overhead.

Co-authored-by: Claude <noreply@anthropic.com>
2025-07-11 10:09:36 +09:00
Yukihiro "Matz" Matsumoto 96355f33b2 hash.c: implement Hash#eql? in C for better performance
Move Hash#eql? implementation from Ruby to C to improve performance and
consistency with other core methods. The C implementation uses mrb_eql
for value comparison, providing proper eql? semantics.

Co-authored-by: Claude <noreply@anthropic.com>
2025-07-11 10:09:36 +09:00
Yukihiro "Matz" Matsumoto 633317a809 hash.c: implement Hash#== in C for better performance
Move Hash#== implementation from Ruby to C to improve performance
and consistency with other core methods. The C implementation
provides the same functionality while being more efficient.

Co-authored-by: Claude <noreply@anthropic.com>
2025-07-11 10:09:35 +09:00
Yukihiro "Matz" Matsumoto 695207be68 hash.c (mrb_obj_hash_code): expose hash function 2025-06-23 17:07:21 +09:00
Yukihiro "Matz" Matsumoto 8cb427b75c hash.c: make Hash#initialize_copy private 2025-06-15 14:13:56 +09:00
google-labs-jules[bot] 493cc64902 hash.c: add descriptive comments to C-facing MRB_API hash functions
This commit adds C-style descriptive comments to MRB_API functions
in `src/hash.c` that are intended for use as part of mruby's C API.
The comments are targeted at C developers using these functions directly.

Comments were added or updated for the following functions:
- mrb_hash_new: Added comment.
- mrb_hash_new_capa: Updated existing comment to be more C API user-centric.
- mrb_hash_dup: Added comment.
- mrb_hash_get: Added comment.
- mrb_hash_fetch: Added comment.
- mrb_hash_set: Added comment.
- mrb_hash_delete_key: Added comment.
- mrb_hash_size: Added comment.
- mrb_hash_merge: Added comment.
- mrb_hash_foreach: Comment updated in a previous phase of work.

This work aligns with the guideline to comment C-facing MRB_API functions,
while avoiding adding new C-API comments to those MRB_API functions
that solely implement Ruby methods and already have extensive Ruby
method documentation (call-seq) in the source. The @brief markup
was avoided as per the original issue request.
2025-06-01 17:57:30 +09:00
Yukihiro "Matz" Matsumoto a574034cb2 hash.c (hash_set_default_proc): mrb_proc_arity() returns mrb_int 2025-03-25 08:09:21 +09:00
Yukihiro "Matz" Matsumoto 226acdc540 hash.c (mrb_hash_set_default_proc): avoid repeated calls for mrb_nil_p() 2025-03-19 14:57:02 +09:00
Yukihiro "Matz" Matsumoto 9a226c28bc hash.c: add arity check for Hash#default_proc (and Hash.new); fix #6484 2025-03-08 16:14:26 +09:00
Yukihiro "Matz" Matsumoto a7f3cfb711 hash.c: allow 'default_proc=nil' to clear default_proc; ref #6483 2025-03-08 15:49:26 +09:00
Yukihiro "Matz" Matsumoto 837f62f18a hash.c: should check type before setting default_proc; fix #6483 2025-03-08 12:34:25 +09:00
Yukihiro "Matz" Matsumoto 87680d3ab2 hash.c (mrb_hash_rehash): call hash_modify before actual modify; fix #6485 2025-03-08 11:21:27 +09:00
Yukihiro "Matz" Matsumoto 213a262b20 hash.c (mrb_hash_compact): call hash_modify instead of mrb_check_frozen
Currently, hash_modify() only calls mrb_check_frozen, but we may add new
checks in the future; ref #6485
2025-03-08 11:15:37 +09:00
dearblue b86c220384 Avoid array object creation with “unknown keyword” error
It is sufficient to return the first element.
2025-02-02 21:02:03 +09:00
Yukihiro "Matz" Matsumoto 3b6325ba3c hash.c (mrb_hash_aset): use pre-assigned local variable 2025-01-21 13:07:44 +09:00
dearblue 1e504bb16a Fixed missing changes to IB_FIND_BY_KEY() parameter names
This is a #6432 supplement.
2025-01-20 22:11:45 +09:00
Yukihiro "Matz" Matsumoto 8276143f03 object.h: remove MRB_SET_FROZEN_FLAG/MRB_UNSET_FROZEN_FLAG macros
Simple `o->frozen = 1/0` now works.
2025-01-07 13:56:30 +09:00
Yukihiro "Matz" Matsumoto c11d18e426 object.h: unify MRB_FROZEN_P() and mrb_frozen_p() 2025-01-07 11:24:58 +09:00
Yukihiro "Matz" Matsumoto baeeb5e435 hash.c (mrb_hash_to_s): print :sym => val as sym: val
Ruby 3.4 changed the format of hash string representation. We follow.
2024-12-21 08:52:23 +09:00
dearblue fd97241cd6 Moving code in macro arguments out of macros
In `src/hash.c`, there are code blocks that are passed as macro arguments.
These code blocks are interpreted as part of the macro function, so breakpoints cannot be set in the debugger.
Also, the gcov command will aggregate them to the caller, and the code in the block will not be counted.

This patch will prevent them from being interpreted as part of a macro, and thus the aforementioned problems will no longer occur.
2024-11-21 22:52:29 +09:00
Yukihiro "Matz" Matsumoto 4a54b551e8 hash.c (ht_set): inline ht_set_without_ib_adjustment() 2024-11-21 07:59:11 +09:00
Yukihiro "Matz" Matsumoto 33357d4f35 hash.c (ht_set_without_ib_adjustment): need to skip tombstone; #6421
If a tombstone (a deleted entry slot) is found in searching the entry,
it should be skipped, but we had added the new entry even if the entry
to be replaced might be found in the further search. #6414 and #6421
tried to rehash the table to remove tombstone. But rehashing consumes
memory. So for the time being, we just skip tombstones in the search.
Maybe we will add some heuristics to rehash when the table has too many
tombstones. close #6414
2024-11-20 10:52:39 +09:00
dearblue 9501c3f58c Add annotations for function names defined in the preprocessor 2024-11-16 20:50:49 +09:00
Yukihiro "Matz" Matsumoto 5387b74be7 hash.c (mrb_hash_to_s): put spaces around =>
CRuby 3.4 puts spaces around `=>` since for example `{:a!=>2}` can be
confusing where to separate tokens.  mruby should follow the behavior.

Many tests in `test/t` directory assumed no spaces around `=>`, so we
needed to fix them too.
2024-11-11 11:07:43 +09:00
Yukihiro "Matz" Matsumoto 398e669bbf hash.c: add Hash#assoc and Hash#rassoc 2024-07-18 15:06:31 +09:00
Yukihiro "Matz" Matsumoto cd8582a011 hash.c: define Hash#to_hash 2024-07-17 09:46:46 +09:00
Yukihiro "Matz" Matsumoto 1c021a5c3a hash.c (obj_eql): simplify the expression 2024-04-11 15:39:45 +09:00
Yukihiro "Matz" Matsumoto 2cb3f1d9e5 hash.c (mrb_gc_mark_hash_size): unify with mrb_gc_mark_hash 2024-03-14 11:52:25 +09:00
Yukihiro "Matz" Matsumoto 8e6f4a79a8 hash.c: use presym to initialize Hash class 2023-11-11 23:48:31 +09:00
Yukihiro "Matz" Matsumoto 0443f14fd0 array.c,hash.c,numeric.c,string.c: use mrb_define_method_id()
For primary class libraries.
2023-10-23 15:23:08 +09:00
Yukihiro "Matz" Matsumoto b85b6822b2 hash.c (mrb_hash_aset): avoid slower mrb_get_args() 2023-08-26 22:30:20 +09:00
Yukihiro "Matz" Matsumoto 113565a1c5 hash.c (mrb_hash_to_s): add recursive inspect check to Hash#inspect 2023-06-20 11:18:38 +09:00
Yukihiro "Matz" Matsumoto 20552fe176 hash.c (mrb_hash_foreach): wrap function call with h_check_modified
If the iterating hash is modified in the function, h_each loop may
crash accessing modified (and probably deallocated) internal data.
2023-06-17 10:55:55 +09:00
Yukihiro "Matz" Matsumoto eea72ec84a fix spaces in the type cast expressions (cosmetic changes) 2023-05-18 23:29:16 +09:00
Yukihiro "Matz" Matsumoto 76157c5f78 add inline specifier to frequently called functions
- entry_deleted_p(): hash.c
- ensure_block(): vm.c
2023-02-19 19:06:37 +09:00
Yukihiro "Matz" Matsumoto 1b299addaf mruby-hash-ext/hash.rb: implement Hash#compact! in C
Using `__compact` method defined in the core, since hash access
functions are private to `src/hash.c`.
2023-02-02 22:44:04 +09:00
Yukihiro "Matz" Matsumoto 9c5dc42e59 small cosmetic changes.
I prefer `i++` style unless absolutely necessary.
This commit is an addition to 41e4148.
2022-11-19 17:11:56 +09:00
dearblue 2d9ecc660e Fix property between ar_set() and ht_init().
If GC occurs in `mrb_realloc()` in `ht_init()` called from `ar_set()`, the following inconsistency occurs:
- If `h_ht_on()` is called before `mrb_realloc()`, `hash->hsh.ht` is referenced instead of `hash->hsh.ea` during GC.
- If the pointer is changed by `ea_adjust()` in `ar_set()`, `hash->hsh.ea` (`hash->hsh.ht`) is referenced in GC before the change.

These modifications can be resolved by changing the order of processing.

However, if a `NoMemoryError` exception is raised, it is presumed that the size of the "AR" will be exceeded and the unintended state will continue.
To prevent this, elements should be added after they have been converted to "HT".
2022-07-30 23:20:48 +09:00
Yukihiro "Matz" Matsumoto d2a24a540c hash.c: implement typical part of merge in C. 2022-06-19 22:28:31 +09:00
Yukihiro "Matz" Matsumoto b99c389ec3 internal.h: aggregate internal functions.
Internal functions can only be called from within the library.
Functions listed in `mruby/internal.h` can be called from:

* core (src/*.c)
* gems (mrbgems/**/*.c)

But not from the application linked with `libmruby`.
2022-04-02 18:25:13 +09:00