[ruby-core:78017] [Ruby trunk Bug#12905] tailcall_optimization not working as expected under certain condition order
From:
tonysun329@...
Date:
2016-11-06 15:58:05 UTC
List:
ruby-core #78017
Issue #12905 has been updated by Kai Sun.
Shugo Maeda wrote:
> Kai Sun wrote:
> > Below code gets stack too deep error:
>
> RubyVM::InstructionSequence.compile_option must be set before
> compilation of the target program, so you need eval, load, etc.
>
> ```ruby
> RubyVM::InstructionSequence.compile_option = {
> :tailcall_optimization => true,
> :trace_instruction => false
> }
>
> eval(<<EOF)
> def run_forever(current, final)
> if current < final
> run_forever(current+1, final)
> else
> nil
> end
> end
>
> run_forever(1, Float::INFINITY)
> EOF
> ```
I have tried with eval but seems still getting stack level too deep error.
----------------------------------------
Bug #12905: tailcall_optimization not working as expected under certain condition order
https://bugs.ruby-lang.org/issues/12905#change-61360
* Author: Kai Sun
* Status: Rejected
* Priority: Normal
* Assignee:
* ruby -v: 2.3.1
* Backport: 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
----------------------------------------
Below code gets stack too deep error:
~~~ ruby
RubyVM::InstructionSequence.compile_option = {
:tailcall_optimization => true,
:trace_instruction => false
}
def run_forever(current, final)
if current < final
run_forever(current+1, final)
else
nil
end
end
run_forever(1, Float::INFINITY)
~~~
However, below code works as expected:
~~~ ruby
RubyVM::InstructionSequence.compile_option = {
:tailcall_optimization => true,
:trace_instruction => false
}
def run_forever(current, final)
if current >= final
nil
else
run_forever(current+1, final)
end
end
run_forever(1, Float::INFINITY)
~~~
Thanks for looking at this :)
--
https://bugs.ruby-lang.org/
Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>