summaryrefslogtreecommitdiff
path: root/MLKDynamicContext.m
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-06-14 20:30:55 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-06-14 20:30:55 +0200
commit51e2909e615867293d949217073093404a2c1139 (patch)
treeca40bc1c7f2a3ab4ed2d621d75762364a6ec31b1 /MLKDynamicContext.m
parentcfc17a412d17cac2aa8ad31e434c803a4a7d21b3 (diff)
MLKDynamicContext: Implement -findHandler:.
Diffstat (limited to 'MLKDynamicContext.m')
-rw-r--r--MLKDynamicContext.m65
1 files changed, 53 insertions, 12 deletions
diff --git a/MLKDynamicContext.m b/MLKDynamicContext.m
index c034eac..d08deaa 100644
--- a/MLKDynamicContext.m
+++ b/MLKDynamicContext.m
@@ -41,7 +41,7 @@
handlers:(NSDictionary *)handlers
restarts:(NSDictionary *)restarts
catchTags:(NSDictionary *)catchTags
- currentHandler:(MLKClosure *)handler
+ activeHandlerEnvironment:(MLKEnvironment *)handlerEnv;
{
self = [super init];
ASSIGN (_parent, (aContext ? aContext : [MLKDynamicContext currentContext]));
@@ -51,11 +51,12 @@
_parent->_conditionHandlers);
_restarts = MAKE_ENVIRONMENT(restarts, _parent, _parent->_restarts);
_catchTags = MAKE_ENVIRONMENT(catchTags, _parent, _parent->_catchTags);
- _currentConditionHandler = (handler
- ? (id) handler
- : (_parent
- ? (id) _parent->_currentConditionHandler
- : nil));
+ ASSIGN (_activeHandlerEnvironment,
+ handlerEnv
+ ? (id) handlerEnv
+ : (_parent
+ ? (id) (_parent->_activeHandlerEnvironment)
+ : nil));
return self;
}
@@ -86,19 +87,59 @@
-(id) findRestart:(MLKSymbol *)symbol
{
- return [_restarts valueForBinding:symbol];
+ NS_DURING
+ {
+ return [_restarts valueForBinding:symbol];
+ }
+ NS_HANDLER
+ {
+ if ([[localException name] isEqualToString: @"MLKUndefinedVariableException"])
+ NS_VALUERETURN (nil, id);
+ else
+ [localException raise];
+ }
+ NS_ENDHANDLER;
+
+ return nil;
}
-/*
-(id) findHandler:(MLKSymbol *)symbol
{
- // ???
+ NS_DURING
+ {
+ if (_activeHandlerEnvironment)
+ return [[_activeHandlerEnvironment parent] valueForBinding:symbol];
+ else
+ return [_conditionHandlers valueForBinding:symbol];
+ }
+ NS_HANDLER
+ {
+ if ([[localException name] isEqualToString: @"MLKUndefinedVariableException"])
+ NS_VALUERETURN (nil, id);
+ else
+ [localException raise];
+ }
+ NS_ENDHANDLER;
+
+ return nil;
}
-*/
-(id) findCatchTag:(MLKSymbol *)symbol
{
- return [_catchTags valueForBinding:symbol];
+ NS_DURING
+ {
+ return [_catchTags valueForBinding:symbol];
+ }
+ NS_HANDLER
+ {
+ if ([[localException name] isEqualToString: @"MLKUndefinedVariableException"])
+ NS_VALUERETURN (nil, id);
+ else
+ [localException raise];
+ }
+ NS_ENDHANDLER;
+
+ return nil;
}
-(void) dealloc
@@ -106,7 +147,7 @@
RELEASE (_conditionHandlers);
RELEASE (_restarts);
RELEASE (_catchTags);
- RELEASE (_currentConditionHandler);
+ RELEASE (_activeHandlerEnvironment);
RELEASE (_environment);
RELEASE (_parent);
[super dealloc];