Simplify and improve version setting for marshalled code objects:

* Use a simpler check for validity -- the reverse magic number mapping was
  unnecessary and missed some cases (2.2, 3.2).
* Set the version directly after it is checked for validity.
* Fix unicode flag setting on Python 3.x.
This commit is contained in:
Michael Hansen
2022-10-04 14:51:23 -07:00
parent 4951905f83
commit 8590d67d29
2 changed files with 21 additions and 55 deletions

View File

@@ -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<PycCode>();
}
@@ -243,52 +258,3 @@ PycRef<PycObject> 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

View File

@@ -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<PycObject> str) { m_refs.push_back(str); }
PycRef<PycObject> getRef(int ref) const;
static bool isSupportedVersion(int major, int minor);
private:
void setVersion(unsigned int magic);