Commit Graph
919 Commits
Author SHA1 Message Date
Nobuyoshi Nakada 8f4a3c9401 [Feature #22215] Extract internal coverage API
Provide a narrow coverage interface so `ext/coverage` does not depend
on GC or VM implementation headers.
2026-08-07 09:59:15 +09:00
Peter Zhu 5f398e864a Make ruby_incpush_expand static 2026-07-25 20:02:17 -04:00
Hiroshi SHIBATAandClaude Opus 4.8 4f84a740ee Default stdin script encoding to UTF-8 on Windows
A script read from stdin used the locale encoding, so on a non-UTF-8
console such as CP932 its source encoding differed from a script read
from a file, which already defaults to UTF-8. Match both the Prism and
legacy paths to magic_comment_spec.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-29 08:09:51 +09:00
Jean Boussier d17f8ecd19 file.c: right size the rb_find_file_ext & rb_find_file buffer
It generally end up frozen in `$LOADED_FEATURES` so it's preferable
to predict its size and only deal with an embedded string most of
the time.

It saves on having to allocate a `MAXPATHLEN + 2` (1026) bytes long
buffer and then realloc it later to shink it.
2026-06-19 21:20:07 +02:00
Satoshi Tagomori 276f0d9b3e [Bug #21881] Separate the master and root box
This change separates the master box from the root box, as the single
master copy of boxes.
Before this change, the root box is the source of copies, and also
it runs builtin classes' code. Builtin code makes changes by
requiring files, thus the source of copies is mutable, be different
from the past one. This causes different internal states of boxes,
depending on when it is created.
After this change, all boxes are created from the master box, and
the master box never runs code, so it realizes the immutable source
of copies.

This also makes is possible to separate RubyGems (and other default
gems) from each boxes. All boxes will have their own copies of RubyGems.
RubyGems has its internal state, but it'll be separated between boxes
after this change.
2026-05-10 09:38:45 +09:00
Étienne Barrié 42b3cdc51a Remove discard qualifiers warning with C23 strchr
C23 has qualifier-preserving standard library functions, so calling
strchr with a `const char *` will return a `const char *`. We can change
the type of the local variables because we don't mutate the strings.
2026-04-22 16:45:35 +09:00
Kevin Newton 78ab3a7ced Leverage new Prism APIs
Prism changed structure quite a bit. Most of the previously-public
structs are now opaque. This requires quite a bit of changes
internally.

It also triggered some unrelated changes, which were necessary
because Prism's main header used to pull in standard headers. So
box.c and jit.c are now no longer transitively getting all the
headers they needed.
2026-03-20 09:37:43 -04:00
Randy Stauner e7cff2e817 ZJIT: Register builtin CMEs before prelude to avoid prepend crash
Split rb_zjit_init into rb_zjit_init_builtin_cmes (called before
ruby_init_prelude) and rb_zjit_init (called after). The prelude may
load bundler via BUNDLER_SETUP which can call Kernel.prepend, moving
core methods to an origin iclass. Registering method annotations
before the prelude ensures we capture CMEs while core classes are
pristine.
2026-02-19 10:57:10 -05:00
Randy Stauner a19becac5b YJIT: Register builtin CMEs before prelude to avoid prepend crash
Split rb_yjit_init into rb_yjit_init_builtin_cmes (called before
ruby_init_prelude) and rb_yjit_init (called after). The prelude may
load bundler via BUNDLER_SETUP which can call Kernel.prepend, moving
core methods to an origin iclass. Registering method codegen before
the prelude ensures we capture CMEs while core classes are pristine.
2026-02-19 10:57:10 -05:00
Nobuyoshi Nakada f486ee3402 [Feature #21872] Search script from $PATH only if no separator 2026-02-10 20:07:47 +09:00
Kevin Newton af4a1ca021 Use slices instead of locations
In the C API, we want to use slices instead of locations in the
AST. In this case a "slice" is effectively the same thing as the
location, expect it is represented using a 32-bit offset and a
32-bit length. This will cut down on half of the space of all of
the locations in the AST.

Note that from the Ruby/Java/JavaScript side, this is effectively
an invisible change. This only impacts the C/Rust side.
2026-01-27 15:30:45 -05:00
Nobuyoshi Nakada ccc8610b66 Remove RUBY_GC_HEAP_INIT_SLOTS environment variable 2025-12-26 15:11:23 +09:00
NARUSE, Yui 479f8682c8 Remove extra help 2025-12-24 23:52:45 +09:00
NARUSE, Yui 29ffc5d624 Reapply "Extract ruby_api_version_name"
This reverts commit ba2f697219.

Box already used ruby_api_version_name.
2025-12-24 23:07:35 +09:00
NARUSE, Yui 285e22edc5 Revert "Add link to Ruby options doc in help text"
This reverts commit 31ff07ed1e.

* Don't add a test which only runs on production release
  * https://github.com/ruby/actions/actions/runs/20486784889/job/58870959976
* Don't add a new line to `ruby --help`
  * https://github.com/ruby/ruby/pull/14142#issuecomment-3689829564
2025-12-24 22:55:44 +09:00
NARUSE, Yui ba2f697219 Revert "Extract ruby_api_version_name"
This reverts commit 9b576cd625.
2025-12-24 22:55:44 +09:00
Kouhei Yanagita 0f45d0c484 Update man and help: -d option set $VERBOSE to true 2025-11-27 16:00:35 +09:00
Godfrey Chan f84bbb4238 ZJIT: add support for lazy RubyVM::ZJIT.enable
This implements Shopify#854:

- Splits boot-time and enable-time initialization,
  tracks progress with `InitializationState` enum

- Introduces `RubyVM::ZJIT.enable` Ruby method for
  enabling the JIT lazily, if not already enabled

- Introduces `--zjit-disable` flag, which can be
  used alongside the other `--zjit-*` flags but
  prevents enabling the JIT at boot time

- Adds ZJIT infra to support JIT hooks, but this
  is not currently exercised (Shopify/ruby#667)

Left for future enhancements:

- Support kwargs for overriding the CLI flags in
  `RubyVM::ZJIT.enable`

Closes Shopify#854
2025-11-18 08:35:09 -08:00
Randy Stauner 3ddb5f99a9 Allow --jit to mean zjit if yjit isn't defined
The --help output suggests this should work
as ZJIT is labeled as the default if YJIT isn't enabled.
2025-11-10 13:14:13 -08:00
Satoshi Tagomori d2a587c791 renaming internal data structures and functions from namespace to box 2025-11-07 13:14:54 +09:00
Peter Zhu da4bd3b3df Fix memory leak when RUBYOPT is invalid
When RUBYOPT is invalid, it raises an error which causes moreswitches
to leak memory. It can be seen when building with LSAN enabled:

    $ RUBY_FREE_AT_EXIT=1 RUBYOPT=f ruby
    ruby: invalid option -f  (-h will show valid options) (RuntimeError)

    Direct leak of 16 byte(s) in 1 object(s) allocated from:
        #0 0x618cef8efa23 in malloc (miniruby+0x64a23)
        #1 0x618cefa0e8d8 in rb_gc_impl_malloc gc/default/default.c:8182:5
        #2 0x618cef9f7f01 in ruby_xmalloc2_body gc.c:5182:12
        #3 0x618cef9f7eac in ruby_xmalloc2 gc.c:5176:34
        #4 0x618cefb547b2 in moreswitches ruby.c:919:18
        #5 0x618cefb526fe in process_options ruby.c:2350:9
        #6 0x618cefb524ac in ruby_process_options ruby.c:3202:12
        #7 0x618cef9dc11f in ruby_options eval.c:119:16
        #8 0x618cef8f2fb5 in rb_main main.c:42:26
        #9 0x618cef8f2f59 in main main.c:62:12
2025-10-22 19:36:47 -04:00
Satoshi Tagomori 52c6b32f80 Initialize the main namespace after loading builtin libraries
* For having the common set of loaded libraries between root and main namespaces
* To have the consistent $LOADED_FEATURES in the main namespace
2025-10-07 14:19:26 +09:00
Satoshi Tagomori 4f47327287 Update current namespace management by using control frames and lexical contexts
to fix inconsistent and wrong current namespace detections.

This includes:
* Moving load_path and related things from rb_vm_t to rb_namespace_t to simplify
  accessing those values via namespace (instead of accessing either vm or ns)
* Initializing root_namespace earlier and consolidate builtin_namespace into root_namespace
* Adding VM_FRAME_FLAG_NS_REQUIRE for checkpoints to detect a namespace to load/require files
* Removing implicit refinements in the root namespace which was used to determine
  the namespace to be loaded (replaced by VM_FRAME_FLAG_NS_REQUIRE)
* Removing namespaces from rb_proc_t because its namespace can be identified by lexical context
* Starting to use ep[VM_ENV_DATA_INDEX_SPECVAL] to store the current namespace when
  the frame type is MAGIC_TOP or MAGIC_CLASS (block handlers don't exist in this case)
2025-09-29 01:15:38 +09:00
Takashi Kokubun 0ab7833773 ruby.c: Fallback FEATURE_BIT(jit) to FEATURE_BIT(zjit)
if it's the only JIT enabled in the build
2025-09-05 12:36:40 -07:00
Alan Wu fdb831fdfc ZJIT: Look for RUBY_ZJIT_ENABLE in combo build with YJIT 2025-08-14 15:38:52 -04:00
Nobuyoshi Nakada 9b576cd625 Extract ruby_api_version_name 2025-08-14 12:39:19 +09:00
Peter Zhu 31ff07ed1e Add link to Ruby options doc in help text
Adds link to https://docs.ruby-lang.org/en/master/ruby/options_md.html in
Ruby help text (-h and --help).
2025-08-13 11:24:50 -04:00
Takashi Kokubun 4f34eddbd3 YJIT, ZJIT: Fix JITs compiling prelude (#14171) 2025-08-11 14:35:34 -07:00
Takashi Kokubun 2cd10de330 ZJIT: Prepare for sharing JIT hooks with ZJIT (#14044) 2025-07-30 10:11:10 -07:00
Takashi Kokubun f1acf47ca2 YJIT: Call YJIT hooks before enabling YJIT (#14032) 2025-07-28 15:17:45 -07:00
Étienne Barrié 31c1f3665a Stop setting TMP_RUBY_PREFIX during prelude
It's unnecessary now that builtin-loader supports sub-libraries:
9faa9ced96
2025-06-28 10:27:44 +09:00
Jean Boussier 96a0c2065a Mark RClass instance that may be namespaced with RCLASS_NAMESPACEABLE 2025-06-23 10:04:58 +01:00
Satoshi Tagomori 382645d440 namespace on read 2025-05-11 23:32:50 +09:00
Takashi Kokubun 608fe6ee53 ZJIT: Handle ZJIT options properly (#13197) 2025-04-29 09:50:05 -07:00
Takashi Kokubun 50ae35054b Resurrect yjit_hook 2025-04-18 21:53:01 +09:00
Takashi Kokubun 0252ce1cd4 Implement Options as part of ZJITState 2025-04-18 21:52:57 +09:00
Takashi Kokubun eb677ec24c Fix the handling of flags 2025-04-18 21:52:56 +09:00
Takashi Kokubun b076037af2 Disable yjit_hook builtin for now 2025-04-18 21:52:56 +09:00
Takashi Kokubun 8d5d5b34cf Hook zjit_init 2025-04-18 21:52:55 +09:00
Takashi Kokubun cabfa3bfe1 Call libzjit from CRuby 2025-04-18 21:52:55 +09:00
Takashi Kokubun d993307d4c Add --zjit option 2025-04-18 21:52:55 +09:00
Étienne BarriéandJean Boussier 6ecfe643b5 Freeze $/ and make it ractor safe
[Feature #21109]

By always freezing when setting the global rb_rs variable, we can ensure
it is not modified and can be accessed from a ractor.

We're also making sure it's an instance of String and does not have any
instance variables.

Of course, if $/ is changed at runtime, it may cause surprising behavior
but doing so is deprecated already anyway.

Co-authored-by: Jean Boussier <jean.boussier@gmail.com>
2025-03-27 17:54:56 +01:00
Nobuyoshi Nakada 453f88f7f1 Make ASAN default option string built-in libruby
The content depends on ruby internal, not responsibility of the
caller.  Revive `RUBY_GLOBAL_SETUP` macro to define the hook function.
2025-03-16 17:33:58 +09:00
Peter Zhu 6bad47ac6d RUBY_FREE_AT_EXIT does not work when error in -r
[Bug #21173]

When loading a file using the command line -r, it is processed before
RUBY_FREE_AT_EXIT is checked. So if the loaded file raises an error, it
will cause memory to not be freed with RUBY_FREE_AT_EXIT.

For example `ruby -rtest.rb -e ""` will report a large amount of memory
leaks if `test.rb` raises.
2025-03-06 11:58:54 -05:00
Nobuyoshi Nakada 4a67ef09cc [Feature #21116] Extract RJIT as a third-party gem 2025-02-13 18:01:03 +09:00
Xavier Noria f6e259da87 Improve docs of -I ruby option 2025-01-24 11:25:26 +01:00
Nobuyoshi Nakada dfe6b7c02e [Bug #21018] Show invalid command line option more properly 2025-01-09 19:26:20 +09:00
Nobuyoshi Nakada 1b0c46daed [Bug #20979] [DOC] Add a proviso to +comment option 2024-12-24 13:27:05 +09:00
John Hawthorn a8ebc596d6 Free parse result under -c 2024-11-22 19:25:01 -08:00
Peter Zhu 51ffef2819 Fix memory leak in prism when syntax error in iseq compilation
If there's a syntax error during iseq compilation then prism would leak
memory because it would not free the pm_parse_result_t.

This commit changes pm_iseq_new_with_opt to have a rb_protect to catch
when an error is raised, and return NULL and set error_state to a value
that can be raised by calling rb_jump_tag after memory has been freed.

For example:

    10.times do
      10_000.times do
        eval("/[/=~s")
      rescue SyntaxError
      end

      puts `ps -o rss= -p #{$$}`
    end

Before:

    39280
    68736
    99232
    128864
    158896
    188208
    217344
    246304
    275376
    304592

After:

    12192
    13200
    14256
    14848
    16000
    16000
    16000
    16064
    17232
    17952
2024-11-08 15:43:41 -05:00