@@ -775,6 +775,78 @@ static SEXP R_GetGlobalCacheLoc(SEXP symbol)
775775}
776776#endif /* USE_GLOBAL_CACHE */
777777
778+
779+ /*----------------------------------------------------------------------
780+ R_GetBindingType
781+ */
782+
783+ static R_BindingType_t BINDING_TYPE (SEXP cell )
784+ {
785+ if (BNDCELL_TAG (cell ))
786+ // avoid expanding immediate values
787+ return R_BindingTypeValue ;
788+ else if (IS_ACTIVE_BINDING (cell ))
789+ return R_BindingTypeActive ;
790+ else {
791+ SEXP value = CAR (cell );
792+ if (value == R_MissingArg )
793+ return R_BindingTypeMissing ;
794+ else if (TYPEOF (value ) == PROMSXP ) {
795+ if (PROMISE_IS_EVALUATED (value ))
796+ return R_BindingTypeForced ;
797+ else
798+ return R_BindingTypeDelayed ;
799+ }
800+ else
801+ return R_BindingTypeValue ;
802+ }
803+ }
804+
805+ static R_BindingType_t SYMBOL_BINDING_TYPE (SEXP cell )
806+ {
807+ // probably no need to support symbol bindings
808+ error ("symbol bindings not supported yet" );
809+ }
810+
811+ attribute_hidden
812+ R_BindingType_t R_GetVarLocType (R_varloc_t vl )
813+ {
814+ SEXP cell = vl .cell ;
815+ if (cell == NULL || cell == R_UnboundValue )
816+ return R_BindingTypeUnbound ;
817+ else if (TYPEOF (cell ) == SYMSXP )
818+ return SYMBOL_BINDING_TYPE (cell );
819+ else
820+ return BINDING_TYPE (cell );
821+ }
822+
823+ R_BindingType_t R_GetBindingType (SEXP sym , SEXP env ) {
824+ if (TYPEOF (sym ) != SYMSXP )
825+ error (_ ("not a symbol" ));
826+ if (TYPEOF (env ) != ENVSXP )
827+ error (_ ("not an environment" ));
828+
829+ R_varloc_t loc = R_findVarLocInFrame (env , sym );
830+ return R_GetVarLocType (loc );
831+ }
832+
833+ attribute_hidden SEXP do_bindingType (SEXP call , SEXP op , SEXP args , SEXP rho )
834+ {
835+ checkArity (op , args );
836+ SEXP sym = CAR (args );
837+ SEXP env = CADR (args );
838+ switch (R_GetBindingType (sym , env )) {
839+ case R_BindingTypeUnbound : return mkString ("unbound" );
840+ case R_BindingTypeValue : return mkString ("value" );
841+ case R_BindingTypeMissing : return mkString ("missing" );
842+ case R_BindingTypeDelayed : return mkString ("delayed" );
843+ case R_BindingTypeForced : return mkString ("forced" );
844+ case R_BindingTypeActive : return mkString ("active" );
845+ default : error ("unknown binding type; should not happen" );
846+ }
847+ }
848+
849+
778850/*----------------------------------------------------------------------
779851
780852 unbindVar
0 commit comments