Merge pull request #285 from zrax/simplify_marshal_version
Simplify and improve version setting for marshalled code objects
This commit is contained in:
@@ -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
|
||||
|
@@ -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);
|
||||
|
||||
|
Reference in New Issue
Block a user