Skip to content

Commit 20700ed

Browse files
committed
Add binding constructors
1 parent 112feaa commit 20700ed

File tree

2 files changed

+29
-0
lines changed

2 files changed

+29
-0
lines changed

src/include/Rinternals.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,9 @@ Rboolean R_EnvironmentIsLocked(SEXP env); // envir.c
720720
void R_LockBinding(SEXP sym, SEXP env);
721721
void R_unLockBinding(SEXP sym, SEXP env);
722722
void R_MakeActiveBinding(SEXP sym, SEXP fun, SEXP env);
723+
void R_MakeDelayedPromiseBinding(SEXP sym, SEXP promiseExpr, SEXP promiseEnv, SEXP env);
724+
void R_MakeForcedPromiseBinding(SEXP sym, SEXP promiseExpr, SEXP promiseValue, SEXP env);
725+
void R_MakeMissingBinding(SEXP sym, SEXP env);
723726
Rboolean R_BindingIsLocked(SEXP sym, SEXP env); // envir.c
724727
Rboolean R_BindingIsActive(SEXP sym, SEXP env); // envir.c
725728
SEXP R_ActiveBindingFunction(SEXP sym, SEXP env);

src/main/envir.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3485,6 +3485,32 @@ void R_unLockBinding(SEXP sym, SEXP env)
34853485
}
34863486
}
34873487

3488+
void R_MakeDelayedPromiseBinding(SEXP sym, SEXP promiseExpr, SEXP promiseEnv, SEXP env) {
3489+
if (TYPEOF(sym) != SYMSXP)
3490+
error(_("not a symbol"));
3491+
if (TYPEOF(env) != ENVSXP)
3492+
error(_("not an environment"));
3493+
if (TYPEOF(promiseEnv) != ENVSXP)
3494+
error(_("not an environment"));
3495+
defineVar(sym, Rf_mkPROMISE(promiseExpr, promiseEnv), env);
3496+
}
3497+
3498+
void R_MakeForcedPromiseBinding(SEXP sym, SEXP promiseExpr, SEXP promiseValue, SEXP env) {
3499+
if (TYPEOF(sym) != SYMSXP)
3500+
error(_("not a symbol"));
3501+
if (TYPEOF(env) != ENVSXP)
3502+
error(_("not an environment"));
3503+
defineVar(sym, R_mkEVPROMISE(promiseExpr, promiseValue), env);
3504+
}
3505+
3506+
void R_MakeMissingBinding(SEXP sym, SEXP env) {
3507+
if (TYPEOF(sym) != SYMSXP)
3508+
error(_("not a symbol"));
3509+
if (TYPEOF(env) != ENVSXP)
3510+
error(_("not an environment"));
3511+
defineVar(sym, R_MissingArg, env);
3512+
}
3513+
34883514
void R_MakeActiveBinding(SEXP sym, SEXP fun, SEXP env)
34893515
{
34903516
if (TYPEOF(sym) != SYMSXP)

0 commit comments

Comments
 (0)