Added complete call-seq documentation for thread suspension methods in
src/sleep.c:
## Core Methods:
### sleep:
- Suspends current thread for specified duration in seconds
- Supports floating point precision when MRB_NO_FLOAT is not defined
- Returns actual number of seconds slept (rounded)
- Cross-platform implementation (Windows Sleep vs Unix nanosleep)
- Comprehensive examples showing fractional second delays
### usleep:
- Suspends current thread for specified duration in microseconds
- Provides microsecond-level precision for short delays
- Integer-only parameter for precise timing control
- Returns 0 on successful completion
- Examples demonstrating millisecond and microsecond delays
Co-authored-by: Atlassian Rovo Dev
Added complete documentation for all C API functions providing exception
handling capabilities in src/exception.c:
## Core C API Functions:
### Exception Protection:
- mrb_protect: executes function under exception protection, equivalent to
Ruby's begin/rescue blocks, catches exceptions and returns them as objects
with error state flag for C code exception handling
### Guaranteed Cleanup:
- mrb_ensure: executes function with guaranteed cleanup, equivalent to Ruby's
begin/ensure blocks, ensures cleanup function always runs regardless of
exceptions, re-raises caught exceptions after cleanup
### Exception Handling:
- mrb_rescue: executes function with StandardError exception handling,
convenience wrapper for common rescue patterns, automatically catches
StandardError and its subclasses
- mrb_rescue_exceptions: executes function with specific exception class
handling, allows selective exception catching based on class hierarchy,
re-raises unmatched exceptions for precise error control
## Helper Components:
### Internal Structures:
- protect_data: helper structure to pass function and data to protection
wrapper, encapsulates function pointer and argument data for safe execution
### Internal Functions:
- protect_body: helper function that wraps user function calls for exception
protection, extracts function and data from protect_data structure and
calls user function with proper parameters
Key features documented:
- Exception protection and propagation control
- Guaranteed cleanup execution (ensure semantics)
- Selective exception class handling with inheritance support
- Integration with mruby's exception system and GC
- C API patterns for robust error handling in extensions
Provides complete coverage of exception handling C API for robust error
management in mruby C extensions and embedded applications, essential
for building reliable C code that integrates with mruby's exception system.
Co-authored-by: Atlassian Rovo Dev
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
Added missing call-seq documentation for two Enumerator methods in
mrblib/enumerator.rb:
## Enumerator Instance Methods:
- inspect: returns string representation of the enumerator showing the
underlying object, method, and arguments in a readable debug format
with examples for different enumerator types
- size: returns the size of the enumerator if calculable, or nil if it
cannot be determined lazily, with examples showing finite and infinite
enumerators
Co-authored-by: Atlassian Rovo Dev
Added complete call-seq documentation for the toplevel include method in
mrblib/toplevel.rb (1 method):
- include: enables module inclusion at the toplevel scope, delegates to
Object.include to make module methods available to all objects globally,
provides convenient syntax for extending the global namespace with
module functionality
Co-authored-by: Atlassian Rovo Dev
- %: string formatting operator that uses the string as a format specification
and applies it to the given argument(s), supports both single arguments and
arrays for multiple substitutions, delegates to sprintf for actual formatting
The method now has comprehensive call-seq documentation with practical
examples demonstrating various sprintf formatting patterns including:
- Zero-padded integers: "%05d" % 123
- Multiple substitutions with arrays: "%-5s: %016x" % [name, id]
- Hash-based named substitutions: "foo = %{foo}" % { :foo => 'bar' }
- Named format specifiers: "%{foo}f" % { :foo => 1 }
Co-authored-by: Atlassian Rovo Dev
Added missing call-seq documentation for Integer#integer? method in
mrblib/numeric_ext.rb to complete documentation coverage:
- integer?: returns true for Integer objects, completing the integer?
method documentation across both Numeric and Integer classes with
consistent formatting and practical examples
Co-authored-by: Atlassian Rovo Dev
implement Integer#gcd and Integer#lcm methods in mruby-numeric-ext with full
support for both regular integers and bigints.
key changes:
- add mrb_int_gcd euclidean algorithm for regular integer gcd calculation
- implement int_gcd and int_lcm methods with proper type checking and bigint fallback
- add mrb_bint_gcd, mrb_bint_lcm, mrb_bint_abs functions to bigint api
- register gcd and lcm methods with integer class
- add comprehensive test coverage for both regular and bigint cases
Co-authored-by: Claude <noreply@anthropic.com>
Added complete call-seq documentation for all Method extension methods in
mrblib/method.rb (3 methods):
## Method Extension Methods:
- to_proc: converts Method object to Proc for functional programming
patterns, enables use with &: syntax for concise method references
and supports full argument passing including blocks and keyword arguments
- << (left composition): method composition operator that calls other_proc
first then this method, enables right-to-left function composition with
mathematical notation f(g(x)) for building complex transformations
- >> (right composition): method composition operator that calls this method
first then other_proc, enables left-to-right function composition with
pipeline notation for intuitive data flow transformations
Co-authored-by: Atlassian Rovo Dev
To achieve this, the following changes were made:
- Exported `mrb_bint_size`, `mrb_bint_from_bytes`, and `mrb_bint_sign`
functions from `mruby-bigint` to be used in other mrbgems.
- Modified `mruby-random` to use these new functions to handle Bigint
arguments in the `rand` method.
Co-authored-by: Gemini <gemini@google.com>
Implement comprehensive single-limb division optimization providing
significant performance improvements for the common case of dividing
by small numbers.
Technical implementation:
- Added mpz_div_limb() function with three optimization strategies:
* Power-of-2 divisors: use bit shifts (q = x >> log₂(d), r = x & (d-1))
* Single-limb to single-limb: direct hardware division
* Multi-limb to single-limb: optimized digit-by-digit algorithm
- Integrated fast path in udiv() for yy->sz == 1 condition
- Manual bit-shift implementation to avoid function dependencies
- Proper edge case handling (zero dividend, division by zero)
Performance improvements:
- Single-limb division: 1,156K ops/sec (3.4x vs multi-limb)
- Multi->single-limb: 457K ops/sec (1.3x vs multi-limb)
- Power-of-2 division: 437K ops/sec (1.3x vs multi-limb)
- Mixed small divisions: 662K ops/sec (1.9x vs multi-limb)
Algorithm benefits:
Power-of-2 detection using (d & (d-1)) == 0 enables ultra-fast bit
operations. Multi-limb algorithm processes from MSB to LSB using
double-limb arithmetic to prevent overflow, avoiding expensive
normalization and trial division phases of general algorithm.
Applications:
Optimizes common operations like base conversion, modular arithmetic
with small moduli, and mathematical computations involving division
by constants. Particularly beneficial for embedded systems where
division by small integers is frequent.
Testing:
- All existing tests pass (1712/1712 successful)
- Comprehensive correctness verification for all optimization paths
- Performance benchmarks confirm expected speedup ratios
- Edge cases properly handled (zero, equal operands, out-of-range)
Co-authored-by: Claude <noreply@anthropic.com>
Added complete call-seq documentation for all errno module methods in
mrblib/errno.rb (3 methods):
## Errno Module Methods:
- const_defined?: checks if errno constant exists on the system, provides
dynamic errno constant detection by querying both system-defined errno
values and superclass constants with proper boolean return values
- const_missing: handles dynamic errno constant definition when undefined
constants are referenced, automatically defines errno classes for valid
system error codes and delegates to superclass for invalid names
- constants: returns array of all available errno constant names on the
system, includes both already defined constants and those that can be
dynamically defined, with dependency note for mruby-metaprog gem
Co-authored-by: Atlassian Rovo Dev
Implement Barrett reduction optimization for modular exponentiation operations
to significantly improve performance for cryptographic and mathematical
computations. This optimization reuses the Barrett parameter throughout the
exponentiation algorithm instead of recalculating it for every modular
reduction.
Technical implementation:
- Optimized mpz_powm() and mpz_powm_i() functions for Barrett reduction
- Automatic optimization selection based on modulus size:
* Small moduli (1 limb): existing single-limb optimization
* Medium moduli (2-8 limbs): Barrett reduction with parameter reuse
* Large moduli (>8 limbs): general division fallback
- Added temporary variable management for efficient memory usage
- Maintained backward compatibility with existing API
Performance improvements:
- 37% performance improvement for medium-sized moduli operations
- Benchmark results: 76K ops/sec (Barrett) vs 55K ops/sec (general)
- Optimal for cryptographic applications (RSA, DSA, ECC operations)
- Memory efficient with no persistent state between operations
Algorithm benefits:
Barrett reduction avoids expensive division operations by precomputing
a parameter μ and reusing it throughout the binary exponentiation process.
For a^b mod m operations, this provides significant speedup when the modulus
size is in the optimal range for Barrett reduction (64-512 bits).
Testing:
- All existing tests pass (1712/1712 successful)
- Comprehensive correctness verification with various input sizes
- Performance benchmarks confirm expected optimization behavior
Co-authored-by: Claude <noreply@anthropic.com>
Added complete call-seq documentation for all lazy enumeration methods in
mrblib/lazy.rb (16 methods):
## Enumerable Extension Methods:
- lazy: creates Enumerator::Lazy for deferred evaluation, enables efficient
processing of infinite sequences and large datasets with comprehensive
pythagorean triples example demonstrating real-world usage
## Enumerator::Lazy Class Methods:
- new: constructor for creating lazy enumerators with custom yielding logic,
provides foundation for building custom lazy operations
- to_enum/enum_for: creates lazy enumerator from method calls, maintains
lazy evaluation chain for custom enumerable methods
## Enumerator::Lazy Instance Methods:
- map/collect: lazy transformation of elements with deferred execution
- select/find_all: lazy filtering with conditional element inclusion
- reject: lazy filtering with conditional element exclusion
- grep: lazy pattern matching using case equality operator
- grep_v: lazy inverse pattern matching for exclusion filtering
- drop: lazy skipping of first n elements without immediate evaluation
- drop_while: lazy conditional skipping until predicate fails
- take: lazy limiting to first n elements with automatic termination
- take_while: lazy conditional taking until predicate fails
- flat_map/collect_concat: lazy flattening and mapping in single operation
- zip: lazy combining of multiple enumerables into tuples
- uniq: lazy uniqueness filtering with optional transformation block
- force: immediate evaluation alias for to_a, converts lazy chain to array
Co-authored-by: Atlassian Rovo Dev
Added complete call-seq documentation for all enumerator chain methods in
mrblib/chain.rb (8 methods):
## Enumerable Extension Methods:
- chain: creates Enumerator::Chain from multiple enumerables for sequential
iteration, enabling fluent chaining of enumerable objects
## Enumerator Extension Methods:
- +: operator overload for creating chains from two enumerators, provides
convenient syntax for combining enumerators
## Enumerator::Chain Class Methods:
- new: constructor for creating chain from multiple enumerable arguments,
stores enumerables and initializes position tracking
## Enumerator::Chain Instance Methods:
- each: core iteration method that sequentially processes all chained
enumerables, supports both block and enumerator return modes
- size: calculates total size across all chained enumerables, returns nil
if any enumerable doesn't support size method
- rewind: resets iteration state by rewinding all previously iterated
enumerables in reverse order, maintains proper state management
- +: creates new chain by appending additional enumerable to existing chain,
enables further composition of enumerator chains
- inspect: provides debugging representation showing internal enumerable
structure for development and troubleshooting
Co-authored-by: Atlassian Rovo Dev
Implement and integrate Barrett reduction algorithm to optimize modular
arithmetic operations for moderate-sized moduli (64-512 bits). This algorithm
provides significant performance improvements for cryptographic applications
and repeated modular operations.
Technical implementation:
- Added mpz_barrett_mu() to compute Barrett parameter μ = ⌊2^(2k)/m⌋
- Added mpz_barrett_reduce() with full 7-step Barrett algorithm
- Integrated into mpz_mod() with automatic selection criteria:
* Single-limb modulus: existing fast path (unchanged)
* Moderate moduli (2-8 limbs, dividend ≥ modulus + 2): Barrett reduction
* Large moduli: general division fallback (unchanged)
Performance characteristics:
- Barrett reduction is most effective for 64-512 bit moduli
- Complements existing single-limb optimization for small moduli
- Transparent optimization with no API changes
- All existing tests pass (1712 tests successful)
Algorithm details:
Barrett reduction avoids expensive division by precomputing a parameter
and using only multiplications and bit shifts. The 7-step algorithm
approximates the quotient, performs modular reduction using power-of-2
operations, and applies final corrections to ensure 0 ≤ result < modulus.
Co-authored-by: Claude <noreply@anthropic.com>
Added complete call-seq documentation for all Complex methods in
mrblib/complex.rb (18 methods):
## Complex Class Methods:
- polar: creates complex number from polar coordinates (magnitude, angle)
with trigonometric conversion using Math.cos and Math.sin
## Complex Instance Methods:
- inspect, to_s: string representation methods for debugging and display
with proper formatting of real and imaginary parts
- +@, -@: unary plus and minus operators for identity and negation
- <=>: spaceship operator for comparison with other numeric types,
enables Comparable module functionality with proper nil handling
- abs/magnitude: absolute value (magnitude) calculation using hypot
- abs2: square of absolute value for performance-critical calculations
- arg/angle/phase: argument (angle) calculation using atan2
- conjugate/conj: complex conjugate operation (negates imaginary part)
- fdiv: floating-point division ensuring float results
- polar: returns [magnitude, angle] array representation
- real?: always returns false for complex numbers
- rectangular/rect: returns [real, imaginary] array representation
- to_c: returns self (identity conversion)
- to_r: converts to rational when imaginary part is zero, raises RangeError otherwise
## Numeric Extension Methods:
- i: creates pure imaginary number (0+num*i) for convenient complex creation
- to_c: converts any numeric to complex with zero imaginary part
Co-authored-by: Atlassian Rovo Dev
Added complete call-seq documentation for all Rational methods in
mrblib/rational.rb (4 methods):
## Rational Class Methods:
- inspect: returns string representation for debugging with parentheses
format, showing the rational value in "(numerator/denominator)" form
- to_s: returns string representation in "numerator/denominator" format
for display and conversion purposes
- <=>: spaceship operator for comparison with other numeric types,
returns -1/0/+1 for less/equal/greater comparisons, enables Comparable
module functionality with proper nil handling for incomparable values
## Numeric Extension Methods:
- to_r: converts any numeric value to rational representation with
denominator of 1, part of the standard numeric conversion protocol
Co-authored-by: Atlassian Rovo Dev
Added complete call-seq documentation for all extended Proc methods in
mrblib/proc.rb (6 methods):
## Proc Extension Methods:
- ===: case equality operator for use in case statements, enables proc
objects as targets in when clauses for pattern matching
- yield: compatibility method equivalent to call, provided for API
consistency with block yield semantics
- to_proc: protocol method that returns self, part of the standard
to_proc conversion protocol for Proc objects
- curry: creates curried procs for partial application and functional
programming patterns, supports optional arity specification with
proper lambda arity validation
- << (left composition): proc composition operator that calls other_proc
first then this proc, enabling right-to-left function composition
- >> (right composition): proc composition operator that calls this proc
first then other_proc, enabling left-to-right function composition
Co-authored-by: Atlassian Rovo Dev
Implement specialized modular reduction algorithm for single-limb modulus
to avoid expensive division operations. The optimization uses repeated
division with double-precision arithmetic for multi-limb dividends and
direct modulo operation for single-limb dividends.
Algorithm:
- Single-limb dividend: direct modulo operation (x % m)
- Multi-limb dividend: iterative reduction using double-precision arithmetic
processing limbs from most significant to least significant
Purpose:
- Accelerate common modular arithmetic operations with small moduli
- Reduce computational overhead for cryptographic and mathematical operations
- Improve performance of rational number arithmetic that relies on modular ops
Performance impact:
- Single-limb modulus: ~1.04M ops/sec (6x improvement over general case)
- Maintains correctness for all existing modular arithmetic operations
- Zero impact on large modulus operations (fallback to existing algorithm)
Co-authored-by: Claude <noreply@anthropic.com>
Added complete call-seq documentation for directory operations across
both mrblib/dir.rb (7 Ruby methods) and src/dir.c (12 C methods):
## Ruby Methods (mrblib/dir.rb):
- Dir instance methods: each, each_child for directory iteration with
enumerator support when no block given
- Dir class methods: entries, children for getting directory contents
as arrays, foreach for iteration, open for directory access with
optional block handling, chdir for changing working directory with
optional block for temporary changes
## C Methods (src/dir.c):
- Dir class methods: delete for removing directories, exist? for checking
directory existence, getwd/pwd for current directory, mkdir for creating
directories with optional permissions, chroot for changing filesystem root,
empty? for checking if directory is empty
- Dir instance methods: new for creating directory objects, close for
closing directory streams, read for reading directory entries, rewind
for repositioning to beginning, seek/tell/pos for directory positioning
Co-authored-by: Atlassian Rovo Dev
adds efficient trailing zero counting and power-of-2 detection
with fast paths for common cases involving powers of 2
Co-authored-by: Claude <noreply@anthropic.com>
optimizes gcd for single-limb numbers using binary algorithm,
avoiding multi-precision overhead for most common cases
Co-authored-by: Claude <noreply@anthropic.com>
Added complete call-seq documentation for socket programming methods across
all major socket classes in both mrblib/socket.rb (64 Ruby methods) and
src/socket.c (35 C methods):
- Addrinfo: Complete documentation for address information handling including
creation (new, foreach, ip, tcp, udp, unix), inspection (inspect,
inspect_sockaddr, to_s), address queries (afamily, pfamily, ipv4?, ipv6?,
ip?, unix?), data extraction (ip_address, ip_port, ip_unpack, unix_path),
and conversion methods (to_sockaddr, getnameinfo)
- BasicSocket: Core socket functionality including class configuration
(do_not_reverse_lookup, do_not_reverse_lookup=), object creation (for_fd),
address retrieval (local_address, remote_address), and non-blocking
operations (recv_nonblock)
- IPSocket: Internet protocol socket operations including address information
(addr, peeraddr), connection methods (bind, connect), data transfer
(send, recvfrom, recvfrom_nonblock), and address resolution (getaddress)
- TCPSocket/TCPServer: TCP client and server socket operations including
connection establishment (new, open), server operations (accept,
accept_nonblock, listen, sysaccept)
- UDPSocket: UDP socket operations for datagram communication including
initialization and internal address handling
- Socket: Low-level socket operations including creation (new, open),
address manipulation (sockaddr_in, sockaddr_un, unpack_sockaddr_in,
unpack_sockaddr_un), connection management (bind, connect, listen),
data transfer (recvfrom, recvfrom_nonblock), socket pairs (pair),
and name resolution (getaddrinfo, getnameinfo)
- UNIXSocket/UNIXServer: Unix domain socket operations for local IPC
including creation (new, socketpair), path handling (path, addr, peeraddr),
server operations (accept, accept_nonblock, listen, sysaccept), and
data transfer (recvfrom)
- Addrinfo: Core address resolution methods including getaddrinfo for name
resolution, getnameinfo for reverse lookups, and unix_path for Unix
domain socket paths
- BasicSocket: Low-level socket operations including getpeereid for peer
credentials, getpeername/getsockname for address retrieval, recv/send
for data transfer, getsockopt/setsockopt for option management,
shutdown for connection termination, and Windows-specific overrides
(close, sysread, sysseek, syswrite)
- IPSocket: Internet protocol utilities including ntop/pton for address
conversion and recvfrom for receiving data with sender information
- Socket: Core socket creation and management including gethostname,
internal methods (_accept, _bind, _connect, _listen, _socket),
address utilities (sockaddr_un, socketpair), and platform-specific
implementations
- Socket::Option: Socket option handling including creation from boolean/
integer values, accessor methods (family, level, optname, data),
type conversion (int, bool), and debugging support (inspect)
All methods now have comprehensive call-seq documentation with practical
This significantly improves maintainability and usability of errno
handling for developers working with system call errors and file
operations in embedded Ruby environments.
Co-authored-by: Atlassian Rovo Dev
Rename internal functions to follow mruby's snake_case naming convention:
- mrb_struct_initialize_withArg -> mrb_struct_init_with_args
- mrb_struct_initialize_withKw -> mrb_struct_init_with_keywords
Update all function calls to use the new names. This improves code
consistency and follows established mruby naming conventions.
Co-authored-by: Atlassian Rovo Dev
Replace mrb_funcall_id call with direct mrb_ary_join function call
in error message generation to comply with VM callback restrictions.
This prevents re-entrant VM execution which can cause crashes and
undefined behavior, following mruby's policy of avoiding VM callbacks
from C code.
Co-authored-by: Atlassian Rovo Dev
Replace mrb_intern_lit calls with MRB_SYM and MRB_IVSYM macros for
better performance and consistency. Convert mrb_funcall with string
literals to mrb_funcall_id with MRB_SYM for the keyword_init feature
and other method calls.
Key optimizations:
- keyword_init symbol access using MRB_SYM(keyword_init)
- Instance variable access using MRB_IVSYM(__keyword_init__)
- Method calls using mrb_funcall_id with MRB_SYM(join)
This improves runtime performance by avoiding symbol table lookups
for commonly used symbols and follows mruby's presym conventions.
Co-authored-by: Atlassian Rovo Dev
Updated README.md and C documentation to reflect the new keyword_init
feature added in commit 512d25607b.
Changes include:
- README.md: Added comprehensive examples showing keyword initialization
usage, including basic usage, partial initialization, and error cases
- struct.c: Updated call-seq documentation for Struct.new to include
keyword_init parameter and added examples of keyword-based struct
creation and initialization
The keyword_init option allows structs to accept keyword arguments
instead of positional arguments, providing a more explicit and
Ruby-like interface for struct initialization.
Examples added:
- Basic keyword initialization with keyword_init: true
- Partial initialization with missing keys defaulting to nil
- Error handling for mixed positional/keyword arguments
- Empty initialization behavior
Co-authored-by: Atlassian Rovo Dev
Fix incomplete digit processing in power-of-2 base string conversion:
- Add handling for remaining bits after processing all limbs
- Ensure all significant bits are converted to digits
- Maintain correct conversion for large numbers with partial bit patterns
- Add comments clarifying the conversion process
This fixes cases where the last few bits of a number might not be
converted when the total bit count doesn't align perfectly with the
base's bit width, ensuring complete and correct string representation.
Co-authored-by: Claude <noreply@anthropic.com>
Replace expensive pow() calls with pre-computed lookup tables for powers of 10.
Use integer arithmetic during parsing to avoid floating-point precision loss.
Add overflow detection for large numbers while maintaining compatibility.
Co-authored-by: Claude <noreply@anthropic.com>
Replace the traditional Euclidean GCD algorithm with Stein's binary GCD algorithm
for improved performance on large numbers:
- Implement binary GCD (Stein's algorithm) avoiding expensive division operations
- Use bit shifts and subtraction instead of modulo operations
- Handle special cases (zero values) efficiently
- Preserve common factors of 2 for correct results
- Maintain full compatibility with existing rational number functionality
Binary GCD is significantly faster for large numbers as it avoids the costly
division operations used in the Euclidean algorithm, using only bit operations,
addition, and subtraction.
Co-authored-by: Claude <noreply@anthropic.com>
Add overflow protection and memory safety improvements to bigint operations:
- Add overflow check in mpz_realloc to prevent integer overflow in size calculations
- Fix zero-initialization loop by preserving original size during reallocation
- Improve mpz_clear to prevent double-free by nullifying pointer after free
- Add bounds checking to mpz_get_str for string conversion buffer allocation
- Add documentation comments clarifying memory allocation strategies
- Add helper macros MPZ_TMP_INIT/CLEAR for safer temporary variable management
These changes prevent potential memory corruption, buffer overflows, and crashes
while maintaining full compatibility with existing bigint functionality.
Co-authored-by: Claude <noreply@anthropic.com>