summaryrefslogtreecommitdiff
path: root/cpp/src/FreezeScript/DumpDescriptors.cpp
diff options
context:
space:
mode:
authorMark Spruiell <mes@zeroc.com>2004-01-26 21:27:05 +0000
committerMark Spruiell <mes@zeroc.com>2004-01-26 21:27:05 +0000
commit3b7399eeec5af755b40e26a7e2a24c892148ce73 (patch)
treeb12813a47aef67cf2c04a7476acc70f97ac34e53 /cpp/src/FreezeScript/DumpDescriptors.cpp
parentremoving Ice.Daemon (diff)
downloadice-3b7399eeec5af755b40e26a7e2a24c892148ce73.tar.bz2
ice-3b7399eeec5af755b40e26a7e2a24c892148ce73.tar.xz
ice-3b7399eeec5af755b40e26a7e2a24c892148ce73.zip
allow insertion/removal in sequences
Diffstat (limited to 'cpp/src/FreezeScript/DumpDescriptors.cpp')
-rw-r--r--cpp/src/FreezeScript/DumpDescriptors.cpp291
1 files changed, 218 insertions, 73 deletions
diff --git a/cpp/src/FreezeScript/DumpDescriptors.cpp b/cpp/src/FreezeScript/DumpDescriptors.cpp
index d571c99f368..242997c628e 100644
--- a/cpp/src/FreezeScript/DumpDescriptors.cpp
+++ b/cpp/src/FreezeScript/DumpDescriptors.cpp
@@ -424,11 +424,16 @@ FreezeScript::AddDescriptor::AddDescriptor(const DescriptorPtr& parent, int line
target = p->second;
p = attributes.find("key");
- if(p == attributes.end())
+ if(p != attributes.end())
{
- _errorReporter->error("required attribute `key' is missing");
+ _keyStr = p->second;
+ }
+
+ p = attributes.find("index");
+ if(p != attributes.end())
+ {
+ _indexStr = p->second;
}
- _keyStr = p->second;
p = attributes.find("value");
if(p != attributes.end())
@@ -449,8 +454,25 @@ FreezeScript::AddDescriptor::AddDescriptor(const DescriptorPtr& parent, int line
_errorReporter->error("`target' attribute is not an entity: `" + target + "'");
}
- assert(!_keyStr.empty());
- _key = parse(_keyStr);
+ if(!_keyStr.empty() && !_indexStr.empty())
+ {
+ _errorReporter->error("attributes `key' and `index' are mutually exclusive");
+ }
+
+ if(_keyStr.empty() && _indexStr.empty())
+ {
+ _errorReporter->error("one of attributes `key' or `index' is required");
+ }
+
+ if(!_keyStr.empty())
+ {
+ _key = parse(_keyStr);
+ }
+
+ if(!_indexStr.empty())
+ {
+ _index = parse(_indexStr);
+ }
if(!_valueStr.empty())
{
@@ -483,64 +505,128 @@ FreezeScript::AddDescriptor::execute(const SymbolTablePtr& sym, ExecuteInfo*)
_errorReporter->error("target `" + ostr.str() + "' cannot be modified");
}
- DictionaryDataPtr dict = DictionaryDataPtr::dynamicCast(data);
- if(!dict)
+ if(_key)
{
- ostringstream ostr;
- ostr << _target;
- _errorReporter->error("target `" + ostr.str() + "' is not a dictionary");
- }
+ DictionaryDataPtr dict = DictionaryDataPtr::dynamicCast(data);
+ if(!dict)
+ {
+ ostringstream ostr;
+ ostr << _target;
+ _errorReporter->error("target `" + ostr.str() + "' is not a dictionary");
+ }
- Slice::DictionaryPtr type = Slice::DictionaryPtr::dynamicCast(dict->getType());
- assert(type);
+ Slice::DictionaryPtr type = Slice::DictionaryPtr::dynamicCast(dict->getType());
+ assert(type);
- DataPtr key;
- Destroyer<DataPtr> keyDestroyer;
- try
- {
- DataPtr v = _key->evaluate(sym);
- key = _factory->create(type->keyType(), false);
- keyDestroyer.set(key);
- AssignVisitor visitor(v, _factory, _errorReporter, _convert);
- key->visit(visitor);
+ DataPtr key;
+ Destroyer<DataPtr> keyDestroyer;
+ try
+ {
+ DataPtr v = _key->evaluate(sym);
+ key = _factory->create(type->keyType(), false);
+ keyDestroyer.set(key);
+ AssignVisitor visitor(v, _factory, _errorReporter, _convert);
+ key->visit(visitor);
+ }
+ catch(const EvaluateException& ex)
+ {
+ _errorReporter->error("evaluation of key `" + _keyStr + "' failed:\n" + ex.reason());
+ }
+
+ if(dict->getElement(key))
+ {
+ ostringstream ostr;
+ printData(key, ostr);
+ _errorReporter->error("key " + ostr.str() + " already exists in dictionary");
+ }
+
+ DataPtr elem = _factory->create(type->valueType(), false);
+ Destroyer<DataPtr> elemDestroyer(elem);
+
+ DataPtr value;
+ if(_value)
+ {
+ try
+ {
+ value = _value->evaluate(sym);
+ }
+ catch(const EvaluateException& ex)
+ {
+ _errorReporter->error("evaluation of value `" + _valueStr + "' failed:\n" + ex.reason());
+ }
+ }
+
+ if(value)
+ {
+ AssignVisitor visitor(value, _factory, _errorReporter, _convert);
+ elem->visit(visitor);
+ }
+ DataMap& map = dict->getElements();
+ map.insert(DataMap::value_type(key, elem));
+ keyDestroyer.release();
+ elemDestroyer.release();
}
- catch(const EvaluateException& ex)
+ else
{
- _errorReporter->error("evaluation of key `" + _keyStr + "' failed:\n" + ex.reason());
- }
+ assert(_index);
- if(dict->getElement(key))
- {
- ostringstream ostr;
- printData(key, ostr);
- _errorReporter->error("key " + ostr.str() + " already exists in dictionary");
- }
+ SequenceDataPtr seq = SequenceDataPtr::dynamicCast(data);
+ if(!seq)
+ {
+ ostringstream ostr;
+ ostr << _target;
+ _errorReporter->error("target `" + ostr.str() + "' is not a sequence");
+ }
- DataPtr elem = _factory->create(type->valueType(), false);
- Destroyer<DataPtr> elemDestroyer(elem);
+ Slice::SequencePtr type = Slice::SequencePtr::dynamicCast(seq->getType());
+ assert(type);
- DataPtr value;
- if(_value)
- {
+ DataPtr index;
+ Destroyer<DataPtr> indexDestroyer;
try
{
- value = _value->evaluate(sym);
+ index = _index->evaluate(sym);
+ indexDestroyer.set(index);
}
catch(const EvaluateException& ex)
{
- _errorReporter->error("evaluation of value `" + _valueStr + "' failed:\n" + ex.reason());
+ _errorReporter->error("evaluation of index `" + _indexStr + "' failed:\n" + ex.reason());
}
- }
- if(value)
- {
- AssignVisitor visitor(value, _factory, _errorReporter, _convert);
- elem->visit(visitor);
+ DataList& elements = seq->getElements();
+ Ice::Long l = index->integerValue();
+ DataList::size_type i = static_cast<DataList::size_type>(l);
+ if(l < 0 || l > INT_MAX || i > elements.size())
+ {
+ _errorReporter->error("sequence index " + index->toString() + " is out of range");
+ }
+
+ DataPtr elem = _factory->create(type->type(), false);
+ Destroyer<DataPtr> elemDestroyer(elem);
+
+ DataPtr value;
+ if(_value)
+ {
+ try
+ {
+ value = _value->evaluate(sym);
+ }
+ catch(const EvaluateException& ex)
+ {
+ _errorReporter->error("evaluation of value `" + _valueStr + "' failed:\n" + ex.reason());
+ }
+ }
+
+ if(value)
+ {
+ AssignVisitor visitor(value, _factory, _errorReporter, _convert);
+ elem->visit(visitor);
+ }
+
+ elements.insert(elements.begin() + i, elem);
+ indexDestroyer.release();
+ elemDestroyer.release();
}
- DataMap& map = dict->getElements();
- map.insert(DataMap::value_type(key, elem));
- keyDestroyer.release();
- elemDestroyer.release();
}
//
@@ -564,11 +650,26 @@ FreezeScript::RemoveDescriptor::RemoveDescriptor(const DescriptorPtr& parent, in
target = p->second;
p = attributes.find("key");
- if(p == attributes.end())
+ if(p != attributes.end())
{
- _errorReporter->error("required attribute `key' is missing");
+ _keyStr = p->second;
+ }
+
+ p = attributes.find("index");
+ if(p != attributes.end())
+ {
+ _indexStr = p->second;
+ }
+
+ if(!_keyStr.empty() && !_indexStr.empty())
+ {
+ _errorReporter->error("attributes `key' and `index' are mutually exclusive");
+ }
+
+ if(_keyStr.empty() && _indexStr.empty())
+ {
+ _errorReporter->error("one of attributes `key' or `index' is required");
}
- _keyStr = p->second;
NodePtr node = parse(target);
_target = EntityNodePtr::dynamicCast(node);
@@ -577,7 +678,15 @@ FreezeScript::RemoveDescriptor::RemoveDescriptor(const DescriptorPtr& parent, in
_errorReporter->error("`target' attribute is not an entity: `" + target + "'");
}
- _key = parse(_keyStr);
+ if(!_keyStr.empty())
+ {
+ _key = parse(_keyStr);
+ }
+
+ if(!_indexStr.empty())
+ {
+ _index = parse(_indexStr);
+ }
}
void
@@ -597,16 +706,6 @@ FreezeScript::RemoveDescriptor::execute(const SymbolTablePtr& sym, ExecuteInfo*)
{
DescriptorErrorContext ctx(_errorReporter, "remove", _line);
- DataPtr key;
- try
- {
- key = _key->evaluate(sym);
- }
- catch(const EvaluateException& ex)
- {
- _errorReporter->error("evaluation of key `" + _keyStr + "' failed:\n" + ex.reason());
- }
-
DataPtr data = sym->getValue(_target);
if(data->readOnly())
{
@@ -615,21 +714,67 @@ FreezeScript::RemoveDescriptor::execute(const SymbolTablePtr& sym, ExecuteInfo*)
_errorReporter->error("target `" + ostr.str() + "' cannot be modified");
}
- DictionaryDataPtr dict = DictionaryDataPtr::dynamicCast(data);
- if(!dict)
+ if(_key)
{
- ostringstream ostr;
- ostr << _target;
- _errorReporter->error("target `" + ostr.str() + "' is not a dictionary");
- }
+ DataPtr key;
+ try
+ {
+ key = _key->evaluate(sym);
+ }
+ catch(const EvaluateException& ex)
+ {
+ _errorReporter->error("evaluation of key `" + _keyStr + "' failed:\n" + ex.reason());
+ }
- DataMap& map = dict->getElements();
- DataMap::iterator p = map.find(key);
- if(p != map.end())
+ DictionaryDataPtr dict = DictionaryDataPtr::dynamicCast(data);
+ if(!dict)
+ {
+ ostringstream ostr;
+ ostr << _target;
+ _errorReporter->error("target `" + ostr.str() + "' is not a dictionary");
+ }
+
+ DataMap& map = dict->getElements();
+ DataMap::iterator p = map.find(key);
+ if(p != map.end())
+ {
+ p->first->destroy();
+ p->second->destroy();
+ map.erase(p);
+ }
+ }
+ else
{
- p->first->destroy();
- p->second->destroy();
- map.erase(p);
+ assert(_index);
+
+ DataPtr index;
+ try
+ {
+ index = _index->evaluate(sym);
+ }
+ catch(const EvaluateException& ex)
+ {
+ _errorReporter->error("evaluation of index `" + _indexStr + "' failed:\n" + ex.reason());
+ }
+
+ SequenceDataPtr seq = SequenceDataPtr::dynamicCast(data);
+ if(!seq)
+ {
+ ostringstream ostr;
+ ostr << _target;
+ _errorReporter->error("target `" + ostr.str() + "' is not a sequence");
+ }
+
+ DataList& elements = seq->getElements();
+ Ice::Long l = index->integerValue();
+ DataList::size_type i = static_cast<DataList::size_type>(l);
+ if(l < 0 || l > INT_MAX || i >= elements.size())
+ {
+ _errorReporter->error("sequence index " + index->toString() + " is out of range");
+ }
+
+ elements[i]->destroy();
+ elements.erase(elements.begin() + i);
}
}