Pregunta

I am running Lua with a C++ library via swig. When a swig runtime error occurs I would like to know the line which caused the problem. The error message I receive does not have this information.

How can I find which line in the Lua code triggered the error?

For example suppose I have a swig function "swigstringcount" and it takes a string:

local n=4
local m=swigstringcount(n)
print (m,n)

This (obviously wrong) code produces an error on line two. Currently all I get is

error:SWIG_RuntimeError: swigstringcount requires a string

I want it to tell me that line 2 produced the error, like standard Lua error messages.

¿Fue útil?

Solución

Based on this method for getting debug info from the Lua C API I've put together a (slightly messy) example of how you can integrate that into a SWIG interface:

%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) {}
%}

This basically replaces the default SWIG_fail_arg macro with a modified one that gets and prints some debug info.

I tested it with the latest SWIG trunk (I think you might be using an older version since the text I see didn't quite match), but I was able to do:

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]: ?

I seem to have more debug info (i.e. a full stack trace) there already though.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top