/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2004--2011 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 2004--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#include "main.hh"
#include "simple-closure.hh"
#include "spanner.hh"
+#include "unpure-pure-container.hh"
#include "warn.hh"
/*
target_alist = scm_acons (symbol, new_value, target_alist);
bool ok = true;
- if (!ly_is_procedure (new_value)
- && !is_simple_closure (new_value))
- ok = type_check_assignment (symbol, new_value,
- ly_symbol2scm ("backend-type?"));
+ bool pc = is_unpure_pure_container (new_value);
+ SCM vals[] = {pc ? unpure_pure_container_unpure_part (new_value) : new_value,
+ pc ? unpure_pure_container_pure_part (new_value) : SCM_BOOL_F
+ };
+
+ for (int i = 0; i < 2; i++)
+ if (!ly_is_procedure (vals[i])
+ && !is_simple_closure (vals[i]))
+ ok = ok && type_check_assignment (symbol, vals[i],
+ ly_symbol2scm ("backend-type?"));
/*
tack onto alist. We can use set_car, since
void
apply_property_operations (Context *tg, SCM pre_init_ops)
{
- SCM correct_order = scm_reverse (pre_init_ops);
- for (SCM s = correct_order; scm_is_pair (s); s = scm_cdr (s))
+ for (SCM s = pre_init_ops; scm_is_pair (s); s = scm_cdr (s))
{
SCM entry = scm_car (s);
SCM type = scm_car (entry);
entry = scm_cdr (entry);
+ if (!scm_is_pair (entry))
+ continue;
+ SCM context_prop = scm_car (entry);
+ if (scm_is_pair (context_prop))
+ {
+ if (tg->is_alias (scm_car (context_prop)))
+ context_prop = scm_cdr (context_prop);
+ else
+ continue;
+ }
if (type == ly_symbol2scm ("push"))
{
- SCM context_prop = scm_car (entry);
SCM val = scm_cadr (entry);
SCM grob_prop_path = scm_cddr (entry);
sloppy_general_pushpop_property (tg, context_prop, grob_prop_path, val);
}
else if (type == ly_symbol2scm ("pop"))
{
- SCM context_prop = scm_car (entry);
SCM val = SCM_UNDEFINED;
SCM grob_prop_path = scm_cdr (entry);
sloppy_general_pushpop_property (tg, context_prop, grob_prop_path, val);
}
else if (type == ly_symbol2scm ("assign"))
- tg->set_property (scm_car (entry), scm_cadr (entry));
+ tg->set_property (context_prop, scm_cadr (entry));
+ else if (type == ly_symbol2scm ("apply"))
+ scm_apply_1 (context_prop, tg->self_scm (), scm_cdr (entry));
}
}