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 ]