@@ -125,28 +125,30 @@ MethodItemEntry::MethodItemEntry(const MethodItemEntry& that)
125125 }
126126}
127127
128- MethodItemEntry::~MethodItemEntry () {
129- switch (type) {
128+ namespace {
129+
130+ void free_mie_contents (MethodItemEntry& mie) {
131+ switch (mie.type ) {
130132 case MFLOW_TRY:
131- delete tentry;
133+ delete mie. tentry ;
132134 break ;
133135 case MFLOW_CATCH:
134- delete centry;
136+ delete mie. centry ;
135137 break ;
136138 case MFLOW_TARGET:
137- delete target;
139+ delete mie. target ;
138140 break ;
139141 case MFLOW_DEBUG:
140- dbgop.~unique_ptr<DexDebugInstruction>();
142+ mie. dbgop .~unique_ptr<DexDebugInstruction>();
141143 break ;
142144 case MFLOW_POSITION:
143- pos.~unique_ptr<DexPosition>();
145+ mie. pos .~unique_ptr<DexPosition>();
144146 break ;
145147 case MFLOW_SOURCE_BLOCK:
146- src_block.~unique_ptr<SourceBlock>();
148+ mie. src_block .~unique_ptr<SourceBlock>();
147149 break ;
148150 case MFLOW_DEX_OPCODE:
149- delete dex_insn;
151+ delete mie. dex_insn ;
150152 break ;
151153 case MFLOW_OPCODE:
152154 case MFLOW_FALLTHROUGH:
@@ -155,6 +157,48 @@ MethodItemEntry::~MethodItemEntry() {
155157 }
156158}
157159
160+ } // namespace
161+
162+ MethodItemEntry& MethodItemEntry::operator =(const MethodItemEntry& that) {
163+ if (this == &that) {
164+ return *this ;
165+ }
166+ free_mie_contents (*this );
167+ type = that.type ;
168+ switch (type) {
169+ case MFLOW_TRY:
170+ tentry = that.tentry ;
171+ break ;
172+ case MFLOW_CATCH:
173+ centry = that.centry ;
174+ break ;
175+ case MFLOW_OPCODE:
176+ insn = that.insn ;
177+ break ;
178+ case MFLOW_DEX_OPCODE:
179+ dex_insn = that.dex_insn ;
180+ break ;
181+ case MFLOW_TARGET:
182+ target = that.target ;
183+ break ;
184+ case MFLOW_DEBUG:
185+ new (&dbgop) std::unique_ptr<DexDebugInstruction>(that.dbgop ->clone ());
186+ break ;
187+ case MFLOW_POSITION:
188+ new (&pos) std::unique_ptr<DexPosition>(new DexPosition (*that.pos ));
189+ break ;
190+ case MFLOW_SOURCE_BLOCK:
191+ new (&src_block)
192+ std::unique_ptr<SourceBlock>(new SourceBlock (*that.src_block ));
193+ break ;
194+ case MFLOW_FALLTHROUGH:
195+ break ;
196+ }
197+ return *this ;
198+ }
199+
200+ MethodItemEntry::~MethodItemEntry () { free_mie_contents (*this ); }
201+
158202void MethodItemEntry::replace_ir_with_dex (DexInstruction* dex_insn) {
159203 always_assert (type == MFLOW_OPCODE);
160204 delete this ->insn ;
@@ -985,6 +1029,19 @@ void IRList::insn_clear_and_dispose() {
9851029 });
9861030}
9871031
1032+ SourceBlock& SourceBlock::operator =(const SourceBlock& other) {
1033+ if (this == &other) {
1034+ return *this ;
1035+ }
1036+ src = other.src ;
1037+ next = std::unique_ptr<SourceBlock>(
1038+ other.next == nullptr ? nullptr : new SourceBlock (*other.next ));
1039+ id = other.id ;
1040+ always_assert (vals_size == other.vals_size );
1041+ m_storage = make_storage (other.m_storage .get ());
1042+ return *this ;
1043+ }
1044+
9881045std::unique_ptr<SourceBlock::Storage, SourceBlock::FreeDeleter>
9891046SourceBlock::make_storage (size_t vals_size, const Val& val) {
9901047 if (vals_size == 0 ) {
0 commit comments