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

Ensure disassemble/reassemble cycle works in testProg. #2745

Merged
merged 2 commits into from
Aug 23, 2021

Conversation

jannotti
Copy link
Contributor

Disassemble was omitting labels if they were only used as targets of backjumps.

This fixes that, but making a second pass to find labels if any such labels exist in a program. It also changes testProg, which is used extensively to test programs in the logic package, so that every such test is a Disassemble/Reassemble test to ensure the same program is produced.

@codecov-commenter
Copy link

codecov-commenter commented Aug 15, 2021

Codecov Report

Merging #2745 (001848b) into master (80bd5ed) will decrease coverage by 0.06%.
The diff coverage is 72.72%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master    #2745      +/-   ##
==========================================
- Coverage   47.14%   47.07%   -0.07%     
==========================================
  Files         349      349              
  Lines       56322    56329       +7     
==========================================
- Hits        26553    26517      -36     
- Misses      26800    26833      +33     
- Partials     2969     2979      +10     
Impacted Files Coverage Δ
data/transactions/logic/assembler.go 82.34% <70.00%> (-0.13%) ⬇️
data/transactions/logic/debugger.go 51.42% <100.00%> (ø)
ledger/roundlru.go 90.56% <0.00%> (-5.67%) ⬇️
network/wsPeer.go 72.14% <0.00%> (-2.79%) ⬇️
agreement/cryptoVerifier.go 75.73% <0.00%> (-2.21%) ⬇️
crypto/merkletrie/trie.go 66.42% <0.00%> (-2.19%) ⬇️
agreement/proposalManager.go 96.07% <0.00%> (-1.97%) ⬇️
crypto/merkletrie/node.go 91.62% <0.00%> (-1.87%) ⬇️
data/transactions/verify/txn.go 44.19% <0.00%> (-1.79%) ⬇️
catchup/peerSelector.go 98.95% <0.00%> (-1.05%) ⬇️
... and 3 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 80bd5ed...001848b. Read the comment docs.

@@ -1034,7 +1034,7 @@ func TestGlobal(t *testing.T) {
addr, err := basics.UnmarshalChecksumAddress(testAddr)
require.NoError(t, err)
ledger.creatorAddr = addr
for v := uint64(0); v <= AssemblerMaxVersion; v++ {
for v := uint64(1); v <= AssemblerMaxVersion; v++ {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why is it changed to 1? 0 is used to be a valid version for TEAL 1

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The trouble is that when AssembleStringWithVersion is given 0 as the version, the actual assembled version is 1, and so #pragma version 1 is generated in the disassembly. But then AssembleStringWithVersion(dissassembly, 0) fails to reassemble it, because the source specifies 1 when the assembler was explicitly called with 0. We could probably make all this work, but AssembleStringWithVersion is not actually used outside of testing, so it seems pointless to make it clever about accepting 1 when called with 0 (which might be reasonable!). The only public use invokes it with assembleNoVersion. None of the other versioning tests test against 0, they all start at 1.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm ok to have it set 1 here. The only problem this looks like the last place where assembling with version 0 happens. Probably a separate test checking assembling with version 0 at backwardCompat_test.go is needed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see a good reason for AssembleStringWithVersion(s, 0) to work at all. There's no "user-level" way to cause the function to run that way. It always runs with the version assemblerNoVersion when invoked to assemble teal outside of tests. I don't think we need to be compatible with old test code. I don't think the WithVersion function should even be public. And it should probably fail if given 0.

@@ -1938,6 +1938,7 @@ type disassembleState struct {
numericTargets bool
labelCount int
pendingLabels map[int]string
rerun bool
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please add a comment for rerun, it is not obvious at all

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

comment added

@jannotti jannotti merged commit 98ed08f into algorand:master Aug 23, 2021
@jannotti jannotti deleted the disassemble-backjump branch January 28, 2022 15:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

3 participants