forked from tslarkin/Mercury
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Exceptions.m
executable file
·178 lines (143 loc) · 4.21 KB
/
Exceptions.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#import "Exceptions.h"
//#import "Engine.h"
#import "HMPort.h"
@implementation HermesException
-(NSMutableArray*)errorStrings
{
return nil;
}
@end
@implementation NotANumber
+ (void) raiseException: (char*)nan
{
NSException *myException
= [NSException exceptionWithName:@"NotANumber"
reason:@"The token is not a number"
userInfo:[NSDictionary
dictionaryWithObject:[NSString stringWithCString:nan]
forKey:@"token"]];
[myException raise];
}
@end
@implementation UnexpectedToken
+ (void) raiseException : (char*)unexpectedToken
{
NSString *detail = [NSString stringWithFormat:@"The token was %s",
unexpectedToken];
NSException *myException
= [NSException exceptionWithName:@"UnexpectedToken"
reason:@"An unexpected token was found"
userInfo:[NSDictionary dictionaryWithObject:
detail forKey:@"detail"]];
[myException raise];
}
@end
@implementation CircularDependency
+ (void) circularDependencyBetween:(HMPart*)x et:(HMPart*)y
{
NSString *detail = [NSString stringWithFormat:@"Circular dependency with %@",
[y name]];
NSDictionary *dict
= [NSDictionary dictionaryWithObjectsAndKeys:
detail, @"detail", nil];
CircularDependency *myException
= (CircularDependency*)[CircularDependency exceptionWithName:@"Circular Dependency"
reason:@"Circular dependency between two components"
userInfo:dict];
[myException raise];
}
@end
@implementation RuntimeException
-(void)dealloc
{
[super dealloc];
}
-(HMPort*)node
{
return _node;
}
-(void)setNode:(HMPort*)node
{
_node = node;
}
-(HMPart*)component
{
return _component;
}
-(void)setComponent:(HMPart*)component
{
_component = component;
}
-(NSMutableArray*)errorStrings
{
NSMutableArray *strings = [NSMutableArray arrayWithCapacity:3];
[strings addObject:[NSString stringWithFormat:@"Error: %@", [self reason]]];
[strings addObject:[NSString stringWithFormat:@"in component %@",
[_node name]]];
NSString *detail = [[self userInfo] objectForKey:@"detail"];
if (detail == nil) detail = @"";
[strings addObject:detail];
return strings;
}
@end
@implementation TypeMismatch
+(void)raiseException:(Cell*)cell inComponent:(id)component
{
extern NSDictionary *gCellListDict;
NSArray *typeNames = [gCellListDict objectForKey:@"TypeNames"];
NSString *detail
= [NSString stringWithFormat:@"Cell %@ in component %@ expected a value of type %@, but is connected to output %@, which is type %@",
[cell name], [component name],
[typeNames objectAtIndex:[cell baseType]],
[[cell reference] name],
[typeNames objectAtIndex:[[cell reference] cellType]]];
NSDictionary *dict
= [NSDictionary dictionaryWithObjectsAndKeys:
detail, @"detail", nil];
NSException *myException
= [NSException exceptionWithName:@"TypeMismatch"
reason:@"Actual type was not expected type"
userInfo:dict];
[myException raise];
}
+(void)raiseException:(Cell*)cell desiredType:(unsigned)desiredType
{
extern NSDictionary *gCellListDict;
NSArray *typeNames = [gCellListDict objectForKey:@"TypeNames"];
NSString *detail
= [NSString stringWithFormat:@"Cell \"%@\" of type %@, tried to return a value of type %@",
[cell name],
[typeNames objectAtIndex:[cell baseType]],
[typeNames objectAtIndex:desiredType]];
NSDictionary *dict
= [NSDictionary dictionaryWithObjectsAndKeys:
detail, @"detail", nil];
TypeMismatch *myException
= (TypeMismatch*)[TypeMismatch exceptionWithName:@"TypeMismatch"
reason:@"Actual type was not expected type"
userInfo:dict];
[myException raise];
}
@end
@implementation EmptyLookupDomain
+(void)raiseException
{
EmptyLookupDomain *myException = (EmptyLookupDomain*)[EmptyLookupDomain
exceptionWithName:@"EmptyLookup"
reason:@"The lookup table is empty"
userInfo:nil];
[myException raise];
}
@end
@implementation SimulationDone
+ (void) raiseException
{
SimulationDone *myException
= (SimulationDone*)[SimulationDone exceptionWithName:@"SimulationDone"
reason:@"End of simulation forced by some component"
userInfo:nil];
[myException raise];
}
@end
@implementation FireRuntimeError
@end