# (C) Copyright 2017, 2020, 2023, 2025 by Rocky Bernstein
"""
PYPY 2.7 opcodes

This is a like Python 2.7's opcode.py with some classification
of stack usage.
"""
import sys

import xdis.opcodes.opcode_2x.opcode_27 as opcode_27
from xdis.opcodes.base import (
    def_op,
    finalize_opcodes,
    init_opdata,
    jrel_op,
    name_op,
    nargs_op,
    update_pj3,
)
from xdis.opcodes.opcode_2x.opcode_2x import (
    opcode_extended_fmt_base2x,
    update_arg_fmt_base2x,
)
from xdis.version_info import PythonImplementation

version_tuple = (2, 7)
python_implementation = PythonImplementation("PyPy")

loc = locals()

init_opdata(loc, opcode_27, version_tuple, is_pypy=True)

# FIXME: DRY common PYPY opcode additions

# PyPy only
# ----------
name_op(loc, "LOOKUP_METHOD", 201, 1, 2)
nargs_op(loc, "CALL_METHOD", 202, -1, 1)
loc["hasnargs"].append(202)

# Used only in single-mode compilation list-comprehension generators
def_op(loc, "BUILD_LIST_FROM_ARG", 203)

# Used only in assert statements
jrel_op(loc, "JUMP_IF_NOT_DEBUG", 204, conditional=True)


# PyPy 2.7.13 (and 3.6.1) start to introduce LOAD_REVDB_VAR

if sys.version_info[:3] >= (2, 7, 13) and sys.version_info[4] >= 42:
    def_op(loc, "LOAD_REVDB_VAR", 205)

# There are no opcodes to remove or change.
# If there were, they'd be listed below.

opcode_arg_fmt = update_arg_fmt_base2x.copy()
opcode_extended_fmt = opcode_extended_fmt12 = opcode_extended_fmt_base2x.copy()

# FIXME remove (fix uncompyle6)
update_pj3(globals(), loc)
finalize_opcodes(loc)
