// 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.

#ifndef V8_COMPILER_ALLOCATION_BUILDER_INL_H_
#define V8_COMPILER_ALLOCATION_BUILDER_INL_H_

#include "src/compiler/allocation-builder.h"

#include "src/compiler/access-builder.h"
#include "src/objects/map-inl.h"

namespace v8 {
namespace internal {
namespace compiler {

void AllocationBuilder::AllocateContext(int variadic_part_length,
                                        Handle<Map> map) {
  DCHECK(
      IsInRange(map->instance_type(), FIRST_CONTEXT_TYPE, LAST_CONTEXT_TYPE));
  DCHECK_NE(NATIVE_CONTEXT_TYPE, map->instance_type());
  int size = Context::SizeFor(variadic_part_length);
  Allocate(size, AllocationType::kYoung, Type::OtherInternal());
  Store(AccessBuilder::ForMap(), map);
  STATIC_ASSERT(static_cast<int>(Context::kLengthOffset) ==
                static_cast<int>(FixedArray::kLengthOffset));
  Store(AccessBuilder::ForFixedArrayLength(),
        jsgraph()->Constant(variadic_part_length));
}

// Compound allocation of a FixedArray.
void AllocationBuilder::AllocateArray(int length, Handle<Map> map,
                                      AllocationType allocation) {
  DCHECK(map->instance_type() == FIXED_ARRAY_TYPE ||
         map->instance_type() == FIXED_DOUBLE_ARRAY_TYPE);
  int size = (map->instance_type() == FIXED_ARRAY_TYPE)
                 ? FixedArray::SizeFor(length)
                 : FixedDoubleArray::SizeFor(length);
  Allocate(size, allocation, Type::OtherInternal());
  Store(AccessBuilder::ForMap(), map);
  Store(AccessBuilder::ForFixedArrayLength(), jsgraph()->Constant(length));
}

}  // namespace compiler
}  // namespace internal
}  // namespace v8

#endif  // V8_COMPILER_ALLOCATION_BUILDER_INL_H_
