diff options
Diffstat (limited to 'ast.cpp')
-rw-r--r-- | ast.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
@@ -58,12 +58,20 @@ PopAST::PopAST(const std::string& n): BaseAST(n) {} llvm::Value *PopAST::codegen(LLVMState& llvmState) const { - auto gep = llvmState.createPop(); - auto var = llvmState.createVariable(name); - auto load = llvmState.builder.CreateLoad(llvmState.inttype, gep); - llvmState.builder.CreateStore(load, var, false); + if (name == "self") { + extern std::list<ThunkAST> scope; + auto func = scope.back().func; + auto var = llvmState.createVariable(name); + llvmState.builder.CreateStore(func, var, false); + return Var::addLocal(name, var).value; + } else { + auto gep = llvmState.createPop(); + auto var = llvmState.createVariable(name); + auto load = llvmState.builder.CreateLoad(llvmState.inttype, gep); + llvmState.builder.CreateStore(load, var, false); - return Var::addLocal(name, var).value; + return Var::addLocal(name, var).value; + } } CallAST::CallAST(const std::string& n): BaseAST(n) {} |