From 6d9b8a06e9d9fece731d045db2f815f261db09c3 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 7 Mar 2009 03:56:20 +0000 Subject: Ensure only CEnv can call compile function directly (fix recursive functions). git-svn-id: http://svn.drobilla.net/resp/tuplr@74 ad02d1e2-f140-0410-9f75-f8b11f17cedd --- llvm.cpp | 2 +- tuplr.hpp | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/llvm.cpp b/llvm.cpp index 8eeab42..c0c46c9 100644 --- a/llvm.cpp +++ b/llvm.cpp @@ -281,7 +281,7 @@ CValue ASTCall::compile(CEnv& cenv) { AST* c = maybeLookup(cenv, at(0)); - Function* f = dynamic_cast(LLVal(c->compile(cenv))); + Function* f = dynamic_cast(LLVal(cenv.compile(c))); if (!f) throw Error("callee failed to compile", exp.loc); vector params(size() - 1); diff --git a/tuplr.hpp b/tuplr.hpp index c86ff68..29b8463 100644 --- a/tuplr.hpp +++ b/tuplr.hpp @@ -99,13 +99,15 @@ struct CEnv; ///< Compile-Time Environment struct AST { AST(Cursor c=Cursor()) : loc(c) {} virtual ~AST() {} - virtual string str() const = 0; - virtual bool operator==(const AST& o) const = 0; - virtual bool contains(AST* child) const { return false; } - virtual void constrain(TEnv& tenv) const {} - virtual void lift(CEnv& cenv) {} - virtual CValue compile(CEnv& cenv) = 0; + virtual string str() const = 0; + virtual bool operator==(const AST& o) const = 0; + virtual bool contains(const AST* child) const { return false; } + virtual void constrain(TEnv& tenv) const {} + virtual void lift(CEnv& cenv) {} Cursor loc; +private: + friend class CEnv; + virtual CValue compile(CEnv& cenv) = 0; }; /// Literal value -- cgit v1.2.1