Skip to content

Commit

Permalink
rename evaluate to fold
Browse files Browse the repository at this point in the history
  • Loading branch information
tserg committed Dec 21, 2023
1 parent 4256dca commit ce3f61f
Show file tree
Hide file tree
Showing 22 changed files with 74 additions and 75 deletions.
2 changes: 1 addition & 1 deletion tests/functional/builtins/folding/test_abs.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def foo(a: int256) -> int256:

vyper_ast = vy_ast.parse_to_ast(f"abs({a})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.DISPATCH_TABLE["abs"].evaluate(old_node)
new_node = vy_fn.DISPATCH_TABLE["abs"].fold(old_node)

assert contract.foo(a) == new_node.value == abs(a)

Expand Down
2 changes: 1 addition & 1 deletion tests/functional/builtins/folding/test_addmod_mulmod.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ def foo(a: uint256, b: uint256, c: uint256) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"{fn_name}({a}, {b}, {c})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.DISPATCH_TABLE[fn_name].evaluate(old_node)
new_node = vy_fn.DISPATCH_TABLE[fn_name].fold(old_node)

assert contract.foo(a, b, c) == new_node.value
8 changes: 4 additions & 4 deletions tests/functional/builtins/folding/test_bitwise.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def foo(a: uint256, b: uint256) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"{a} {op} {b}")
old_node = vyper_ast.body[0].value
new_node = old_node.evaluate()
new_node = old_node.fold()

assert contract.foo(a, b) == new_node.value

Expand All @@ -49,7 +49,7 @@ def foo(a: uint256, b: uint256) -> uint256:
old_node = vyper_ast.body[0].value

try:
new_node = old_node.evaluate()
new_node = old_node.fold()
# force bounds check, no-op because validate_numeric_bounds
# already does this, but leave in for hygiene (in case
# more types are added).
Expand Down Expand Up @@ -79,7 +79,7 @@ def foo(a: int256, b: uint256) -> int256:
old_node = vyper_ast.body[0].value

try:
new_node = old_node.evaluate()
new_node = old_node.fold()
validate_expected_type(new_node, INT256_T) # force bounds check
# compile time behavior does not match runtime behavior.
# compile-time will throw on OOB, runtime will wrap.
Expand All @@ -104,6 +104,6 @@ def foo(a: uint256) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"~{value}")
old_node = vyper_ast.body[0].value
new_node = old_node.evaluate()
new_node = old_node.fold()

assert contract.foo(value) == new_node.value
2 changes: 1 addition & 1 deletion tests/functional/builtins/folding/test_epsilon.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,6 @@ def foo() -> {typ_name}:

vyper_ast = vy_ast.parse_to_ast(f"epsilon({typ_name})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.DISPATCH_TABLE["epsilon"].evaluate(old_node)
new_node = vy_fn.DISPATCH_TABLE["epsilon"].fold(old_node)

assert contract.foo() == new_node.value
2 changes: 1 addition & 1 deletion tests/functional/builtins/folding/test_floor_ceil.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,6 @@ def foo(a: decimal) -> int256:

vyper_ast = vy_ast.parse_to_ast(f"{fn_name}({value})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.DISPATCH_TABLE[fn_name].evaluate(old_node)
new_node = vy_fn.DISPATCH_TABLE[fn_name].fold(old_node)

assert contract.foo(value) == new_node.value
4 changes: 2 additions & 2 deletions tests/functional/builtins/folding/test_fold_as_wei_value.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ def foo(a: decimal) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"as_wei_value({value:.10f}, '{denom}')")
old_node = vyper_ast.body[0].value
new_node = vy_fn.AsWeiValue().evaluate(old_node)
new_node = vy_fn.AsWeiValue().fold(old_node)

assert contract.foo(value) == new_node.value

Expand All @@ -51,6 +51,6 @@ def foo(a: uint256) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"as_wei_value({value}, '{denom}')")
old_node = vyper_ast.body[0].value
new_node = vy_fn.AsWeiValue().evaluate(old_node)
new_node = vy_fn.AsWeiValue().fold(old_node)

assert contract.foo(value) == new_node.value
6 changes: 3 additions & 3 deletions tests/functional/builtins/folding/test_keccak_sha.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def foo(a: String[100]) -> bytes32:

