summaryrefslogtreecommitdiff
path: root/MLKDynamicContext.m
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-06-12 20:27:29 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-06-12 20:27:29 +0200
commit508b4902f6e6df7387b617a67c6fe5e248ee2c38 (patch)
treec8eb79aa2cc5d8c63e9f41440055e7be92bedfcb /MLKDynamicContext.m
parenta6955cf42df675518514e4da54f36174de9eb736 (diff)
Add class MLKDynamicContext.
Diffstat (limited to 'MLKDynamicContext.m')
-rw-r--r--MLKDynamicContext.m63
1 files changed, 63 insertions, 0 deletions
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 <Foundation/NSDictionary.h>
+#import <Foundation/NSArray.h>
+#import <Foundation/NSThread.h>
+
+#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