好き勝手に・げーあにん?

ファミコンと同い年の社会人ヌルオタの日記

Squirrel をちょっとだけ使ってみたメモ

スクエニWiiウェアを作るのに組み込んだということで話題になった(?)プログラム言語 Squirrelをちょっとだけ使ってみたのでメモ。

公式とWiki

C++用のバインダなら SqPlus が便利らしい(他のは試してないけど(ぇ))。g++用の Makefile と、VC++用のファイルも入ってて、ちょっと試すのも楽ちん。せっかくなので VC++で試した。特に詰まる事も無く、あっさりビルドできた。

Squirrel から C++ のメソッドを呼ぶサンプルは、minimalSqPlus。C/C++ から Squirrel の関数を呼ぶサンプルは、etc/minimal.c。両方ともわかりやすい。

Makefile がシンプルなのが嬉しい。configureとか無い。gcc 以外でコンパイルする時は、Make を新たに書くのが楽ってことなんだよな。たぶん。

あとでやる?

C/C++ から Squirrel を呼ぶ関数を、もうちょっと簡単に定義したい。マクロでなんとかできそう。すでにありそうな気もする。

Squirrel用のメモリ確保の再定義をどこでやってるのか調べる。

Squirrelで書いたハンドラっぽいクラスを C++から呼んでみたが、いまいちスマートじゃない気がするのであとで考えるかも。

Squirrel

class XHandler{
  function onEnter() {print("XHandler::onEnter");}
}
class XXHandler{
  function onEnter() {print("XXHandler::onEnter");}
}

// Cから呼ばれるハンドラ設定
function GetXHandler() {
  return XHandler;
  //return XXHandler;
}

C側

void call_handler_on_enter(HSQUIRRELVM v)
{
  SQInteger top = sq_gettop(v);
  // ハンドラ取得を探す
  sq_pushroottable(v);
  sq_pushstring(v,_SC("GetXHandler"),-1);
  if(!SQ_SUCCEEDED(sq_get(v,-2))) {
    goto FAILED;
  }
  // ハンドラ取得を呼ぶ
  sq_pushroottable(v);
  if (!SQ_SUCCEEDED(sq_call(v,1,SQTrue,SQTrue))) {
    goto FAILED;
  }
  // 戻り値取得
  SQInteger handler = sq_gettop(v);
  // onEnterを探す
  sq_push(v, handler);
  sq_pushstring(v,_SC("onEnter"),-1);
  if(!SQ_SUCCEEDED(sq_get(v,-2))) {
    goto FAILED;
  }
  // onEnter を呼ぶ
  sq_pushroottable(v);
  if (!SQ_SUCCEEDED(sq_call(v,1,SQFalse,SQTrue))) {
    goto FAILED;
  }
  goto SUCCESS;
FAILED:
  printf("FAILED\n");
SUCCESS:
  sq_settop(v,top); //restores the original stack size
}

こんな事するよりは、Squirrel側のクラス名を決めといたほうがいいんだろうな‥‥。めんどくさいし。命名規則がめちゃくちゃなのは気にしないで><