2007年9月7日金曜日

try / finally by jsr/ret (~java1.3)

Java 1.3 までは try/finally を jsr バイトコードで実現していた。
一見、トリッキーだがわかってみれば簡潔にできている気もする。
しかし、jsr バイトコードはベリフィケーションが難しく、使用を
避ける方向にある。1.4 以降の javac コンパイラでは極力使用しない
ようになっている。1.5 開発時には jsr をなくしてしまえという意見も
あったとかなかったとか.

次のような簡単な try / finally を 1.3 javac でコンパイルする。

try {
System.out.println("main in try block");
} finally {
System.out.println("main in finally block");
}

結果と、インラインの説明。

Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String main in try block
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: jsr 20
# finally block のある 20 に jump. この際、次のバイトコードオフセット 11 が
# stack に push される。
11: goto 31
# offset 31 に飛び、メソッドからリターンする。

# 0-14 の間で例外が発生した場合、exception table にしたがってここに
# 制御が移る。
14: astore_1
# 例外の参照を loc[1] に保持
15: jsr 20
# jsr で一旦 finally block に飛ぶ。
# ret 2 はここに返ってくる。例外をスローして終わる。
18: aload_1
19: athrow
# stack 上にある jsr が残したアドレスをローカル、ここでは local[2] にコピー。
20: astore_2
21: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
24: ldc #5; //String main in finally block
26: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
29: ret 2
# loc[2] にあるオフセットにリターンする
31: return
Exception table:
from to target type
0 14 14 any

2007年9月6日木曜日

bytecodes memo

dup_x1

tos を複製して2つ下にインサート

.., value2, value1 => ..., value1, value2, value1

===
jsr <target off>
次のバイトコードのアドレスをスタックにプッシュして指定された
アドレスに jump する。

===
ret <slot#>
slot# のアドレスに jump

----------
PuTTY - a terminal emulator. If it's lighter than TeraTerm, worth while trying.

2007年9月5日水曜日

svcadm/svcs

IPアドレスの変更を反映させるだけのために Solaris をリブートしたくない。
Solaris 10 ではこのあたりは SMF の管理下にある。

# svcadm restart network/physical

これでできたようだ。

2007年9月4日火曜日

Solaris changing host/network config

あっさりと動いた。

/etc/hostname.<itf> // bge0
<simply put hostname for the itf>

/etc/hosts
<update entry as needed>

/etc/nodename
<node name of the system itself>

/etc/defaultdomain
// did not exist

/etc/defaultrouter
// put default gateway address

/etc/inet/netmasks
<network addr> <mask>

2007年9月3日月曜日

grub chain loading

見よう見まね、行き当たりばったりでつかってきたので、大事なことを知らなかった。

grup から linux も solaris もあげたいとき、solaris の grub を使えば動く
のは知っていて、それが唯一の方法かと勘違いしていた。chain loading を
使うのがどうやら常識のようで...

title Solaris
rootnoverify (hda0,3,a)
chainloader +1

これで solaris のパーティションから solaris をロードできるブートローダ
(Solaris の grub)が起動される。

2007年9月1日土曜日

Solaris 10 again

Solaris 10 u3 をインストール。

システムは PC サーバーだが、余計なインターフェイスがついているのでインストーラ
起動前にドライバアップデートが必要。

GUI モードのインストーラはドライバアップデートを使うとうまくいかないことが
あるらしいので(実際にエラーが発生)、CUI で入れる。Lan も二つあって、
どちらか迷ったがインスタンス番号が少ないほうで進めた。

---

Xvnc は以前ユーザー起動で xdm login できるようにしていたが、そのやりかたが
思い出せない。散々試した挙句、次の方法でいけることがわかった。

vncserver :2 -query localhost