| ... | ... | @@ -48,7 +48,10 @@ const ColumnRange = struct { |
| 48 | 48 | }; |
| 49 | 49 | |
| 50 | 50 | columns: std.ArrayList(Column) = .empty, |
| 51 | | stack: std.ArrayList(ColumnRange) = .empty, |
| 51 | stack: std.ArrayList(struct { |
| 52 | cfa: Column, |
| 53 | columns: ColumnRange, |
| 54 | }) = .empty, |
| 52 | 55 | current_row: Row = .{}, |
| 53 | 56 | |
| 54 | 57 | /// The result of executing the CIE's initial_instructions |
| ... | ... | @@ -205,17 +208,21 @@ pub fn step( |
| 205 | 208 | column.rule = .{ .register = i.target_register }; |
| 206 | 209 | }, |
| 207 | 210 | .remember_state => { |
| 208 | | try self.stack.append(gpa, self.current_row.columns); |
| 211 | try self.stack.append(gpa, .{ |
| 212 | .cfa = self.current_row.cfa, |
| 213 | .columns = self.current_row.columns, |
| 214 | }); |
| 209 | 215 | self.current_row.copy_on_write = true; |
| 210 | 216 | }, |
| 211 | 217 | .restore_state => { |
| 212 | | const restored_columns = self.stack.pop() orelse return error.InvalidOperation; |
| 218 | const restored = self.stack.pop() orelse return error.InvalidOperation; |
| 213 | 219 | self.columns.shrinkRetainingCapacity(self.columns.items.len - self.current_row.columns.len); |
| 214 | | try self.columns.ensureUnusedCapacity(gpa, restored_columns.len); |
| 220 | try self.columns.ensureUnusedCapacity(gpa, restored.columns.len); |
| 215 | 221 | |
| 222 | self.current_row.cfa = restored.cfa; |
| 216 | 223 | self.current_row.columns.start = self.columns.items.len; |
| 217 | | self.current_row.columns.len = restored_columns.len; |
| 218 | | self.columns.appendSliceAssumeCapacity(self.columns.items[restored_columns.start..][0..restored_columns.len]); |
| 224 | self.current_row.columns.len = restored.columns.len; |
| 225 | self.columns.appendSliceAssumeCapacity(self.columns.items[restored.columns.start..][0..restored.columns.len]); |
| 219 | 226 | }, |
| 220 | 227 | .def_cfa => |i| { |
| 221 | 228 | try self.resolveCopyOnWrite(gpa); |