著作一覧 |
File: RScriptCore.cpp #ifndef __IRubyEngine_INTERFACE_DEFINED__ int stacktop; s_pStackTop = reinterpret_casts_pStackTopの参照用メソッド(RScriptCore.h)(&stacktop); #endif LPSTR psz = AllocLibPath(); static int dummyargc(0); static char** vec; NtInitialize(&dummyargc, &vec); ruby_init();
inline LPBYTE GetStackTop() const { return s_pStackTop; }を使っている個所(例:RubyObject.cpp)
HRESULT STDMETHODCALLTYPE CRubyObject::GetIDsOfNames( /* [in] */ REFIID riid, /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, /* [in] */ UINT cNames, /* [in] */ LCID lcid, /* [size_is][out] */ DISPID __RPC_FAR *rgDispId) { #ifdef __IRubyWrapper_INTERFACE_DEFINED__ IRubyWrapper* p = CRubyWrapper::GetWrapper(); #else int stacktop; if (reinterpret_cast*(&stacktop) > CRScriptCore::GetCurrentEngine()->GetStackTop()) _alloca(reinterpret_cast (&stacktop) - CRScriptCore::GetCurrentEngine()->GetStackTop()); #endif
__IRubyWrapper_INTERFACE_DEFINED__
が未定義のほうが一般的な組み込み環境。
rb_init呼び出し時のスタックトップより浅い個所でGCが実行されることが無いように、Rubyに制御を渡す前にallocaでスタックポインタを調整している処理。
*これはInit_stack()で行われるので、アプリケーションからインタプリタを呼び出す境界のところでは、これを呼んだほうがいい
とのことだ。が、ruby.hで公開されていない関数を呼ぶのは回避するけどね。
眼球の中の悪魔ならぬ緑の小人のために、半円型のマシンの中に顔を突っ込む。その場所は見えているのに、そこで今まさに起こっていることが見えていない。まさに病気だ。
多分、マクニーリの考えは正しい。
そして、サービスと叫ぶマイクロソフトも正しい。
ソフトウェアはインフラとシステムに分けて考えなければならない。
すでに、インフラではビジネスは成立しないというのは共通認識だ。(ただし、開発基盤というインフラは重要で、JavaとVisual Studio .NETをどっちも非常に大事にしている。なぜならば、開発インフラなくしてシステム構築も無いからだ)
システムといっても、ソフトウェアだけで構築できるシステムもあれば、エンタープライズシステムもあるし、企業間システムというのもある。
で、手近なところでは、ルータってのもシステムだよな、とOpenBlockSを眺めながら思うのであった。
ジェズイットを見習え |