vyper_ast = vy_ast.parse_to_ast(f"{fn_name}('''{value}''')")
old_node = vyper_ast.body[0].value
new_node = vy_fn.DISPATCH_TABLE[fn_name].evaluate(old_node)
new_node = vy_fn.DISPATCH_TABLE[fn_name].fold(old_node)

assert f"0x{contract.foo(value).hex()}" == new_node.value

Expand All @@ -41,7 +41,7 @@ def foo(a: Bytes[100]) -> bytes32:

vyper_ast = vy_ast.parse_to_ast(f"{fn_name}({value})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.DISPATCH_TABLE[fn_name].evaluate(old_node)
new_node = vy_fn.DISPATCH_TABLE[fn_name].fold(old_node)

assert f"0x{contract.foo(value).hex()}" == new_node.value

Expand All @@ -62,6 +62,6 @@ def foo(a: Bytes[100]) -> bytes32:

vyper_ast = vy_ast.parse_to_ast(f"{fn_name}({value})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.DISPATCH_TABLE[fn_name].evaluate(old_node)
new_node = vy_fn.DISPATCH_TABLE[fn_name].fold(old_node)

assert f"0x{contract.foo(value).hex()}" == new_node.value
6 changes: 3 additions & 3 deletions tests/functional/builtins/folding/test_len.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ def foo(a: String[1024]) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"len('{value}')")
old_node = vyper_ast.body[0].value
new_node = vy_fn.Len().evaluate(old_node)
new_node = vy_fn.Len().fold(old_node)

assert contract.foo(value) == new_node.value

Expand All @@ -35,7 +35,7 @@ def foo(a: Bytes[1024]) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"len(b'{value}')")
old_node = vyper_ast.body[0].value
new_node = vy_fn.Len().evaluate(old_node)
new_node = vy_fn.Len().fold(old_node)

assert contract.foo(value.encode()) == new_node.value

Expand All @@ -53,6 +53,6 @@ def foo(a: Bytes[1024]) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"len({value})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.Len().evaluate(old_node)
new_node = vy_fn.Len().fold(old_node)

assert contract.foo(value) == new_node.value
6 changes: 3 additions & 3 deletions tests/functional/builtins/folding/test_min_max.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def foo(a: decimal, b: decimal) -> decimal:

