| 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/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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |