diff --git a/tests/unit/cli/vyper_json/test_compile_json.py b/tests/unit/cli/vyper_json/test_compile_json.py index fc7483eabc..3c0b356e9b 100644 --- a/tests/unit/cli/vyper_json/test_compile_json.py +++ b/tests/unit/cli/vyper_json/test_compile_json.py @@ -403,6 +403,46 @@ def test_compile_json_with_experimental_codegen(): assert venom["cfg_runtime"] == expected["cfg_runtime"] +def test_compile_json_subgraph_label(): + foo_code = """ +a: uint256 +b: address + +@internal +def _foo(f: uint256, g: address) -> uint256: + self.a = f + self.b = g + return self.a + + +@internal +def _bar(f: uint256, g: address) -> uint256: + self._foo(f, g) + self._foo(f, g) + return self.a + + +@external +def call_foo(amount: uint256, account: address) -> uint256: + return self._bar(amount, account) + """ + code = { + "language": "Vyper", + "sources": {"foo.vy": {"content": foo_code}}, + "settings": { + "evmVersion": "cancun", + "optimize": "gas", + "venomExperimental": True, + "search_paths": ["."], + "outputSelection": {"*": ["cfg_runtime"]}, + }, + } + output_json = compile_json(code) + venom = output_json["contracts"]["foo.vy"]["foo"]["venom"] + # ensure that quotes are formatted properly in the output + assert 'subgraph "internal 0 _foo(uint256,address)_runtime"' in venom["cfg_runtime"] + + def test_compile_json_without_experimental_codegen(): code = { "language": "Vyper", diff --git a/vyper/venom/function.py b/vyper/venom/function.py index 3ad63b207a..c57229eabc 100644 --- a/vyper/venom/function.py +++ b/vyper/venom/function.py @@ -192,7 +192,7 @@ def _make_label(bb): if not only_subgraph: ret.append("digraph G {{") - ret.append(f'subgraph "{self.name}" {{') + ret.append(f"subgraph {repr(self.name)} {{") for bb in self.get_basic_blocks(): for out_bb in bb.out_bbs: