summaryrefslogtreecommitdiff
path: root/src/lj_err.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lj_err.c')
-rw-r--r--src/lj_err.c46
1 files changed, 46 insertions, 0 deletions
diff --git a/src/lj_err.c b/src/lj_err.c
index a723af48..71c561b1 100644
--- a/src/lj_err.c
+++ b/src/lj_err.c
@@ -676,6 +676,8 @@ LJ_NORET LJ_NOINLINE static void err_argmsg(lua_State *L, int narg,
676{ 676{
677 const char *fname = "?"; 677 const char *fname = "?";
678 const char *ftype = getfuncname(L, L->base - 1, &fname); 678 const char *ftype = getfuncname(L, L->base - 1, &fname);
679 if (narg < 0 && narg > LUA_REGISTRYINDEX)
680 narg = (L->top - L->base) + narg + 1;
679 if (ftype && ftype[3] == 'h' && --narg == 0) /* Check for "method". */ 681 if (ftype && ftype[3] == 'h' && --narg == 0) /* Check for "method". */
680 msg = lj_str_pushf(L, err2msg(LJ_ERR_BADSELF), fname, msg); 682 msg = lj_str_pushf(L, err2msg(LJ_ERR_BADSELF), fname, msg);
681 else 683 else
@@ -761,3 +763,47 @@ LUALIB_API int luaL_error(lua_State *L, const char *fmt, ...)
761 return 0; /* unreachable */ 763 return 0; /* unreachable */
762} 764}
763 765
766/* -- C++ exception support ----------------------------------------------- */
767
768#if defined(__ELF__) || defined(__MACH__)
769typedef enum
770{
771 _URC_NO_REASON,
772 _URC_FOREIGN_EXCEPTION_CAUGHT,
773 _URC_FATAL_PHASE2_ERROR,
774 _URC_FATAL_PHASE1_ERROR,
775 _URC_NORMAL_STOP,
776 _URC_END_OF_STACK,
777 _URC_HANDLER_FOUND,
778 _URC_INSTALL_CONTEXT,
779 _URC_CONTINUE_UNWIND
780} _Unwind_Reason_Code;
781
782#define _UA_SEARCH_PHASE 1
783#define _UA_CLEANUP_PHASE 2
784#define _UA_HANDLER_FRAME 4
785#define _UA_FORCE_UNWIND 8
786#define _UA_END_OF_STACK 16
787
788extern void *_Unwind_GetCFA(void *ctx);
789extern void _Unwind_DeleteException(void *uex);
790
791/* DWARF2 personality handler referenced from .eh_frame. */
792LJ_FUNCA int lj_err_unwind_dwarf(int version, int actions, uint64_t uexclass,
793 void *uex, void *ctx)
794{
795 if (version != 1)
796 return _URC_FATAL_PHASE1_ERROR;
797 UNUSED(uexclass);
798 if ((actions & _UA_SEARCH_PHASE))
799 return _URC_HANDLER_FOUND;
800 if ((actions & _UA_HANDLER_FRAME)) {
801 void *cf = _Unwind_GetCFA(ctx);
802 lua_State *L = cframe_L(cf);
803 _Unwind_DeleteException(uex);
804 lj_err_msg(L, LJ_ERR_ERRCPP);
805 }
806 return _URC_CONTINUE_UNWIND;
807}
808#endif
809