allocation-site-scopes-inl.h 2.01 KB
Newer Older
1 2 3 4
// Copyright 2018 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.

5 6
#ifndef V8_OBJECTS_ALLOCATION_SITE_SCOPES_INL_H_
#define V8_OBJECTS_ALLOCATION_SITE_SCOPES_INL_H_
7

8
#include "src/objects/allocation-site-scopes.h"
9 10 11 12 13 14

#include "src/objects/allocation-site-inl.h"

namespace v8 {
namespace internal {

15 16 17 18 19 20 21
void AllocationSiteContext::InitializeTraversal(Handle<AllocationSite> site) {
  top_ = site;
  // {current_} is updated in place to not create unnecessary Handles, hence
  // we initially need a separate handle.
  current_ = Handle<AllocationSite>::New(*top_, isolate());
}

22 23 24 25 26
Handle<AllocationSite> AllocationSiteUsageContext::EnterNewScope() {
  if (top().is_null()) {
    InitializeTraversal(top_site_);
  } else {
    // Advance current site
27
    Object nested_site = current()->nested_site();
28 29 30 31 32 33 34 35 36 37 38 39 40 41
    // Something is wrong if we advance to the end of the list here.
    update_current_site(AllocationSite::cast(nested_site));
  }
  return Handle<AllocationSite>(*current(), isolate());
}

void AllocationSiteUsageContext::ExitScope(Handle<AllocationSite> scope_site,
                                           Handle<JSObject> object) {
  // This assert ensures that we are pointing at the right sub-object in a
  // recursive walk of a nested literal.
  DCHECK(object.is_null() || *object == scope_site->boilerplate());
}

bool AllocationSiteUsageContext::ShouldCreateMemento(Handle<JSObject> object) {
42
  if (activated_ && AllocationSite::CanTrack(object->map().instance_type())) {
43 44 45 46 47
    if (FLAG_allocation_site_pretenuring ||
        AllocationSite::ShouldTrack(object->GetElementsKind())) {
      if (FLAG_trace_creation_allocation_sites) {
        PrintF("*** Creating Memento for %s %p\n",
               object->IsJSArray() ? "JSArray" : "JSObject",
48
               reinterpret_cast<void*>(object->ptr()));
49 50 51 52 53 54 55 56 57 58
      }
      return true;
    }
  }
  return false;
}

}  // namespace internal
}  // namespace v8

59
#endif  // V8_OBJECTS_ALLOCATION_SITE_SCOPES_INL_H_