18b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch// Copyright 2011 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ast/variables.h"
6a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/ast/scopes.h"
8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/globals.h"
962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects-inl.h"
10a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
11a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 {
12a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal {
13a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
14a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// ----------------------------------------------------------------------------
15a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block// Implementation Variable.
16a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochVariable::Variable(Scope* scope, const AstRawString* name, VariableMode mode,
18f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                   VariableKind kind, InitializationFlag initialization_flag,
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch                   MaybeAssignedFlag maybe_assigned_flag)
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : scope_(scope),
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      name_(name),
22f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      local_if_not_shadowed_(nullptr),
23c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch      next_(nullptr),
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      index_(-1),
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      initializer_position_(kNoSourcePosition),
26f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch      bit_field_(MaybeAssignedFlagField::encode(maybe_assigned_flag) |
27f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                 InitializationFlagField::encode(initialization_flag) |
28f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                 VariableModeField::encode(mode) | IsUsedField::encode(false) |
29f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                 ForceContextAllocationField::encode(false) |
30f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                 LocationField::encode(VariableLocation::UNALLOCATED) |
31f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch                 VariableKindField::encode(kind)) {
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Var declared variables never need initialization.
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  DCHECK(!(mode == VAR && initialization_flag == kNeedsInitialization));
34a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block}
35a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
36a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool Variable::IsGlobalObjectProperty() const {
38a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // Temporaries are never global, they must always be allocated in the
39a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block  // activation frame.
4062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  return (IsDynamicVariableMode(mode()) || mode() == VAR) &&
4162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch         scope_ != nullptr && scope_->is_script_scope();
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
46