diff --git a/codetransformer/code.py b/codetransformer/code.py index c576206..05a640c 100644 --- a/codetransformer/code.py +++ b/codetransformer/code.py @@ -218,6 +218,7 @@ def _freevar_argname(arg, cellvars, freevars): def pycode(argcount, + posonlyargcount, kwonlyargcount, nlocals, stacksize, @@ -238,23 +239,43 @@ def pycode(argcount, -------- types.CodeType """ - return CodeType( - argcount, - kwonlyargcount, - nlocals, - stacksize, - flags, - codestring, - constants, - names, - varnames, - filename, - name, - firstlineno, - lnotab, - freevars, - cellvars, - ) + if hasattr(CodeType, "co_posonlyargcount"): + return CodeType( + argcount, + posonlyargcount, # new in 3.8 + kwonlyargcount, + nlocals, + stacksize, + flags, + codestring, + constants, + names, + varnames, + filename, + name, + firstlineno, + lnotab, + freevars, + cellvars, + ) + else: + return CodeType( + argcount, + kwonlyargcount, + nlocals, + stacksize, + flags, + codestring, + constants, + names, + varnames, + filename, + name, + firstlineno, + lnotab, + freevars, + cellvars, + ) class Code: @@ -581,22 +602,23 @@ def to_pycode(self): # with wordcode, all instructions are padded to 2 bytes bc.append(0) - return CodeType( - self.argcount, - self.kwonlyargcount, - len(varnames), - self.stacksize, - self.py_flags, - bytes(bc), - consts, - names, - varnames, - self.filename, - self.name, - self.firstlineno, - self.py_lnotab, - freevars, - cellvars, + return pycode( + argcount=self.argcount, + posonlyargcount=0, + kwonlyargcount=self.kwonlyargcount, + nlocals=len(varnames), + stacksize=self.stacksize, + flags=self.py_flags, + codestring=bytes(bc), + constants=consts, + names=names, + varnames=varnames, + filename=self.filename, + name=self.name, + firstlineno=self.firstlineno, + lnotab=self.py_lnotab, + freevars=freevars, + cellvars=cellvars ) @property diff --git a/codetransformer/tests/test_code.py b/codetransformer/tests/test_code.py index f9135e8..85ba858 100644 --- a/codetransformer/tests/test_code.py +++ b/codetransformer/tests/test_code.py @@ -154,6 +154,7 @@ def test_code_flags(sample_flags): code = Code.from_pycode(pycode( argcount=0, + posonlyargcount=0, kwonlyargcount=0, nlocals=2, stacksize=0,