blob: da2d8387f5117c541ea056685e3e4701053c84f4 [file] [log] [blame]
// Copyright 2011 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 "src/ast/variables.h"
#include "src/ast/scopes.h"
#include "src/common/globals.h"
#include "src/objects/objects-inl.h"
namespace v8 {
namespace internal {
// ----------------------------------------------------------------------------
// Implementation Variable.
Variable::Variable(Variable* other)
: scope_(other->scope_),
name_(other->name_),
local_if_not_shadowed_(nullptr),
next_(nullptr),
index_(other->index_),
initializer_position_(other->initializer_position_),
bit_field_(other->bit_field_) {}
bool Variable::IsGlobalObjectProperty() const {
// Temporaries are never global, they must always be allocated in the
// activation frame.
return (IsDynamicVariableMode(mode()) || mode() == VariableMode::kVar) &&
scope_ != nullptr && scope_->is_script_scope();
}
bool Variable::IsReplGlobalLet() const {
return scope()->is_repl_mode_scope() && mode() == VariableMode::kLet;
}
void Variable::RewriteLocationForRepl() {
DCHECK(scope_->is_repl_mode_scope());
if (mode() == VariableMode::kLet) {
DCHECK_EQ(location(), VariableLocation::CONTEXT);
bit_field_ =
LocationField::update(bit_field_, VariableLocation::REPL_GLOBAL);
}
}
} // namespace internal
} // namespace v8