The R Project SVN R

Rev

Rev 26354 | Rev 27000 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 26354 Rev 26646
Line 647... Line 647...
647
    if ( !R_Interactive && !haveHandler ) {
647
    if ( !R_Interactive && !haveHandler ) {
648
	REprintf("Execution halted\n");
648
	REprintf("Execution halted\n");
649
	R_CleanUp(SA_NOSAVE, 1, 0); /* quit, no save, no .Last, status=1 */
649
	R_CleanUp(SA_NOSAVE, 1, 0); /* quit, no save, no .Last, status=1 */
650
    }
650
    }
651
 
651
 
652
    if (traceback) {
652
    if (traceback && ! oldInError) {
653
	PROTECT(s = R_GetTraceback(0));
653
	PROTECT(s = R_GetTraceback(0));
654
	setVar(install(".Traceback"), s, R_GlobalEnv);
654
	setVar(install(".Traceback"), s, R_GlobalEnv);
655
	UNPROTECT(1);
655
	UNPROTECT(1);
656
    }
656
    }
657
 
657
 
Line 1038... Line 1038...
1038
 
1038
 
1039
static void vsignalError(SEXP call, const char *format, va_list ap)
1039
static void vsignalError(SEXP call, const char *format, va_list ap)
1040
{
1040
{
1041
    SEXP list, oldstack;
1041
    SEXP list, oldstack;
1042
 
1042
 
1043
    PROTECT(oldstack = R_HandlerStack);
1043
    oldstack = R_HandlerStack;
1044
    while ((list = findSimpleErrorHandler()) != R_NilValue) {
1044
    while ((list = findSimpleErrorHandler()) != R_NilValue) {
1045
	char *buf = errbuf;
1045
	char *buf = errbuf;
1046
	SEXP entry = CAR(list);
1046
	SEXP entry = CAR(list);
1047
	R_HandlerStack = CDR(list);
1047
	R_HandlerStack = CDR(list);
1048
	Rvsnprintf(buf, BUFSIZE - 1, format, ap);
1048
	Rvsnprintf(buf, BUFSIZE - 1, format, ap);
1049
	buf[BUFSIZE - 1] = 0;
1049
	buf[BUFSIZE - 1] = 0;
1050
	if (IS_CALLING_ENTRY(entry)) {
1050
	if (IS_CALLING_ENTRY(entry)) {
1051
	    if (ENTRY_HANDLER(entry) == R_RestartToken) {
1051
	    if (ENTRY_HANDLER(entry) == R_RestartToken)
1052
		UNPROTECT(1);
-
 
1053
		return; /* go to default error handling; do not reset stack */
1052
		return; /* go to default error handling; do not reset stack */
1054
	    }
-
 
1055
	    else {
1053
	    else {
1056
		SEXP hooksym, quotesym, hcall, qcall;
1054
		SEXP hooksym, quotesym, hcall, qcall;
-
 
1055
		/* protect oldstack here, not outside loop, so handler
-
 
1056
		   stack gets unwound in case error is protect stack
-
 
1057
		   overflow */
-
 
1058
		PROTECT(oldstack);
1057
		hooksym = install(".handleSimpleError");
1059
		hooksym = install(".handleSimpleError");
1058
		quotesym = install("quote");
1060
		quotesym = install("quote");
1059
		PROTECT(qcall = LCONS(quotesym, LCONS(call, R_NilValue)));
1061
		PROTECT(qcall = LCONS(quotesym, LCONS(call, R_NilValue)));
1060
		PROTECT(hcall = LCONS(qcall, R_NilValue));
1062
		PROTECT(hcall = LCONS(qcall, R_NilValue));
1061
		hcall = LCONS(ScalarString(mkChar(buf)), hcall);
1063
		hcall = LCONS(ScalarString(mkChar(buf)), hcall);
1062
		hcall = LCONS(ENTRY_HANDLER(entry), hcall);
1064
		hcall = LCONS(ENTRY_HANDLER(entry), hcall);
1063
		PROTECT(hcall = LCONS(hooksym, hcall));
1065
		PROTECT(hcall = LCONS(hooksym, hcall));
1064
		eval(hcall, R_GlobalEnv);
1066
		eval(hcall, R_GlobalEnv);
1065
		UNPROTECT(3);
1067
		UNPROTECT(4);
1066
	    }
1068
	    }
1067
	}
1069
	}
1068
	else gotoExitingHandler(R_NilValue, call, entry);
1070
	else gotoExitingHandler(R_NilValue, call, entry);
1069
    }
1071
    }
1070
    R_HandlerStack = oldstack;
1072
    R_HandlerStack = oldstack;
1071
    UNPROTECT(1);
-
 
1072
}
1073
}
1073
 
1074
 
1074
static SEXP findConditionHandler(SEXP cond)
1075
static SEXP findConditionHandler(SEXP cond)
1075
{
1076
{
1076
    int i;
1077
    int i;