From 36e5729db554afaea6fe9b23f3caa87b6c8cc80d Mon Sep 17 00:00:00 2001 From: Dan Willemsen Date: Mon, 9 Oct 2017 11:23:32 -0700 Subject: Keep track of stack usage, report line that used the most This won't keep track of everything, but was useful in tracking down some recursive variables in the android build that shouldn't have been recursive (they were using 1MB+ of stack). Change-Id: I5e6b70480cffbebb09dfd72276017559480da948 --- expr.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'expr.cc') diff --git a/expr.cc b/expr.cc index f0afb7b..5419900 100644 --- a/expr.cc +++ b/expr.cc @@ -52,7 +52,8 @@ class Literal : public Value { StringPiece val() const { return s_; } - virtual void Eval(Evaluator*, string* s) const override { + virtual void Eval(Evaluator* ev, string* s) const override { + ev->CheckStack(); s->append(s_.begin(), s_.end()); } @@ -79,6 +80,7 @@ class Expr : public Value { void AddValue(Value* v) { vals_.push_back(v); } virtual void Eval(Evaluator* ev, string* s) const override { + ev->CheckStack(); for (Value* v : vals_) { v->Eval(ev, s); } @@ -119,6 +121,7 @@ class SymRef : public Value { virtual ~SymRef() {} virtual void Eval(Evaluator* ev, string* s) const override { + ev->CheckStack(); Var* v = ev->LookupVar(name_); v->Used(ev, name_); v->Eval(ev, s); @@ -138,6 +141,7 @@ class VarRef : public Value { virtual ~VarRef() { delete name_; } virtual void Eval(Evaluator* ev, string* s) const override { + ev->CheckStack(); ev->IncrementEvalDepth(); const string&& name = name_->Eval(ev); ev->DecrementEvalDepth(); @@ -166,6 +170,7 @@ class VarSubst : public Value { } virtual void Eval(Evaluator* ev, string* s) const override { + ev->CheckStack(); ev->IncrementEvalDepth(); const string&& name = name_->Eval(ev); Symbol sym = Intern(name); @@ -205,6 +210,7 @@ class Func : public Value { } virtual void Eval(Evaluator* ev, string* s) const override { + ev->CheckStack(); LOG("Invoke func %s(%s)", name(), JoinValues(args_, ",").c_str()); ev->IncrementEvalDepth(); fi_->func(args_, ev, s); -- cgit v1.2.3