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 | |||
