From d86e7f5a10584b1d3f8870e3d65297cfea4bff39 Mon Sep 17 00:00:00 2001 From: tserg <8017125+tserg@users.noreply.github.com> Date: Sat, 5 Oct 2024 20:16:28 +0800 Subject: [PATCH] add hexbytes node --- vyper/ast/nodes.py | 19 +++++++++++++++++++ vyper/ast/parse.py | 6 +----- vyper/codegen/expr.py | 6 ++++++ vyper/semantics/types/bytestrings.py | 2 +- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/vyper/ast/nodes.py b/vyper/ast/nodes.py index 991edeca6e..a20106f866 100644 --- a/vyper/ast/nodes.py +++ b/vyper/ast/nodes.py @@ -916,6 +916,25 @@ def s(self): return self.value +class HexBytes(Constant): + __slots__ = () + _translated_fields = {"s": "value"} + + def __init__(self, parent: Optional["VyperNode"] = None, **kwargs: dict): + super().__init__(parent, **kwargs) + if isinstance(self.value, str): + self.value = bytes.fromhex(self.value) + + def to_dict(self): + ast_dict = super().to_dict() + ast_dict["value"] = f"0x{self.value.hex()}" + return ast_dict + + @property + def s(self): + return self.value + + class List(ExprNode): __slots__ = ("elements",) _translated_fields = {"elts": "elements"} diff --git a/vyper/ast/parse.py b/vyper/ast/parse.py index ec582aaa6e..1f46b58451 100644 --- a/vyper/ast/parse.py +++ b/vyper/ast/parse.py @@ -406,11 +406,7 @@ def visit_Constant(self, node): node.lineno, node.col_offset, ) - - byte_val = bytes.fromhex(node.value) - - node.ast_type = "Bytes" - node.value = byte_val + node.ast_type = "HexBytes" else: node.ast_type = "Str" elif isinstance(node.value, bytes): diff --git a/vyper/codegen/expr.py b/vyper/codegen/expr.py index 0b3b29b9d0..abbb105a47 100644 --- a/vyper/codegen/expr.py +++ b/vyper/codegen/expr.py @@ -140,6 +140,12 @@ def parse_Str(self): # Byte literals def parse_Bytes(self): + return self._parse_bytes() + + def parse_HexBytes(self): + return self._parse_bytes() + + def _parse_bytes(self, bytes): bytez = self.expr.value bytez_length = len(self.expr.value) typ = BytesT(bytez_length) diff --git a/vyper/semantics/types/bytestrings.py b/vyper/semantics/types/bytestrings.py index cd330681cf..02e3bb213f 100644 --- a/vyper/semantics/types/bytestrings.py +++ b/vyper/semantics/types/bytestrings.py @@ -159,7 +159,7 @@ class BytesT(_BytestringT): typeclass = "bytes" _id = "Bytes" - _valid_literal = (vy_ast.Bytes,) + _valid_literal = (vy_ast.Bytes, vy_ast.HexBytes) @property def abi_type(self) -> ABIType: