libs-steptalk/Languages/Smalltalk/STStack.m
Wolfgang Lux 3f8eeb9ff0 StepTalk Smalltalk compiler: int->NSInteger transition
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/steptalk/trunk@36658 72102866-910b-0410-8b05-ffd578937521
2013-05-26 15:51:26 +00:00

133 lines
2.7 KiB
Objective-C

/**
STStack.m
Temporaries and stack storage.
Copyright (c) 2002 Free Software Foundation
This file is part of the StepTalk project.
*/
#import "STStack.h"
#import <StepTalk/STExterns.h>
#import <Foundation/NSException.h>
#import <Foundation/NSDebug.h>
@implementation STStack
+ stackWithSize:(NSUInteger)newSize
{
return AUTORELEASE([[self alloc] initWithSize:newSize]);
}
- initWithSize:(NSUInteger)newSize
{
if ((self = [super init]) != nil)
{
size = newSize;
pointer = 0;
stack = NSZoneMalloc( NSDefaultMallocZone(), size * sizeof(id) );
}
return self;
}
- (void)invalidPointer:(NSUInteger)ptr
{
[NSException raise:STInternalInconsistencyException
format:@"%@: invalid pointer %lu (sp=%lu size=%lu)",
self,
(unsigned long)ptr,
(unsigned long)pointer,
(unsigned long)size];
}
- (void)dealloc
{
NSZoneFree(NSDefaultMallocZone(),stack);
[super dealloc];
}
#define INDEX_IS_VALID(index) \
((index >= 0) && (index < size))
#define CHECK_POINTER(value) \
do {\
if(!INDEX_IS_VALID(value)) \
{\
[self invalidPointer:value];\
} \
}\
while(0)
/*
- (void)setPointer:(NSUInteger)newPointer
{
CHECK_POINTER(newPointer);
pointer=newPointer;
}
*/
- (NSUInteger)pointer
{
return pointer;
}
- (void)push:(id)value
{
CHECK_POINTER(pointer);
NSDebugLLog(@"STStack",@"stack:%p %02lu push '%@'",
self,(unsigned long)pointer,value);
stack[pointer++] = value;
}
- (void)duplicateTop
{
[self push:[self valueAtTop]];
}
#define CONVERT_NIL(obj) ((obj == STNil) ? nil : (obj))
- (id)valueAtTop
{
CHECK_POINTER(pointer-1);
return CONVERT_NIL(stack[pointer-1]);
}
- (id)valueFromTop:(NSUInteger)index
{
id value;
CHECK_POINTER(pointer-index-1);
value = stack[pointer - index - 1];
NSDebugLLog(@"STStack",@"stack:%p %02li from top %li '%@'",
self,(unsigned long)pointer,(unsigned long)index,value);
return CONVERT_NIL(value);
}
- (id)pop
{
CHECK_POINTER(pointer-1);
NSDebugLLog(@"STStack",@"stack:%p %02li pop '%@'",
self,(unsigned long)pointer,stack[pointer-1]);
pointer --;
return CONVERT_NIL(stack[pointer]);
}
- (void)popCount:(NSUInteger)count
{
CHECK_POINTER(pointer-count);
NSDebugLLog(@"STStack",@"stack:%p %02lu pop count %lu (%li)",self,
(unsigned long)pointer,(unsigned long)count,
(long)(pointer-count));
pointer -= count;
}
- (void)empty
{
pointer = 0;
}
@end