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[tool]: compile multiple files #4053

Merged
38 changes: 38 additions & 0 deletions tests/unit/cli/storage_layout/test_storage_layout.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from vyper.compiler import compile_code
from vyper.evm.opcodes import version_check

from .utils import adjust_storage_layout_for_cancun

Expand Down Expand Up @@ -342,3 +343,40 @@ def foo() -> uint256:

out = compile_code(code, input_bundle=input_bundle, output_formats=["layout"])
assert out["layout"] == expected_layout


def test_multiple_compile_codes(make_input_bundle):
# test calling compile_code multiple times with the same library allocated
# in different locations
lib = """
x: uint256
"""
input_bundle = make_input_bundle({"lib.vy": lib})

main1 = """
import lib

initializes: lib
t: uint256
"""
main2 = """
import lib

t: uint256
initializes: lib
"""
out1 = compile_code(main1, input_bundle=input_bundle, output_formats=["layout"])["layout"]
out2 = compile_code(main2, input_bundle=input_bundle, output_formats=["layout"])["layout"]

layout1 = out1["storage_layout"]["lib"]
layout2 = out2["storage_layout"]["lib"]

assert layout1 != layout2 # for clarity

if version_check(begin="cancun"):
start_slot = 0
else:
start_slot = 1

assert layout1 == {"x": {"slot": start_slot, "type": "uint256", "n_slots": 1}}
assert layout2 == {"x": {"slot": start_slot + 1, "type": "uint256", "n_slots": 1}}
34 changes: 31 additions & 3 deletions tests/unit/compiler/test_compile_code.py

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions vyper/compiler/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,7 @@ def compile_from_file_input(
output_formats = ("bytecode",)

# make IR output the same between runs
# TODO: move this to CompilerData.__init__()
codegen.reset_names()

compiler_data = CompilerData(
Expand Down
3 changes: 3 additions & 0 deletions vyper/compiler/phases.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,9 @@ def __init__(
self.input_bundle = input_bundle or FilesystemInputBundle([Path(".")])
self.expected_integrity_sum = integrity_sum

# ast cache, hitchhike onto the input_bundle object
self.input_bundle._cache._ast_of: dict[int, vy_ast.Module] = {} # type: ignore

@cached_property
def source_code(self):
return self.file_input.source_code
Expand Down
4 changes: 0 additions & 4 deletions vyper/semantics/analysis/module.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,6 @@ def __init__(

self.module_t: Optional[ModuleT] = None

# ast cache, hitchhike onto the input_bundle object
if not hasattr(self.input_bundle._cache, "_ast_of"):
self.input_bundle._cache._ast_of: dict[int, vy_ast.Module] = {} # type: ignore

def analyze_module_body(self):
# generate a `ModuleT` from the top-level node
# note: also validates unique method ids
Expand Down
Loading