diff options
| author | Matthias Andreas Benkard <matthias@benkard.de> | 2008-09-01 23:39:42 +0200 | 
|---|---|---|
| committer | Matthias Andreas Benkard <matthias@benkard.de> | 2008-09-01 23:39:42 +0200 | 
| commit | a5364817b1cd751832a4634e4afbd67bb668fa2e (patch) | |
| tree | aa17dedb58241b6d9f0462762baf11b4f9291127 /MLKLLVMCompiler.mm | |
| parent | 73903e25720a373028a2bf269c2aab27385c4692 (diff) | |
LLVM compiler: Add support for heap allocation of lexical variables.
Diffstat (limited to 'MLKLLVMCompiler.mm')
| -rw-r--r-- | MLKLLVMCompiler.mm | 51 | 
1 files changed, 39 insertions, 12 deletions
| diff --git a/MLKLLVMCompiler.mm b/MLKLLVMCompiler.mm index b40d4d0..e0d53dd 100644 --- a/MLKLLVMCompiler.mm +++ b/MLKLLVMCompiler.mm @@ -458,10 +458,15 @@ static Constant                           onObject:dynctx                           withArgumentVector:&args];      } -  else if ([_context variableHeapAllocationForSymbol:_form]) +  else if ([_context contextForVariable:_form] == [MLKLexicalContext globalContext])      {        //[_compiler insertTrace:@"Global."]; -      Value *binding = builder.CreateLoad (builder.Insert ([_context bindingCellValueForSymbol:_form])); +      Value *binding = builder.Insert ([_context globalBindingValueForSymbol:_form]); +      value = [_compiler insertMethodCall:@"value" onObject:binding];       +    } +  else if ([_context variableHeapAllocationForSymbol:_form]) +    { +      Value *binding = [_context bindingValueForSymbol:_form];        value = [_compiler insertMethodCall:@"value" onObject:binding];      }    else @@ -693,15 +698,29 @@ static Constant    while ((binding_form = [e nextObject]))      { -      // FIXME: Handle heap allocation.        Value *binding_value = [[binding_form valueForm] processForLLVM]; -      Value *binding_variable = builder.CreateAlloca (PointerTy, -                                                      NULL, -                                                      [(MLKPrintToString([binding_form name])) -                                                        UTF8String]); -      builder.CreateStore (binding_value, binding_variable); -      [_bodyContext setValueValue:binding_variable -                    forSymbol:[binding_form name]]; + +      if ([_bodyContext variableHeapAllocationForSymbol:[binding_form name]]) +        { +          Value *mlkbinding = [_compiler insertClassLookup:@"MLKBinding"]; +          std::vector<Value *> args (1, binding_value); +          Value *binding = [_compiler insertMethodCall:@"bindingWithValue:" +                                      onObject:mlkbinding +                                      withArgumentVector:&args]; +          [_bodyContext setBindingValue:binding +                        forSymbol:[binding_form name]]; +        } +      else +        { +          Value *binding_variable = builder.CreateAlloca (PointerTy, +                                                          NULL, +                                                          [(MLKPrintToString([binding_form name])) +                                                            UTF8String]); +          builder.CreateStore (binding_value, binding_variable); + +          [_bodyContext setValueValue:binding_variable +                        forSymbol:[binding_form name]]; +        }      }    e = [_bodyForms objectEnumerator]; @@ -806,10 +825,18 @@ static Constant                       onObject:dynctx                       withArgumentVector:&args];                    } +      else if ([_context contextForVariable:variable] == [MLKLexicalContext globalContext]) +        { +          Value *binding = builder.Insert ([_context globalBindingValueForSymbol:variable]); +          std::vector<Value *> args (1, value); + +          [_compiler insertVoidMethodCall:@"setValue:" +                     onObject:binding +                     withArgumentVector:&args]; +        }        else if ([_context variableHeapAllocationForSymbol:variable])          { -          Value *binding = builder.CreateLoad (builder.Insert ([_context -                                                                 bindingCellValueForSymbol:variable])); +          Value *binding = [_context bindingValueForSymbol:variable];            std::vector<Value *> args (1, value);            [_compiler insertVoidMethodCall:@"setValue:" | 
