icon

@tadd
例えば、
```
function setup() {
const el = document.getElementById("hoge");
el.addEventListener("click", function() {
el.style.color="red"; // A
});
el.parentElement.removeChild(el);
}
```
とした時に、elがリークすると思うんだけど、
elを勝手にWeakRefにしたとして、Aの行で、el.deref()を呼んだときにnullが帰ってきたらどうするように書き換えるか?という疑問。

icon

jekyllは定数部分で遅いというよりは、オーダー的に遅いのがツラいのだが、挙動を変えずにオーダーを落とせないと思う。

icon

@tadd
```
if (weakRef) {
doSomething(weakRef);
}
```
としたときに、JavaScriptだとweakRefが途中で空になる事はないけど、
それがありえるようになると困るんじゃないかな。

Rubyのは、一定範囲でピンする方法はあるのかな?

icon

@tadd 空になっても困らないコードが想像できない。という話だな。例えばどういう変換?

JSだと、インスタンスAを差すWeakRefのderefメソッドを呼んで、その返り値であるAへの参照を変数に入れたら、Aへの参照をWeakRef経由ではない形で持っていることになるから、掴んでる間はAはGCされないんだと思う。

icon

@tadd 例えば、saveボタンを押したら、textareaの中身をsaveする機能があって、textareaがGCされて、saveされなくなると困るみたいなレイヤの話をしてた。

icon

@tadd これは、
JavaScriptでは前者ができるけど、RubyのWeakRefのAPIは後者相当の事しかできない気がするんだけど、大丈夫?という疑問だった。

icon

@tadd うん。

icon

@tadd いや、「GCされる」は、オブジェクトが持つリソース(メモリとか)が回収されるという話だけ。 > これをいけじは「GCされる」と表現してる、であってる?

icon

@tadd この「うん」は こっちへのレスね。 > なるほど、何となく分かってきた。textareaがもはやdocumentにつながってないとしてもclicked相当を処理する意味があるし、他にもそういう場合があるよ、ってことであってるかな?

icon

@tadd あと、ちゃぶだいを引っくり返すようで申しわけないんだけど、
これはDOMのGCとJavaScritのGCが平行してあるのが問題で、
たぶん、Rubyで同じ状況にあると同じようにメモリリークする。
例えば、Gaucheのtcl/tkバインディングは、gaucheのGCとTclのGCが混じってるから、
メモリリークする。
https://github.com/shirok/Gauche-tk#avoiding-leak

で、この2つのGCをまとめて1つにするという解決策があって、
operaはそれを統一してメモリリークを無くする計画だという話を聞いたが、
その後Chromiumベースになったから、今はその計画はなくなったと思う。

Web site image
GitHub - shirok/Gauche-tk: Simple Gauche binding of Tk toolkit
icon

@tadd セーブというのはアプリケーションの話だよね。
セーブするアプリケーションもありえるので、処理系にはわからないと思う。
> 画面上にあるテキストはもはやセーブされない。

icon

@tadd そうだね。またisConnectedにしたくなるかもしれないし。