vyper_ast = vy_ast.parse_to_ast(f"{fn_name}({left}, {right})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.DISPATCH_TABLE[fn_name].evaluate(old_node)
new_node = vy_fn.DISPATCH_TABLE[fn_name].fold(old_node)

assert contract.foo(left, right) == new_node.value

Expand All @@ -50,7 +50,7 @@ def foo(a: int128, b: int128) -> int128:

vyper_ast = vy_ast.parse_to_ast(f"{fn_name}({left}, {right})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.DISPATCH_TABLE[fn_name].evaluate(old_node)
new_node = vy_fn.DISPATCH_TABLE[fn_name].fold(old_node)

assert contract.foo(left, right) == new_node.value

Expand All @@ -69,6 +69,6 @@ def foo(a: uint256, b: uint256) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"{fn_name}({left}, {right})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.DISPATCH_TABLE[fn_name].evaluate(old_node)
new_node = vy_fn.DISPATCH_TABLE[fn_name].fold(old_node)

assert contract.foo(left, right) == new_node.value
2 changes: 1 addition & 1 deletion tests/functional/builtins/folding/test_powmod.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ def foo(a: uint256, b: uint256) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"pow_mod256({a}, {b})")
old_node = vyper_ast.body[0].value
new_node = vy_fn.PowMod256().evaluate(old_node)
new_node = vy_fn.PowMod256().fold(old_node)

assert contract.foo(a, b) == new_node.value
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ def foo(a: decimal, b: decimal) -> decimal:
vyper_ast = vy_ast.parse_to_ast(f"{left} {op} {right}")
old_node = vyper_ast.body[0].value
try:
new_node = old_node.evaluate()
new_node = old_node.fold()
is_valid = True
except ZeroDivisionException:
is_valid = False
Expand All @@ -48,7 +48,7 @@ def test_binop_pow():
old_node = vyper_ast.body[0].value

with pytest.raises(TypeMismatch):
old_node.evaluate()
old_node.fold()


@pytest.mark.fuzzing
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ def foo(a: int128, b: int128) -> int128:
vyper_ast = vy_ast.parse_to_ast(f"{left} {op} {right}")
old_node = vyper_ast.body[0].value
try:
new_node = old_node.evaluate()
new_node = old_node.fold()
is_valid = True
except ZeroDivisionException:
is_valid = False
Expand Down Expand Up @@ -56,7 +56,7 @@ def foo(a: uint256, b: uint256) -> uint256:
vyper_ast = vy_ast.parse_to_ast(f"{left} {op} {right}")
old_node = vyper_ast.body[0].value
try:
new_node = old_node.evaluate()
new_node = old_node.fold()
is_valid = new_node.value >= 0
except ZeroDivisionException:
is_valid = False
Expand All @@ -83,7 +83,7 @@ def foo(a: uint256, b: uint256) -> uint256:

vyper_ast = vy_ast.parse_to_ast(f"{left} ** {right}")
old_node = vyper_ast.body[0].value
new_node = old_node.evaluate()
new_node = old_node.fold()

assert contract.foo(left, right) == new_node.value

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def foo({input_value}) -> bool:

vyper_ast = vy_ast.parse_to_ast(literal_op)
old_node = vyper_ast.body[0].value
new_node = old_node.evaluate()
new_node = old_node.fold()

assert contract.foo(*values) == new_node.value

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def foo(a: int128, b: int128) -> bool:

vyper_ast = vy_ast.parse_to_ast(f"{left} {op} {right}")
old_node = vyper_ast.body[0].value
new_node = old_node.evaluate()
new_node = old_node.fold()

assert contract.foo(left, right) == new_node.value

Expand All @@ -41,7 +41,7 @@ def foo(a: uint128, b: uint128) -> bool:

vyper_ast = vy_ast.parse_to_ast(f"{left} {op} {right}")
old_node = vyper_ast.body[0].value
new_node = old_node.evaluate()
new_node = old_node.fold()

assert contract.foo(left, right) == new_node.value

Expand All @@ -65,7 +65,7 @@ def bar(a: int128) -> bool:

vyper_ast = vy_ast.parse_to_ast(f"{left} in {right}")
old_node = vyper_ast.body[0].value
new_node = old_node.evaluate()
new_node = old_node.fold()

# check runtime == fully folded
assert contract.foo(left, right) == new_node.value
Expand Down Expand Up @@ -94,7 +94,7 @@ def bar(a: int128) -> bool:

vyper_ast = vy_ast.parse_to_ast(f"{left} not in {right}")
old_node = vyper_ast.body[0].value
new_node = old_node.evaluate()
new_node = old_node.fold()

# check runtime == fully folded
assert contract.foo(left, right) == new_node.value
Expand All @@ -109,4 +109,4 @@ def test_compare_type_mismatch(op):
vyper_ast = vy_ast.parse_to_ast(f"1 {op} 1.0")
old_node = vyper_ast.body[0].value
with pytest.raises(UnfoldableNode):
old_node.evaluate()
old_node.fold()
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@ def foo(array: int128[10], idx: uint256) -> int128:

vyper_ast = vy_ast.parse_to_ast(f"{array}[{idx}]")
old_node = vyper_ast.body[0].value
new_node = old_node.evaluate()
new_node = old_node.fold()

assert contract.foo(array, idx) == new_node.value
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ def foo(a: bool) -> bool:

vyper_ast = vy_ast.parse_to_ast(f"not {bool_cond}")
old_node = vyper_ast.body[0].value
new_node = old_node.evaluate()
new_node = old_node.fold()

assert contract.foo(bool_cond) == new_node.value

Expand Down
3 changes: 1 addition & 2 deletions vyper/ast/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,7 @@ folding include:

The process of literal folding includes:

1. Foldable node classes are evaluated via their `evaluate` method, which attempts
to create a new `Constant` from the content of the given node.
1. Foldable node classes are evaluated via their `fold` method, which attempts to create a new `Constant` from the content of the given node.
2. Replacement nodes are generated using the `from_node` class method within the new
node class.
3. The modification of the tree is handled by `Module.replace_in_tree`, which locates
Expand Down
8 changes: 4 additions & 4 deletions vyper/ast/folding.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def replace_literal_ops(vyper_module: vy_ast.Module) -> int:
node_types = (vy_ast.BoolOp, vy_ast.BinOp, vy_ast.UnaryOp, vy_ast.Compare)
for node in vyper_module.get_descendants(node_types, reverse=True):
try:
new_node = node.evaluate()
new_node = node.fold()
except UnfoldableNode:
continue

Expand Down Expand Up @@ -79,7 +79,7 @@ def replace_subscripts(vyper_module: vy_ast.Module) -> int:

for node in vyper_module.get_descendants(vy_ast.Subscript, reverse=True):
try:
new_node = node.evaluate()
new_node = node.fold()
except UnfoldableNode:
continue

Expand Down Expand Up @@ -114,10 +114,10 @@ def replace_builtin_functions(vyper_module: vy_ast.Module) -> int:

name = node.func.id
func = DISPATCH_TABLE.get(name)
if func is None or not hasattr(func, "evaluate"):
if func is None or not hasattr(func, "fold"):
continue
try:
new_node = func.evaluate(node) # type: ignore
new_node = func.fold(node) # type: ignore
except UnfoldableNode:
continue

Expand Down
16 changes: 8 additions & 8 deletions vyper/ast/nodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,15 +366,15 @@ def prefold(self) -> Optional["VyperNode"]:
"""
return None

def evaluate(self) -> "VyperNode":
def fold(self) -> "VyperNode":
"""
Attempt to evaluate the content of a node and generate a new node from it.
If a node cannot be evaluated it should raise `UnfoldableNode`. This base
If a node cannot be evaluated, it should raise `UnfoldableNode`. This base
method acts as a catch-all to raise on any inherited classes that do not
implement the method.
"""
raise UnfoldableNode(f"{type(self)} cannot be evaluated")
raise UnfoldableNode(f"{type(self)} cannot be folded")

def validate(self) -> None:
"""
Expand Down Expand Up @@ -929,7 +929,7 @@ def prefold(self) -> Optional[ExprNode]:

return None

def evaluate(self) -> ExprNode:
def fold(self) -> ExprNode:
"""
Attempt to evaluate the unary operation.
Expand Down Expand Up @@ -992,7 +992,7 @@ def prefold(self) -> Optional[ExprNode]:
value = self.op._op(left.value, right.value)
return type(left).from_node(self, value=value)

def evaluate(self) -> ExprNode:
def fold(self) -> ExprNode:
"""
Attempt to evaluate the arithmetic operation.
Expand Down Expand Up @@ -1143,7 +1143,7 @@ def prefold(self) -> Optional[ExprNode]:
value = self.op._op(values)
return NameConstant.from_node(self, value=value)

def evaluate(self) -> ExprNode:
def fold(self) -> ExprNode:
"""
Attempt to evaluate the boolean operation.
Expand Down Expand Up @@ -1209,7 +1209,7 @@ def prefold(self) -> Optional[ExprNode]:
value = self.op._op(left.value, right.value)
return NameConstant.from_node(self, value=value)

def evaluate(self) -> ExprNode:
def fold(self) -> ExprNode:
"""
Attempt to evaluate the comparison.
Expand Down Expand Up @@ -1320,7 +1320,7 @@ def prefold(self) -> Optional[ExprNode]:

return value.elements[slice_.value]

def evaluate(self) -> ExprNode:
def fold(self) -> ExprNode:
"""
Attempt to evaluate the subscript.
Expand Down
2 changes: 1 addition & 1 deletion vyper/ast/nodes.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class VyperNode:
@classmethod
def get_fields(cls: Any) -> set: ...
def prefold(self) -> Optional[VyperNode]: ...
def evaluate(self) -> VyperNode: ...
def fold(self) -> VyperNode: ...
@classmethod
def from_node(cls, node: VyperNode, **kwargs: Any) -> Any: ...
def to_dict(self) -> dict: ...
Expand Down
Loading

0 comments on commit ce3f61f

Please sign in to comment.