著作一覧 |
それはとても難しいツッコミです。問題点は2つあります。
1つは、Class.forName(String)って、Class.forName(String, true, this.getClass().getClassLoader())と等しくて、ではこのthisとは? と考えるとRjbなんですよね。で、thisを取るのに動くのはsun.reflect.Reflection.getCallerClassという、SunのJ2seの内部実装そのもので多分、スタックを戻ってthisを取ってくる仕組みになってたり。でもRjbはJavaから見たらVMからの呼び出しと等しいから結局ClassLoaderとしてnullを与えたことになってしまい、この状態はJ2SEのClass#forNameでは規定されていない(少なくてもSystemClassLoaderが利用されるわけではないことはわかるけど)のでもにゃもにゃとClassNotFoundExceptionになるんでしょう。(J2SEの配布ソースまでは追ったけど、sunの実装はまで追ってないのでとりあえずここまで)
2つ目はimportで取って来たのとClass.forName(String, boolean, ClassLoader)で取って来たのではRjbの内部処理が異なってnewが呼べなかったり(でも、これは戻り値がClassだったらimportと同等の処理を走らせれば良いから大した問題じゃないか)。
2つ目はともかく、1つ目はRjbが内部でimportに置き換えるのが良いかな?
なんか、最後のテスト(_が付いた定数の処理)が引っかかるな。それとsize_tが見つからないみたいで#include <unistd.h>が必要になったけど、なんなんだろう? と言いながら真剣に追う気にはならないのだが。
とりあえずメモ。
mswin32とLinuxでは問題なくmakeもテストも動くんだが(待てよ、両方ともJ2SE 1.4.2だ。それか?)。
#あと、javahの動作が変だ。以前からなのかな(他のプラットフォームではたまたま動かなくて済んでいるとか)。その意味ではmakeの動作も多少違うのかも。
なんてことやってる閑があるなら、ツッコミのほうの問題をやれと、思いながらも今はそれはできない。
ジェズイットを見習え |
「Rjbが内部でimportに置き換える」はちょっと困ります。<br>S2コンテナからインターフェースを取得する際に、<br>getComponentにClassオブジェクトを与えるのですが、現在はimportで得られたインスタンスではなく、forNameで取得したものを、与えないとだめだったからです。
むしろ、そこを修正すべきかも知れません。<br>importで取って来たClassのインスタンスのRuby側から見えるものと、JVMに渡すものをRjbが正しく変換できていないという問題だと思うからです。<br>そこが修正できるとforName(String)はフックしてimportに置換することで丸く収まります。<br>で、どのようにだめだったのでしょうか?
なるほど、了解しました。RjbQandAに再現スクリプトと実行結果を書きました。どうやら、S2(JAVA)からはNullと見えているようです。
おお、ありがとうございます。<br>そうか、Classの場合メタデータだけを確保してインスタンスをnullにしているのに、そちらをJVMへ与えてしまっているんだろうな。というか、そのあたりの管理が試行錯誤し過ぎて錯綜しているというのは0.2.1の修正時にわかったからどうにかなりそうです。<br>すぐ、と言いたいところですが、色々詰っているので最悪今週末(次の金曜か土曜)までお待ちください。
早速ありがとうございます。急ぎませんので、artonさんのペースでまったくかまいません。ご心配なく。