| OLD | NEW | 
|---|
| 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a | 
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "vm/assembler.h" | 5 #include "vm/assembler.h" | 
| 6 #include "vm/globals.h" | 6 #include "vm/globals.h" | 
| 7 #include "vm/os.h" | 7 #include "vm/os.h" | 
| 8 #include "vm/simulator.h" | 8 #include "vm/simulator.h" | 
| 9 #include "vm/unit_test.h" | 9 #include "vm/unit_test.h" | 
| 10 #include "vm/virtual_memory.h" | 10 #include "vm/virtual_memory.h" | 
| 11 | 11 | 
| 12 namespace dart { | 12 namespace dart { | 
| 13 | 13 | 
| 14 ASSEMBLER_TEST_EXTERN(StoreIntoObject); | 14 ASSEMBLER_TEST_EXTERN(StoreIntoObject); | 
| 15 | 15 | 
| 16 ASSEMBLER_TEST_RUN(StoreIntoObject, test) { | 16 ASSEMBLER_TEST_RUN(StoreIntoObject, test) { | 
| 17 #if defined(USING_SIMULATOR) | 17 #define TEST_CODE(value, growable_array, thread)                               \ | 
| 18 #define test_code(value, growable_array, thread)                               \ | 18   test->Invoke<void, RawObject*, RawObject*, Thread*>(                         \ | 
| 19   Simulator::Current()->Call(                                                  \ | 19   value, growable_array, thread) | 
| 20       bit_cast<intptr_t, uword>(test->entry()),                                \ |  | 
| 21       reinterpret_cast<intptr_t>(value),                                       \ |  | 
| 22       reinterpret_cast<intptr_t>(growable_array),                              \ |  | 
| 23       reinterpret_cast<intptr_t>(thread),                                      \ |  | 
| 24       0) /* unused parameter */ |  | 
| 25 #else |  | 
| 26   typedef void (*StoreData)(RawObject* value, |  | 
| 27                             RawObject* growable_array, |  | 
| 28                             Thread* thread); |  | 
| 29   StoreData test_code = reinterpret_cast<StoreData>(test->entry()); |  | 
| 30 #endif |  | 
| 31 | 20 | 
| 32   const Array& old_array = Array::Handle(Array::New(3, Heap::kOld)); | 21   const Array& old_array = Array::Handle(Array::New(3, Heap::kOld)); | 
| 33   const Array& new_array = Array::Handle(Array::New(3, Heap::kNew)); | 22   const Array& new_array = Array::Handle(Array::New(3, Heap::kNew)); | 
| 34   const GrowableObjectArray& grow_old_array = GrowableObjectArray::Handle( | 23   const GrowableObjectArray& grow_old_array = GrowableObjectArray::Handle( | 
| 35       GrowableObjectArray::New(old_array, Heap::kOld)); | 24       GrowableObjectArray::New(old_array, Heap::kOld)); | 
| 36   const GrowableObjectArray& grow_new_array = GrowableObjectArray::Handle( | 25   const GrowableObjectArray& grow_new_array = GrowableObjectArray::Handle( | 
| 37       GrowableObjectArray::New(old_array, Heap::kNew)); | 26       GrowableObjectArray::New(old_array, Heap::kNew)); | 
| 38   Smi& smi = Smi::Handle(); | 27   Smi& smi = Smi::Handle(); | 
| 39   Thread* thread = Thread::Current(); | 28   Thread* thread = Thread::Current(); | 
| 40 | 29 | 
| 41   EXPECT(old_array.raw() == grow_old_array.data()); | 30   EXPECT(old_array.raw() == grow_old_array.data()); | 
| 42   EXPECT(!thread->StoreBufferContains(grow_old_array.raw())); | 31   EXPECT(!thread->StoreBufferContains(grow_old_array.raw())); | 
| 43   EXPECT(old_array.raw() == grow_new_array.data()); | 32   EXPECT(old_array.raw() == grow_new_array.data()); | 
| 44   EXPECT(!thread->StoreBufferContains(grow_new_array.raw())); | 33   EXPECT(!thread->StoreBufferContains(grow_new_array.raw())); | 
| 45 | 34 | 
| 46   // Store Smis into the old object. | 35   // Store Smis into the old object. | 
| 47   for (int i = -128; i < 128; i++) { | 36   for (int i = -128; i < 128; i++) { | 
| 48     smi = Smi::New(i); | 37     smi = Smi::New(i); | 
| 49     test_code(smi.raw(), grow_old_array.raw(), thread); | 38     TEST_CODE(smi.raw(), grow_old_array.raw(), thread); | 
| 50     EXPECT(reinterpret_cast<RawArray*>(smi.raw()) == grow_old_array.data()); | 39     EXPECT(reinterpret_cast<RawArray*>(smi.raw()) == grow_old_array.data()); | 
| 51     EXPECT(!thread->StoreBufferContains(grow_old_array.raw())); | 40     EXPECT(!thread->StoreBufferContains(grow_old_array.raw())); | 
| 52   } | 41   } | 
| 53 | 42 | 
| 54   // Store an old object into the old object. | 43   // Store an old object into the old object. | 
| 55   test_code(old_array.raw(), grow_old_array.raw(), thread); | 44   TEST_CODE(old_array.raw(), grow_old_array.raw(), thread); | 
| 56   EXPECT(old_array.raw() == grow_old_array.data()); | 45   EXPECT(old_array.raw() == grow_old_array.data()); | 
| 57   EXPECT(!thread->StoreBufferContains(grow_old_array.raw())); | 46   EXPECT(!thread->StoreBufferContains(grow_old_array.raw())); | 
| 58 | 47 | 
| 59   // Store a new object into the old object. | 48   // Store a new object into the old object. | 
| 60   test_code(new_array.raw(), grow_old_array.raw(), thread); | 49   TEST_CODE(new_array.raw(), grow_old_array.raw(), thread); | 
| 61   EXPECT(new_array.raw() == grow_old_array.data()); | 50   EXPECT(new_array.raw() == grow_old_array.data()); | 
| 62   EXPECT(thread->StoreBufferContains(grow_old_array.raw())); | 51   EXPECT(thread->StoreBufferContains(grow_old_array.raw())); | 
| 63 | 52 | 
| 64   // Store a new object into the new object. | 53   // Store a new object into the new object. | 
| 65   test_code(new_array.raw(), grow_new_array.raw(), thread); | 54   TEST_CODE(new_array.raw(), grow_new_array.raw(), thread); | 
| 66   EXPECT(new_array.raw() == grow_new_array.data()); | 55   EXPECT(new_array.raw() == grow_new_array.data()); | 
| 67   EXPECT(!thread->StoreBufferContains(grow_new_array.raw())); | 56   EXPECT(!thread->StoreBufferContains(grow_new_array.raw())); | 
| 68 | 57 | 
| 69   // Store an old object into the new object. | 58   // Store an old object into the new object. | 
| 70   test_code(old_array.raw(), grow_new_array.raw(), thread); | 59   TEST_CODE(old_array.raw(), grow_new_array.raw(), thread); | 
| 71   EXPECT(old_array.raw() == grow_new_array.data()); | 60   EXPECT(old_array.raw() == grow_new_array.data()); | 
| 72   EXPECT(!thread->StoreBufferContains(grow_new_array.raw())); | 61   EXPECT(!thread->StoreBufferContains(grow_new_array.raw())); | 
| 73 } | 62 } | 
| 74 | 63 | 
| 75 }  // namespace dart | 64 }  // namespace dart | 
| OLD | NEW | 
|---|