普通文本  |  52行  |  1.26 KB

// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <fstream>
#include <iostream>
#include <string>

#include "src/torque/global-context.h"

#include "src/torque/scope.h"

namespace v8 {
namespace internal {
namespace torque {

Scope::Scope(ScopeChain& scope_chain)
    : scope_chain_(scope_chain),
      scope_number_(scope_chain_.GetNextScopeNumber()),
      private_label_number_(0) {}

Scope* ScopeChain::NewScope() {
  Scope* new_scope = new Scope(*this);
  scopes_.emplace_back(std::unique_ptr<Scope>(new_scope));
  return new_scope;
}

void Scope::AddLiveVariables(std::set<const Variable*>& set) {
  for (auto& current : lookup_) {
    if (current.second->IsVariable()) {
      set.insert(Variable::cast(current.second));
    }
  }
}

void Scope::Print() {
  std::cout << "scope #" << std::to_string(scope_number_) << "\n";
  for (auto& i : lookup_) {
    std::cout << i.first << ": " << i.second << "\n";
  }
}

Scope::Activator::Activator(Scope* scope) : scope_(scope) {
  scope->GetScopeChain().PushScope(scope);
}

Scope::Activator::~Activator() { scope_->GetScopeChain().PopScope(); }

}  // namespace torque
}  // namespace internal
}  // namespace v8