From 508b4902f6e6df7387b617a67c6fe5e248ee2c38 Mon Sep 17 00:00:00 2001 From: Matthias Andreas Benkard Date: Thu, 12 Jun 2008 20:27:29 +0200 Subject: Add class MLKDynamicContext. --- MLKDynamicContext.m | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 MLKDynamicContext.m (limited to 'MLKDynamicContext.m') diff --git a/MLKDynamicContext.m b/MLKDynamicContext.m new file mode 100644 index 0000000..2d8312f --- /dev/null +++ b/MLKDynamicContext.m @@ -0,0 +1,63 @@ +/* -*- mode: objc; coding: utf-8 -*- */ +/* Copyright 2008, Matthias Benkard. */ + +#import +#import +#import + +#import "MLKDynamicContext.h" +#import "MLKEnvironment.h" +#import "MLKLinkedList.h" + + +#define MAKE_ENVIRONMENT(variable, parent, parent_member) \ + (variable \ + ? (id) [[MLKEnvironment alloc] \ + initWithParent:(parent \ + ? (id) parent_member \ + : nil) \ + bindings:vars] \ + : (id) (parent ? (id) parent_member : nil)); + + +@implementation MLKDynamicContext +-(MLKDynamicContext *) initWithParent:(MLKDynamicContext *)aContext + variables:(NSDictionary *)vars + handlers:(NSDictionary *)handlers + restarts:(NSDictionary *)restarts + currentHandler:(MLKClosure *)handler +{ + _parent = (aContext ? aContext : [MLKDynamicContext currentContext]); + _environment = MAKE_ENVIRONMENT(vars, _parent, _parent->_environment); + _conditionHandlers = MAKE_ENVIRONMENT(handlers, + _parent, + _parent->_conditionHandlers); + _restarts = MAKE_ENVIRONMENT(restarts, _parent, _parent->_restarts); + _currentConditionHandler = (handler + ? (id) handler + : (_parent + ? (id) _parent->_currentConditionHandler + : nil)); + return self; +} + +-(MLKDynamicContext *) pushContext +{ + return [[[NSThread currentThread] threadDictionary] + objectForKey:@"MLKDynamicContext"]; +} + ++(MLKDynamicContext *) currentContext +{ + return [[[NSThread currentThread] threadDictionary] + objectForKey:@"MLKDynamicContext"]; +} + ++(MLKDynamicContext *) popContext +{ + MLKDynamicContext *context = [self currentContext]; + [[[NSThread currentThread] threadDictionary] setObject:context->_parent + forKey:@"MLKDynamicContext"]; + return context; +} +@end -- cgit v1.2.3