SEXP RKStructureGetter::resolvePromise (SEXP from) { RK_TRACE (RBACKEND); SEXP ret = from; if (TYPEOF (from) == PROMSXP) { ret = PRVALUE(from); if (ret == R_UnboundValue) { RK_DEBUG (RBACKEND, DL_DEBUG, "temporarily resolving unbound promise"); PROTECT (from); SET_PRSEEN(from, 1); ret = Rf_eval(PRCODE(from), PRENV(from)); SET_PRSEEN(from, 0); if (keep_evalled_promises) { SET_PRVALUE(from, ret); SET_PRENV(from, R_NilValue); } UNPROTECT (1); RK_DEBUG (RBACKEND, DL_DEBUG, "resolved type is %d", TYPEOF (ret)); } } return ret; }
void attribute_hidden R_restore_globals(RCNTXT *cptr) { R_PPStackTop = cptr->cstacktop; R_EvalDepth = cptr->evaldepth; vmaxset(cptr->vmax); R_interrupts_suspended = cptr->intsusp; R_HandlerStack = cptr->handlerstack; R_RestartStack = cptr->restartstack; while (R_PendingPromises != cptr->prstack) { /* The value 2 installed in PRSEEN 2 allows forcePromise in eval.c to signal a warning when asked to evaluate a promise whose evaluation has been interrupted by a jump. */ SET_PRSEEN(R_PendingPromises->promise, 2); R_PendingPromises = R_PendingPromises->next; } /* Need to reset R_Expressions in case we are jumping after handling a stack overflow. */ R_Expressions = R_Expressions_keep; R_BCNodeStackTop = cptr->nodestack; #ifdef BC_INT_STACK R_BCIntStackTop = cptr->intstack; #endif R_Srcref = cptr->srcref; }