summaryrefslogtreecommitdiff
path: root/MLKLexicalContext.m
diff options
context:
space:
mode:
authorMatthias Andreas Benkard <matthias@benkard.de>2008-08-18 11:38:56 +0200
committerMatthias Andreas Benkard <matthias@benkard.de>2008-08-18 11:41:15 +0200
commit4447563e79bb32bbda14641733049fe544392917 (patch)
treed1d4cdd5498b988817d386a855887b403896eb6f /MLKLexicalContext.m
parent60993a5e474244a3f4f623bb81d5191f2ec50993 (diff)
LLVM compiler: Implement dynamic variable access.
Diffstat (limited to 'MLKLexicalContext.m')
-rw-r--r--MLKLexicalContext.m39
1 files changed, 32 insertions, 7 deletions
diff --git a/MLKLexicalContext.m b/MLKLexicalContext.m
index 2af717b..3f820a8 100644
--- a/MLKLexicalContext.m
+++ b/MLKLexicalContext.m
@@ -198,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])
@@ -211,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])
@@ -222,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])
@@ -401,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