Module: Stupidedi::TailCall::ClassMethods

Defined in:
lib/stupidedi/tail_call.rb

Instance Method Summary collapse

Instance Method Details

#optimize_tailcall(*names) ⇒ void

This method returns an undefined value.



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/stupidedi/tail_call.rb', line 76

def optimize_tailcall(*names)
  @__tc ||= Hash.new

  for name in names
    @__tc[name.to_sym] = instance_method(name)

    module_eval "      def \#{name}(*args, &block)\n        if Thread.current[:tc_\#{name}]\n          throw(:recurse_\#{name}, [args, block])\n        else\n          Thread.current[:tc_\#{name}] =\n            self.class.instance_variable_get(:@__tc)[:\#{name}].bind(self)\n\n          result = catch(:done_\#{name}) do\n            while true\n              args, block =\n                catch(:recurse_\#{name}) do\n                  throw(:done_\#{name},\n                    Thread.current[:tc_\#{name}].call(*args, &block))\n                end\n            end\n          end\n\n          Thread.current[:tc_\#{name}] = nil\n\n          result\n        end\n      end\n    RUBY\n  end\nend\n"