Skip to content
Snippets Groups Projects
Commit 3d1c7231 authored by Xavier Morel's avatar Xavier Morel
Browse files

[ADD] core: 3.9 bytecode instructions in safe_eval


Python 3.9 has 10 new bytecode instructions, for now this commit adds 8

* CONTAINS_OP / IS_OP: moved out of COMPARE_OP which is now only used
  for *rich* comparisons (bpo-39156)
* JUMP_IF_NOT_EXC_MATCH: also moved out of COMPARE_OP for the sole
  purpose of testing exception types
* RERAISE and WITH_EXCEPT_START (bpo-32949) used to simplify the
  context manager bytecode, but RERAISE was then used for
  try/except/finally, we don't support context managers in safe_eval
  so we don't care about the latter
* LIST_TO_TUPLE, LIST_EXTEND, SET_UPDATE, DICT_MERGE and
  DICT_UPDATE (bpo-39320) updates to unpacking (* and **) in various
  contexts
  * LIST_TO_TUPLE we're skipping as it's only used when calling a
    function with two `*arg` parameters (aka `foo(*a, *b)`)
  * SET_UPDATE is used for set literals of 3 or more items or
    unpacking ({*a})
  * LIST_EXTEND is used in the same cases as well as function calls
    with unpacking
  * DICT_MERGE is used for function calls with `**kwargs`
  * DICT_UPDATE is used when unpacking in a dict literal (`{**kw}`)

See odoo/odoo#59980

closes odoo/odoo#62498

Signed-off-by: default avatarXavier Morel (xmo) <xmo@odoo.com>
parent c4a94bc9
No related branches found
No related tags found
No related merge requests found
......@@ -65,6 +65,7 @@ _CONST_OPCODES = set(to_opcodes([
'BUILD_LIST', 'BUILD_MAP', 'BUILD_TUPLE', 'BUILD_SET',
# 3.6: literal map with constant keys https://bugs.python.org/issue27140
'BUILD_CONST_KEY_MAP',
'LIST_EXTEND', 'SET_UPDATE',
])) - _BLACKLIST
# operations which are both binary and inplace, same order as in doc'
......@@ -82,6 +83,9 @@ _EXPR_OPCODES = _CONST_OPCODES.union(to_opcodes([
# comprehensions
'LIST_APPEND', 'MAP_ADD', 'SET_ADD',
'COMPARE_OP',
# specialised comparisons
'IS_OP', 'CONTAINS_OP',
'DICT_MERGE', 'DICT_UPDATE',
])) - _BLACKLIST
_SAFE_OPCODES = _EXPR_OPCODES.union(to_opcodes([
......@@ -106,6 +110,8 @@ _SAFE_OPCODES = _EXPR_OPCODES.union(to_opcodes([
'LOAD_FAST', 'STORE_FAST', 'DELETE_FAST', 'UNPACK_SEQUENCE',
'STORE_SUBSCR',
'LOAD_GLOBAL',
'RERAISE', 'JUMP_IF_NOT_EXC_MATCH',
])) - _BLACKLIST
_logger = logging.getLogger(__name__)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment