diff options
Diffstat (limited to 'src/lj_err.c')
-rw-r--r-- | src/lj_err.c | 46 |
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__) | ||
769 | typedef 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 | |||
788 | extern void *_Unwind_GetCFA(void *ctx); | ||
789 | extern void _Unwind_DeleteException(void *uex); | ||
790 | |||
791 | /* DWARF2 personality handler referenced from .eh_frame. */ | ||
792 | LJ_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 | |||