
13.08.21 20:24, Guido van Rossum пише:
If these weren't part of the stable ABI, I'd choose (E). But because they are, I think only (A) or (B) are our options. The problem with (C) is that if there's code that links to them but doesn't call them (except in some corner case that the user can avoid), the code won't link even though it would work fine. The problem with (D) is that if it *is* called by code expecting the old signature it will segfault. I'm not keen on (A) since it can cause broken code objects when used to copy a code object with some modified metadata (e.g. a different filename), since there's no way to pass the exception table (and several other fields, but the exception table is an integral part of the code now).
I agree that (A) and (B) are only options if we preserve binary compatibility. For practical reasons I prefer (B). We can make (A) working if add the exception table to the end of the bytecode array and the endline/column tables to the end of the lineno table. It would allow to re-construct the code object with some simple changes (like filename or replace some constants). Creating the code object from zero is version-specific in any case, because bytecode is changed in every version, and semantic of some fields can be changed too (e.g. support of negative offsets in the lineno table). But it would complicate the code object structure and the code that works with it in long term.