Add support for pycdas/pycdc using marshalled code objects

These requires the Python version to be specified as the Pyc header
magic is not present.
This commit is contained in:
clubby789
2022-06-15 11:33:11 +01:00
parent 96ef91b5f9
commit dc50479d06
4 changed files with 144 additions and 14 deletions

View File

@@ -202,6 +202,23 @@ void PycModule::loadFromFile(const char* filename)
m_code = LoadObject(&in, this).require_cast<PycCode>();
}
void PycModule::loadFromMarshalledFile(const char* filename, int major, int minor) {
PycFile in (filename);
if (!in.isOpen()) {
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");
return;
}
setVersion(magic);
m_maj = major;
m_min = minor;
m_code = LoadObject(&in, this).require_cast<PycCode>();
}
PycRef<PycString> PycModule::getIntern(int ref) const
{
if (ref < 0)
@@ -227,3 +244,51 @@ 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