Skip to content

Merge from upstream #36

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 55 commits into from
Nov 23, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
4399903
Avoid warnings on MINGW:
larskanis Nov 18, 2022
180ed61
[ruby/irb] Add edit command (https://github.com/ruby/irb/pull/453)
st0012 Nov 20, 2022
e0f0367
[ruby/irb] Fix CI failure on ruby/ruby
k0kubun Nov 20, 2022
1284bae
Skip TestDRbSSLAry on mswin
k0kubun Nov 20, 2022
f472516
[ruby/irb] Require rubygems for ruby/ruby
k0kubun Nov 20, 2022
fa2e0cc
[ruby/irb] Try using a different file name
k0kubun Nov 20, 2022
8512b97
[ruby/irb] Require missing EnvUtil
k0kubun Nov 20, 2022
67034ac
[ruby/irb] Deal with inconsistency with ruby/ruby
k0kubun Nov 20, 2022
66ac288
[ruby/irb] Push an accidentally uncommitted diff
k0kubun Nov 20, 2022
779917f
Avoid a timeout on test_cache_optimization_exponential
k0kubun Nov 20, 2022
230c7de
sync_default_gems.rb: Fix substitution [ci skip]
nobu Nov 20, 2022
12b7b85
Use `enum ruby_tag_type` over `int`
nobu Nov 18, 2022
701dfe4
[Bug #19016] Handle syntax error in main script like other errors
nobu Nov 18, 2022
bbc4cf5
Revert wrong sync in 5958c305e5 [ci skip]
k0kubun Nov 20, 2022
d860162
Enhance keep_tokens option for RubyVM::AbstractSyntaxTree parsing met…
yui-knk Sep 23, 2022
29e6d97
Fix typos (#6775)
ydah Nov 21, 2022
db8ff23
Add a link to Feature #19070 ticket [ci skip]
yui-knk Nov 21, 2022
1753cf5
Fix a broken interpolation #{head}
k0kubun Nov 21, 2022
509f04c
[ruby/irb] Version 1.5.0
k0kubun Nov 21, 2022
427985c
Update default gems list at 509f04ca9159d1dd046af4ffb19cfa [ci skip]
matzbot Nov 21, 2022
166598a
Add outdate-bundled-gems target [ci skip]
nobu Nov 21, 2022
730b841
Prevent a "warning: ambiguity between regexp and two divisions"
mame Nov 21, 2022
3071a72
Add a comment about confusing code [ci skip]
k0kubun Nov 21, 2022
854312e
Refactor to use has_delayed_token macro
yui-knk Nov 21, 2022
65e3140
Use double quotes for nmake [ci skip]
nobu Nov 21, 2022
c9fbc77
[ruby/irb] Add commands to start and use the debugger
k0kubun Nov 21, 2022
e2b1546
[ruby/optparse] Use class methods of `File` over `IO`
nobu Nov 21, 2022
116920c
[ruby/un] Use class methods of `File` over `Kernel.open`
nobu Nov 21, 2022
612aa5c
Use class methods of `File` over `Kernel.open` and `IO.read`
nobu Nov 21, 2022
648927d
Refactor obj_ivar_set and vm_setivar
peterzhu2118 Nov 15, 2022
1f0888a
Speed up shape transitions
peterzhu2118 Nov 17, 2022
5b959e2
[Bug #19016] re-order error handling at cleanup
nobu Nov 11, 2022
b7a0ce3
[Bug #19016] `SyntaxError` with parser error messages
nobu Nov 11, 2022
5f95228
Add RVALUE_OVERHEAD and move ractor_belonging_id
peterzhu2118 Nov 18, 2022
0942387
Let SHAPE_BITS take 32 bits on debug builds
peterzhu2118 Nov 18, 2022
607fb49
YJIT: Lower the required Rust version from 1.58.1 to 1.58.0 (#6780)
k0kubun Nov 21, 2022
cf05c20
Fixup spec/ruby/optional/capi/rbasic_spec.rb for mswin
MSP-Greg Nov 20, 2022
c05f85f
[ruby/cgi] Check cookie name/path/domain characters
nobu Aug 16, 2022
0e75b2f
[ruby/cgi] Prevent CRLF injection
mame Nov 22, 2022
3f960cf
[ruby/cgi] Bump up 0.3.4
hsbt Nov 22, 2022
5304b3b
Update default gems list at 3f960cf445dd387a5497ffad897ea6 [ci skip]
matzbot Nov 22, 2022
58682b6
[ruby/cgi] Relax domain label restrictions
nobu Nov 22, 2022
805d70f
[ruby/cgi] Bump up 0.3.5
hsbt Nov 22, 2022
32d202e
Update default gems list at 805d70f716c782e82ec77ca623b217 [ci skip]
matzbot Nov 22, 2022
36f297e
Use valid tokens as cookie names
nobu Nov 22, 2022
77f9630
Avoid unnecessary use of global variables
nobu Nov 22, 2022
8c02084
Use dedicated assertions for warnings
nobu Nov 22, 2022
20b9d7b
Use `enum` over `int`
nobu Nov 22, 2022
9c5e367
Increment max_iv_count on class based on number of set_iv in initiali…
jemmaissroff Nov 22, 2022
63f4a7a
YJIT: Skip padding jumps to side exits on Arm (#6790)
k0kubun Nov 22, 2022
eaf2b6c
Add Time#deconstruct_keys
zverok Oct 19, 2022
c4e99ac
Update yjit.md
maximecb Nov 22, 2022
003f8ea
Remove dead code in rb_obj_copy_ivar
peterzhu2118 Nov 14, 2022
aedf682
Free the IV table after estimation
tenderlove Nov 22, 2022
0a59127
Merge remote-tracking branch 'upstream/master' into merge-upstream
chrisseaton Nov 23, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .cirrus.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ yjit_task:
matrix:
- CC: clang-12
configure: --enable-yjit=dev
rustup_init: --default-toolchain=1.58.1
rustup_init: --default-toolchain=1.58.0
- CC: gcc-11
configure: --enable-yjit
id_script: id
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/yjit-ubuntu.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,8 @@ jobs:
configure: "--with-gcc=clang-12 --enable-yjit=dev"

- test_task: "check"
configure: "--enable-yjit RUSTC='rustc +1.58.1'" # release build
rust_version: "1.58.1"
configure: "--enable-yjit RUSTC='rustc +1.58.0'" # release build
rust_version: "1.58.0"

- test_task: "check"
configure: "--enable-yjit=dev"
Expand Down
20 changes: 17 additions & 3 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,14 @@ Note: We're only listing outstanding class updates.

* RubyVM::AbstractSyntaxTree
* Add `error_tolerant` option for `parse`, `parse_file` and `of`. [[Feature #19013]]
* Add `keep_tokens` option for `parse`, `parse_file` and `of`. Add `#tokens` and `#all_tokens`
for `RubyVM::AbstractSyntaxTree::Node` [[Feature #19070]]

```ruby
root = RubyVM::AbstractSyntaxTree.parse("x = 1 + 2", keep_tokens: true)
root.tokens # => [[0, :tIDENTIFIER, "x", [1, 0, 1, 1]], [1, :tSP, " ", [1, 1, 1, 2]], ...]
root.tokens.map{_1[2]}.join # => "x = 1 + 2"
```

* Set
* Set is now available as a built-in class without the need for `require "set"`. [[Feature #16989]]
Expand All @@ -217,6 +225,10 @@ Note: We're only listing outstanding class updates.
* A Struct class can also be initialized with keyword arguments
without `keyword_init: true` on `Struct.new` [[Feature #16806]]

* Time
* `Time#deconstruct_keys` is added, allowing to use `Time` instances
in pattern-matching expressions [[Feature #19071]]

* TracePoint
* TracePoint#binding now returns `nil` for `c_call`/`c_return` TracePoints.
[[Bug #18487]]
Expand All @@ -235,7 +247,7 @@ Note: We're only listing outstanding class updates.
* RubyGems 3.4.0.dev
* bigdecimal 3.1.2
* bundler 2.4.0.dev
* cgi 0.3.3
* cgi 0.3.5
* date 3.2.3
* erb 3.0.0
* error_highlight 0.5.1
Expand All @@ -245,7 +257,7 @@ Note: We're only listing outstanding class updates.
* io-nonblock 0.1.1
* io-wait 0.3.0.pre
* ipaddr 1.2.4
* irb 1.4.3
* irb 1.5.0
* json 2.6.2
* logger 1.5.1
* net-http 0.3.0
Expand Down Expand Up @@ -359,7 +371,7 @@ The following deprecated APIs are removed.
### YJIT

* Support arm64 / aarch64 on UNIX platforms.
* Building YJIT requires Rust 1.58.1+. [[Feature #18481]]
* Building YJIT requires Rust 1.58.0+. [[Feature #18481]]
* Physical memory for JIT code is lazily allocated. Unlike Ruby 3.1,
the RSS of a Ruby process is minimized because virtual memory pages
allocated by `--yjit-exec-mem-size` will not be mapped to physical
Expand Down Expand Up @@ -437,5 +449,7 @@ The following deprecated APIs are removed.
[Feature #19013]: https://bugs.ruby-lang.org/issues/19013
[Feature #19026]: https://bugs.ruby-lang.org/issues/19026
[Feature #19060]: https://bugs.ruby-lang.org/issues/19060
[Feature #19070]: https://bugs.ruby-lang.org/issues/19070
[Bug #19100]: https://bugs.ruby-lang.org/issues/19100
[Feature #19135]: https://bugs.ruby-lang.org/issues/19135
[Feature #19071]: https://bugs.ruby-lang.org/issues/19071
44 changes: 0 additions & 44 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,50 +54,6 @@ see [Building Ruby](doc/contributing/building_ruby.md)

https://www.ruby-lang.org/

## Commands

The following commands are available on IRB.

* `cwws`
* Show the current workspace.
* `cb`, `cws`, `chws`
* Change the current workspace to an object.
* `bindings`, `workspaces`
* Show workspaces.
* `pushb`, `pushws`
* Push an object to the workspace stack.
* `popb`, `popws`
* Pop a workspace from the workspace stack.
* `load`
* Load a Ruby file.
* `require`
* Require a Ruby file.
* `source`
* Loads a given file in the current session.
* `irb`
* Start a child IRB.
* `jobs`
* List of current sessions.
* `fg`
* Switches to the session of the given number.
* `kill`
* Kills the session with the given number.
* `help`
* Enter the mode to look up RI documents.
* `irb_info`
* Show information about IRB.
* `ls`
* Show methods, constants, and variables.
`-g [query]` or `-G [query]` allows you to filter out the output.
* `measure`
* `measure` enables the mode to measure processing time. `measure :off` disables it.
* `$`, `show_source`
* Show the source code of a given method or constant.
* `@`, `whereami`
* Show the source code around binding.irb again.
* `debug`
* Start the debugger of debug.gem.

## Documentation

- [English](https://docs.ruby-lang.org/en/master/index.html)
Expand Down
2 changes: 1 addition & 1 deletion array.c
Original file line number Diff line number Diff line change
Expand Up @@ -2086,7 +2086,7 @@ rb_ary_first(int argc, VALUE *argv, VALUE ary)
*
* If +self+ is empty, returns +nil+.
*
* When non-negative \Innteger argument +n+ is given,
* When non-negative \Integer argument +n+ is given,
* returns the last +n+ elements in a new \Array:
*
* a = [:foo, 'bar', 2]
Expand Down
38 changes: 25 additions & 13 deletions ast.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,8 +64,8 @@ ast_new_internal(rb_ast_t *ast, const NODE *node)
return obj;
}

static VALUE rb_ast_parse_str(VALUE str, VALUE keep_script_lines, VALUE error_tolerant);
static VALUE rb_ast_parse_file(VALUE path, VALUE keep_script_lines, VALUE error_tolerant);
static VALUE rb_ast_parse_str(VALUE str, VALUE keep_script_lines, VALUE error_tolerant, VALUE keep_tokens);
static VALUE rb_ast_parse_file(VALUE path, VALUE keep_script_lines, VALUE error_tolerant, VALUE keep_tokens);

static VALUE
ast_parse_new(void)
Expand All @@ -85,32 +85,33 @@ ast_parse_done(rb_ast_t *ast)
}

static VALUE
ast_s_parse(rb_execution_context_t *ec, VALUE module, VALUE str, VALUE keep_script_lines, VALUE error_tolerant)
ast_s_parse(rb_execution_context_t *ec, VALUE module, VALUE str, VALUE keep_script_lines, VALUE error_tolerant, VALUE keep_tokens)
{
return rb_ast_parse_str(str, keep_script_lines, error_tolerant);
return rb_ast_parse_str(str, keep_script_lines, error_tolerant, keep_tokens);
}

static VALUE
rb_ast_parse_str(VALUE str, VALUE keep_script_lines, VALUE error_tolerant)
rb_ast_parse_str(VALUE str, VALUE keep_script_lines, VALUE error_tolerant, VALUE keep_tokens)
{
rb_ast_t *ast = 0;

StringValue(str);
VALUE vparser = ast_parse_new();
if (RTEST(keep_script_lines)) rb_parser_keep_script_lines(vparser);
if (RTEST(error_tolerant)) rb_parser_error_tolerant(vparser);
if (RTEST(keep_tokens)) rb_parser_keep_tokens(vparser);
ast = rb_parser_compile_string_path(vparser, Qnil, str, 1);
return ast_parse_done(ast);
}

static VALUE
ast_s_parse_file(rb_execution_context_t *ec, VALUE module, VALUE path, VALUE keep_script_lines, VALUE error_tolerant)
ast_s_parse_file(rb_execution_context_t *ec, VALUE module, VALUE path, VALUE keep_script_lines, VALUE error_tolerant, VALUE keep_tokens)
{
return rb_ast_parse_file(path, keep_script_lines, error_tolerant);
return rb_ast_parse_file(path, keep_script_lines, error_tolerant, keep_tokens);
}

static VALUE
rb_ast_parse_file(VALUE path, VALUE keep_script_lines, VALUE error_tolerant)
rb_ast_parse_file(VALUE path, VALUE keep_script_lines, VALUE error_tolerant, VALUE keep_tokens)
{
VALUE f;
rb_ast_t *ast = 0;
Expand All @@ -122,6 +123,7 @@ rb_ast_parse_file(VALUE path, VALUE keep_script_lines, VALUE error_tolerant)
VALUE vparser = ast_parse_new();
if (RTEST(keep_script_lines)) rb_parser_keep_script_lines(vparser);
if (RTEST(error_tolerant)) rb_parser_error_tolerant(vparser);
if (RTEST(keep_tokens)) rb_parser_keep_tokens(vparser);
ast = rb_parser_compile_file_path(vparser, Qnil, f, 1);
rb_io_close(f);
return ast_parse_done(ast);
Expand All @@ -141,14 +143,15 @@ lex_array(VALUE array, int index)
}

static VALUE
rb_ast_parse_array(VALUE array, VALUE keep_script_lines, VALUE error_tolerant)
rb_ast_parse_array(VALUE array, VALUE keep_script_lines, VALUE error_tolerant, VALUE keep_tokens)
{
rb_ast_t *ast = 0;

array = rb_check_array_type(array);
VALUE vparser = ast_parse_new();
if (RTEST(keep_script_lines)) rb_parser_keep_script_lines(vparser);
if (RTEST(error_tolerant)) rb_parser_error_tolerant(vparser);
if (RTEST(keep_tokens)) rb_parser_keep_tokens(vparser);
ast = rb_parser_compile_generic(vparser, lex_array, Qnil, array, 1);
return ast_parse_done(ast);
}
Expand Down Expand Up @@ -208,7 +211,7 @@ node_id_for_backtrace_location(rb_execution_context_t *ec, VALUE module, VALUE l
}

static VALUE
ast_s_of(rb_execution_context_t *ec, VALUE module, VALUE body, VALUE keep_script_lines, VALUE error_tolerant)
ast_s_of(rb_execution_context_t *ec, VALUE module, VALUE body, VALUE keep_script_lines, VALUE error_tolerant, VALUE keep_tokens)
{
VALUE node, lines = Qnil;
const rb_iseq_t *iseq;
Expand Down Expand Up @@ -247,13 +250,13 @@ ast_s_of(rb_execution_context_t *ec, VALUE module, VALUE body, VALUE keep_script
}

if (!NIL_P(lines) || !NIL_P(lines = script_lines(path))) {
node = rb_ast_parse_array(lines, keep_script_lines, error_tolerant);
node = rb_ast_parse_array(lines, keep_script_lines, error_tolerant, keep_tokens);
}
else if (e_option) {
node = rb_ast_parse_str(rb_e_script, keep_script_lines, error_tolerant);
node = rb_ast_parse_str(rb_e_script, keep_script_lines, error_tolerant, keep_tokens);
}
else {
node = rb_ast_parse_file(path, keep_script_lines, error_tolerant);
node = rb_ast_parse_file(path, keep_script_lines, error_tolerant, keep_tokens);
}

return node_find(node, node_id);
Expand Down Expand Up @@ -715,6 +718,15 @@ ast_node_last_column(rb_execution_context_t *ec, VALUE self)
return INT2NUM(nd_last_column(data->node));
}

static VALUE
ast_node_all_tokens(rb_execution_context_t *ec, VALUE self)
{
struct ASTNodeData *data;
TypedData_Get_Struct(self, struct ASTNodeData, &rb_node_type, data);

return rb_ast_tokens(data->ast);
}

static VALUE
ast_node_inspect(rb_execution_context_t *ec, VALUE self)
{
Expand Down
52 changes: 46 additions & 6 deletions ast.rb
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ module RubyVM::AbstractSyntaxTree
#
# RubyVM::AbstractSyntaxTree.parse("x = 1 + 2")
# # => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-1:9>
def self.parse string, keep_script_lines: false, error_tolerant: false
Primitive.ast_s_parse string, keep_script_lines, error_tolerant
def self.parse string, keep_script_lines: false, error_tolerant: false, keep_tokens: false
Primitive.ast_s_parse string, keep_script_lines, error_tolerant, keep_tokens
end

# call-seq:
Expand All @@ -44,8 +44,8 @@ def self.parse string, keep_script_lines: false, error_tolerant: false
#
# RubyVM::AbstractSyntaxTree.parse_file("my-app/app.rb")
# # => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-31:3>
def self.parse_file pathname, keep_script_lines: false, error_tolerant: false
Primitive.ast_s_parse_file pathname, keep_script_lines, error_tolerant
def self.parse_file pathname, keep_script_lines: false, error_tolerant: false, keep_tokens: false
Primitive.ast_s_parse_file pathname, keep_script_lines, error_tolerant, keep_tokens
end

# call-seq:
Expand All @@ -63,8 +63,8 @@ def self.parse_file pathname, keep_script_lines: false, error_tolerant: false
#
# RubyVM::AbstractSyntaxTree.of(method(:hello))
# # => #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:0-3:3>
def self.of body, keep_script_lines: false, error_tolerant: false
Primitive.ast_s_of body, keep_script_lines, error_tolerant
def self.of body, keep_script_lines: false, error_tolerant: false, keep_tokens: false
Primitive.ast_s_of body, keep_script_lines, error_tolerant, keep_tokens
end

# call-seq:
Expand Down Expand Up @@ -136,6 +136,46 @@ def last_column
Primitive.ast_node_last_column
end

# call-seq:
# node.tokens -> array
#
# Returns tokens corresponding to the location of the node.
# Returns nil if keep_tokens is not enabled when parse method is called.
# Token is an array of:
#
# - id
# - token type
# - source code text
# - location [first_lineno, first_column, last_lineno, last_column]
#
# root = RubyVM::AbstractSyntaxTree.parse("x = 1 + 2", keep_tokens: true)
# root.tokens # => [[0, :tIDENTIFIER, "x", [1, 0, 1, 1]], [1, :tSP, " ", [1, 1, 1, 2]], ...]
# root.tokens.map{_1[2]}.join # => "x = 1 + 2"
def tokens
return nil unless all_tokens

all_tokens.each_with_object([]) do |token, a|
loc = token.last
if ([first_lineno, first_column] <=> [loc[0], loc[1]]) <= 0 &&
([last_lineno, last_column] <=> [loc[2], loc[3]]) >= 0
a << token
end
end
end

# call-seq:
# node.all_tokens -> array
#
# Returns all tokens for the input script regardless the receiver node.
# Returns nil if keep_tokens is not enabled when parse method is called.
#
# root = RubyVM::AbstractSyntaxTree.parse("x = 1 + 2", keep_tokens: true)
# root.all_tokens # => [[0, :tIDENTIFIER, "x", [1, 0, 1, 1]], [1, :tSP, " ", [1, 1, 1, 2]], ...]
# root.children[-1].all_tokens # => [[0, :tIDENTIFIER, "x", [1, 0, 1, 1]], [1, :tSP, " ", [1, 1, 1, 2]], ...]
def all_tokens
Primitive.ast_node_all_tokens
end

# call-seq:
# node.children -> array
#
Expand Down
12 changes: 12 additions & 0 deletions common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -1400,6 +1400,17 @@ extract-gems$(gnumake:yes=-sequential): PHONY
-e 'end' \
gems/bundled_gems

extract-gems: outdate-bundled-gems
outdate-bundled-gems: PHONY
$(Q) $(BASERUBY) -C "$(srcdir)" \
-rfileutils \
-e "Dir.glob('.bundle/gems/*/') {|g|" \
-e "FileUtils::Verbose.rm_rf(g) unless File.exist?(%[gems/#{File.basename(g)}.gem])" \
-e "}" \
-e "Dir.glob('.bundle/specifications/*.gemspec') {|g|" \
-e "FileUtils::Verbose.rm_f(g) unless File.exist?(%[gems/#{File.basename(g, '.gemspec')}.gem])" \
-e "}"

update-bundled_gems: PHONY
$(Q) $(RUNRUBY) -rrubygems \
$(tooldir)/update-bundled_gems.rb \
Expand Down Expand Up @@ -15822,6 +15833,7 @@ time.$(OBJEXT): $(top_srcdir)/internal/compar.h
time.$(OBJEXT): $(top_srcdir)/internal/compilers.h
time.$(OBJEXT): $(top_srcdir)/internal/fixnum.h
time.$(OBJEXT): $(top_srcdir)/internal/gc.h
time.$(OBJEXT): $(top_srcdir)/internal/hash.h
time.$(OBJEXT): $(top_srcdir)/internal/numeric.h
time.$(OBJEXT): $(top_srcdir)/internal/rational.h
time.$(OBJEXT): $(top_srcdir)/internal/serial.h
Expand Down
1 change: 1 addition & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@ AC_ARG_WITH(baseruby,
[
AC_PATH_PROG([BASERUBY], [ruby], [false])
])
# BASERUBY must be >= 2.2.0. Note that `"2.2.0" > "2.2"` is true.
AS_IF([test "$HAVE_BASERUBY" != no -a "`RUBYOPT=- $BASERUBY --disable=gems -e 'print 42 if RUBY_VERSION > "2.2"' 2>/dev/null`" = 42], [
AS_CASE(["$build_os"], [mingw*], [
# Can MSys shell run a command with a drive letter?
Expand Down
2 changes: 1 addition & 1 deletion doc/contributing/building_ruby.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
* libffi
* libyaml
* libexecinfo (FreeBSD)
* rustc - 1.58.1 or later (if you wish to build [YJIT](/doc/yjit/yjit.md))
* rustc - 1.58.0 or later (if you wish to build [YJIT](/doc/yjit/yjit.md))

3. Checkout the CRuby source code:

Expand Down
Loading