Le dim. 5 avr. 2020 à 23:07, Skip Montanaro <skip.montan...@gmail.com> a écrit :
> I'm trying it the simplest way I can think of. Registers are exactly
> like local variables, so SETLOCAL Py_XDECREFs whatever is already
> there before overwriting it with a new value. At the end of
> _PyEval_EvalFrameDefault if the code object's co_flags includes the
> (new) CO_REGISTER flag, it loops over the stack/register space calling
> Py_CLEAR. The stack/register space is also Py_CLEAR'd when the frame
> is first allocated.

Let's say that you call "func()". The stack-based bytecode "LOAD_GLOAL
0; CALL_FUNC 0" becomes register-based bytecode "LOAD_GLOBAL_REG %r1,
0; CALL_FUNC_REG %r2, %r1": the function result is stored into %r2
register.

The problem is that if the %r2 is not cleared explicitly, you change
the object lifetime and so the Python semantics. The register %r2 must
be cleared explicitly.

Same issue applies for %r1 (which stores a global variable).

The correct code should be "LOAD_GLOBAL_REG %r1, 0; CALL_FUNC_REG %r2,
%r1; CLEAR_REG %r1; CLEAR_REG %r2".

A compiler can optimize it to: "LOAD_GLOBAL_REG %r1, 0; CALL_FUNC_REG
%r1, %r1; CLEAR_REG %r1" (remove %r2: reuse %r1).

For example, I expect to get immediately a ResourceWarning when
running the following script demo.py with python3 -Wd demo.py:
---
import time

def func():
    open("/etc/issue")

func()
# ResourceWarning expected here
time.sleep(60)
---

Victor
-- 
Night gathers, and now my watch begins. It shall not end until my death.
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/python-dev@python.org/message/72Q5GNAX42TWSR4PKAVPNDQDAJHWW3KL/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to