[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: lua_error() and C++
- From: Edwin Eyan Moragas <haaktu@...>
- Date: Wed, 3 Aug 2005 16:27:49 +0800
let me just throw in my praises.
amazing! David, i am in love with your skill.
(Just had my dose of Samurai 7. sorry, can't
help it).
--
salud,
eyan
On 8/3/05, David Burgess <dburgess@gmail.com> wrote:
> Hello
>
> > How nicely (if at
> > all) does this play with C++'s unwinding? For example:
> >
>
> Depends on your compiler. I can tell you what happens with MS VC6.
> I suspect similar issues with other compilers. This has been previously
> discussed on this list.
>
> You need to compile your C++ with /EHsc-, this generates code that
> tells C++ that C can throw exceptions. Without this C++ code assumes
> that C will never throw an exception.
>
> If you are going to be using Lua under a lot of C++ for a small
> performance hit you can replace the Lua longjmp code with
> try/catch and compile one Lua module as C++. This for shaky
> compilers puts all of the exception handling under one exception
> management mechanism.
>
> I would be interested to know what is the current state of play with gcc.
>
> For MS VC6 I did the following ( I can send you the complete patch
> if you like)
>
> 1) copied ldo.c to ldo.cpp
> 2) In ldo.cpp added
>
> class lua_exception {
> int status;
> public:
> lua_exception(int status_) : status(status_) { };
> int get_status() { return status; }
> };
>
>
> 3) Changed
>
> void luaD_throw (lua_State *L, int errcode) {
> if (L->errorJmp) {
> throw lua_exception(errcode);
> }
> else {
> G(L)->panic(L);
> exit(EXIT_FAILURE);
> }
> }
>
> int luaD_rawrunprotected (lua_State *L, Pfunc f, void *ud) {
> struct lua_longjmp lj;
> lj.status = 0;
> lj.previous = L->errorJmp; /* chain new error handler */
> L->errorJmp = &lj;
> try {
> (*f)(L, ud);
> }
> catch (lua_exception &e) { /* an error occurred: restore the state */
> lj.status = e.get_status();
> }
> catch (...) {
> throw;
> }
> L->errorJmp = lj.previous; /* restore old error handler */
> return lj.status;
> }
>
> 4) Compiled everything with /GX /EHsc-
> This has been working ok for me.
>
> Finally Lua5.1 work6 has build time options for using try/catch rather
> than longjmp. The important point is that the exception handling is
> localized to ldo.c in two functions so that it is rather easy to install
> whatever exception handling mechanism that you prefer.
>
> DB
>