- scm_gc_mark (SCM_SMOB_OBJECT (smob));
- return SCM_SMOB_OBJECT_2 (smob);
-}
-
-// Function signature has two fixed arguments so that dropping two
-// will always work: if we have fewer to start with, it will trigger
-// wrong-number-of-args in a sensible location rather than making
-// drop-right barf.
-
-SCM
-apply_unpure_pure (SCM clo, SCM arg1, SCM arg2, SCM rest)
-{
- return scm_apply_0 (SCM_SMOB_OBJECT (clo),
- scm_call_2 (ly_lily_module_constant ("drop-right"),
- scm_cons2 (arg1, arg2, rest),
- scm_from_int (2)));
+ if (Unpure_pure_container *upc = unsmob<Unpure_pure_container> (data))
+ {
+ // Avoid gratuitous creation of an Unpure_pure_call
+ if (upc->is_unchanging ())
+ data = upc->unpure_part ();
+ else
+ {
+ data = upc->pure_part ();
+ if (ly_is_procedure (data))
+ return scm_apply_3 (data, grob, start, end, rest);
+ return data;
+ }
+ }
+ if (ly_is_procedure (data))
+ return scm_apply_1 (data, grob, rest);
+ return data;