https://bugzilla.mozilla.org/show_bug.cgi?id=900285
目次
- 説明
- 模索途中
- 解決法
模索途中
- MacroAssembler(js/src/assembler/assembler/MacroAssembler.h)
MacroAssemblerが定義されている箇所
- MacroAssembler(js/src/ion/IonMacroAssembler.h)
MacroAssemblerが定義されいる箇所。現在使われているのはこちら。
- OutOfLineCode(js/src/ion/shared/CodeGenerator-shared.h)
framePushedをメンバ変数として持つクラス。MacroAssemblerまでのリレーショナルはまだ分からない。
- 調査経過
OutOfLineCodeクラスには、setFramePushedというセッターが用意されている。
MacroAssemblerから、setFramePushedを呼ぶことはできない。
インスタンスメソッドなので、インスタンスしてからでないと呼び出せない?
コンストラクタはインスタンス生成時に呼び出されるのでインスタンスメソッドも呼び出し可能なはず。
fromePushedの初期化もできない。
OutOfLineCodeクラスを継承してない?
しかし、MacroAssemblerのインスタンスであるmasmがsetFramePushedを呼び出している。
コンストラクタで親クラスのメンバ変数を初期化したい。その変数はのアクセッサはprivateである。セッタは用意されている。
スタックオーバーフローに方法が載っていた。http://stackoverflow.com/questions/2290733/initialize-parents-protected-members-with-initialization-list-c
つまり、OutOfLineCodeに新たなコンストラクタを追加することになる。
複数のクラスを間に挟んでいるので簡単にはいかない。
まずは、OutOfLineCodeまでの関係図を調べる。
OutOfLineCodeは、SEGV周りで使われているためたくさんのクラスが継承している。よって、ここのコードを変更するのはあまりよろしくない。
MacroAssemlerがIonMacroAssembler内で定義されていた。
引数を持ったコンストラクタが呼ばれている形跡があるので、変更したいのはこっちの可能性が高い。
icSaveLiveはファントムタイプを返すことになっている。ファントムタイプの説明は以下のURLに載っている。
http://d.hatena.ne.jp/faith_and_brave/20121205/1354690830
http://kagamilove0707.github.io/programming/2013/05/30/about-phantom-type/
icSaveLiveはCodeGeneratorShared::saveLiveと同等な役割を持つ。
buildOOLFakeExitFrameは、icSaveLiveの戻り値を受け取れるように変更しなければならない。このメソッドの機能をまずは理解する。