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

Unified 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, 10 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object_test.cc
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index ec55e5008db637f86c665b441501941b4f0d5f12..2a15f69a58f4846376dfd601acde09ad7dd6fe64 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -1931,6 +1931,65 @@ TEST_CASE(ExternalByteArraySkewedUnalignedBaseAccess) {
}
+TEST_CASE(ExternalByteArrayCopy) {
+ const uint8_t b_0_1_2_3[] = { 0, 1, 2, 3 };
+ const uint8_t b_4_5_6_7[] = { 4, 5, 6, 7 };
+
+ uint8_t data[] = { 0, 1, 2, 3 };
+ const ExternalByteArray& external =
+ ExternalByteArray::Handle(
+ ExternalByteArray::New(data, ARRAY_SIZE(data), NULL, NULL));
+ EXPECT(!external.IsNull());
+ EXPECT_EQ(4, external.Length());
+ EXPECT_EQ(0, external.At<uint8_t>(0));
+ EXPECT_EQ(1, external.At<uint8_t>(1));
+ EXPECT_EQ(2, external.At<uint8_t>(2));
+ EXPECT_EQ(3, external.At<uint8_t>(3));
+
+ // A zero length copy.
+ ByteArray::Copy(external, 0, b_4_5_6_7, 0);
+ EXPECT_EQ(0, external.At<uint8_t>(0));
+ EXPECT_EQ(1, external.At<uint8_t>(1));
+ EXPECT_EQ(2, external.At<uint8_t>(2));
+ EXPECT_EQ(3, external.At<uint8_t>(3));
+
+ // Another zero length copy.
+ ByteArray::Copy(external, 4, b_4_5_6_7, 0);
+ EXPECT_EQ(0, external.At<uint8_t>(0));
+ EXPECT_EQ(1, external.At<uint8_t>(1));
+ EXPECT_EQ(2, external.At<uint8_t>(2));
+ EXPECT_EQ(3, external.At<uint8_t>(3));
+
+ // A one element copy.
+ ByteArray::Copy(external, 0, b_4_5_6_7, 1);
+ EXPECT_EQ(4, external.At<uint8_t>(0));
+ EXPECT_EQ(1, external.At<uint8_t>(1));
+ EXPECT_EQ(2, external.At<uint8_t>(2));
+ EXPECT_EQ(3, external.At<uint8_t>(3));
+
+ // A two element copy.
+ ByteArray::Copy(external, 2, b_4_5_6_7, 2);
+ EXPECT_EQ(4, external.At<uint8_t>(0));
+ EXPECT_EQ(1, external.At<uint8_t>(1));
+ EXPECT_EQ(4, external.At<uint8_t>(2));
+ EXPECT_EQ(5, external.At<uint8_t>(3));
+
+ // A three element copy.
+ ByteArray::Copy(external, 1, b_4_5_6_7, 3);
+ EXPECT_EQ(4, external.At<uint8_t>(0));
+ EXPECT_EQ(4, external.At<uint8_t>(1));
+ EXPECT_EQ(5, external.At<uint8_t>(2));
+ EXPECT_EQ(6, external.At<uint8_t>(3));
+
+ // A four element copy.
+ ByteArray::Copy(external, 0, b_0_1_2_3, 4);
+ EXPECT_EQ(0, external.At<uint8_t>(0));
+ EXPECT_EQ(1, external.At<uint8_t>(1));
+ EXPECT_EQ(2, external.At<uint8_t>(2));
+ EXPECT_EQ(3, external.At<uint8_t>(3));
+}
+
+
TEST_CASE(InternalByteArray) {
uint8_t data[] = { 253, 254, 255, 0, 1, 2, 3, 4 };
intptr_t data_length = ARRAY_SIZE(data);
@@ -2033,6 +2092,145 @@ TEST_CASE(InternalByteArrayUnlignedAccess) {
}
+TEST_CASE(InternalByteArrayCopy) {
+ const uint8_t b_0_1_2_3[] = { 0, 1, 2, 3 };
+ const uint8_t b_4_5_6_7[] = { 4, 5, 6, 7 };
+
+ const InternalByteArray& internal =
+ InternalByteArray::Handle(
+ InternalByteArray::New(b_0_1_2_3, ARRAY_SIZE(b_0_1_2_3)));
+ EXPECT(!internal.IsNull());
+ EXPECT_EQ(4, internal.Length());
+ EXPECT_EQ(0, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(2, internal.At<uint8_t>(2));
+ EXPECT_EQ(3, internal.At<uint8_t>(3));
+
+ // A zero length copy.
+ ByteArray::Copy(internal, 0, b_4_5_6_7, 0);
+ EXPECT_EQ(0, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(2, internal.At<uint8_t>(2));
+ EXPECT_EQ(3, internal.At<uint8_t>(3));
+
+ // Another zero length copy.
+ ByteArray::Copy(internal, 4, b_4_5_6_7, 0);
+ EXPECT_EQ(0, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(2, internal.At<uint8_t>(2));
+ EXPECT_EQ(3, internal.At<uint8_t>(3));
+
+ // A one element copy.
+ ByteArray::Copy(internal, 0, b_4_5_6_7, 1);
+ EXPECT_EQ(4, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(2, internal.At<uint8_t>(2));
+ EXPECT_EQ(3, internal.At<uint8_t>(3));
+
+ // A two element copy.
+ ByteArray::Copy(internal, 2, b_4_5_6_7, 2);
+ EXPECT_EQ(4, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(4, internal.At<uint8_t>(2));
+ EXPECT_EQ(5, internal.At<uint8_t>(3));
+
+ // A three element copy.
+ ByteArray::Copy(internal, 1, b_4_5_6_7, 3);
+ EXPECT_EQ(4, internal.At<uint8_t>(0));
+ EXPECT_EQ(4, internal.At<uint8_t>(1));
+ EXPECT_EQ(5, internal.At<uint8_t>(2));
+ EXPECT_EQ(6, internal.At<uint8_t>(3));
+
+ // A four element copy.
+ ByteArray::Copy(internal, 0, b_0_1_2_3, 4);
+ EXPECT_EQ(0, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(2, internal.At<uint8_t>(2));
+ EXPECT_EQ(3, internal.At<uint8_t>(3));
+}
+
+
+TEST_CASE(ByteArrayCopy) {
+ const uint8_t b_0_1_2_3[] = { 0, 1, 2, 3 };
+
+ const InternalByteArray& internal =
+ InternalByteArray::Handle(
+ InternalByteArray::New(b_0_1_2_3, ARRAY_SIZE(b_0_1_2_3)));
+ EXPECT(!internal.IsNull());
+ EXPECT_EQ(4, internal.Length());
+ EXPECT_EQ(0, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(2, internal.At<uint8_t>(2));
+ EXPECT_EQ(3, internal.At<uint8_t>(3));
+
+ uint8_t data[] = { 4, 5, 6, 7 };
+ const ExternalByteArray& external =
+ ExternalByteArray::Handle(
+ ExternalByteArray::New(data, ARRAY_SIZE(data), NULL, NULL));
+ EXPECT(!external.IsNull());
+ EXPECT_EQ(4, external.Length());
+ EXPECT_EQ(4, external.At<uint8_t>(0));
+ EXPECT_EQ(5, external.At<uint8_t>(1));
+ EXPECT_EQ(6, external.At<uint8_t>(2));
+ EXPECT_EQ(7, external.At<uint8_t>(3));
+
+ // A zero length copy.
+ ByteArray::Copy(internal, 0, external, 0, 0);
+ EXPECT_EQ(0, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(2, internal.At<uint8_t>(2));
+ EXPECT_EQ(3, internal.At<uint8_t>(3));
+
+ // A zero length copy, take 2.
+ ByteArray::Copy(internal, 4, external, 0, 0);
+ EXPECT_EQ(0, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(2, internal.At<uint8_t>(2));
+ EXPECT_EQ(3, internal.At<uint8_t>(3));
+
+ // A zero length copy, take 3.
+ ByteArray::Copy(internal, 0, external, 4, 0);
+ EXPECT_EQ(0, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(2, internal.At<uint8_t>(2));
+ EXPECT_EQ(3, internal.At<uint8_t>(3));
+
+ // A zero length copy, take 4.
+ ByteArray::Copy(internal, 4, external, 4, 0);
+ EXPECT_EQ(0, internal.At<uint8_t>(0));
+ EXPECT_EQ(1, internal.At<uint8_t>(1));
+ EXPECT_EQ(2, internal.At<uint8_t>(2));
+ EXPECT_EQ(3, internal.At<uint8_t>(3));
+
+ // A four element copy.
+ ByteArray::Copy(internal, 0, external, 0, 4);
+ EXPECT_EQ(4, internal.At<uint8_t>(0));
+ EXPECT_EQ(5, internal.At<uint8_t>(1));
+ EXPECT_EQ(6, internal.At<uint8_t>(2));
+ EXPECT_EQ(7, internal.At<uint8_t>(3));
+ EXPECT_EQ(4, external.At<uint8_t>(0));
+ EXPECT_EQ(5, external.At<uint8_t>(1));
+ EXPECT_EQ(6, external.At<uint8_t>(2));
+ EXPECT_EQ(7, external.At<uint8_t>(3));
+
+ // A four element copy, take 2.
+ ByteArray::Copy(external, 0, b_0_1_2_3, 4);
+ EXPECT_EQ(0, external.At<uint8_t>(0));
+ EXPECT_EQ(1, external.At<uint8_t>(1));
+ EXPECT_EQ(2, external.At<uint8_t>(2));
+ EXPECT_EQ(3, external.At<uint8_t>(3));
+ ByteArray::Copy(external, 0, internal, 0, 4);
+ EXPECT_EQ(4, internal.At<uint8_t>(0));
+ EXPECT_EQ(5, internal.At<uint8_t>(1));
+ EXPECT_EQ(6, internal.At<uint8_t>(2));
+ EXPECT_EQ(7, internal.At<uint8_t>(3));
+ EXPECT_EQ(4, external.At<uint8_t>(0));
+ EXPECT_EQ(5, external.At<uint8_t>(1));
+ EXPECT_EQ(6, external.At<uint8_t>(2));
+ EXPECT_EQ(7, external.At<uint8_t>(3));
+}
+
+
TEST_CASE(Script) {
const char* url_chars = "builtin:test-case";
const char* source_chars = "This will not compile.";
« 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