Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(80)

Side by Side Diff: runtime/vm/object_test.cc

Issue 9195031: Add ByteArray interface and provide internal and external implementations. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: address remaining review comments Created 8 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/object_store.cc ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/assert.h" 5 #include "platform/assert.h"
6 #include "vm/assembler.h" 6 #include "vm/assembler.h"
7 #include "vm/bigint_operations.h" 7 #include "vm/bigint_operations.h"
8 #include "vm/isolate.h" 8 #include "vm/isolate.h"
9 #include "vm/object.h" 9 #include "vm/object.h"
10 #include "vm/object_store.h" 10 #include "vm/object_store.h"
(...skipping 1717 matching lines...) Expand 10 before | Expand all | Expand 10 after
1728 1728
1729 other_array = Array::New(kArrayLen - 1); 1729 other_array = Array::New(kArrayLen - 1);
1730 other_array.SetAt(0, array); 1730 other_array.SetAt(0, array);
1731 other_array.SetAt(2, array); 1731 other_array.SetAt(2, array);
1732 EXPECT(!array.Equals(other_array)); 1732 EXPECT(!array.Equals(other_array));
1733 1733
1734 EXPECT_EQ(0, Array::Handle(Array::Empty()).Length()); 1734 EXPECT_EQ(0, Array::Handle(Array::Empty()).Length());
1735 } 1735 }
1736 1736
1737 1737
1738 TEST_CASE(ByteBuffer) { 1738 TEST_CASE(ExternalByteArray) {
1739 uint8_t data[] = { 253, 254, 255, 0, 1, 2, 3, 4 }; 1739 uint8_t data[] = { 253, 254, 255, 0, 1, 2, 3, 4 };
1740 intptr_t data_length = ARRAY_SIZE(data); 1740 intptr_t data_length = ARRAY_SIZE(data);
1741 1741
1742 const ByteBuffer& array1 = 1742 const ExternalByteArray& array1 =
1743 ByteBuffer::Handle(ByteBuffer::New(data, data_length)); 1743 ExternalByteArray::Handle(ExternalByteArray::New(data, data_length));
1744 EXPECT(!array1.IsNull()); 1744 EXPECT(!array1.IsNull());
1745 EXPECT_EQ(data_length, array1.Length()); 1745 EXPECT_EQ(data_length, array1.Length());
1746 EXPECT_EQ(-3, array1.At<int8_t>(0)); 1746 EXPECT_EQ(-3, array1.At<int8_t>(0));
1747 EXPECT_EQ(253, array1.At<uint8_t>(0)); 1747 EXPECT_EQ(253, array1.At<uint8_t>(0));
1748 EXPECT_EQ(-2, array1.At<int8_t>(1)); 1748 EXPECT_EQ(-2, array1.At<int8_t>(1));
1749 EXPECT_EQ(254, array1.At<uint8_t>(1)); 1749 EXPECT_EQ(254, array1.At<uint8_t>(1));
1750 EXPECT_EQ(-1, array1.At<int8_t>(2)); 1750 EXPECT_EQ(-1, array1.At<int8_t>(2));
1751 EXPECT_EQ(255, array1.At<uint8_t>(2)); 1751 EXPECT_EQ(255, array1.At<uint8_t>(2));
1752 EXPECT_EQ(0, array1.At<int8_t>(3)); 1752 EXPECT_EQ(0, array1.At<int8_t>(3));
1753 EXPECT_EQ(0, array1.At<uint8_t>(3)); 1753 EXPECT_EQ(0, array1.At<uint8_t>(3));
1754 EXPECT_EQ(1, array1.At<int8_t>(4)); 1754 EXPECT_EQ(1, array1.At<int8_t>(4));
1755 EXPECT_EQ(1, array1.At<uint8_t>(4)); 1755 EXPECT_EQ(1, array1.At<uint8_t>(4));
1756 EXPECT_EQ(2, array1.At<int8_t>(5)); 1756 EXPECT_EQ(2, array1.At<int8_t>(5));
1757 EXPECT_EQ(2, array1.At<uint8_t>(5)); 1757 EXPECT_EQ(2, array1.At<uint8_t>(5));
1758 1758
1759 const ByteBuffer& array2 = 1759 const ExternalByteArray& array2 =
1760 ByteBuffer::Handle(ByteBuffer::New(data, data_length)); 1760 ExternalByteArray::Handle(ExternalByteArray::New(data, data_length));
1761 EXPECT(!array1.IsNull()); 1761 EXPECT(!array1.IsNull());
1762 EXPECT_EQ(data_length, array2.Length()); 1762 EXPECT_EQ(data_length, array2.Length());
1763 EXPECT(array1.Equals(array2)); 1763 for (intptr_t i = 0 ; i < array1.Length(); ++i) {
1764 EXPECT(array2.Equals(array1)); 1764 EXPECT_EQ(array1.At<uint8_t>(i), array2.At<uint8_t>(i));
1765 }
1765 1766
1766 array1.SetAt<uint8_t>(0, 123); 1767 array1.SetAt<uint8_t>(0, 123);
1767 array2.SetAt<int8_t>(2, -123); 1768 array2.SetAt<int8_t>(2, -123);
1768 EXPECT(array1.Equals(array2)); 1769 for (intptr_t i = 0 ; i < array1.Length(); ++i) {
1769 EXPECT(array2.Equals(array1)); 1770 EXPECT_EQ(array1.At<uint8_t>(i), array2.At<uint8_t>(i));
1771 }
1770 } 1772 }
1771 1773
1772 1774
1773 TEST_CASE(ByteBufferAlignedAccess) { 1775 TEST_CASE(ExternalByteArrayAlignedAccess) {
1774 intptr_t length = 16; 1776 intptr_t length = 16;
1775 uint8_t* data = new uint8_t[length]; 1777 uint8_t* data = new uint8_t[length];
1776 1778
1777 const ByteBuffer& array1 = 1779 const ExternalByteArray& array1 =
1778 ByteBuffer::Handle(ByteBuffer::New(data, length)); 1780 ExternalByteArray::Handle(ExternalByteArray::New(data, length));
1779 EXPECT(!array1.IsNull()); 1781 EXPECT(!array1.IsNull());
1780 EXPECT_EQ(length, array1.Length()); 1782 EXPECT_EQ(length, array1.Length());
1781 1783
1782 const ByteBuffer& array2 = 1784 const ExternalByteArray& array2 =
1783 ByteBuffer::Handle(ByteBuffer::New(data, length)); 1785 ExternalByteArray::Handle(ExternalByteArray::New(data, length));
1784 EXPECT(!array2.IsNull()); 1786 EXPECT(!array2.IsNull());
1785 EXPECT_EQ(length, array2.Length()); 1787 EXPECT_EQ(length, array2.Length());
1786 1788
1787 memset(data, 0xAA, ARRAY_SIZE(data)); 1789 memset(data, 0xAA, ARRAY_SIZE(data));
1788 array1.SetAt<float>(0, FLT_MIN); 1790 array1.SetAt<float>(0, FLT_MIN);
1789 array1.SetAt<float>(4, FLT_MAX); 1791 array1.SetAt<float>(4, FLT_MAX);
1790 EXPECT_EQ(FLT_MIN, array2.At<float>(0)); 1792 EXPECT_EQ(FLT_MIN, array2.At<float>(0));
1791 EXPECT_EQ(FLT_MAX, array2.At<float>(4)); 1793 EXPECT_EQ(FLT_MAX, array2.At<float>(4));
1792 1794
1793 memset(data, 0xAA, ARRAY_SIZE(data)); 1795 memset(data, 0xAA, ARRAY_SIZE(data));
(...skipping 11 matching lines...) Expand all
1805 memset(data, 0xAA, ARRAY_SIZE(data)); 1807 memset(data, 0xAA, ARRAY_SIZE(data));
1806 array1.SetAt<double>(0, 0.0); 1808 array1.SetAt<double>(0, 0.0);
1807 EXPECT_EQ(0.0, array2.At<double>(0)); 1809 EXPECT_EQ(0.0, array2.At<double>(0));
1808 array1.SetAt<double>(8, 1.0); 1810 array1.SetAt<double>(8, 1.0);
1809 EXPECT_EQ(1.0, array2.At<double>(8)); 1811 EXPECT_EQ(1.0, array2.At<double>(8));
1810 1812
1811 delete[] data; 1813 delete[] data;
1812 } 1814 }
1813 1815
1814 1816
1815 TEST_CASE(ByteBufferUnlignedAccess) { 1817 TEST_CASE(ExternalByteArrayUnlignedAccess) {
1816 intptr_t length = 24; 1818 intptr_t length = 24;
1817 uint8_t* data = new uint8_t[length]; 1819 uint8_t* data = new uint8_t[length];
1818 1820
1819 const ByteBuffer& array1 = 1821 const ExternalByteArray& array1 =
1820 ByteBuffer::Handle(ByteBuffer::New(data, length)); 1822 ExternalByteArray::Handle(ExternalByteArray::New(data, length));
1821 EXPECT(!array1.IsNull()); 1823 EXPECT(!array1.IsNull());
1822 EXPECT_EQ(length, array1.Length()); 1824 EXPECT_EQ(length, array1.Length());
1823 1825
1824 const ByteBuffer& array2 = 1826 const ExternalByteArray& array2 =
1825 ByteBuffer::Handle(ByteBuffer::New(data, length)); 1827 ExternalByteArray::Handle(ExternalByteArray::New(data, length));
1826 EXPECT(!array2.IsNull()); 1828 EXPECT(!array2.IsNull());
1827 EXPECT_EQ(length, array2.Length()); 1829 EXPECT_EQ(length, array2.Length());
1828 1830
1829 int float_misalign = 3; 1831 int float_misalign = 3;
1830 memset(data, 0xAA, ARRAY_SIZE(data)); 1832 memset(data, 0xAA, ARRAY_SIZE(data));
1831 array1.SetUnalignedAt<float>(float_misalign, FLT_MIN); 1833 array1.SetUnalignedAt<float>(float_misalign, FLT_MIN);
1832 array1.SetUnalignedAt<float>(4 + float_misalign, FLT_MAX); 1834 array1.SetUnalignedAt<float>(4 + float_misalign, FLT_MAX);
1833 EXPECT_EQ(FLT_MIN, array2.UnalignedAt<float>(float_misalign)); 1835 EXPECT_EQ(FLT_MIN, array2.UnalignedAt<float>(float_misalign));
1834 EXPECT_EQ(FLT_MAX, array2.UnalignedAt<float>(4 + float_misalign)); 1836 EXPECT_EQ(FLT_MAX, array2.UnalignedAt<float>(4 + float_misalign));
1835 1837
(...skipping 14 matching lines...) Expand all
1850 memset(data, 0xAA, ARRAY_SIZE(data)); 1852 memset(data, 0xAA, ARRAY_SIZE(data));
1851 array1.SetUnalignedAt<double>(double_misalign, 0.0); 1853 array1.SetUnalignedAt<double>(double_misalign, 0.0);
1852 EXPECT_EQ(0.0, array2.UnalignedAt<double>(double_misalign)); 1854 EXPECT_EQ(0.0, array2.UnalignedAt<double>(double_misalign));
1853 array1.SetUnalignedAt<double>(8 + double_misalign, 1.0); 1855 array1.SetUnalignedAt<double>(8 + double_misalign, 1.0);
1854 EXPECT_EQ(1.0, array2.UnalignedAt<double>(8 + double_misalign)); 1856 EXPECT_EQ(1.0, array2.UnalignedAt<double>(8 + double_misalign));
1855 1857
1856 delete[] data; 1858 delete[] data;
1857 } 1859 }
1858 1860
1859 1861
1860 TEST_CASE(ByteBufferSkewedUnalignedBaseAccess) { 1862 TEST_CASE(ExternalByteArraySkewedUnalignedBaseAccess) {
1861 intptr_t length = 24; 1863 intptr_t length = 24;
1862 uint8_t* data = new uint8_t[length]; 1864 uint8_t* data = new uint8_t[length];
1863 1865
1864 int skew = 2; 1866 int skew = 2;
1865 1867
1866 const ByteBuffer& array1 = 1868 const ExternalByteArray& array1 =
1867 ByteBuffer::Handle(ByteBuffer::New(data + 3, length)); 1869 ExternalByteArray::Handle(ExternalByteArray::New(data + 3, length));
1868 EXPECT(!array1.IsNull()); 1870 EXPECT(!array1.IsNull());
1869 EXPECT_EQ(length, array1.Length()); 1871 EXPECT_EQ(length, array1.Length());
1870 1872
1871 const ByteBuffer& array2 = 1873 const ExternalByteArray& array2 =
1872 ByteBuffer::Handle(ByteBuffer::New(data + 1, length)); 1874 ExternalByteArray::Handle(ExternalByteArray::New(data + 1, length));
1873 EXPECT(!array2.IsNull()); 1875 EXPECT(!array2.IsNull());
1874 EXPECT_EQ(length, array2.Length()); 1876 EXPECT_EQ(length, array2.Length());
1875 1877
1876 memset(data, 0xAA, ARRAY_SIZE(data)); 1878 memset(data, 0xAA, ARRAY_SIZE(data));
1877 array1.SetUnalignedAt<float>(0, FLT_MIN); 1879 array1.SetUnalignedAt<float>(0, FLT_MIN);
1878 array1.SetUnalignedAt<float>(4, FLT_MAX); 1880 array1.SetUnalignedAt<float>(4, FLT_MAX);
1879 EXPECT_EQ(FLT_MIN, array2.UnalignedAt<float>(0 + skew)); 1881 EXPECT_EQ(FLT_MIN, array2.UnalignedAt<float>(0 + skew));
1880 EXPECT_EQ(FLT_MAX, array2.UnalignedAt<float>(4 + skew)); 1882 EXPECT_EQ(FLT_MAX, array2.UnalignedAt<float>(4 + skew));
1881 1883
1882 memset(data, 0xAA, ARRAY_SIZE(data)); 1884 memset(data, 0xAA, ARRAY_SIZE(data));
(...skipping 11 matching lines...) Expand all
1894 memset(data, 0xAA, ARRAY_SIZE(data)); 1896 memset(data, 0xAA, ARRAY_SIZE(data));
1895 array1.SetUnalignedAt<double>(0, 0.0); 1897 array1.SetUnalignedAt<double>(0, 0.0);
1896 EXPECT_EQ(0.0, array2.UnalignedAt<double>(0 + skew)); 1898 EXPECT_EQ(0.0, array2.UnalignedAt<double>(0 + skew));
1897 array2.SetUnalignedAt<double>(8 + skew, 1.0); 1899 array2.SetUnalignedAt<double>(8 + skew, 1.0);
1898 EXPECT_EQ(1.0, array1.UnalignedAt<double>(8)); 1900 EXPECT_EQ(1.0, array1.UnalignedAt<double>(8));
1899 1901
1900 delete[] data; 1902 delete[] data;
1901 } 1903 }
1902 1904
1903 1905
1906 TEST_CASE(InternalByteArray) {
1907 uint8_t data[] = { 253, 254, 255, 0, 1, 2, 3, 4 };
1908 intptr_t data_length = ARRAY_SIZE(data);
1909
1910 const InternalByteArray& array1 =
1911 InternalByteArray::Handle(InternalByteArray::New(data, data_length));
1912 EXPECT(!array1.IsNull());
1913 EXPECT_EQ(data_length, array1.Length());
1914 EXPECT_EQ(-3, array1.At<int8_t>(0));
1915 EXPECT_EQ(253, array1.At<uint8_t>(0));
1916 EXPECT_EQ(-2, array1.At<int8_t>(1));
1917 EXPECT_EQ(254, array1.At<uint8_t>(1));
1918 EXPECT_EQ(-1, array1.At<int8_t>(2));
1919 EXPECT_EQ(255, array1.At<uint8_t>(2));
1920 EXPECT_EQ(0, array1.At<int8_t>(3));
1921 EXPECT_EQ(0, array1.At<uint8_t>(3));
1922 EXPECT_EQ(1, array1.At<int8_t>(4));
1923 EXPECT_EQ(1, array1.At<uint8_t>(4));
1924 EXPECT_EQ(2, array1.At<int8_t>(5));
1925 EXPECT_EQ(2, array1.At<uint8_t>(5));
1926
1927 const InternalByteArray& array2 =
1928 InternalByteArray::Handle(InternalByteArray::New(data, data_length));
1929 EXPECT(!array1.IsNull());
1930 EXPECT_EQ(data_length, array2.Length());
1931 for (intptr_t i = 0; i < array1.Length(); ++i) {
1932 EXPECT_EQ(array1.At<uint8_t>(i), array2.At<uint8_t>(i));
1933 }
1934
1935 array1.SetAt<uint8_t>(0, 123);
1936 array2.SetAt<int8_t>(2, -123);
1937
1938 EXPECT(array1.At<uint8_t>(0) != array2.At<uint8_t>(0));
1939 EXPECT(array1.At<uint8_t>(1) == array2.At<uint8_t>(1));
1940 EXPECT(array1.At<uint8_t>(2) != array2.At<uint8_t>(2));
1941 for (intptr_t i = 3; i < array1.Length(); ++i) {
1942 EXPECT(array1.At<uint8_t>(i) == array2.At<uint8_t>(i));
1943 }
1944 }
1945
1946
1947 TEST_CASE(InternalByteArrayAlignedAccess) {
1948 const intptr_t length = 16;
1949 const InternalByteArray& byte_array =
1950 InternalByteArray::Handle(InternalByteArray::New(length));
1951 EXPECT(!byte_array.IsNull());
1952 EXPECT_EQ(length, byte_array.Length());
1953
1954 byte_array.SetAt<float>(0, FLT_MIN);
1955 byte_array.SetAt<float>(4, FLT_MAX);
1956 EXPECT_EQ(FLT_MIN, byte_array.At<float>(0));
1957 EXPECT_EQ(FLT_MAX, byte_array.At<float>(4));
1958
1959 byte_array.SetAt<float>(0, 0.0f);
1960 EXPECT_EQ(0.0f, byte_array.At<float>(0));
1961 byte_array.SetAt<float>(4, 1.0f);
1962 EXPECT_EQ(1.0f, byte_array.At<float>(4));
1963
1964 byte_array.SetAt<double>(0, DBL_MIN);
1965 EXPECT_EQ(DBL_MIN, byte_array.At<double>(0));
1966 byte_array.SetAt<double>(8, DBL_MAX);
1967 EXPECT_EQ(DBL_MAX, byte_array.At<double>(8));
1968
1969 byte_array.SetAt<double>(0, 0.0);
1970 EXPECT_EQ(0.0, byte_array.At<double>(0));
1971 byte_array.SetAt<double>(8, 1.0);
1972 EXPECT_EQ(1.0, byte_array.At<double>(8));
1973 }
1974
1975
1976 TEST_CASE(InternalByteArrayUnlignedAccess) {
1977 const intptr_t length = 24;
1978 const InternalByteArray& byte_array =
1979 InternalByteArray::Handle(InternalByteArray::New(length));
1980 EXPECT(!byte_array.IsNull());
1981 EXPECT_EQ(length, byte_array.Length());
1982
1983 int float_misalign = 3;
1984 byte_array.SetUnalignedAt<float>(float_misalign, FLT_MIN);
1985 byte_array.SetUnalignedAt<float>(4 + float_misalign, FLT_MAX);
1986 EXPECT_EQ(FLT_MIN, byte_array.UnalignedAt<float>(float_misalign));
1987 EXPECT_EQ(FLT_MAX, byte_array.UnalignedAt<float>(4 + float_misalign));
1988
1989 byte_array.SetUnalignedAt<float>(float_misalign, 0.0f);
1990 EXPECT_EQ(0.0f, byte_array.UnalignedAt<float>(float_misalign));
1991 byte_array.SetUnalignedAt<float>(4 + float_misalign, 1.0f);
1992 EXPECT_EQ(1.0f, byte_array.UnalignedAt<float>(4 + float_misalign));
1993
1994 int double_misalign = 5;
1995 byte_array.SetUnalignedAt<double>(double_misalign, DBL_MIN);
1996 EXPECT_EQ(DBL_MIN, byte_array.UnalignedAt<double>(double_misalign));
1997 byte_array.SetUnalignedAt<double>(8 + double_misalign, DBL_MAX);
1998 EXPECT_EQ(DBL_MAX,
1999 byte_array.UnalignedAt<double>(8 + double_misalign));
2000
2001 byte_array.SetUnalignedAt<double>(double_misalign, 0.0);
2002 EXPECT_EQ(0.0, byte_array.UnalignedAt<double>(double_misalign));
2003 byte_array.SetUnalignedAt<double>(8 + double_misalign, 1.0);
2004 EXPECT_EQ(1.0, byte_array.UnalignedAt<double>(8 + double_misalign));
2005 }
2006
2007
1904 TEST_CASE(Script) { 2008 TEST_CASE(Script) {
1905 const char* url_chars = "builtin:test-case"; 2009 const char* url_chars = "builtin:test-case";
1906 const char* source_chars = "This will not compile."; 2010 const char* source_chars = "This will not compile.";
1907 const String& url = String::Handle(String::New(url_chars)); 2011 const String& url = String::Handle(String::New(url_chars));
1908 const String& source = String::Handle(String::New(source_chars)); 2012 const String& source = String::Handle(String::New(source_chars));
1909 const Script& script = Script::Handle(Script::New(url, 2013 const Script& script = Script::Handle(Script::New(url,
1910 source, 2014 source,
1911 RawScript::kSource)); 2015 RawScript::kSource));
1912 EXPECT(!script.IsNull()); 2016 EXPECT(!script.IsNull());
1913 EXPECT(script.IsScript()); 2017 EXPECT(script.IsScript());
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
2277 cls = iterator.GetNextClass(); 2381 cls = iterator.GetNextClass();
2278 ASSERT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw())); 2382 ASSERT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw()));
2279 count++; 2383 count++;
2280 } 2384 }
2281 ASSERT(count == 2); 2385 ASSERT(count == 2);
2282 } 2386 }
2283 2387
2284 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). 2388 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
2285 2389
2286 } // namespace dart 2390 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object_store.cc ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698