summaryrefslogtreecommitdiff
path: root/cpp
diff options
context:
space:
mode:
authorJose <jose@zeroc.com>2017-01-31 11:25:53 +0100
committerJose <jose@zeroc.com>2017-01-31 11:25:53 +0100
commitb5bf5eb1c4bc08f10358a61e13077b50cebdb0ae (patch)
treeaeec63c2046341ae182710181d164b887e23f7e3 /cpp
parentPython test failures (diff)
downloadice-b5bf5eb1c4bc08f10358a61e13077b50cebdb0ae.tar.bz2
ice-b5bf5eb1c4bc08f10358a61e13077b50cebdb0ae.tar.xz
ice-b5bf5eb1c4bc08f10358a61e13077b50cebdb0ae.zip
Fixes to Python metadata validation
Diffstat (limited to 'cpp')
-rw-r--r--cpp/src/Slice/PythonUtil.cpp53
1 files changed, 31 insertions, 22 deletions
diff --git a/cpp/src/Slice/PythonUtil.cpp b/cpp/src/Slice/PythonUtil.cpp
index 9dc1830cb1b..1f08d85232e 100644
--- a/cpp/src/Slice/PythonUtil.cpp
+++ b/cpp/src/Slice/PythonUtil.cpp
@@ -68,7 +68,7 @@ private:
//
// Validates sequence metadata.
//
- void validateSequence(const string&, const string&, const TypePtr&, const StringList&);
+ StringList validateSequence(const string&, const string&, const TypePtr&, const StringList&);
//
// Checks a definition that doesn't currently support Python metadata.
@@ -2997,23 +2997,21 @@ Slice::Python::MetaDataVisitor::visitUnitStart(const UnitPtr& p)
DefinitionContextPtr dc = p->findDefinitionContext(file);
assert(dc);
StringList globalMetaData = dc->getMetaData();
- for(StringList::const_iterator r = globalMetaData.begin(); r != globalMetaData.end(); ++r)
+ for(StringList::const_iterator r = globalMetaData.begin(); r != globalMetaData.end();)
{
- string s = *r;
- if(_history.count(s) == 0)
+ string s = *r++;
+ if(s.find(prefix) == 0)
{
- _history.insert(s);
- if(s.find(prefix) == 0)
+ static const string packagePrefix = "python:package:";
+ if(s.find(packagePrefix) == 0 && s.size() > packagePrefix.size())
{
- static const string packagePrefix = "python:package:";
- if(s.find(packagePrefix) == 0 && s.size() > packagePrefix.size())
- {
- continue;
- }
- emitWarning(file, "", "ignoring invalid global metadata `" + s + "'");
+ continue;
}
+ emitWarning(file, "", "ignoring invalid global metadata `" + s + "'");
+ globalMetaData.remove(s);
}
}
+ dc->setMetaData(globalMetaData);
}
return true;
}
@@ -3081,6 +3079,7 @@ Slice::Python::MetaDataVisitor::visitSequence(const SequencePtr& p)
StringList metaData = p->getMetaData();
const string file = p->file();
const string line = p->line();
+ StringList protobufMetaData;
for(StringList::const_iterator q = metaData.begin(); q != metaData.end(); )
{
string s = *q++;
@@ -3090,17 +3089,22 @@ Slice::Python::MetaDataVisitor::visitSequence(const SequencePtr& p)
// Remove from list so validateSequence does not try to handle as well.
//
metaData.remove(s);
-
BuiltinPtr builtin = BuiltinPtr::dynamicCast(p->type());
if(!builtin || builtin->kind() != Builtin::KindByte)
{
emitWarning(file, line, "ignoring invalid metadata `" + s + ": " +
"`protobuf' encoding must be a byte sequence");
}
+ else
+ {
+ protobufMetaData.push_back(s);
+ }
}
}
- validateSequence(file, line, p, metaData);
+ metaData = validateSequence(file, line, p, metaData);
+ metaData.insert(metaData.end(), protobufMetaData.begin(), protobufMetaData.end());
+ p->setMetaData(metaData);
}
void
@@ -3121,15 +3125,15 @@ Slice::Python::MetaDataVisitor::visitConst(const ConstPtr& p)
reject(p);
}
-void
+StringList
Slice::Python::MetaDataVisitor::validateSequence(const string& file, const string& line,
- const TypePtr& type, const StringList& meta)
+ const TypePtr& type, const StringList& metaData)
{
static const string prefix = "python:";
-
- for(StringList::const_iterator p = meta.begin(); p != meta.end(); ++p)
+ StringList newMetaData = metaData;
+ for(StringList::const_iterator p = newMetaData.begin(); p != newMetaData.end();)
{
- string s = *p;
+ string s = *p++;
if(s.find(prefix) == 0)
{
string::size_type pos = s.find(':', prefix.size());
@@ -3146,8 +3150,10 @@ Slice::Python::MetaDataVisitor::validateSequence(const string& file, const strin
}
}
emitWarning(file, line, "ignoring invalid metadata `" + s + "'");
+ newMetaData.remove(s);
}
}
+ return newMetaData;
}
void
@@ -3155,11 +3161,14 @@ Slice::Python::MetaDataVisitor::reject(const ContainedPtr& cont)
{
StringList localMetaData = cont->getMetaData();
static const string prefix = "python:";
- for(StringList::const_iterator p = localMetaData.begin(); p != localMetaData.end(); ++p)
+ for(StringList::const_iterator p = localMetaData.begin(); p != localMetaData.end();)
{
- if(p->find(prefix) == 0)
+ string s = *p++;
+ if(s.find(prefix) == 0)
{
- emitWarning(cont->file(), cont->line(), "ignoring invalid metadata `" + *p + "'");
+ emitWarning(cont->file(), cont->line(), "ignoring invalid metadata `" + s + "'");
+ localMetaData.remove(s);
}
}
+ cont->setMetaData(localMetaData);
}