1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use crate::{
asm_generation::{DataSection, FinalizedAsm, InstructionSet},
asm_lang::allocated_ops::AllocatedOp,
};
use std::fmt;
pub enum RegisterAllocatedAsmSet {
ContractAbi {
data_section: DataSection,
program_section: InstructionSet,
},
ScriptMain {
data_section: DataSection,
program_section: InstructionSet,
},
PredicateMain {
data_section: DataSection,
program_section: InstructionSet,
},
Library,
}
impl RegisterAllocatedAsmSet {
pub(crate) fn optimize(self) -> FinalizedAsm {
match self {
RegisterAllocatedAsmSet::Library => FinalizedAsm::Library,
RegisterAllocatedAsmSet::ScriptMain {
mut program_section,
data_section,
} => {
if program_section.ops.len() & 1 != 0 {
program_section.ops.push(AllocatedOp {
opcode: crate::asm_lang::allocated_ops::AllocatedOpcode::NOOP,
comment: "word-alignment of data section".into(),
owning_span: None,
});
}
FinalizedAsm::ScriptMain {
program_section,
data_section,
}
}
RegisterAllocatedAsmSet::PredicateMain {
mut program_section,
data_section,
} => {
if program_section.ops.len() & 1 != 0 {
program_section.ops.push(AllocatedOp {
opcode: crate::asm_lang::allocated_ops::AllocatedOpcode::NOOP,
comment: "word-alignment of data section".into(),
owning_span: None,
});
}
FinalizedAsm::PredicateMain {
program_section,
data_section,
}
}
RegisterAllocatedAsmSet::ContractAbi {
mut program_section,
data_section,
} => {
if program_section.ops.len() & 1 != 0 {
program_section.ops.push(AllocatedOp {
opcode: crate::asm_lang::allocated_ops::AllocatedOpcode::NOOP,
comment: "word-alignment of data section".into(),
owning_span: None,
});
}
FinalizedAsm::ContractAbi {
program_section,
data_section,
}
}
}
}
}
impl fmt::Display for RegisterAllocatedAsmSet {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
RegisterAllocatedAsmSet::ScriptMain {
program_section,
data_section,
} => {
write!(f, "{}\n{}", program_section, data_section)
}
RegisterAllocatedAsmSet::PredicateMain {
program_section,
data_section,
} => {
write!(f, "{}\n{}", program_section, data_section)
}
RegisterAllocatedAsmSet::ContractAbi {
program_section,
data_section,
} => {
write!(f, "{}\n{}", program_section, data_section)
}
RegisterAllocatedAsmSet::Library => write!(f, ""),
}
}
}