Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix[ux]: remove side effects in compare_type for bytestrings #3379

Open
wants to merge 68 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
30c54db
try what happens
tserg Apr 29, 2023
1212c50
minor fix
tserg Apr 30, 2023
135629e
try fix
tserg Apr 30, 2023
c87630c
fix lint
tserg Apr 30, 2023
809278a
update comment
tserg May 1, 2023
2cc75ef
handle nested bytestrings
tserg May 1, 2023
59c8f78
fix lint
tserg May 1, 2023
40077ea
try aggressive overriding of contract function return type
tserg May 1, 2023
b7e52c5
undo changes
tserg May 1, 2023
9f9981e
undo changes
tserg May 1, 2023
b07efdd
add widening test
tserg May 5, 2023
77cdd99
Merge branch 'master' of https://github.com/vyperlang/vyper into fix/…
tserg May 5, 2023
ace4367
check for propagated type
tserg May 5, 2023
44e0023
widen bytestring by deriving larger type
tserg May 5, 2023
f4060d7
remove _min_length; add _is_literal
tserg May 6, 2023
828929a
update comment
tserg May 6, 2023
cc1d76a
fix formatting
tserg May 6, 2023
7fcbacd
improve comment
tserg May 6, 2023
36028c2
use length instead of _length
tserg May 6, 2023
1b5a390
add comment
tserg May 6, 2023
00c26cf
fix lint
tserg May 6, 2023
2cc968e
Merge branch 'master' of https://github.com/vyperlang/vyper into fix/…
tserg Nov 8, 2023
014e989
fix literal cmp
tserg Nov 8, 2023
c1a9bbc
uncomment
tserg Nov 8, 2023
38e94d2
fix wip
tserg Nov 9, 2023
013e594
Merge branch 'master' of https://github.com/vyperlang/vyper into fix/…
tserg Nov 9, 2023
9ce8c4a
fix test
tserg Nov 9, 2023
1cb5066
fix any syntax
tserg Nov 9, 2023
5d6ad38
fix comment
tserg Nov 9, 2023
114973d
rename helper; change semantics
tserg Nov 9, 2023
eb8ffc5
fix lint
tserg Nov 9, 2023
ba527d3
add is_from_abi attr
tserg Nov 11, 2023
50e5000
remove set_length fn
tserg Nov 11, 2023
a325b99
fix slice
tserg Nov 12, 2023
d4d598a
fix lint
tserg Nov 12, 2023
8e8f204
remove is_literal
tserg Nov 12, 2023
6d29d1b
fix compare_type
tserg Nov 12, 2023
b175311
revert overwriting of ContractFunctionT return typ
tserg Nov 12, 2023
5a8490e
add comment
tserg Nov 12, 2023
ac9b222
fix lint
tserg Nov 12, 2023
e788797
wip - review
charles-cooper Nov 20, 2023
b33c878
fix lint
charles-cooper Nov 20, 2023
4a2744f
fix some return types
charles-cooper Nov 20, 2023
8b537c4
fix return type for call stmts
tserg Nov 20, 2023
27490e3
Merge branch 'master' into fix/bytestring_compare_type
charles-cooper Dec 7, 2023
a44779b
rename to _any_compare_type
charles-cooper Dec 7, 2023
1208ae1
fix lint
charles-cooper Dec 7, 2023
832f17b
rename fetch_call_return to get_return_type
charles-cooper Dec 7, 2023
23ef9d1
fix some signatures
charles-cooper Dec 8, 2023
8c82d1d
Merge branch 'master' of https://github.com/vyperlang/vyper into fix/…
tserg Dec 18, 2023
87096e2
Merge branch 'fix/bytestring_compare_type' of https://github.com/tser…
tserg Dec 18, 2023
f3553f5
fix lint
tserg Dec 18, 2023
ce5b120
fix more lint
tserg Dec 18, 2023
b124308
use Optional
tserg Dec 18, 2023
b94ae77
revert return analysis
tserg Dec 18, 2023
b9a474d
fix some tests
tserg Dec 18, 2023
6b58aeb
fix more tests
tserg Dec 18, 2023
5c6135c
revert circular call in infer_arg_types
tserg Dec 18, 2023
73193d5
fix lint
tserg Dec 18, 2023
9f667ca
fix more tests
tserg Dec 18, 2023
b3eb9f2
fix lint
tserg Dec 18, 2023
34ab4bc
fix import
tserg Dec 18, 2023
1b25514
Merge branch 'master' of https://github.com/vyperlang/vyper into fix/…
tserg Sep 21, 2024
729df1e
fix lint
tserg Sep 21, 2024
a1fbb11
fix convert
tserg Sep 21, 2024
24a306a
fix lint
tserg Sep 21, 2024
7c60586
fix typo
tserg Sep 21, 2024
b91e442
fix another typo
tserg Sep 21, 2024
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
31 changes: 31 additions & 0 deletions tests/parser/functions/test_interfaces.py
Original file line number Diff line number Diff line change
Expand Up @@ -696,3 +696,34 @@ def test_call(a: address, b: {type_str}) -> {type_str}:
code, interface_codes={"jsonabi": {"type": "json", "code": convert_v1_abi(abi)}}
)
assert c3.test_call(c1.address, value) == value


