dvander@0: /* dvander@0: * Copyright (C) 2012 David Anderson dvander@0: * dvander@0: * This file is part of JITCraft. dvander@0: * dvander@0: * JITCraft is free software: you can redistribute it and/or modify it under dvander@0: * the terms of the GNU General Public License as published by the Free dvander@0: * Software Foundation, either version 3 of the License, or (at your option) dvander@0: * any later version. dvander@0: * dvander@0: * Foobar is distributed in the hope that it will be useful, but WITHOUT ANY dvander@0: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS dvander@0: * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. dvander@0: * dvander@0: * You should have received a copy of the GNU General Public License along with dvander@0: * JITCraft. If not, see http://www.gnu.org/licenses/. dvander@0: */ dvander@0: #ifndef _include_jitcraft_scopes_h_ dvander@0: #define _include_jitcraft_scopes_h_ dvander@0: dvander@195: #include "../PoolAllocator.h" dvander@195: #include "../Structures.h" dvander@0: #include "AST.h" dvander@0: #include "NameBinding.h" dvander@0: dvander@59: namespace ke { dvander@0: dvander@84: class CompileContext; dvander@85: class EnvironmentMap; dvander@195: class Struct; dvander@84: dvander@0: class Scope : public PoolObject dvander@0: { dvander@195: protected: dvander@0: PoolAllocator &pool_; dvander@195: PoolList names_; dvander@58: PoolList children_; dvander@1: dvander@0: bool empty() const { dvander@58: return names_.length() == 0; dvander@0: } dvander@0: void unlink(); dvander@0: dvander@0: public: dvander@0: enum Kind { dvander@195: IMPORT, dvander@0: GLOBAL, dvander@0: FUNCTION, dvander@0: BLOCK dvander@0: }; dvander@0: dvander@0: public: dvander@0: Scope(PoolAllocator &pool, Kind kind, Scope *enclosing); dvander@0: bool initialize(); dvander@0: dvander@0: Kind kind() const { dvander@0: return kind_; dvander@0: } dvander@0: Scope *enclosing() const { dvander@0: return enclosing_; dvander@0: } dvander@195: dvander@195: bool addSymbol(Symbol *symbol); dvander@0: dvander@0: Scope *unlinkIfEmpty(); dvander@195: Symbol *localLookup(Handle name); dvander@195: Symbol *lookup(Handle name); dvander@25: dvander@85: EnvironmentMap *createEnvironmentMap(Zone *zone); dvander@85: dvander@195: void setParent(Scope *parent) { dvander@195: assert(!enclosing_ || enclosing_ == parent); dvander@195: enclosing_ = parent; dvander@195: } dvander@0: dvander@0: private: dvander@0: Kind kind_; dvander@0: Scope *enclosing_; dvander@0: }; dvander@0: dvander@195: class ArgumentScope : public Scope dvander@195: { dvander@195: public: dvander@195: static ArgumentScope *New(PoolAllocator &pool); dvander@195: dvander@195: private: dvander@195: ArgumentScope(PoolAllocator &pool); dvander@195: }; dvander@195: dvander@195: class LocalScope : public Scope dvander@195: { dvander@195: public: dvander@195: static LocalScope *New(PoolAllocator &pool); dvander@195: dvander@195: private: dvander@195: LocalScope(PoolAllocator &pool); dvander@195: }; dvander@195: dvander@195: class GlobalScope : public Scope dvander@195: { dvander@195: public: dvander@195: static GlobalScope *New(PoolAllocator &pool, ImportScope *parent); dvander@195: dvander@195: bool addPublic(Symbol *symbol); dvander@195: Symbol *findPublic(Handle name); dvander@195: Struct *build(Zone *zone); dvander@195: dvander@195: private: dvander@195: GlobalScope(PoolAllocator &pool, ImportScope *parent); dvander@195: dvander@195: private: dvander@195: PoolList publics_; dvander@195: }; dvander@195: dvander@195: class ImportScope : public Scope dvander@195: { dvander@195: public: dvander@195: static ImportScope *New(PoolAllocator &pool); dvander@195: dvander@195: private: dvander@195: ImportScope(PoolAllocator &pool); dvander@195: }; dvander@195: dvander@0: } dvander@0: dvander@0: #endif // _include_jitcraft_scopes_h_