Project

General

Profile

Actions

Bug #21867

open

enabling Ruby::Box changes puts/warn to no longer use $stdout/$stderr

Bug #21867: enabling Ruby::Box changes puts/warn to no longer use $stdout/$stderr

Added by zenspider (Ryan Davis) 17 days ago. Updated 14 days ago.

Status:
Assigned
Target version:
-
ruby -v:
4.0.1+
Backport:
[ruby-core:124705]
Tags:

Description

On 4.0.1 or latest build as of 2026-02-06, given:

warn "run with RUBY_BOX=1 to repro the error" unless ENV["RUBY_BOX"]

require "stringio"

def capture_io
  captured_stdout, captured_stderr = StringIO.new, StringIO.new

  orig_stdout, orig_stderr = $stdout, $stderr
  $stdout, $stderr         = captured_stdout, captured_stderr

  yield

  return captured_stdout.string, captured_stderr.string
ensure
  $stdout = orig_stdout
  $stderr = orig_stderr
end

out, err = capture_io do
  puts "standard out!"          # these go to STDOUT/STDERR, not $stdout/$stderr
  warn  "standard err?"

  $stdout.print "standard out!" # these go to the stringio as expected
  $stderr.print "standard err?"
end

exp_out = "standard out!\nstandard out!"
exp_err = "standard err?\nstandard err?"

p OUT: out, EXP: exp_out unless out == exp_out
p ERR: out, EXP: exp_err unless err == exp_err

abort "bad" unless out == exp_out && err == exp_err
p :good!

I get:

10026 $ ./build/miniruby --disable=gems,did_you_mean -I./lib ./tool/runruby.rb --extout=build/.ext --archdir=build -- test_box.rb
run with RUBY_BOX=1 to repro the error
:good!

vs w/ box enabled:

10027 $ RUBY_BOX=1 ./build/miniruby --disable=gems,did_you_mean -I./lib ./tool/runruby.rb --extout=build/.ext --archdir=build -- test_box.rb
... box warnings ...
standard out!
standard err?
{OUT: "standard out!", EXP: "standard out!\nstandard out!"}
{ERR: "standard out!", EXP: "standard err?\nstandard err?"}
bad

Updated by mame (Yusuke Endoh) 14 days ago Actions #1

  • Status changed from Open to Assigned
  • Assignee set to tagomoris (Satoshi Tagomori)
Actions

Also available in: PDF Atom