@@ -3590,6 +3590,45 @@ attribute_hidden Rboolean R_HasFancyBindings(SEXP rho)
35903590 }
35913591}
35923592
3593+ // Equivalent to `substitute()`, but only supports promises
3594+ SEXP R_DelayedPromiseBindingExpression (SEXP sym , SEXP env ) {
3595+ SEXP value = Rf_findVarInFrame3 (env , sym , FALSE);
3596+
3597+ if (TYPEOF (value ) != PROMSXP )
3598+ error (_ ("not a promise" ));
3599+
3600+ if (PROMISE_IS_EVALUATED (value ))
3601+ error (_ ("not a delayed promise" ));
3602+
3603+ // This has special handling for bytecode, unlike `PREXPR()`
3604+ return R_PromiseExpr (value );
3605+ }
3606+
3607+ SEXP R_DelayedPromiseBindingEnvironment (SEXP sym , SEXP env ) {
3608+ SEXP value = Rf_findVarInFrame3 (env , sym , FALSE);
3609+
3610+ if (TYPEOF (value ) != PROMSXP )
3611+ error (_ ("not a promise" ));
3612+
3613+ if (PROMISE_IS_EVALUATED (value ))
3614+ error (_ ("not a delayed promise" ));
3615+
3616+ return PRENV (value );
3617+ }
3618+
3619+ SEXP R_ForcedPromiseBindingExpression (SEXP sym , SEXP env ) {
3620+ SEXP value = Rf_findVarInFrame3 (env , sym , FALSE);
3621+
3622+ if (TYPEOF (value ) != PROMSXP )
3623+ error (_ ("not a promise" ));
3624+
3625+ if (!PROMISE_IS_EVALUATED (value ))
3626+ error (_ ("not a forced promise" ));
3627+
3628+ // This has special handling for bytecode, unlike `PREXPR()`
3629+ return R_PromiseExpr (value );
3630+ }
3631+
35933632SEXP R_ActiveBindingFunction (SEXP sym , SEXP env )
35943633{
35953634 if (TYPEOF (sym ) != SYMSXP )
0 commit comments