| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 "platform/globals.h" | 5 #include "platform/globals.h" |
| 6 | 6 |
| 7 #include "vm/assembler.h" | 7 #include "vm/assembler.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
| 10 #include "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" |
| (...skipping 2130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2141 value = Smi::New(i * 10); | 2141 value = Smi::New(i * 10); |
| 2142 array.SetAt(i, value); | 2142 array.SetAt(i, value); |
| 2143 } | 2143 } |
| 2144 EXPECT_EQ(10, array.Length()); | 2144 EXPECT_EQ(10, array.Length()); |
| 2145 for (intptr_t i = 0; i < 10; i++) { | 2145 for (intptr_t i = 0; i < 10; i++) { |
| 2146 expected_value = Smi::New(i * 10); | 2146 expected_value = Smi::New(i * 10); |
| 2147 value ^= array.At(i); | 2147 value ^= array.At(i); |
| 2148 EXPECT(value.Equals(expected_value)); | 2148 EXPECT(value.Equals(expected_value)); |
| 2149 } | 2149 } |
| 2150 | 2150 |
| 2151 // Test the MakeArray functionality to make sure the resulting array | 2151 // Test the MakeFixedLength functionality to make sure the resulting array |
| 2152 // object is properly setup. | 2152 // object is properly setup. |
| 2153 // 1. Should produce an array of length 2 and a left over int8 array. | 2153 // 1. Should produce an array of length 2 and a left over int8 array. |
| 2154 Array& new_array = Array::Handle(); | 2154 Array& new_array = Array::Handle(); |
| 2155 TypedData& left_over_array = TypedData::Handle(); | 2155 TypedData& left_over_array = TypedData::Handle(); |
| 2156 Object& obj = Object::Handle(); | 2156 Object& obj = Object::Handle(); |
| 2157 uword addr = 0; | 2157 uword addr = 0; |
| 2158 intptr_t used_size = 0; | 2158 intptr_t used_size = 0; |
| 2159 | 2159 |
| 2160 array = GrowableObjectArray::New(kArrayLen + 1); | 2160 array = GrowableObjectArray::New(kArrayLen + 1); |
| 2161 EXPECT_EQ(kArrayLen + 1, array.Capacity()); | 2161 EXPECT_EQ(kArrayLen + 1, array.Capacity()); |
| 2162 EXPECT_EQ(0, array.Length()); | 2162 EXPECT_EQ(0, array.Length()); |
| 2163 for (intptr_t i = 0; i < 2; i++) { | 2163 for (intptr_t i = 0; i < 2; i++) { |
| 2164 value = Smi::New(i); | 2164 value = Smi::New(i); |
| 2165 array.Add(value); | 2165 array.Add(value); |
| 2166 } | 2166 } |
| 2167 used_size = Array::InstanceSize(array.Length()); | 2167 used_size = Array::InstanceSize(array.Length()); |
| 2168 new_array = Array::MakeArray(array); | 2168 new_array = Array::MakeFixedLength(array); |
| 2169 addr = RawObject::ToAddr(new_array.raw()); | 2169 addr = RawObject::ToAddr(new_array.raw()); |
| 2170 obj = RawObject::FromAddr(addr); | 2170 obj = RawObject::FromAddr(addr); |
| 2171 EXPECT(obj.IsArray()); | 2171 EXPECT(obj.IsArray()); |
| 2172 new_array ^= obj.raw(); | 2172 new_array ^= obj.raw(); |
| 2173 EXPECT_EQ(2, new_array.Length()); | 2173 EXPECT_EQ(2, new_array.Length()); |
| 2174 addr += used_size; | 2174 addr += used_size; |
| 2175 obj = RawObject::FromAddr(addr); | 2175 obj = RawObject::FromAddr(addr); |
| 2176 EXPECT(obj.IsTypedData()); | 2176 EXPECT(obj.IsTypedData()); |
| 2177 left_over_array ^= obj.raw(); | 2177 left_over_array ^= obj.raw(); |
| 2178 EXPECT_EQ((2 * kWordSize), left_over_array.Length()); | 2178 EXPECT_EQ((2 * kWordSize), left_over_array.Length()); |
| 2179 | 2179 |
| 2180 // 2. Should produce an array of length 3 and a left over int8 array. | 2180 // 2. Should produce an array of length 3 and a left over int8 array. |
| 2181 array = GrowableObjectArray::New(kArrayLen); | 2181 array = GrowableObjectArray::New(kArrayLen); |
| 2182 EXPECT_EQ(kArrayLen, array.Capacity()); | 2182 EXPECT_EQ(kArrayLen, array.Capacity()); |
| 2183 EXPECT_EQ(0, array.Length()); | 2183 EXPECT_EQ(0, array.Length()); |
| 2184 for (intptr_t i = 0; i < 3; i++) { | 2184 for (intptr_t i = 0; i < 3; i++) { |
| 2185 value = Smi::New(i); | 2185 value = Smi::New(i); |
| 2186 array.Add(value); | 2186 array.Add(value); |
| 2187 } | 2187 } |
| 2188 used_size = Array::InstanceSize(array.Length()); | 2188 used_size = Array::InstanceSize(array.Length()); |
| 2189 new_array = Array::MakeArray(array); | 2189 new_array = Array::MakeFixedLength(array); |
| 2190 addr = RawObject::ToAddr(new_array.raw()); | 2190 addr = RawObject::ToAddr(new_array.raw()); |
| 2191 obj = RawObject::FromAddr(addr); | 2191 obj = RawObject::FromAddr(addr); |
| 2192 EXPECT(obj.IsArray()); | 2192 EXPECT(obj.IsArray()); |
| 2193 new_array ^= obj.raw(); | 2193 new_array ^= obj.raw(); |
| 2194 EXPECT_EQ(3, new_array.Length()); | 2194 EXPECT_EQ(3, new_array.Length()); |
| 2195 addr += used_size; | 2195 addr += used_size; |
| 2196 obj = RawObject::FromAddr(addr); | 2196 obj = RawObject::FromAddr(addr); |
| 2197 EXPECT(obj.IsTypedData()); | 2197 EXPECT(obj.IsTypedData()); |
| 2198 left_over_array ^= obj.raw(); | 2198 left_over_array ^= obj.raw(); |
| 2199 EXPECT_EQ(0, left_over_array.Length()); | 2199 EXPECT_EQ(0, left_over_array.Length()); |
| 2200 | 2200 |
| 2201 // 3. Should produce an array of length 1 and a left over int8 array. | 2201 // 3. Should produce an array of length 1 and a left over int8 array. |
| 2202 array = GrowableObjectArray::New(kArrayLen + 3); | 2202 array = GrowableObjectArray::New(kArrayLen + 3); |
| 2203 EXPECT_EQ((kArrayLen + 3), array.Capacity()); | 2203 EXPECT_EQ((kArrayLen + 3), array.Capacity()); |
| 2204 EXPECT_EQ(0, array.Length()); | 2204 EXPECT_EQ(0, array.Length()); |
| 2205 for (intptr_t i = 0; i < 1; i++) { | 2205 for (intptr_t i = 0; i < 1; i++) { |
| 2206 value = Smi::New(i); | 2206 value = Smi::New(i); |
| 2207 array.Add(value); | 2207 array.Add(value); |
| 2208 } | 2208 } |
| 2209 used_size = Array::InstanceSize(array.Length()); | 2209 used_size = Array::InstanceSize(array.Length()); |
| 2210 new_array = Array::MakeArray(array); | 2210 new_array = Array::MakeFixedLength(array); |
| 2211 addr = RawObject::ToAddr(new_array.raw()); | 2211 addr = RawObject::ToAddr(new_array.raw()); |
| 2212 obj = RawObject::FromAddr(addr); | 2212 obj = RawObject::FromAddr(addr); |
| 2213 EXPECT(obj.IsArray()); | 2213 EXPECT(obj.IsArray()); |
| 2214 new_array ^= obj.raw(); | 2214 new_array ^= obj.raw(); |
| 2215 EXPECT_EQ(1, new_array.Length()); | 2215 EXPECT_EQ(1, new_array.Length()); |
| 2216 addr += used_size; | 2216 addr += used_size; |
| 2217 obj = RawObject::FromAddr(addr); | 2217 obj = RawObject::FromAddr(addr); |
| 2218 EXPECT(obj.IsTypedData()); | 2218 EXPECT(obj.IsTypedData()); |
| 2219 left_over_array ^= obj.raw(); | 2219 left_over_array ^= obj.raw(); |
| 2220 EXPECT_EQ((6 * kWordSize), left_over_array.Length()); | 2220 EXPECT_EQ((6 * kWordSize), left_over_array.Length()); |
| 2221 | 2221 |
| 2222 // 4. Verify that GC can handle the filler object for a large array. | 2222 // 4. Verify that GC can handle the filler object for a large array. |
| 2223 array = GrowableObjectArray::New((1 * MB) >> kWordSizeLog2); | 2223 array = GrowableObjectArray::New((1 * MB) >> kWordSizeLog2); |
| 2224 EXPECT_EQ(0, array.Length()); | 2224 EXPECT_EQ(0, array.Length()); |
| 2225 for (intptr_t i = 0; i < 1; i++) { | 2225 for (intptr_t i = 0; i < 1; i++) { |
| 2226 value = Smi::New(i); | 2226 value = Smi::New(i); |
| 2227 array.Add(value); | 2227 array.Add(value); |
| 2228 } | 2228 } |
| 2229 Heap* heap = Isolate::Current()->heap(); | 2229 Heap* heap = Isolate::Current()->heap(); |
| 2230 heap->CollectAllGarbage(); | 2230 heap->CollectAllGarbage(); |
| 2231 intptr_t capacity_before = heap->CapacityInWords(Heap::kOld); | 2231 intptr_t capacity_before = heap->CapacityInWords(Heap::kOld); |
| 2232 new_array = Array::MakeArray(array); | 2232 new_array = Array::MakeFixedLength(array); |
| 2233 EXPECT_EQ(1, new_array.Length()); | 2233 EXPECT_EQ(1, new_array.Length()); |
| 2234 heap->CollectAllGarbage(); | 2234 heap->CollectAllGarbage(); |
| 2235 intptr_t capacity_after = heap->CapacityInWords(Heap::kOld); | 2235 intptr_t capacity_after = heap->CapacityInWords(Heap::kOld); |
| 2236 // Page should shrink. | 2236 // Page should shrink. |
| 2237 EXPECT_LT(capacity_after, capacity_before); | 2237 EXPECT_LT(capacity_after, capacity_before); |
| 2238 EXPECT_EQ(1, new_array.Length()); | 2238 EXPECT_EQ(1, new_array.Length()); |
| 2239 } | 2239 } |
| 2240 | 2240 |
| 2241 | 2241 |
| 2242 ISOLATE_UNIT_TEST_CASE(InternalTypedData) { | 2242 ISOLATE_UNIT_TEST_CASE(InternalTypedData) { |
| (...skipping 2479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4722 // utf32->utf16 conversion. | 4722 // utf32->utf16 conversion. |
| 4723 int32_t char_codes[] = {0, 0x0a, 0x0d, 0x7f, 0xff, | 4723 int32_t char_codes[] = {0, 0x0a, 0x0d, 0x7f, 0xff, |
| 4724 0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff}; | 4724 0xffff, 0xd800, 0xdc00, 0xdbff, 0xdfff}; |
| 4725 | 4725 |
| 4726 const String& str = | 4726 const String& str = |
| 4727 String::Handle(String::FromUTF32(char_codes, ARRAY_SIZE(char_codes))); | 4727 String::Handle(String::FromUTF32(char_codes, ARRAY_SIZE(char_codes))); |
| 4728 EXPECT(str.Equals(char_codes, ARRAY_SIZE(char_codes))); | 4728 EXPECT(str.Equals(char_codes, ARRAY_SIZE(char_codes))); |
| 4729 } | 4729 } |
| 4730 | 4730 |
| 4731 } // namespace dart | 4731 } // namespace dart |
| OLD | NEW |