diff options
author | Matthias Benkard <mulk@minimulk.mst-plus> | 2008-08-18 16:13:54 +0200 |
---|---|---|
committer | Matthias Benkard <mulk@minimulk.mst-plus> | 2008-08-18 16:13:54 +0200 |
commit | eec88254d7e37ecb07b0503a9e87abfb81ce2460 (patch) | |
tree | d96aa76e24b4b090383623134b35eaf6a10f3431 /MLKLexicalContext.m | |
parent | 5cd4de577c08637cb5d78d1c3376b1ff80e74065 (diff) | |
parent | 054dc70426505f72a1e9856c9e48c0ae3349d68d (diff) |
Merge branch 'master' of http://matthias.benkard.de/code/mulklisp
Diffstat (limited to 'MLKLexicalContext.m')
-rw-r--r-- | MLKLexicalContext.m | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/MLKLexicalContext.m b/MLKLexicalContext.m index 1eaa51c..3f820a8 100644 --- a/MLKLexicalContext.m +++ b/MLKLexicalContext.m @@ -37,6 +37,8 @@ #import "runtime-compatibility.h" #import "util.h" +#include <stdlib.h> + #define MAKE_ENVIRONMENT(variable, parent, parent_member) \ [[MLKEnvironment alloc] \ @@ -196,9 +198,29 @@ static MLKSymbol *LEXICAL; with:_declarations]); } +-(id) contextForVariable:(MLKSymbol *)symbol +{ + if ([_variables containsObject:nullify(symbol)]) + return self; + else if (_parent) + return [_parent contextForVariable:symbol]; + else + return nil; +} + +-(id) contextForFunction:(MLKSymbol *)symbol +{ + if ([_functions containsObject:nullify(symbol)]) + return self; + else if (_parent) + return [_parent contextForFunction:symbol]; + else + return nil; +} + -(BOOL) symbolNamesFunction:(MLKSymbol *)symbol { - symbol = symbol ? (id)symbol : (id)[NSNull null]; + symbol = nullify (symbol); if ([_functions containsObject:symbol]) return YES; else if ([_knownMacros containsObject:symbol]) @@ -209,7 +231,7 @@ static MLKSymbol *LEXICAL; -(BOOL) symbolNamesMacro:(MLKSymbol *)symbol { - symbol = symbol ? (id)symbol : (id)[NSNull null]; + symbol = nullify (symbol); if ([_functions containsObject:symbol]) return NO; else if ([_knownMacros containsObject:symbol]) @@ -220,7 +242,7 @@ static MLKSymbol *LEXICAL; -(BOOL) symbolNamesSymbolMacro:(MLKSymbol *)symbol { - symbol = symbol ? (id)symbol : (id)[NSNull null]; + symbol = nullify (symbol); if ([_variables containsObject:symbol]) return NO; else if ([_knownSymbolMacros containsObject:symbol]) @@ -399,20 +421,25 @@ static MLKSymbol *LEXICAL; } } --(id) bindingForSymbol:(id)name +-(id *) bindingCellForSymbol:(id)name { id prop = [self deepPropertyForVariable:name key:@"LEXCTX.variable-binding"]; if (!prop) { - prop = [MLKBinding binding]; + id *cell = malloc (sizeof(id)); + *cell = [[MLKBinding alloc] init]; + prop = [NSValue valueWithPointer:cell]; [self setDeepProperty:prop forVariable:name key:@"LEXCTX.variable-binding"]; + return cell; + } + else + { + return [prop pointerValue]; } - - return prop; } -(void) dealloc |