// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "vm/assembler.h"
#include "vm/globals.h"
#include "vm/os.h"
#include "vm/simulator.h"
#include "vm/unit_test.h"
#include "vm/virtual_memory.h"

namespace dart {

ASSEMBLER_TEST_EXTERN(StoreIntoObject);

ASSEMBLER_TEST_RUN(StoreIntoObject, test) {
#define TEST_CODE(value, growable_array, thread)                               \
  test->Invoke<void, RawObject*, RawObject*, Thread*>(value, growable_array,   \
                                                      thread)

  const Array& old_array = Array::Handle(Array::New(3, Heap::kOld));
  const Array& new_array = Array::Handle(Array::New(3, Heap::kNew));
  const GrowableObjectArray& grow_old_array = GrowableObjectArray::Handle(
      GrowableObjectArray::New(old_array, Heap::kOld));
  const GrowableObjectArray& grow_new_array = GrowableObjectArray::Handle(
      GrowableObjectArray::New(old_array, Heap::kNew));
  Smi& smi = Smi::Handle();
  Thread* thread = Thread::Current();

  EXPECT(old_array.raw() == grow_old_array.data());
  EXPECT(!thread->StoreBufferContains(grow_old_array.raw()));
  EXPECT(old_array.raw() == grow_new_array.data());
  EXPECT(!thread->StoreBufferContains(grow_new_array.raw()));

  // Store Smis into the old object.
  for (int i = -128; i < 128; i++) {
    smi = Smi::New(i);
    TEST_CODE(smi.raw(), grow_old_array.raw(), thread);
    EXPECT(reinterpret_cast<RawArray*>(smi.raw()) == grow_old_array.data());
    EXPECT(!thread->StoreBufferContains(grow_old_array.raw()));
  }

  // Store an old object into the old object.
  TEST_CODE(old_array.raw(), grow_old_array.raw(), thread);
  EXPECT(old_array.raw() == grow_old_array.data());
  EXPECT(!thread->StoreBufferContains(grow_old_array.raw()));

  // Store a new object into the old object.
  TEST_CODE(new_array.raw(), grow_old_array.raw(), thread);
  EXPECT(new_array.raw() == grow_old_array.data());
  EXPECT(thread->StoreBufferContains(grow_old_array.raw()));

  // Store a new object into the new object.
  TEST_CODE(new_array.raw(), grow_new_array.raw(), thread);
  EXPECT(new_array.raw() == grow_new_array.data());
  EXPECT(!thread->StoreBufferContains(grow_new_array.raw()));

  // Store an old object into the new object.
  TEST_CODE(old_array.raw(), grow_new_array.raw(), thread);
  EXPECT(old_array.raw() == grow_new_array.data());
  EXPECT(!thread->StoreBufferContains(grow_new_array.raw()));
}

}  // namespace dart
