Skip to content

Commit 3d2a832

Browse files
committed
Avoid recursion when redefining Warning#warn
* Fixes #2109
1 parent 3c823aa commit 3d2a832

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ Compatibility:
4141
* Fix arity for `Proc` (#2098, @ssnickolay)
4242
* Check bounds for `FFI::Pointer` accesses when the size of the memory behind is known.
4343
* Implement negative line numbers for eval (#1482).
44+
* Avoid infinite recursion when redefining `Warning#warn` and calling `Kernel#warn` (#2109).
4445

4546
Performance:
4647

src/main/ruby/truffleruby/core/kernel.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -643,7 +643,7 @@ def untrace_var(name, cmd=undefined)
643643
def warn(*messages, uplevel: undefined)
644644
if !Primitive.nil?($VERBOSE) && !messages.empty?
645645
prefix = if Primitive.undefined?(uplevel)
646-
+''
646+
''
647647
else
648648
uplevel = Primitive.rb_to_int(uplevel)
649649
raise ArgumentError, "negative level (#{uplevel})" unless uplevel >= 0
@@ -662,13 +662,22 @@ def warn(*messages, uplevel: undefined)
662662
if caller
663663
"#{caller.path}:#{caller.lineno}: warning: "
664664
else
665-
+'warning: '
665+
'warning: '
666666
end
667667
end
668668

669-
stringio = Truffle::StringOperations::SimpleStringIO.new(prefix)
669+
stringio = Truffle::StringOperations::SimpleStringIO.new(+prefix)
670670
Truffle::IOOperations.puts(stringio, *messages)
671-
Warning.warn(stringio.string)
671+
message = stringio.string
672+
673+
if Primitive.object_equal(self, Warning) # avoid recursion when redefining Warning#warn
674+
unless message.encoding.ascii_compatible?
675+
raise Encoding::CompatibilityError, "ASCII incompatible encoding: #{message.encoding}"
676+
end
677+
$stderr.write message
678+
else
679+
Warning.warn(message)
680+
end
672681
end
673682
nil
674683
end

0 commit comments

Comments
 (0)