3 * Copyright (c) 2015, Blue Static <https://www.bluestatic.org>
5 * This program is free software; you can redistribute it and/or modify it under the terms of the GNU
6 * General Public License as published by the Free Software Foundation; either version 2 of the
7 * License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
10 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * General Public License for more details.
13 * You should have received a copy of the GNU General Public License along with this program; if not,
14 * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
17 #import "DebuggerModel.h"
19 #import "BreakpointManager.h"
20 #import "StackFrame.h"
22 @interface DebuggerModel ()
23 @property(assign
, nonatomic
) BOOL connected
;
26 @implementation DebuggerModel
{
27 NSMutableArray
* _stack
;
30 - (instancetype
)init
{
31 if (self = [super init
]) {
32 _breakpointManager
= [[BreakpointManager alloc
] init
];
33 _stack
= [NSMutableArray
new];
41 [_breakpointManager release
];
48 - (NSUInteger
)stackDepth
{
49 return self.stack.count
;
52 - (void)onListeningOnPort
:(uint16_t
)port
{
53 self.status
= [NSString stringWithFormat
:@
"Listening on Port %d", port
];
56 - (void)onNewConnection
{
59 [_stack removeAllObjects
];
62 - (void)onDisconnect
{
64 self.status
= @
"Disconnected";
67 - (void)updateStack
:(NSArray
<StackFrame
*>*)newStack
{
68 // Iterate, in reverse order from the bottom to the top, both stacks to find
69 // the point of divergence.
70 NSEnumerator
* itNewStack
= [newStack reverseObjectEnumerator
];
71 NSEnumerator
* itOldStack
= [self.stack reverseObjectEnumerator
];
74 StackFrame
* frameOld
= [itOldStack nextObject
];
75 NSUInteger oldStackOffset
= self.stack.count
;
76 while (frameNew
= [itNewStack nextObject
]) {
77 if ([frameNew isEqual
:frameOld
]) {
79 frameOld
= [itOldStack nextObject
];
85 [self willChangeValueForKey
:@
"stack"];
87 // Remove any frames from the top of the stack that are not shared with the
89 [_stack removeObjectsInRange
:NSMakeRange(0, oldStackOffset
)];
91 // Continue inserting objects to update the stack with the new frames.
93 [_stack insertObject
:frameNew atIndex
:0];
94 frameNew
= [itNewStack nextObject
];
97 // Renumber the stack.
98 for (NSUInteger i
= 0; i
< self.stack.count
; ++i
)
99 self.stack
[i
].index
= i
;
101 [self didChangeValueForKey
:@
"stack"];