interface_tuple_return_test_code = """
@external
@view
def test_json(a: {0}) -> (uint256, {0}):
return 1, a
"""


@pytest.mark.parametrize("type_str,value", type_str_params)
def test_json_interface_calls_tuple_return(get_contract, type_str, value):
code = interface_tuple_return_test_code.format(type_str)

abi = compile_code(code, ["abi"])["abi"]
c1 = get_contract(code)

code = f"""
import jsonabi as jsonabi

@external
@view
def test_call(a: address, b: {type_str}) -> (uint256, {type_str}):
return jsonabi(a).test_json(b)
"""
c2 = get_contract(code, interface_codes={"jsonabi": {"type": "json", "code": abi}})
assert c2.test_call(c1.address, value) == [1, value]
c3 = get_contract(
code, interface_codes={"jsonabi": {"type": "json", "code": convert_v1_abi(abi)}}
)
assert c3.test_call(c1.address, value) == [1, value]
3 changes: 3 additions & 0 deletions vyper/codegen/core.py
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,9 @@ def dummy_node_for_type(typ):


def _check_assign_bytes(left, right):
if left.typ.maxlen == 0:
return

if right.typ.maxlen > left.typ.maxlen:
raise TypeMismatch(f"Cannot cast from {right.typ} to {left.typ}") # pragma: notest

Expand Down
17 changes: 16 additions & 1 deletion vyper/semantics/analysis/annotation.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,17 @@
get_exact_type_from_node,
get_possible_types_from_node,
)
from vyper.semantics.types import TYPE_T, EnumT, EventT, SArrayT, StructT, is_type_t
from vyper.semantics.types import (
TYPE_T,
BytesT,
EnumT,
EventT,
SArrayT,
StringT,
StructT,
TupleT,
is_type_t,
)
Fixed Show fixed Hide fixed
from vyper.semantics.types.function import ContractFunctionT, MemberFunctionT


Expand Down Expand Up @@ -142,6 +152,11 @@ def visit_Call(self, node, type_):
# We should only see special kwargs
self.visit(kwarg.value, call_type.call_site_kwargs[kwarg.arg].typ)

# override return type to handle JSON interfaces with bytestrings
# as return types since they are initialized to length `0`
ret_typ = call_type.return_type
Fixed Show fixed Hide fixed
call_type.return_type = type_

elif is_type_t(call_type, EventT):
# events have no kwargs
for arg, typ in zip(node.args, list(call_type.typedef.arguments.values())):
Expand Down
13 changes: 3 additions & 10 deletions vyper/semantics/types/bytestrings.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,20 +104,13 @@ def compare_type(self, other):
if not super().compare_type(other):
return False

# CMC 2022-03-18 TODO this method should be refactored so it does not have side effects

# when comparing two literals, both now have an equal min-length
# comparing two literals
if not self._length and not other._length:
min_length = max(self._min_length, other._min_length)
self.set_min_length(min_length)
other.set_min_length(min_length)
return True

# comparing a defined length to a literal causes the literal to have a fixed length
# comparing a defined length to a literal
if self._length:
if not other._length:
other.set_length(max(self._length, other._min_length))
return self._length >= other._length
return self._length >= other._min_length

return other.compare_type(self)

Expand Down