Home | History | Annotate | Download | only in kati
      1 // Copyright 2015 Google Inc. All rights reserved
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //      http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #ifndef EVAL_H_
     16 #define EVAL_H_
     17 
     18 #include <unordered_map>
     19 #include <unordered_set>
     20 #include <vector>
     21 
     22 #include "loc.h"
     23 #include "stmt.h"
     24 #include "string_piece.h"
     25 #include "symtab.h"
     26 
     27 using namespace std;
     28 
     29 class Makefile;
     30 class Rule;
     31 class Var;
     32 class Vars;
     33 
     34 class Evaluator {
     35  public:
     36   Evaluator();
     37   ~Evaluator();
     38 
     39   void EvalAssign(const AssignStmt* stmt);
     40   void EvalRule(const RuleStmt* stmt);
     41   void EvalCommand(const CommandStmt* stmt);
     42   void EvalIf(const IfStmt* stmt);
     43   void EvalInclude(const IncludeStmt* stmt);
     44   void EvalExport(const ExportStmt* stmt);
     45 
     46   Var* LookupVar(Symbol name);
     47   // For target specific variables.
     48   Var* LookupVarInCurrentScope(Symbol name);
     49 
     50   string EvalVar(Symbol name);
     51 
     52   const Loc& loc() const { return loc_; }
     53   void set_loc(const Loc& loc) { loc_ = loc; }
     54 
     55   const vector<const Rule*>& rules() const { return rules_; }
     56   const unordered_map<Symbol, Vars*>& rule_vars() const {
     57     return rule_vars_;
     58   }
     59   const unordered_map<Symbol, bool>& exports() const { return exports_; }
     60 
     61   void Error(const string& msg);
     62 
     63   void set_is_bootstrap(bool b) { is_bootstrap_ = b; }
     64 
     65   void set_current_scope(Vars* v) { current_scope_ = v; }
     66 
     67   bool avoid_io() const { return avoid_io_; }
     68   void set_avoid_io(bool a) { avoid_io_ = a; }
     69 
     70   const vector<string>& delayed_output_commands() const {
     71     return delayed_output_commands_;
     72   }
     73   void add_delayed_output_command(const string& c) {
     74     delayed_output_commands_.push_back(c);
     75   }
     76   void clear_delayed_output_commands() {
     77     delayed_output_commands_.clear();
     78   }
     79 
     80   static const unordered_set<Symbol>& used_undefined_vars() {
     81     return used_undefined_vars_;
     82   }
     83 
     84   int eval_depth() const { return eval_depth_; }
     85   void IncrementEvalDepth() {
     86     eval_depth_++;
     87   }
     88   void DecrementEvalDepth() {
     89     eval_depth_--;
     90   }
     91 
     92  private:
     93   Var* EvalRHS(Symbol lhs, Value* rhs, StringPiece orig_rhs, AssignOp op,
     94                bool is_override = false);
     95   void DoInclude(const string& fname);
     96 
     97   Var* LookupVarGlobal(Symbol name);
     98 
     99   unordered_map<Symbol, Vars*> rule_vars_;
    100   vector<const Rule*> rules_;
    101   unordered_map<Symbol, bool> exports_;
    102 
    103   Rule* last_rule_;
    104   Vars* current_scope_;
    105 
    106   Loc loc_;
    107   bool is_bootstrap_;
    108 
    109   bool avoid_io_;
    110   // This value tracks the nest level of make expressions. For
    111   // example, $(YYY) in $(XXX $(YYY)) is evaluated with depth==2.
    112   // This will be used to disallow $(shell) in other make constructs.
    113   int eval_depth_;
    114   // Commands which should run at ninja-time (i.e., info, warning, and
    115   // error).
    116   vector<string> delayed_output_commands_;
    117 
    118   static unordered_set<Symbol> used_undefined_vars_;
    119 };
    120 
    121 #endif  // EVAL_H_
    122