This is Frame.m in view mode; [Download] [Up]
/* Frame.m created by ovidiu on Sun 23-Mar-1997 */
#import <Foundation/Foundation.h>
#import "GdbDisplayController.h"
#import "DebuggerController_Protocol.h"
#import "NSScannerAddition.h"
#import "Stack.h"
#import "Frame.h"
#import "Variable.h"
@implementation Frame
+ (Frame*)frameWithAnnotation:(NSString*)annotation stack:(Stack*)theStack
{
NSScanner* scanner = [NSScanner scannerWithString:annotation];
Frame* frame = [[self new] autorelease];
if (![scanner scanAfterString:@"\032\032frame-begin"])
return nil;
[scanner scanInt:&frame->frameNumber];
[scanner scanHexInt:&frame->frameAddress];
if (![scanner scanAfterString:@"\032\032frame-function-name\n"])
return nil;
if (![scanner scanUpToString:@"\n" intoString:&(frame->functionName)])
return nil;
[frame->functionName retain];
[scanner scanAfterString:@"\032\032frame-source-file\n"];
[scanner scanUpToString:@"\n" intoString:&(frame->fileName)];
[frame->fileName retain];
frame->stack = theStack;
return frame;
}
- init
{
self = [super init];
variables = [NSMutableArray new];
return self;
}
- (void)dealloc
{
[functionName release];
[super dealloc];
}
- (void)invalidateCurrentVariables
{
validVariables = NO;
}
- (void)getVariablesFromGDB
{
#if 1
[variables removeAllObjects];
if (!validVariables) {
validVariables = YES;
#else
if (![variables count]) {
#endif
// NSLog (@"getVariablesFromGDB: frame number = %d", frameNumber);
[[self gdbController] executeGDBCommand:@"info typed-variables"
annotate:NO
notifyObject:self
selector:@selector(frameArguments:type:)];
}
}
- (void)frameArguments:(NSString*)gdbOutput type:(GdbOutputType)type
{
int i, count;
id gdbController;
if (type != GDB_OUTPUT_ANNOTATION)
return;
gdbController = [self gdbController];
[variables release];
variables = [[Variable variablesFromDescription:gdbOutput] retain];
for (i = 0, count = [variables count]; i < count; i++)
[[variables objectAtIndex:i] setGdbDisplayController:gdbController];
validVariables = YES;
[gdbController updateCurrentFrame];
}
- (void)setFilename:(NSString*)_fileName
startLine:(int)_startLine
endLine:(int)_endLine
{
[_fileName retain];
[fileName release];
fileName = _fileName;
startLine = _startLine;
endLine = _endLine;
}
- (Variable*)variableAtIndex:(int)index
{
return [variables objectAtIndex:index];
}
- (void)selectLineInFile
{
// NSLog (@"_selectLineInFile: gdbController = %x, fileName = %@, "
// @"startLine = %d, endLine = %d",
// [self gdbController], fileName, startLine, endLine);
[stack setSelectedFrame:frameNumber];
if (fileName)
[[self gdbController] selectInFile:fileName startLine:startLine endLine:endLine];
}
- (int)frameNumber { return frameNumber; }
- (NSString*)functionName { return functionName; }
- (NSString*)fileName { return fileName; }
- (GdbDisplayController*)gdbController { return [stack gdbController]; }
- (int)numberOfVariables { return [variables count]; }
- (BOOL)variablesAreValid { return validVariables; }
- (int)startLine { return startLine; }
- (int)endLine { return endLine; }
- (NSString*)description
{
return functionName;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.