[前][次][番号順一覧][スレッド一覧][生データ]

yarv-dev:366

From: SASADA Koichi <ko1 atdot.net>
Date: Sat, 11 Dec 2004 02:51:17 +0900
Subject: [yarv-dev:366] Exception Problem with Register Allocated Variable

 ささだです.

 Exception が起こったときに,とりあえず setjmp したところに
返ってくる現在のRuby の仕様をある程度踏襲しているのですが,プ
ログラムカウンタをレジスタ割り付け(*1) にして喜んでいたら問題
になりました.

*1: register VALUE *pc asm("esi"); と書いてみた

 要するに,setjmp したときのレジスタ値に戻るので,例外発生前
に設定していた PC の値ではなくなってしまうわけです.

pc = 0 ; /* esi = 0 */
if(setjmp(buf) == 0){
  VM loop{
  PC になんか入れる(esi = somewhere);
}
else{
  Exception handling with PC (esi == 0),
  but expect pc ==somewhere
}


 さて困りました.どうやったら解決できるか.

・PCのregister 指定をやめる:スタックに割り付けられれば大丈夫
 でも確実じゃない
・PCをvolatile にする:嫌過ぎる
・PCへの代入のときに,必ず volatile の変数にも同時に代入する 
参照はregister 指定したもので行う:これが一番安全で現実的か 
でも,PCがスタックに割り当てられた場合, 余分な手間が増えるだ
けになる
・例外が起こる可能性のある実行をする前に PC をvolatile な変数
に退避しておく: すべてを網羅することは不可能

 C コンパイラは,関数呼び出しの際には(多分)esi をスタックに
退避していると思うので,その退避先を知ることができれば問題あり
ません.だけど,できそうにないし.

 はてさてどうしたものかと思案しているところです.しょうがない
から PC のregister指定を諦めるというところに落ち着くかもです.

 何かいい手はありませんかね.



--
ML: yarv-dev quickml.atdot.net
使い方: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]

->     366 2004-12-11 02:51 [ko1 atdot.net       ] Exception Problem with Register Allocated Variable
       368 2004-12-11 10:08 ┗[nobu.nokada softhome]                                       
       369 2004-12-11 11:34  ┗[ko1 atdot.net       ]                                     
       373 2004-12-12 22:25   ┗[shudo computer.org  ]                                   
       374 2004-12-13 01:05    ┗[maeda-yarv atusi.org]                                 
       375 2004-12-13 14:46     ┗[ko1 atdot.net       ]                               
       376 2004-12-13 18:13      ┗[shudo computer.org  ]                             
       377 2004-12-13 18:18       ┗[ko1 atdot.net       ]                           
       378 2004-12-13 19:47        ┗[shudo computer.org  ]