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@0: #include dvander@0: #include "PoolAllocator.h" dvander@0: #include "AST.h" dvander@0: #include "NameBinding.h" dvander@0: dvander@0: namespace jc { dvander@0: dvander@0: class Scope : public PoolObject dvander@0: { dvander@0: PoolAllocator &pool_; dvander@0: std::vector names_; dvander@0: std::vector children_; dvander@0: std::vector parameters_; dvander@0: unsigned locals_; dvander@0: unsigned maxContainedLocals_; dvander@0: unsigned numFunctions_; dvander@1: dvander@0: bool empty() const { dvander@0: return names_.size() == 0; dvander@0: } dvander@0: void unlink(); dvander@0: dvander@0: public: dvander@0: enum Kind { 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@0: unsigned locals() const { dvander@0: return locals_; dvander@0: } dvander@0: unsigned maxContainedLocals() const { dvander@0: return maxContainedLocals_; dvander@0: } dvander@0: unsigned numFunctions() const { dvander@0: return numFunctions_; dvander@0: } dvander@0: unsigned numArguments() const { dvander@0: return parameters_.size(); dvander@0: } dvander@0: Variable *getArgument(size_t index) { dvander@0: return parameters_[index]; dvander@0: } dvander@1: Variable *firstUnsafeArray(); dvander@0: dvander@0: Scope *unlinkIfEmpty(); dvander@0: BoundName *localLookup(Name *name); dvander@0: BoundName *lookup(Name *name); dvander@0: NamedFunction *declareFunction(Name *name); dvander@0: Variable *declareVariable(Name *name); dvander@0: Variable *declareArgument(Name *name); dvander@0: void allocate(); dvander@0: void allocateGlobals(); dvander@0: dvander@0: public: dvander@0: static bool BindAndAllocate(ParseTree *tree); dvander@0: dvander@0: private: dvander@0: Kind kind_; dvander@0: Scope *enclosing_; dvander@0: }; dvander@0: dvander@0: } dvander@0: dvander@0: #endif // _include_jitcraft_scopes_h_