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

#include "src/api-arguments.h"

#include "src/api-arguments-inl.h"

namespace v8 {
namespace internal {

PropertyCallbackArguments::PropertyCallbackArguments(
    Isolate* isolate, Object data, Object self, JSObject holder,
    Maybe<ShouldThrow> should_throw)
    : Super(isolate) {
  slot_at(T::kThisIndex).store(self);
  slot_at(T::kHolderIndex).store(holder);
  slot_at(T::kDataIndex).store(data);
  slot_at(T::kIsolateIndex).store(Object(reinterpret_cast<Address>(isolate)));
  int value = Internals::kInferShouldThrowMode;
  if (should_throw.IsJust()) {
    value = should_throw.FromJust();
  }
  slot_at(T::kShouldThrowOnErrorIndex).store(Smi::FromInt(value));

  // Here the hole is set as default value.
  // It cannot escape into js as it's removed in Call below.
  HeapObject the_hole = ReadOnlyRoots(isolate).the_hole_value();
  slot_at(T::kReturnValueDefaultValueIndex).store(the_hole);
  slot_at(T::kReturnValueIndex).store(the_hole);
  DCHECK((*slot_at(T::kHolderIndex))->IsHeapObject());
  DCHECK((*slot_at(T::kIsolateIndex))->IsSmi());
}

FunctionCallbackArguments::FunctionCallbackArguments(
    internal::Isolate* isolate, internal::Object data,
    internal::HeapObject callee, internal::Object holder,
    internal::HeapObject new_target, internal::Address* argv, int argc)
    : Super(isolate), argv_(argv), argc_(argc) {
  slot_at(T::kDataIndex).store(data);
  slot_at(T::kHolderIndex).store(holder);
  slot_at(T::kNewTargetIndex).store(new_target);
  slot_at(T::kIsolateIndex).store(Object(reinterpret_cast<Address>(isolate)));
  // Here the hole is set as default value.
  // It cannot escape into js as it's remove in Call below.
  HeapObject the_hole = ReadOnlyRoots(isolate).the_hole_value();
  slot_at(T::kReturnValueDefaultValueIndex).store(the_hole);
  slot_at(T::kReturnValueIndex).store(the_hole);
  DCHECK((*slot_at(T::kHolderIndex))->IsHeapObject());
  DCHECK((*slot_at(T::kIsolateIndex))->IsSmi());
}

}  // namespace internal
}  // namespace v8
