dart-sdk/runtime/vm/assembler_test.cc
Florian Schneider 25966d228d VM: Refactor assembler test that rely on the constant pool.
This makes the test code independent of the way we call Dart code and
makes it easier to change the calling convention.

The code for calling test code is now encapsulated in unit_test.h instead
of being spread over many different files.

I only changed the tests that need a constant pool set up, but the same strategy
could be used for all other assembler tests to avoid unnecessary duplicated
boilerplate code.

BUG=
R=zra@google.com

Review URL: https://codereview.chromium.org//1283733003 .
2015-08-18 11:36:05 +02:00

65 lines
2.5 KiB
C++

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