Lua C API からデバッグ情報を取得するためのこのメソッドに基づいて、SWIG インターフェイスに統合する方法の (少し乱雑な) 例をまとめました。
%module test
%{
#undef SWIG_fail_arg
#define SWIG_fail_arg(func_name,argnum,type) \
{lua_Debug ar;\
lua_getstack(L, 1, &ar);\
lua_getinfo(L, "nSl", &ar);\
lua_pushfstring(L,"Error (%s:%d) in %s (arg %d), expected '%s' got '%s'",\
ar.source,ar.currentline,func_name,argnum,type,SWIG_Lua_typename(L,argnum));\
goto fail;}
%}
%include <std_string.i>
%inline %{
void func(const std::string& str) {}
%}
これは基本的に、デフォルトのSWIG_fail_arg
マクロを、デバッグ情報を取得して出力する変更されたマクロに置き換えます。
最新の SWIG トランクでテストしました (表示されるテキストが完全に一致しなかったため、古いバージョンを使用している可能性があります)。
Lua 5.1.4 Copyright (C) 1994-2008 Lua.org, PUC-Rio
> require('test')
> local n=4
> test.func(n)
Error (=stdin:1) in func (arg 1), expected 'std::string const &' got 'nil'
stack traceback:
[C]: in function 'func'
stdin:1: in main chunk
[C]: ?
ただし、既にデバッグ情報 (つまり、完全なスタック トレース) があるようです。