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"
|