エスケープ解析うまく行きそうです
ちょっと試してみたら、結構うまく行きそうです。でも、ちゃんとチェックしないと訳の分からないGCのエラーでひどい目にあいそうなので、しっかりチェックします。
変更点がここにあります。
http://github.com/miura1729/yarv2llvm/commit/83758bd5c935227b4f62add3fbcaba4ebeb393c5
次のサンプルプログラムをコンパイルしたときにnewメソッドで返される新しいオブジェクトがローカルでとどまるか(local)、メソッドの外に出て行ってしまうか(global)を表示しています。
class TestClass0 def initialize(a) @a = a nil end end def escape_test0 foo = Array.new foo[1] = 1 bar = TestClass0.new(foo) nil end class TestClass1 def initialize(a) @a = a $foo = a nil end end def escape_test1 foo = Array.new foo[1] = 1 bar = TestClass1.new(foo) nil end class TestClass2 def initialize(a) @a = a nil end end def escape_test2 foo = Array.new foo[1] = 1 bar = TestClass2.new(foo) end class TestClass3 def initialize(a) @a = a nil end end def escape_test3 foo = Array.new foo[1] = 1 bar = TestClass3.new([]) end
出力結果。左から、メソッド名、newメソッドのレシーバ、-> 結果(local, global)です。
escape_test0 Array -> local escape_test0 TestClass0 -> local escape_test1 Array -> global escape_test1 TestClass1 -> local escape_test2 Array -> global escape_test2 TestClass2 -> global escape_test3 Array -> local escape_test3 TestClass3 -> global