diff --git a/pyc_module.cpp b/pyc_module.cpp index 06bf31c..66745d4 100644 --- a/pyc_module.cpp +++ b/pyc_module.cpp @@ -171,6 +171,20 @@ void PycModule::setVersion(unsigned int magic) } } +bool PycModule::isSupportedVersion(int major, int minor) +{ + switch (major) { + case 1: + return (minor >= 0 && minor <= 6); + case 2: + return (minor >= 0 && minor <= 7); + case 3: + return (minor >= 0 && minor <= 10); + default: + return false; + } +} + void PycModule::loadFromFile(const char* filename) { PycFile in(filename); @@ -209,12 +223,13 @@ void PycModule::loadFromMarshalledFile(const char* filename, int major, int mino fprintf(stderr, "Error opening file %s\n", filename); return; } - PycMagic magic = version_to_magic(major, minor); - if (magic == PycMagic::INVALID) { - fprintf(stderr, "Unsupported version\n"); + if (!isSupportedVersion(major, minor)) { + fprintf(stderr, "Unsupported version %d.%d\n", major, minor); return; } - setVersion(magic); + m_maj = major; + m_min = minor; + m_unicode = (major >= 3); m_code = LoadObject(&in, this).require_cast(); } @@ -243,52 +258,3 @@ PycRef PycModule::getRef(int ref) const throw std::out_of_range("Ref index out of range"); return *it; } - -#define enumVariant(mj, mn) case mn: \ - return PycMagic::MAGIC_ ## mj ## _ ## mn - -PycMagic version_to_magic(int major, int minor) -{ - switch (major) { - case 1: - switch (minor) { - enumVariant(1, 0); - case 1: - case 2: - return PycMagic::MAGIC_1_1; - enumVariant(1, 3); - enumVariant(1, 4); - enumVariant(1, 5); - enumVariant(1, 6); - default: return PycMagic::INVALID; - } - case 2: - switch (minor) { - enumVariant(2, 0); - enumVariant(2, 1); - enumVariant(2, 3); - enumVariant(2, 4); - enumVariant(2, 5); - enumVariant(2, 6); - enumVariant(2, 7); - default: return PycMagic::INVALID; - } - case 3: - switch (minor) { - enumVariant(3, 0); - enumVariant(3, 1); - enumVariant(3, 3); - enumVariant(3, 4); - enumVariant(3, 5); - enumVariant(3, 6); - enumVariant(3, 7); - enumVariant(3, 8); - enumVariant(3, 9); - enumVariant(3, 10); - default: return PycMagic::INVALID; - } - default: - return PycMagic::INVALID; - } -} -#undef enumVariant diff --git a/pyc_module.h b/pyc_module.h index 22830f5..d1c9ed5 100644 --- a/pyc_module.h +++ b/pyc_module.h @@ -37,8 +37,6 @@ enum PycMagic { INVALID = 0, }; -PycMagic version_to_magic(int major, int minor); - class PycModule { public: PycModule() : m_maj(-1), m_min(-1), m_unicode(false) { } @@ -72,6 +70,8 @@ public: void refObject(PycRef str) { m_refs.push_back(str); } PycRef getRef(int ref) const; + static bool isSupportedVersion(int major, int minor); + private: void setVersion(unsigned int magic);