summaryrefslogtreecommitdiff
path: root/cpp/src/Slice/PythonUtil.cpp
diff options
context:
space:
mode:
authorJose <pepone@users.noreply.github.com>2018-11-08 18:07:04 +0100
committerGitHub <noreply@github.com>2018-11-08 18:07:04 +0100
commit8547e0b073feb47e690c7941488e524254658fb7 (patch)
tree3731c2469753c26957f8b57a30907441c3ebf0d2 /cpp/src/Slice/PythonUtil.cpp
parentAdd check for old Gradle versions (diff)
downloadice-8547e0b073feb47e690c7941488e524254658fb7.tar.bz2
ice-8547e0b073feb47e690c7941488e524254658fb7.tar.xz
ice-8547e0b073feb47e690c7941488e524254658fb7.zip
Memoryview (#271)
Enhance support for buffer objects in Python Close #208
Diffstat (limited to 'cpp/src/Slice/PythonUtil.cpp')
-rw-r--r--cpp/src/Slice/PythonUtil.cpp44
1 files changed, 40 insertions, 4 deletions
diff --git a/cpp/src/Slice/PythonUtil.cpp b/cpp/src/Slice/PythonUtil.cpp
index 1e5d38037bf..5c9b9cc8515 100644
--- a/cpp/src/Slice/PythonUtil.cpp
+++ b/cpp/src/Slice/PythonUtil.cpp
@@ -3296,18 +3296,54 @@ Slice::Python::MetaDataVisitor::validateSequence(const string& file, const strin
string s = *p++;
if(s.find(prefix) == 0)
{
- string::size_type pos = s.find(':', prefix.size());
- if(pos != string::npos && s.substr(prefix.size(), pos - prefix.size()) == "seq")
+ SequencePtr seq = SequencePtr::dynamicCast(type);
+ if(seq)
{
static const string seqPrefix = "python:seq:";
- string arg = s.substr(seqPrefix.size(), pos - seqPrefix.size());
- if(SequencePtr::dynamicCast(type))
+ if(s.find(seqPrefix) == 0)
{
+ string arg = s.substr(seqPrefix.size());
if(arg == "tuple" || arg == "list" || arg == "default")
{
continue;
}
}
+ else if(s.size() > prefix.size())
+ {
+ string arg = s.substr(prefix.size());
+ if(arg == "tuple" || arg == "list" || arg == "default")
+ {
+ continue;
+ }
+ else if(arg == "array.array" || arg == "numpy.ndarray" || arg.find("memoryview:") == 0)
+ {
+ //
+ // The memoryview sequence metadata is only valid for integral builtin
+ // types excluding strings.
+ //
+ BuiltinPtr builtin = BuiltinPtr::dynamicCast(seq->type());
+ if(builtin)
+ {
+ switch(builtin->kind())
+ {
+ case Builtin::KindBool:
+ case Builtin::KindByte:
+ case Builtin::KindShort:
+ case Builtin::KindInt:
+ case Builtin::KindLong:
+ case Builtin::KindFloat:
+ case Builtin::KindDouble:
+ {
+ continue;
+ }
+ default:
+ {
+ break;
+ }
+ }
+ }
+ }
+ }
}
dc->warning(InvalidMetaData, file, line, "ignoring invalid metadata `" + s + "'");
newMetaData.remove(s);