【发布时间】:2017-08-29 09:29:09
【问题描述】:
testing on ../../test/test_patm.py
python: Python/compile.c:4420: int assemble_lnotab(struct assembler *,
struct instr *): Assertion `d_lineno >= 0' failed.
Aborted
在运行我的测试程序时,我收到了上面给出的错误。 最后我发现Python3.5和Python3.6的源代码差别很小。 只有一行:
Python3.5
static int
assemble_lnotab(struct assembler *a, struct instr *i)
{
int d_bytecode, d_lineno;
Py_ssize_t len;
unsigned char *lnotab;
d_bytecode = a->a_offset - a->a_lineno_off;
d_lineno = i->i_lineno - a->a_lineno;
assert(d_bytecode >= 0);
assert(d_lineno >= 0); // the only difference
if(d_bytecode == 0 && d_lineno == 0)
return 1;
...
Python 3.6
static int
assemble_lnotab(struct assembler *a, struct instr *i)
{
int d_bytecode, d_lineno;
Py_ssize_t len;
unsigned char *lnotab;
d_bytecode = (a->a_offset - a->a_lineno_off) * sizeof(_Py_CODEUNIT);
d_lineno = i->i_lineno - a->a_lineno;
assert(d_bytecode >= 0);
if(d_bytecode == 0 && d_lineno == 0)
return 1;
如果我刚刚删除了assert(d_lineno >= 0);,会怎样?
【问题讨论】:
-
我看到另一个区别,
d_bytecode乘以sizeof(_Py_CODEUNIT)。 -
@MartijnPieters 这是它的定义。
typedef uint16_t _Py_CODEUNIT; -
那么你的代码是什么,为什么会触发断言错误呢?我不会从 Python 代码中删除断言,不,它表明你有一个错误 elsewhere。
-
你在 3.6 上测试过你的程序吗?
-
@MartijnPieters 为什么我的代码导致这个问题是我没有更改ast的
lineno,它可能看起来不正确,但它不会导致Python3.6中的任何错误!
标签: python c python-3.x python-internals