summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <randomdan@akira.random.lan>2014-12-01 16:35:01 +0000
committerDan Goodliffe <randomdan@akira.random.lan>2014-12-01 16:35:01 +0000
commit46293f0046335bd7a207ec6b7d3957e1741f0826 (patch)
tree14f8ea8ab8e4db2fc736ca6e17f64812a21695a5
parentUse char * for logging as it can represent null (diff)
downloadproject2-46293f0046335bd7a207ec6b7d3957e1741f0826.tar.bz2
project2-46293f0046335bd7a207ec6b7d3957e1741f0826.tar.xz
project2-46293f0046335bd7a207ec6b7d3957e1741f0826.zip
Don't cache a pointer to the row state instance, it might move!
-rw-r--r--project2/common/variables.cpp25
1 files changed, 9 insertions, 16 deletions
diff --git a/project2/common/variables.cpp b/project2/common/variables.cpp
index 591a03e..d3e7254 100644
--- a/project2/common/variables.cpp
+++ b/project2/common/variables.cpp
@@ -46,13 +46,16 @@ class VariableParent : public VariableImplDyn {
VariableType value(ExecContext * ec) const
{
try {
- if (!getValue) {
- if (depth > RowState::Stack().size()) {
- throw RowSet::ParentOutOfRange(depth);
- }
- bind(ec, RowState::Stack()[RowState::Stack().size() - depth]);
+ if (depth > RowState::Stack().size()) {
+ throw RowSet::ParentOutOfRange(depth);
+ }
+ const auto & row = RowState::Stack()[RowState::Stack().size() - depth];
+ if (attr) {
+ return row->resolveAttr(name)();
+ }
+ else {
+ return row->getCurrentValue(ec, name);
}
- return getValue();
}
catch (RowSet::ParentOutOfRange) {
if (!defaultValue) {
@@ -68,19 +71,9 @@ class VariableParent : public VariableImplDyn {
}
}
protected:
- void bind(ExecContext * ec, const RowState * row) const
- {
- if (attr) {
- getValue = boost::bind(row->resolveAttr(name));
- }
- else {
- getValue = boost::bind(&RowState::getCurrentValue, row, ec, name);
- }
- }
const size_t depth;
const bool attr;
const Glib::ustring name;
- mutable boost::function0<VariableType> getValue;
};
DECLARE_COMPONENT_LOADER("parent", VariableParent, VariableLoader);