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

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

Issue 9560001: Guard calls to ByteAddr when a ByteArray copy length is 0. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 9 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.cc ('k') | no next file » | 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 1913 matching lines...) Expand 10 before | Expand all | Expand 10 after
1924 memset(data, 0xAA, ARRAY_SIZE(data)); 1924 memset(data, 0xAA, ARRAY_SIZE(data));
1925 array1.SetUnalignedAt<double>(0, 0.0); 1925 array1.SetUnalignedAt<double>(0, 0.0);
1926 EXPECT_EQ(0.0, array2.UnalignedAt<double>(0 + skew)); 1926 EXPECT_EQ(0.0, array2.UnalignedAt<double>(0 + skew));
1927 array2.SetUnalignedAt<double>(8 + skew, 1.0); 1927 array2.SetUnalignedAt<double>(8 + skew, 1.0);
1928 EXPECT_EQ(1.0, array1.UnalignedAt<double>(8)); 1928 EXPECT_EQ(1.0, array1.UnalignedAt<double>(8));
1929 1929
1930 delete[] data; 1930 delete[] data;
1931 } 1931 }
1932 1932
1933 1933
1934 TEST_CASE(ExternalByteArrayCopy) {
1935 const uint8_t b_0_1_2_3[] = { 0, 1, 2, 3 };
1936 const uint8_t b_4_5_6_7[] = { 4, 5, 6, 7 };
1937
1938 uint8_t data[] = { 0, 1, 2, 3 };
1939 const ExternalByteArray& external =
1940 ExternalByteArray::Handle(
1941 ExternalByteArray::New(data, ARRAY_SIZE(data), NULL, NULL));
1942 EXPECT(!external.IsNull());
1943 EXPECT_EQ(4, external.Length());
1944 EXPECT_EQ(0, external.At<uint8_t>(0));
1945 EXPECT_EQ(1, external.At<uint8_t>(1));
1946 EXPECT_EQ(2, external.At<uint8_t>(2));
1947 EXPECT_EQ(3, external.At<uint8_t>(3));
1948
1949 // A zero length copy.
1950 ByteArray::Copy(external, 0, b_4_5_6_7, 0);
1951 EXPECT_EQ(0, external.At<uint8_t>(0));
1952 EXPECT_EQ(1, external.At<uint8_t>(1));
1953 EXPECT_EQ(2, external.At<uint8_t>(2));
1954 EXPECT_EQ(3, external.At<uint8_t>(3));
1955
1956 // Another zero length copy.
1957 ByteArray::Copy(external, 4, b_4_5_6_7, 0);
1958 EXPECT_EQ(0, external.At<uint8_t>(0));
1959 EXPECT_EQ(1, external.At<uint8_t>(1));
1960 EXPECT_EQ(2, external.At<uint8_t>(2));
1961 EXPECT_EQ(3, external.At<uint8_t>(3));
1962
1963 // A one element copy.
1964 ByteArray::Copy(external, 0, b_4_5_6_7, 1);
1965 EXPECT_EQ(4, external.At<uint8_t>(0));
1966 EXPECT_EQ(1, external.At<uint8_t>(1));
1967 EXPECT_EQ(2, external.At<uint8_t>(2));
1968 EXPECT_EQ(3, external.At<uint8_t>(3));
1969
1970 // A two element copy.
1971 ByteArray::Copy(external, 2, b_4_5_6_7, 2);
1972 EXPECT_EQ(4, external.At<uint8_t>(0));
1973 EXPECT_EQ(1, external.At<uint8_t>(1));
1974 EXPECT_EQ(4, external.At<uint8_t>(2));
1975 EXPECT_EQ(5, external.At<uint8_t>(3));
1976
1977 // A three element copy.
1978 ByteArray::Copy(external, 1, b_4_5_6_7, 3);
1979 EXPECT_EQ(4, external.At<uint8_t>(0));
1980 EXPECT_EQ(4, external.At<uint8_t>(1));
1981 EXPECT_EQ(5, external.At<uint8_t>(2));
1982 EXPECT_EQ(6, external.At<uint8_t>(3));
1983
1984 // A four element copy.
1985 ByteArray::Copy(external, 0, b_0_1_2_3, 4);
1986 EXPECT_EQ(0, external.At<uint8_t>(0));
1987 EXPECT_EQ(1, external.At<uint8_t>(1));
1988 EXPECT_EQ(2, external.At<uint8_t>(2));
1989 EXPECT_EQ(3, external.At<uint8_t>(3));
1990 }
1991
1992
1934 TEST_CASE(InternalByteArray) { 1993 TEST_CASE(InternalByteArray) {
1935 uint8_t data[] = { 253, 254, 255, 0, 1, 2, 3, 4 }; 1994 uint8_t data[] = { 253, 254, 255, 0, 1, 2, 3, 4 };
1936 intptr_t data_length = ARRAY_SIZE(data); 1995 intptr_t data_length = ARRAY_SIZE(data);
1937 1996
1938 const InternalByteArray& array1 = 1997 const InternalByteArray& array1 =
1939 InternalByteArray::Handle(InternalByteArray::New(data, data_length)); 1998 InternalByteArray::Handle(InternalByteArray::New(data, data_length));
1940 EXPECT(!array1.IsNull()); 1999 EXPECT(!array1.IsNull());
1941 EXPECT_EQ(data_length, array1.Length()); 2000 EXPECT_EQ(data_length, array1.Length());
1942 EXPECT_EQ(-3, array1.At<int8_t>(0)); 2001 EXPECT_EQ(-3, array1.At<int8_t>(0));
1943 EXPECT_EQ(253, array1.At<uint8_t>(0)); 2002 EXPECT_EQ(253, array1.At<uint8_t>(0));
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
2026 EXPECT_EQ(DBL_MAX, 2085 EXPECT_EQ(DBL_MAX,
2027 byte_array.UnalignedAt<double>(8 + double_misalign)); 2086 byte_array.UnalignedAt<double>(8 + double_misalign));
2028 2087
2029 byte_array.SetUnalignedAt<double>(double_misalign, 0.0); 2088 byte_array.SetUnalignedAt<double>(double_misalign, 0.0);
2030 EXPECT_EQ(0.0, byte_array.UnalignedAt<double>(double_misalign)); 2089 EXPECT_EQ(0.0, byte_array.UnalignedAt<double>(double_misalign));
2031 byte_array.SetUnalignedAt<double>(8 + double_misalign, 1.0); 2090 byte_array.SetUnalignedAt<double>(8 + double_misalign, 1.0);
2032 EXPECT_EQ(1.0, byte_array.UnalignedAt<double>(8 + double_misalign)); 2091 EXPECT_EQ(1.0, byte_array.UnalignedAt<double>(8 + double_misalign));
2033 } 2092 }
2034 2093
2035 2094
2095 TEST_CASE(InternalByteArrayCopy) {
2096 const uint8_t b_0_1_2_3[] = { 0, 1, 2, 3 };
2097 const uint8_t b_4_5_6_7[] = { 4, 5, 6, 7 };
2098
2099 const InternalByteArray& internal =
2100 InternalByteArray::Handle(
2101 InternalByteArray::New(b_0_1_2_3, ARRAY_SIZE(b_0_1_2_3)));
2102 EXPECT(!internal.IsNull());
2103 EXPECT_EQ(4, internal.Length());
2104 EXPECT_EQ(0, internal.At<uint8_t>(0));
2105 EXPECT_EQ(1, internal.At<uint8_t>(1));
2106 EXPECT_EQ(2, internal.At<uint8_t>(2));
2107 EXPECT_EQ(3, internal.At<uint8_t>(3));
2108
2109 // A zero length copy.
2110 ByteArray::Copy(internal, 0, b_4_5_6_7, 0);
2111 EXPECT_EQ(0, internal.At<uint8_t>(0));
2112 EXPECT_EQ(1, internal.At<uint8_t>(1));
2113 EXPECT_EQ(2, internal.At<uint8_t>(2));
2114 EXPECT_EQ(3, internal.At<uint8_t>(3));
2115
2116 // Another zero length copy.
2117 ByteArray::Copy(internal, 4, b_4_5_6_7, 0);
2118 EXPECT_EQ(0, internal.At<uint8_t>(0));
2119 EXPECT_EQ(1, internal.At<uint8_t>(1));
2120 EXPECT_EQ(2, internal.At<uint8_t>(2));
2121 EXPECT_EQ(3, internal.At<uint8_t>(3));
2122
2123 // A one element copy.
2124 ByteArray::Copy(internal, 0, b_4_5_6_7, 1);
2125 EXPECT_EQ(4, internal.At<uint8_t>(0));
2126 EXPECT_EQ(1, internal.At<uint8_t>(1));
2127 EXPECT_EQ(2, internal.At<uint8_t>(2));
2128 EXPECT_EQ(3, internal.At<uint8_t>(3));
2129
2130 // A two element copy.
2131 ByteArray::Copy(internal, 2, b_4_5_6_7, 2);
2132 EXPECT_EQ(4, internal.At<uint8_t>(0));
2133 EXPECT_EQ(1, internal.At<uint8_t>(1));
2134 EXPECT_EQ(4, internal.At<uint8_t>(2));
2135 EXPECT_EQ(5, internal.At<uint8_t>(3));
2136
2137 // A three element copy.
2138 ByteArray::Copy(internal, 1, b_4_5_6_7, 3);
2139 EXPECT_EQ(4, internal.At<uint8_t>(0));
2140 EXPECT_EQ(4, internal.At<uint8_t>(1));
2141 EXPECT_EQ(5, internal.At<uint8_t>(2));
2142 EXPECT_EQ(6, internal.At<uint8_t>(3));
2143
2144 // A four element copy.
2145 ByteArray::Copy(internal, 0, b_0_1_2_3, 4);
2146 EXPECT_EQ(0, internal.At<uint8_t>(0));
2147 EXPECT_EQ(1, internal.At<uint8_t>(1));
2148 EXPECT_EQ(2, internal.At<uint8_t>(2));
2149 EXPECT_EQ(3, internal.At<uint8_t>(3));
2150 }
2151
2152
2153 TEST_CASE(ByteArrayCopy) {
2154 const uint8_t b_0_1_2_3[] = { 0, 1, 2, 3 };
2155
2156 const InternalByteArray& internal =
2157 InternalByteArray::Handle(
2158 InternalByteArray::New(b_0_1_2_3, ARRAY_SIZE(b_0_1_2_3)));
2159 EXPECT(!internal.IsNull());
2160 EXPECT_EQ(4, internal.Length());
2161 EXPECT_EQ(0, internal.At<uint8_t>(0));
2162 EXPECT_EQ(1, internal.At<uint8_t>(1));
2163 EXPECT_EQ(2, internal.At<uint8_t>(2));
2164 EXPECT_EQ(3, internal.At<uint8_t>(3));
2165
2166 uint8_t data[] = { 4, 5, 6, 7 };
2167 const ExternalByteArray& external =
2168 ExternalByteArray::Handle(
2169 ExternalByteArray::New(data, ARRAY_SIZE(data), NULL, NULL));
2170 EXPECT(!external.IsNull());
2171 EXPECT_EQ(4, external.Length());
2172 EXPECT_EQ(4, external.At<uint8_t>(0));
2173 EXPECT_EQ(5, external.At<uint8_t>(1));
2174 EXPECT_EQ(6, external.At<uint8_t>(2));
2175 EXPECT_EQ(7, external.At<uint8_t>(3));
2176
2177 // A zero length copy.
2178 ByteArray::Copy(internal, 0, external, 0, 0);
2179 EXPECT_EQ(0, internal.At<uint8_t>(0));
2180 EXPECT_EQ(1, internal.At<uint8_t>(1));
2181 EXPECT_EQ(2, internal.At<uint8_t>(2));
2182 EXPECT_EQ(3, internal.At<uint8_t>(3));
2183
2184 // A zero length copy, take 2.
2185 ByteArray::Copy(internal, 4, external, 0, 0);
2186 EXPECT_EQ(0, internal.At<uint8_t>(0));
2187 EXPECT_EQ(1, internal.At<uint8_t>(1));
2188 EXPECT_EQ(2, internal.At<uint8_t>(2));
2189 EXPECT_EQ(3, internal.At<uint8_t>(3));
2190
2191 // A zero length copy, take 3.
2192 ByteArray::Copy(internal, 0, external, 4, 0);
2193 EXPECT_EQ(0, internal.At<uint8_t>(0));
2194 EXPECT_EQ(1, internal.At<uint8_t>(1));
2195 EXPECT_EQ(2, internal.At<uint8_t>(2));
2196 EXPECT_EQ(3, internal.At<uint8_t>(3));
2197
2198 // A zero length copy, take 4.
2199 ByteArray::Copy(internal, 4, external, 4, 0);
2200 EXPECT_EQ(0, internal.At<uint8_t>(0));
2201 EXPECT_EQ(1, internal.At<uint8_t>(1));
2202 EXPECT_EQ(2, internal.At<uint8_t>(2));
2203 EXPECT_EQ(3, internal.At<uint8_t>(3));
2204
2205 // A four element copy.
2206 ByteArray::Copy(internal, 0, external, 0, 4);
2207 EXPECT_EQ(4, internal.At<uint8_t>(0));
2208 EXPECT_EQ(5, internal.At<uint8_t>(1));
2209 EXPECT_EQ(6, internal.At<uint8_t>(2));
2210 EXPECT_EQ(7, internal.At<uint8_t>(3));
2211 EXPECT_EQ(4, external.At<uint8_t>(0));
2212 EXPECT_EQ(5, external.At<uint8_t>(1));
2213 EXPECT_EQ(6, external.At<uint8_t>(2));
2214 EXPECT_EQ(7, external.At<uint8_t>(3));
2215
2216 // A four element copy, take 2.
2217 ByteArray::Copy(external, 0, b_0_1_2_3, 4);
2218 EXPECT_EQ(0, external.At<uint8_t>(0));
2219 EXPECT_EQ(1, external.At<uint8_t>(1));
2220 EXPECT_EQ(2, external.At<uint8_t>(2));
2221 EXPECT_EQ(3, external.At<uint8_t>(3));
2222 ByteArray::Copy(external, 0, internal, 0, 4);
2223 EXPECT_EQ(4, internal.At<uint8_t>(0));
2224 EXPECT_EQ(5, internal.At<uint8_t>(1));
2225 EXPECT_EQ(6, internal.At<uint8_t>(2));
2226 EXPECT_EQ(7, internal.At<uint8_t>(3));
2227 EXPECT_EQ(4, external.At<uint8_t>(0));
2228 EXPECT_EQ(5, external.At<uint8_t>(1));
2229 EXPECT_EQ(6, external.At<uint8_t>(2));
2230 EXPECT_EQ(7, external.At<uint8_t>(3));
2231 }
2232
2233
2036 TEST_CASE(Script) { 2234 TEST_CASE(Script) {
2037 const char* url_chars = "builtin:test-case"; 2235 const char* url_chars = "builtin:test-case";
2038 const char* source_chars = "This will not compile."; 2236 const char* source_chars = "This will not compile.";
2039 const String& url = String::Handle(String::New(url_chars)); 2237 const String& url = String::Handle(String::New(url_chars));
2040 const String& source = String::Handle(String::New(source_chars)); 2238 const String& source = String::Handle(String::New(source_chars));
2041 const Script& script = Script::Handle(Script::New(url, 2239 const Script& script = Script::Handle(Script::New(url,
2042 source, 2240 source,
2043 RawScript::kSource)); 2241 RawScript::kSource));
2044 EXPECT(!script.IsNull()); 2242 EXPECT(!script.IsNull());
2045 EXPECT(script.IsScript()); 2243 EXPECT(script.IsScript());
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
2486 EXPECT_EQ(2, test_classes.length()); 2684 EXPECT_EQ(2, test_classes.length());
2487 EXPECT_EQ(smi_class.raw(), test_classes[0]->raw()); 2685 EXPECT_EQ(smi_class.raw(), test_classes[0]->raw());
2488 EXPECT_EQ(smi_class.raw(), test_classes[1]->raw()); 2686 EXPECT_EQ(smi_class.raw(), test_classes[1]->raw());
2489 EXPECT_EQ(target1.raw(), test_target.raw()); 2687 EXPECT_EQ(target1.raw(), test_target.raw());
2490 } 2688 }
2491 2689
2492 2690
2493 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). 2691 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64).
2494 2692
2495 } // namespace dart 2693 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/object.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698