diff options
author | Richard Linden <none@none> | 2010-09-16 00:41:27 -0700 |
---|---|---|
committer | Richard Linden <none@none> | 2010-09-16 00:41:27 -0700 |
commit | 8f51615aa7c8cab8137c82e89446928e3632dc74 (patch) | |
tree | 1d6ca5678b9285b4afa927c90241aa9120237e39 /indra | |
parent | cacade69ce944ede139e5c70c4f9db9f8dac00a1 (diff) |
fixed serialization of choice blocks sometimes including more than one alternative
fixed deserialization of Multiple<Block> leaving dummy blocks around when failing to find matching key
Diffstat (limited to 'indra')
-rw-r--r-- | indra/llxuixml/llinitparam.cpp | 2 | ||||
-rw-r--r-- | indra/llxuixml/llinitparam.h | 25 |
2 files changed, 21 insertions, 6 deletions
diff --git a/indra/llxuixml/llinitparam.cpp b/indra/llxuixml/llinitparam.cpp index 7b6be55ec7..dc4d93d38a 100644 --- a/indra/llxuixml/llinitparam.cpp +++ b/indra/llxuixml/llinitparam.cpp @@ -178,7 +178,7 @@ namespace LLInitParam param_handle_t param_handle = it->second->mParamHandle; const Param* param = getParamFromHandle(param_handle); ParamDescriptor::serialize_func_t serialize_func = it->second->mSerializeFunc; - if (serialize_func) + if (serialize_func && param->getProvided()) { // Ensure this param has not already been serialized // Prevents <rect> from being serialized as its own tag. diff --git a/indra/llxuixml/llinitparam.h b/indra/llxuixml/llinitparam.h index 2d281dd0b8..610381dcfe 100644 --- a/indra/llxuixml/llinitparam.h +++ b/indra/llxuixml/llinitparam.h @@ -1101,24 +1101,28 @@ namespace LLInitParam static bool deserializeParam(Param& param, Parser& parser, const Parser::name_stack_range_t& name_stack, S32 generation) { self_t& typed_param = static_cast<self_t&>(param); + bool new_value = false; if (generation != typed_param.mLastParamGeneration || typed_param.mValues.empty()) { + new_value = true; typed_param.mValues.push_back(value_t()); typed_param.mCachedKeys.push_back(Data()); - typed_param.enclosingBlock().setLastChangedParam(param, true); - typed_param.mLastParamGeneration = generation; } - value_t& value = typed_param.mValues.back(); + value_ref_t value = typed_param.mValues.back(); // attempt to parse block... if(value.deserializeBlock(parser, name_stack)) { + if (new_value) + { // successfully parsed new value, let's keep it + typed_param.mLastParamGeneration = generation; + } + typed_param.enclosingBlock().setLastChangedParam(param, true); typed_param.setProvided(true); return true; } - - if(!NAME_VALUE_LOOKUP::empty()) + else if(!NAME_VALUE_LOOKUP::empty()) { // try to parse a known named value std::string name; @@ -1127,6 +1131,11 @@ namespace LLInitParam // try to parse a per type named value if (NAME_VALUE_LOOKUP::get(name, value)) { + if (new_value) + { // successfully parsed new value, let's keep it + typed_param.mLastParamGeneration = generation; + } + typed_param.mCachedKeys.back().setKey(name); typed_param.mCachedKeys.back().mKeyVersion = value.getLastChangeVersion(); typed_param.enclosingBlock().setLastChangedParam(param, true); @@ -1137,6 +1146,12 @@ namespace LLInitParam } } + if (new_value) + { // failed to parse new value, pop it off + typed_param.mValues.pop_back(); + typed_param.mCachedKeys.pop_back(); + } + return false; } |