Parse exception table

This commit is contained in:
Sahil Jain
2025-07-15 22:33:30 +05:30
parent a267bfb47f
commit e8e10f1419
5 changed files with 67 additions and 5 deletions

View File

@@ -128,3 +128,44 @@ PycRef<PycString> PycCode::getCellVar(PycModule* mod, int idx) const
? m_freeVars->get(idx - m_cellVars->size()).cast<PycString>()
: m_cellVars->get(idx).cast<PycString>();
}
int _parse_varint(PycBuffer& data, int& pos) {
int b = data.getByte();
pos += 1;
int val = b & 63;
while (b & 64) {
val <<= 6;
b = data.getByte();
pos += 1;
val |= (b & 63);
}
return val;
}
std::vector<PycCode::exception_table_entry_t> PycCode::exceptTableEntries() const
{
PycBuffer data(m_exceptTable->value(), m_exceptTable->length());
std::vector<exception_table_entry_t> entries;
int pos = 0;
while (!data.atEof()) {
int start = _parse_varint(data, pos) * 2;
int length = _parse_varint(data, pos) * 2;
int end = start + length;
int target = _parse_varint(data, pos) * 2;
int dl = _parse_varint(data, pos);
int depth = dl >> 1;
bool lasti = bool(dl & 1);
entries.emplace_back(start, end, target, depth, lasti);
}
return entries;
}