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

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: 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
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 EXPECT(array1.Equals(array2));
1764 EXPECT(array2.Equals(array1)); 1764 EXPECT(array2.Equals(array1));
1765 1765
1766 array1.SetAt<uint8_t>(0, 123); 1766 array1.SetAt<uint8_t>(0, 123);
1767 array2.SetAt<int8_t>(2, -123); 1767 array2.SetAt<int8_t>(2, -123);
1768 EXPECT(array1.Equals(array2)); 1768 EXPECT(array1.Equals(array2));
1769 EXPECT(array2.Equals(array1)); 1769 EXPECT(array2.Equals(array1));
1770 } 1770 }
1771 1771
1772 1772
1773 TEST_CASE(ByteBufferAlignedAccess) { 1773 TEST_CASE(ExternalByteArrayAlignedAccess) {
1774 intptr_t length = 16; 1774 intptr_t length = 16;
1775 uint8_t* data = new uint8_t[length]; 1775 uint8_t* data = new uint8_t[length];
1776 1776
1777 const ByteBuffer& array1 = 1777 const ExternalByteArray& array1 =
1778 ByteBuffer::Handle(ByteBuffer::New(data, length)); 1778 ExternalByteArray::Handle(ExternalByteArray::New(data, length));
1779 EXPECT(!array1.IsNull()); 1779 EXPECT(!array1.IsNull());
1780 EXPECT_EQ(length, array1.Length()); 1780 EXPECT_EQ(length, array1.Length());
1781 1781
1782 const ByteBuffer& array2 = 1782 const ExternalByteArray& array2 =
1783 ByteBuffer::Handle(ByteBuffer::New(data, length)); 1783 ExternalByteArray::Handle(ExternalByteArray::New(data, length));
1784 EXPECT(!array2.IsNull()); 1784 EXPECT(!array2.IsNull());
1785 EXPECT_EQ(length, array2.Length()); 1785 EXPECT_EQ(length, array2.Length());
1786 1786
1787 memset(data, 0xAA, ARRAY_SIZE(data)); 1787 memset(data, 0xAA, ARRAY_SIZE(data));
1788 array1.SetAt<float>(0, FLT_MIN); 1788 array1.SetAt<float>(0, FLT_MIN);
1789 array1.SetAt<float>(4, FLT_MAX); 1789 array1.SetAt<float>(4, FLT_MAX);
1790 EXPECT_EQ(FLT_MIN, array2.At<float>(0)); 1790 EXPECT_EQ(FLT_MIN, array2.At<float>(0));
1791 EXPECT_EQ(FLT_MAX, array2.At<float>(4)); 1791 EXPECT_EQ(FLT_MAX, array2.At<float>(4));
1792 1792
1793 memset(data, 0xAA, ARRAY_SIZE(data)); 1793 memset(data, 0xAA, ARRAY_SIZE(data));
(...skipping 11 matching lines...) Expand all
1805 memset(data, 0xAA, ARRAY_SIZE(data)); 1805 memset(data, 0xAA, ARRAY_SIZE(data));
1806 array1.SetAt<double>(0, 0.0); 1806 array1.SetAt<double>(0, 0.0);
1807 EXPECT_EQ(0.0, array2.At<double>(0)); 1807 EXPECT_EQ(0.0, array2.At<double>(0));
1808 array1.SetAt<double>(8, 1.0); 1808 array1.SetAt<double>(8, 1.0);
1809 EXPECT_EQ(1.0, array2.At<double>(8)); 1809 EXPECT_EQ(1.0, array2.At<double>(8));
1810 1810
1811 delete[] data; 1811 delete[] data;
1812 } 1812 }
1813 1813
1814 1814
1815 TEST_CASE(ByteBufferUnlignedAccess) { 1815 TEST_CASE(ExternalByteArrayUnlignedAccess) {
1816 intptr_t length = 24; 1816 intptr_t length = 24;
1817 uint8_t* data = new uint8_t[length]; 1817 uint8_t* data = new uint8_t[length];
1818 1818
1819 const ByteBuffer& array1 = 1819 const ExternalByteArray& array1 =
1820 ByteBuffer::Handle(ByteBuffer::New(data, length)); 1820 ExternalByteArray::Handle(ExternalByteArray::New(data, length));
1821 EXPECT(!array1.IsNull()); 1821 EXPECT(!array1.IsNull());
1822 EXPECT_EQ(length, array1.Length()); 1822 EXPECT_EQ(length, array1.Length());
1823 1823
1824 const ByteBuffer& array2 = 1824 const ExternalByteArray& array2 =
1825 ByteBuffer::Handle(ByteBuffer::New(data, length)); 1825 ExternalByteArray::Handle(ExternalByteArray::New(data, length));
1826 EXPECT(!array2.IsNull()); 1826 EXPECT(!array2.IsNull());
1827 EXPECT_EQ(length, array2.Length()); 1827 EXPECT_EQ(length, array2.Length());
1828 1828
1829 int float_misalign = 3; 1829 int float_misalign = 3;
1830 memset(data, 0xAA, ARRAY_SIZE(data)); 1830 memset(data, 0xAA, ARRAY_SIZE(data));
1831 array1.SetUnalignedAt<float>(float_misalign, FLT_MIN); 1831 array1.SetUnalignedAt<float>(float_misalign, FLT_MIN);
1832 array1.SetUnalignedAt<float>(4 + float_misalign, FLT_MAX); 1832 array1.SetUnalignedAt<float>(4 + float_misalign, FLT_MAX);
1833 EXPECT_EQ(FLT_MIN, array2.UnalignedAt<float>(float_misalign)); 1833 EXPECT_EQ(FLT_MIN, array2.UnalignedAt<float>(float_misalign));
1834 EXPECT_EQ(FLT_MAX, array2.UnalignedAt<float>(4 + float_misalign)); 1834 EXPECT_EQ(FLT_MAX, array2.UnalignedAt<float>(4 + float_misalign));
1835 1835
(...skipping 14 matching lines...) Expand all
1850 memset(data, 0xAA, ARRAY_SIZE(data)); 1850 memset(data, 0xAA, ARRAY_SIZE(data));
1851 array1.SetUnalignedAt<double>(double_misalign, 0.0); 1851 array1.SetUnalignedAt<double>(double_misalign, 0.0);
1852 EXPECT_EQ(0.0, array2.UnalignedAt<double>(double_misalign)); 1852 EXPECT_EQ(0.0, array2.UnalignedAt<double>(double_misalign));
1853 array1.SetUnalignedAt<double>(8 + double_misalign, 1.0); 1853 array1.SetUnalignedAt<double>(8 + double_misalign, 1.0);
1854 EXPECT_EQ(1.0, array2.UnalignedAt<double>(8 + double_misalign)); 1854 EXPECT_EQ(1.0, array2.UnalignedAt<double>(8 + double_misalign));
1855 1855
1856 delete[] data; 1856 delete[] data;
1857 } 1857 }
1858 1858
1859 1859
1860 TEST_CASE(ByteBufferSkewedUnalignedBaseAccess) { 1860 TEST_CASE(ExternalByteArraySkewedUnalignedBaseAccess) {
1861 intptr_t length = 24; 1861 intptr_t length = 24;
1862 uint8_t* data = new uint8_t[length]; 1862 uint8_t* data = new uint8_t[length];
1863 1863
1864 int skew = 2; 1864 int skew = 2;
1865 1865
1866 const ByteBuffer& array1 = 1866 const ExternalByteArray& array1 =
1867 ByteBuffer::Handle(ByteBuffer::New(data + 3, length)); 1867 ExternalByteArray::Handle(ExternalByteArray::New(data + 3, length));
1868 EXPECT(!array1.IsNull()); 1868 EXPECT(!array1.IsNull());
1869 EXPECT_EQ(length, array1.Length()); 1869 EXPECT_EQ(length, array1.Length());
1870 1870
1871 const ByteBuffer& array2 = 1871 const ExternalByteArray& array2 =
1872 ByteBuffer::Handle(ByteBuffer::New(data + 1, length)); 1872 ExternalByteArray::Handle(ExternalByteArray::New(data + 1, length));
1873 EXPECT(!array2.IsNull()); 1873 EXPECT(!array2.IsNull());
1874 EXPECT_EQ(length, array2.Length()); 1874 EXPECT_EQ(length, array2.Length());
1875 1875
1876 memset(data, 0xAA, ARRAY_SIZE(data)); 1876 memset(data, 0xAA, ARRAY_SIZE(data));
1877 array1.SetUnalignedAt<float>(0, FLT_MIN); 1877 array1.SetUnalignedAt<float>(0, FLT_MIN);
1878 array1.SetUnalignedAt<float>(4, FLT_MAX); 1878 array1.SetUnalignedAt<float>(4, FLT_MAX);
1879 EXPECT_EQ(FLT_MIN, array2.UnalignedAt<float>(0 + skew)); 1879 EXPECT_EQ(FLT_MIN, array2.UnalignedAt<float>(0 + skew));
1880 EXPECT_EQ(FLT_MAX, array2.UnalignedAt<float>(4 + skew)); 1880 EXPECT_EQ(FLT_MAX, array2.UnalignedAt<float>(4 + skew));
1881 1881
1882 memset(data, 0xAA, ARRAY_SIZE(data)); 1882 memset(data, 0xAA, ARRAY_SIZE(data));
(...skipping 11 matching lines...) Expand all
1894 memset(data, 0xAA, ARRAY_SIZE(data)); 1894 memset(data, 0xAA, ARRAY_SIZE(data));
1895 array1.SetUnalignedAt<double>(0, 0.0); 1895 array1.SetUnalignedAt<double>(0, 0.0);
1896 EXPECT_EQ(0.0, array2.UnalignedAt<double>(0 + skew)); 1896 EXPECT_EQ(0.0, array2.UnalignedAt<double>(0 + skew));
1897 array2.SetUnalignedAt<double>(8 + skew, 1.0); 1897 array2.SetUnalignedAt<double>(8 + skew, 1.0);
1898 EXPECT_EQ(1.0, array1.UnalignedAt<double>(8)); 1898 EXPECT_EQ(1.0, array1.UnalignedAt<double>(8));
1899 1899
1900 delete[] data; 1900 delete[] data;
1901 } 1901 }
1902 1902
1903 1903
1904 TEST_CASE(InternalByteArray) {
1905 uint8_t data[] = { 253, 254, 255, 0, 1, 2, 3, 4 };
1906 intptr_t data_length = ARRAY_SIZE(data);
1907
1908 const InternalByteArray& array1 =
1909 InternalByteArray::Handle(InternalByteArray::New(data, data_length));
1910 EXPECT(!array1.IsNull());
1911 EXPECT_EQ(data_length, array1.Length());
1912 EXPECT_EQ(-3, array1.At<int8_t>(0));
1913 EXPECT_EQ(253, array1.At<uint8_t>(0));
1914 EXPECT_EQ(-2, array1.At<int8_t>(1));
1915 EXPECT_EQ(254, array1.At<uint8_t>(1));
1916 EXPECT_EQ(-1, array1.At<int8_t>(2));
1917 EXPECT_EQ(255, array1.At<uint8_t>(2));
1918 EXPECT_EQ(0, array1.At<int8_t>(3));
1919 EXPECT_EQ(0, array1.At<uint8_t>(3));
1920 EXPECT_EQ(1, array1.At<int8_t>(4));
1921 EXPECT_EQ(1, array1.At<uint8_t>(4));
1922 EXPECT_EQ(2, array1.At<int8_t>(5));
1923 EXPECT_EQ(2, array1.At<uint8_t>(5));
1924
1925 const InternalByteArray& array2 =
1926 InternalByteArray::Handle(InternalByteArray::New(data, data_length));
1927 EXPECT(!array1.IsNull());
1928 EXPECT_EQ(data_length, array2.Length());
1929 EXPECT(array1.Equals(array2));
1930 EXPECT(array2.Equals(array1));
1931
1932 array1.SetAt<uint8_t>(0, 123);
1933 array2.SetAt<int8_t>(2, -123);
1934 EXPECT(!array1.Equals(array2));
1935 EXPECT(!array2.Equals(array1));
1936 }
1937
1938
1939 TEST_CASE(InternalByteArrayAlignedAccess) {
1940 const intptr_t length = 16;
1941 const InternalByteArray& byte_array =
1942 InternalByteArray::Handle(InternalByteArray::New(length));
1943 EXPECT(!byte_array.IsNull());
1944 EXPECT_EQ(length, byte_array.Length());
1945
1946 byte_array.SetAt<float>(0, FLT_MIN);
1947 byte_array.SetAt<float>(4, FLT_MAX);
1948 EXPECT_EQ(FLT_MIN, byte_array.At<float>(0));
1949 EXPECT_EQ(FLT_MAX, byte_array.At<float>(4));
1950
1951 byte_array.SetAt<float>(0, 0.0f);
1952 EXPECT_EQ(0.0f, byte_array.At<float>(0));
1953 byte_array.SetAt<float>(4, 1.0f);
1954 EXPECT_EQ(1.0f, byte_array.At<float>(4));
1955
1956 byte_array.SetAt<double>(0, DBL_MIN);
1957 EXPECT_EQ(DBL_MIN, byte_array.At<double>(0));
1958 byte_array.SetAt<double>(8, DBL_MAX);
1959 EXPECT_EQ(DBL_MAX, byte_array.At<double>(8));
1960
1961 byte_array.SetAt<double>(0, 0.0);
1962 EXPECT_EQ(0.0, byte_array.At<double>(0));
1963 byte_array.SetAt<double>(8, 1.0);
1964 EXPECT_EQ(1.0, byte_array.At<double>(8));
1965 }
1966
1967
1968 TEST_CASE(InternalByteArrayUnlignedAccess) {
1969 const intptr_t length = 24;
1970 const InternalByteArray& byte_array =
1971 InternalByteArray::Handle(InternalByteArray::New(length));
1972 EXPECT(!byte_array.IsNull());
1973 EXPECT_EQ(length, byte_array.Length());
1974
1975 int float_misalign = 3;
1976 byte_array.SetUnalignedAt<float>(float_misalign, FLT_MIN);
1977 byte_array.SetUnalignedAt<float>(4 + float_misalign, FLT_MAX);
1978 EXPECT_EQ(FLT_MIN, byte_array.UnalignedAt<float>(float_misalign));
1979 EXPECT_EQ(FLT_MAX, byte_array.UnalignedAt<float>(4 + float_misalign));
1980
1981 byte_array.SetUnalignedAt<float>(float_misalign, 0.0f);
1982 EXPECT_EQ(0.0f, byte_array.UnalignedAt<float>(float_misalign));
1983 byte_array.SetUnalignedAt<float>(4 + float_misalign, 1.0f);
1984 EXPECT_EQ(1.0f, byte_array.UnalignedAt<float>(4 + float_misalign));
1985
1986 int double_misalign = 5;
1987 byte_array.SetUnalignedAt<double>(double_misalign, DBL_MIN);
1988 EXPECT_EQ(DBL_MIN, byte_array.UnalignedAt<double>(double_misalign));
1989 byte_array.SetUnalignedAt<double>(8 + double_misalign, DBL_MAX);
1990 EXPECT_EQ(DBL_MAX,
1991 byte_array.UnalignedAt<double>(8 + double_misalign));
1992
1993 byte_array.SetUnalignedAt<double>(double_misalign, 0.0);
1994 EXPECT_EQ(0.0, byte_array.UnalignedAt<double>(double_misalign));
1995 byte_array.SetUnalignedAt<double>(8 + double_misalign, 1.0);
1996 EXPECT_EQ(1.0, byte_array.UnalignedAt<double>(8 + double_misalign));
1997 }
1998
1999
1904 TEST_CASE(Script) { 2000 TEST_CASE(Script) {
1905 const char* url_chars = "builtin:test-case"; 2001 const char* url_chars = "builtin:test-case";
1906 const char* source_chars = "This will not compile."; 2002 const char* source_chars = "This will not compile.";
1907 const String& url = String::Handle(String::New(url_chars)); 2003 const String& url = String::Handle(String::New(url_chars));
1908 const String& source = String::Handle(String::New(source_chars)); 2004 const String& source = String::Handle(String::New(source_chars));
1909 const Script& script = Script::Handle(Script::New(url, 2005 const Script& script = Script::Handle(Script::New(url,
1910 source, 2006 source,
1911 RawScript::kSource)); 2007 RawScript::kSource));
1912 EXPECT(!script.IsNull()); 2008 EXPECT(!script.IsNull());
1913 EXPECT(script.IsScript()); 2009 EXPECT(script.IsScript());
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
2277 cls = iterator.GetNextClass(); 2373 cls = iterator.GetNextClass();
2278 ASSERT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw())); 2374 ASSERT((cls.raw() == ae66.raw()) || (cls.raw() == re44.raw()));
2279 count++; 2375 count++;
2280 } 2376 }
2281 ASSERT(count == 2); 2377 ASSERT(count == 2);
2282 } 2378 }
2283 2379
2284 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). 2380 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
2285 2381
2286 } // namespace dart 2382 } // namespace dart
OLDNEW
« runtime/vm/object.cc ('K') | « 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