From eda54cfbf0c423905ea0c17f2937413e6efc1c5c Mon Sep 17 00:00:00 2001 From: nullun Date: Fri, 18 Oct 2024 11:19:34 +0100 Subject: [PATCH 1/4] AVM: Only update the bytec disassembleState from bytecblock opcodes During disassembly if a contract includes a pushbytess opcode after the bytecblock, it will no longer overwrite the bytec disassembleState. This resulted in incorrect or missing comments for disassembled bytec opcodes. --- data/transactions/logic/assembler.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/transactions/logic/assembler.go b/data/transactions/logic/assembler.go index a707e23f65..56d06fb3cf 100644 --- a/data/transactions/logic/assembler.go +++ b/data/transactions/logic/assembler.go @@ -2887,7 +2887,9 @@ func disassemble(dis *disassembleState, spec *OpSpec) (string, error) { if err != nil { return "", err } - dis.bytec = bytec + if spec.Name == "bytecblock" { + dis.bytec = bytec + } for i, bv := range bytec { if i != 0 { out += " " From 1797aeb6b97fbb37332c6f61e574f9961d3cd3f4 Mon Sep 17 00:00:00 2001 From: nullun Date: Tue, 22 Oct 2024 15:32:13 +0100 Subject: [PATCH 2/4] Apply the same logic to immInts with intcblock --- data/transactions/logic/assembler.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data/transactions/logic/assembler.go b/data/transactions/logic/assembler.go index 56d06fb3cf..06fd1f3953 100644 --- a/data/transactions/logic/assembler.go +++ b/data/transactions/logic/assembler.go @@ -2873,8 +2873,9 @@ func disassemble(dis *disassembleState, spec *OpSpec) (string, error) { if err != nil { return "", err } - - dis.intc = intc + if spec.Name == "intcblock" { + dis.intc = intc + } for i, iv := range intc { if i != 0 { out += " " From 223c649640fbe0c886c38cd06c0711cbc0d513a5 Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Tue, 22 Oct 2024 11:31:23 -0400 Subject: [PATCH 3/4] add test cases from #6154 --- data/transactions/logic/assembler_test.go | 46 +++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/data/transactions/logic/assembler_test.go b/data/transactions/logic/assembler_test.go index 10d86f476a..676138de09 100644 --- a/data/transactions/logic/assembler_test.go +++ b/data/transactions/logic/assembler_test.go @@ -2182,6 +2182,52 @@ label1: } } +// TestDisassembleBytecblock asserts correctly disassembly for +// uses of bytecblock and intcblock, from examples in #6154 +func TestDisassembleBytecblock(t *testing.T) { + partitiontest.PartitionTest(t) + t.Parallel() + + ver := uint64(AssemblerMaxVersion) + for _, prog := range []string{ + `#pragma version %d +intcblock 0 1 2 3 4 5 +intc_0 // 0 +intc_1 // 1 +intc_2 // 2 +intc_3 // 3 +intc 4 // 4 +pushints 6 +intc_0 // 0 +intc_1 // 1 +intc_2 // 2 +intc_3 // 3 +intc 4 // 4 +`, + `#pragma version %d +bytecblock 0x6869 0x414243 0x74657374 0x666f7572 0x6c617374 +bytec_0 // "hi" +bytec_1 // "ABC" +bytec_2 // "test" +bytec_3 // "four" +bytec 4 // "last" +pushbytess 0x6576696c +bytec_0 // "hi" +bytec_1 // "ABC" +bytec_2 // "test" +bytec_3 // "four" +bytec 4 // "last" +`, + } { + source := fmt.Sprintf(prog, ver) + ops, err := AssembleStringWithVersion(source, ver) + require.NoError(t, err) + dis, err := Disassemble(ops.Program) + require.NoError(t, err, dis) + require.Equal(t, source, dis) + } +} + func TestAssembleOffsets(t *testing.T) { partitiontest.PartitionTest(t) t.Parallel() From fe97864f289051f16e70fe8065448236b24e4db2 Mon Sep 17 00:00:00 2001 From: cce <51567+cce@users.noreply.github.com> Date: Tue, 22 Oct 2024 11:37:28 -0400 Subject: [PATCH 4/4] fix typo in test comment --- data/transactions/logic/assembler_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/transactions/logic/assembler_test.go b/data/transactions/logic/assembler_test.go index 676138de09..ca17f4d4af 100644 --- a/data/transactions/logic/assembler_test.go +++ b/data/transactions/logic/assembler_test.go @@ -2182,7 +2182,7 @@ label1: } } -// TestDisassembleBytecblock asserts correctly disassembly for +// TestDisassembleBytecblock asserts correct disassembly for // uses of bytecblock and intcblock, from examples in #6154 func TestDisassembleBytecblock(t *testing.T) { partitiontest.PartitionTest(t)