if (gthis && gthis->get_score_context ())
return gthis->get_score_context ()->create_unique_context (name, id, operations);
- /*
- TODO: use accepts_list_.
- */
- vector<Context_def*> path
- = unsmob_context_def (definition_)->path_to_acceptable_context (name, get_output_def ());
-
+ vector<Context_def*> path = path_to_acceptable_context (name);
if (path.size ())
{
Context *current = this;
- // start at 1. The first one (index 0) will be us.
+ // Iterate through the path and create all of the implicit contexts.
for (vsize i = 0; i < path.size (); i++)
{
SCM ops = SCM_EOL;
return tg;
}
- /*
- TODO: use accepts_list_.
- */
- vector<Context_def*> path
- = unsmob_context_def (definition_)->path_to_acceptable_context (n, get_output_def ());
+ vector<Context_def*> path = path_to_acceptable_context (n);
if (path.size ())
{
SCM type_scm = ev->get_property ("type");
string type = ly_symbol2string (type_scm);
- vector<Context_def*> path
- = unsmob_context_def (definition_)->path_to_acceptable_context (type_scm, get_output_def ());
+ vector<Context_def*> path = path_to_acceptable_context (type_scm);
+
if (path.size () != 1)
{
programming_error (_f ("Invalid CreateContext event: Cannot create %s context", type.c_str ()));
ly_symbol2scm ("creator"), sev);
}
+vector<Context_def*>
+Context::path_to_acceptable_context (SCM name) const
+{
+ // The 'accepts elements in definition_mods_ is a list of ('accepts string),
+ // but the Context_def expects to see elements of the form ('accepts symbol).
+ SCM accepts = SCM_EOL;
+ for (SCM s = scm_reverse (definition_mods_); scm_is_pair (s); s = scm_cdr (s))
+ if (scm_caar (s) == ly_symbol2scm ("accepts"))
+ {
+ SCM elt = scm_list_2 (scm_caar (s), scm_string_to_symbol (scm_cadar (s)));
+ accepts = scm_cons (elt, accepts);
+ }
+
+ return unsmob_context_def (definition_)->path_to_acceptable_context (name,
+ get_output_def (),
+ accepts);
+
+}
+
Context *
Context::create_context (Context_def *cdef,
string id,
aliases_ = scm_cons (sym, aliases_);
}
+/* we don't (yet) instrument context properties */
void
-Context::internal_set_property (SCM sym, SCM val
-#ifndef NDEBUG
- , char const *file, int line, char const *fun
-#endif
- )
+Context::instrumented_set_property (SCM sym, SCM val, const char*, int, const char*)
{
-#ifndef NDEBUG
- (void) file;
- (void) line;
- (void) fun;
-#endif
+ internal_set_property (sym, val);
+}
+void
+Context::internal_set_property (SCM sym, SCM val)
+{
if (do_internal_type_checking_global)
assert (type_check_assignment (sym, val, ly_symbol2scm ("translation-type?")));
SCM melisma_properties = tr->get_property ("melismaBusyProperties");
bool busy = false;
- for (; scm_is_pair (melisma_properties);
+ for (; !busy && scm_is_pair (melisma_properties);
melisma_properties = scm_cdr (melisma_properties))
busy = busy || to_boolean (tr->internal_get_property (scm_car (melisma_properties)));