Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions tests/functional/builtins/codegen/test_abi_decode.py
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,20 @@ def foo(x: Bytes[{input_len}]) -> {output_typ}:
assert c.foo(encoded) == expected


def test_abi_decode_folded_unwrap_tuple_kwarg(get_contract):
contract = """
UNWRAP: constant(bool) = False

@external
def foo(x: Bytes[64]) -> Bytes[3]:
return abi_decode(x, Bytes[3], unwrap_tuple=UNWRAP)
"""
c = get_contract(contract)

encoded = abi.encode("bytes", b"vyx")
assert c.foo(encoded) == b"vyx"


@pytest.mark.parametrize(
"arg,expected,input_len,output_typ1,output_typ2,abi_typ",
[
Expand Down
20 changes: 20 additions & 0 deletions tests/functional/syntax/test_print.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import pytest

from vyper import compiler
from vyper.compiler.settings import Settings
from vyper.utils import method_id_int

valid_list = [
"""
Expand Down Expand Up @@ -79,3 +81,21 @@ def foo():
@pytest.mark.parametrize("good_code", valid_list)
def test_print_syntax(good_code):
assert compiler.compile_code(good_code) is not None


def test_print_folded_hardhat_compat_kwarg():
code = """
HARDHAT_COMPAT: constant(bool) = True

@external
def foo(x: uint256):
print(x, hardhat_compat=HARDHAT_COMPAT)
"""

out = compiler.compile_code(
code, output_formats=["ir_runtime"], settings=Settings(experimental_codegen=True)
)
ir_runtime = str(out["ir_runtime"])

assert f"0x{method_id_int('log(uint256)'):08x}" in ir_runtime
assert f"0x{method_id_int('log(string,bytes)'):08x}" not in ir_runtime
26 changes: 26 additions & 0 deletions tests/unit/compiler/venom/test_builtin_kwargs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import pytest

from vyper import ast as vy_ast
from vyper.codegen_venom.builtins.abi import _get_bool_kwarg as get_abi_bool_kwarg
from vyper.codegen_venom.builtins.misc import _get_bool_kwarg as get_misc_bool_kwarg
from vyper.exceptions import CompilerPanic


def _call_node(source):
return vy_ast.parse_to_ast(source).body[0].value


@pytest.mark.parametrize("get_bool_kwarg", [get_abi_bool_kwarg, get_misc_bool_kwarg])
def test_bool_kwarg_uses_reduced_value(get_bool_kwarg):
call_node = _call_node("foo(flag=FLAG)")
call_node.keywords[0].value._set_folded_value(vy_ast.NameConstant(value=False))

assert get_bool_kwarg(call_node, "flag", True) is False


@pytest.mark.parametrize("get_bool_kwarg", [get_abi_bool_kwarg, get_misc_bool_kwarg])
def test_bool_kwarg_rejects_unreduced_value(get_bool_kwarg):
call_node = _call_node("foo(flag=FLAG)")

with pytest.raises(CompilerPanic, match="unfoldable boolean kwarg: flag"):
get_bool_kwarg(call_node, "flag", True)
4 changes: 3 additions & 1 deletion vyper/codegen_venom/builtins/abi.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from vyper.codegen_venom.abi import abi_decode_to_buf, abi_encode_to_buf
from vyper.codegen_venom.buffer import Buffer, Ptr
from vyper.codegen_venom.value import VyperValue
from vyper.exceptions import CompilerPanic
from vyper.semantics.data_locations import DataLocation
from vyper.semantics.types import BytesT, TupleT
from vyper.utils import fourbytes_to_int
Expand All @@ -37,13 +38,14 @@ def _get_bool_kwarg(node: vy_ast.Call, kwarg_name: str, default: bool) -> bool:
kw_node = _get_kwarg_value(node, kwarg_name)
if kw_node is None:
return default
kw_node = kw_node.reduced()
# The value should be a NameConstant (True/False)
if isinstance(kw_node, vy_ast.NameConstant):
return kw_node.value
# Could also be an Int with constant value
if isinstance(kw_node, vy_ast.Int):
return bool(kw_node.value)
return default
raise CompilerPanic(f"unfoldable boolean kwarg: {kwarg_name}", kw_node)


def _parse_method_id(method_id_node: vy_ast.VyperNode) -> Optional[int]:
Expand Down
5 changes: 3 additions & 2 deletions vyper/codegen_venom/builtins/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from vyper.codegen_venom.abi.abi_encoder import abi_encode_to_buf
from vyper.codegen_venom.constants import BLOCKHASH_LOOKBACK_LIMIT, ECRECOVER_PRECOMPILE
from vyper.evm.opcodes import version_check
from vyper.exceptions import EvmVersionException
from vyper.exceptions import CompilerPanic, EvmVersionException
from vyper.semantics.types import BytesT, DecimalT, StringT, TupleT
from vyper.utils import DECIMAL_DIVISOR, method_id_int
from vyper.venom.basicblock import IRLiteral, IROperand, IRVariable
Expand Down Expand Up @@ -389,11 +389,12 @@ def _get_bool_kwarg(node: vy_ast.Call, kwarg_name: str, default: bool) -> bool:
kw_node = _get_kwarg_value(node, kwarg_name)
if kw_node is None:
return default
kw_node = kw_node.reduced()
if isinstance(kw_node, vy_ast.NameConstant):
return kw_node.value
if isinstance(kw_node, vy_ast.Int):
return bool(kw_node.value)
return default
raise CompilerPanic(f"unfoldable boolean kwarg: {kwarg_name}", kw_node)


def _create_tuple_in_memory(
Expand Down
Loading