上へ

開発メモ

2004/04/04 Lua for Delphi

Lua デバッガ作成中。実行、ステップ実行、中断、中止まで実装。
あとは、ブレークポイント設定、変数ウォッチ、lua スタック表示、ローカル変数、グローバル変数、呼び出し履歴あたりか。

エラー処理について
・lua から呼び出される関数中で Delphi 例外を発生させると Delphi のエラー処理ルーチンで処理される。この場合 lua インタープリタは状態が不定になるので再度 lua_pcall するには lua インタープリタの再確保が必要。
・lua_error を使うと lua_pcall が終了する。この場合はそのまま lua_pcall 出来る。

Func1 を引数3つ取る Delphi 側の処理として、Lua に登録するのはこんな感じが正しいのかも知れない。
function lua_func1(L: Plua_State): Integer; cdecl;            
var
  A, B, C: Integer;
begin
  ...
  //Lua スタックから引数取得 -> A, B, C
  ...
  try
    Func1(A, B, C);
  except
    on E: Exception do luaL_error(L, E.Message);
  end;
  Result := 0;
end;

...
lua_register(L, 'func1', lua_func1);

いちいち try except が面倒な場合は毎回 lua_open, lua_close するという手もあるかも。
lua は ガベージコレクトタイプだから、予期せぬ終了の仕方をしても lua_close で全オブジェクトが開放されると思うんだけど。
function lua_func1(L: Plua_State): Integer; cdecl;            
begin
  //Lua スタックから引数取得 -> A, B, C
  Func1(A, B, C);
  Result := 0;
end;

...
L := lua_open;
try
  lua_register(L, 'func1', lua_func1);
  luaL_loadbuffer(L, Code, CodeSize, 'code');
lua_pcall(L, 0, 0, 0);
finally
  lua_close(L);
end;

2004/04/05 Lua for Delphi

lua 日本語化パッチのパッチ(*)適用、ブレークポイント設定、lua スタック表示、ローカル変数、ステップオーバー実行実装
次は、変数ウォッチ、グローバル変数、呼び出し履歴あたり。

(*)
diff -uNr patch/llex.c newpatch/llex.c
--- patch/llex.c        Sun Jun 22 13:52:00 2003
+++ newpatch/llex.c     Mon Apr 05 18:58:50 2004
@@ -98,7 +98,10 @@
     return token2string[token-FIRST_RESERVED];
   }
   else {
-    char _ch[3] = {token>>8, token, 0};
+    char _ch[3];
+    _ch[0] = token>>8;
+    _ch[1] = token;
+    _ch[2] = 0;
     return luaO_pushfstring(ls->L, "%s", _ch);
   }
 }
lua5.0.2 との組み合わせで2バイト目に'\' がくる文字("表","ソ")も扱えるようになることを確認。

2004/04/06 Lua for Delphi

コンパイルエラー表示、変数ウォッチ実装、変数ウォッチはイマイチ。
ウォッチ式を ローカル変数 lua_getlocal 、グローバル変数を luaL_loadbuffer, lua_pcall で実装したが、これではローカル変数は式で評価できない。例えば、ローカル変数 a があったとして、a は表示できるが、a + 1 は表示できない。eval のような関数があれば良いけど。

真面目にやろうとしたら新規 lua_open して、現在のローカル、グローバル変数をグローバル変数として登録し直して lua_pcall しかないか?

2004/04/11 Lua for Delphi

変数ウォッチは妥協、グローバル変数、呼び出し履歴、カーソル位置まで実行、呼び出し元に戻るまで実行、評価変更、実装
パフォーマンスチューニング、DLLの標準出力の取得をパイプ経由ではなく標準出力関数の上書きにする。lua ソースコードのコメントを見る限り、print 関数については上書きが推奨のようだ。

2004/04/18 Lua for Delphi

配布セット作成中。

readme.txt(作成中・・・)
SJISパッチ(完了:lua 日本語化パッチのパッチの一括パッチ形式)
サンプル1:hello world(完了)
サンプル2:ユーザー操作記憶(完了)
サンプル3:タートルグラフィックス(作成中・・・)
サンプル4:Lua デバッガ(完了)