MRIでは、rb_id2str()
電話をかけるとすべての作業を行う責任があるようSymbol#to_s
です。これが、かなり単純な操作であると私が想定したものにとって非常に不可解な関数であることを発見して驚いた。
この関数が何をしているのかについての詳細な説明を探しています。参考までに、1.9.3のソースへのリンクは次のとおりです。
http://rxr.whitequark.org/mri/source/parse.y?v=1.9.3-p195#9950
いくつかの具体的な質問:
4つの主要なif
ブロックは何をしていますか?
if (id < tLAST_TOKEN)
if (id < INT_MAX && rb_ispunct((int)id))
if (st_lookup(global_symbols.id_str, id, &data))
if (is_attrset_id(id))
ifステートメント内のコードの各ブロックが行うことの一般的な概要を取得することは素晴らしいことですが、行ごとの分析である必要はありません。
最後に、メモリ/ガベージコレクションの意味について興味がありますto_s
:呼び出しSymbol#to_s
は毎回ガベージコレクションする必要がある新しい文字列を作成しますか、またはインターン表現への参照を使用する内部コピーオンライト最適化のようなものがあります文字列に突然変異が生じるまでの記号の?