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:
@@ -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
|
||||
Reference in New Issue
Block a user