Skip to content

Commit 112feaa

Browse files
committed
Add promise accessors
1 parent a1d9185 commit 112feaa

File tree

2 files changed

+42
-0
lines changed

2 files changed

+42
-0
lines changed

src/include/Rinternals.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,9 @@ void R_MakeActiveBinding(SEXP sym, SEXP fun, SEXP env);
723723
Rboolean R_BindingIsLocked(SEXP sym, SEXP env); // envir.c
724724
Rboolean R_BindingIsActive(SEXP sym, SEXP env); // envir.c
725725
SEXP R_ActiveBindingFunction(SEXP sym, SEXP env);
726+
SEXP R_DelayedPromiseBindingExpression(SEXP sym, SEXP env);
727+
SEXP R_DelayedPromiseBindingEnvironment(SEXP sym, SEXP env);
728+
SEXP R_ForcedPromiseBindingExpression(SEXP sym, SEXP env);
726729
Rboolean R_HasFancyBindings(SEXP rho); // envir.c
727730

728731

src/main/envir.c

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
35933632
SEXP R_ActiveBindingFunction(SEXP sym, SEXP env)
35943633
{
35953634
if (TYPEOF(sym) != SYMSXP)

0 commit comments

Comments
 (0)