diff options
author | Jose <pepone@users.noreply.github.com> | 2018-11-08 18:07:04 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-08 18:07:04 +0100 |
commit | 8547e0b073feb47e690c7941488e524254658fb7 (patch) | |
tree | 3731c2469753c26957f8b57a30907441c3ebf0d2 /cpp/src/Slice/PythonUtil.cpp | |
parent | Add check for old Gradle versions (diff) | |
download | ice-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.cpp | 44 |
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); |