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.



75
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
# File 'lib/stupidedi/tail_call.rb', line 75

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"