Index: runtime/vm/snapshot_test.cc |
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc |
index 62d7d85d88d4f571dbf1fc2c195b15e6a5f95100..ce7f3f224381181852419369a28fe38c58483946 100644 |
--- a/runtime/vm/snapshot_test.cc |
+++ b/runtime/vm/snapshot_test.cc |
@@ -888,6 +888,119 @@ UNIT_TEST_CASE(DartGeneratedListMessages) { |
Dart_ShutdownIsolate(); |
} |
+ |
+UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
+ const int kArrayLength = 10; |
+ static const char* kScriptChars = |
+ "final int kArrayLength = 10;\n" |
+ "getStringList() {\n" |
+ " var s = 'Hello, world!';\n" |
+ " var list = new List<String>(kArrayLength);\n" |
+ " for (var i = 0; i < kArrayLength; i++) list[i] = s;\n" |
+ " return list;\n" |
+ "}\n" |
+ "getDoubleList() {\n" |
+ " var d = 3.14;\n" |
+ " var list = new List<double>(kArrayLength);\n" |
+ " for (var i = 0; i < kArrayLength; i++) list[i] = d;\n" |
+ " return list;\n" |
+ "}\n" |
+ "getMixedList() {\n" |
+ " var list = new List(kArrayLength);\n" |
+ " for (var i = 0; i < kArrayLength; i++) {\n" |
+ " list[i] = ((i % 2) == 0) ? 'A' : 2.72;\n" |
+ " }\n" |
+ " return list;\n" |
+ "}\n" |
+ "getSelfRefList() {\n" |
+ " var list = new List(kArrayLength);\n" |
+ " for (var i = 0; i < kArrayLength; i++) {\n" |
+ " list[i] = list;\n" |
+ " }\n" |
+ " return list;\n" |
+ "}\n"; |
+ |
+ TestCase::CreateTestIsolate(); |
+ Isolate* isolate = Isolate::Current(); |
+ EXPECT(isolate != NULL); |
+ Dart_EnterScope(); |
+ |
+ Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
+ EXPECT_VALID(lib); |
+ |
+ { |
+ DARTSCOPE_NOCHECKS(isolate); |
+ |
+ { |
+ // Generate a list of strings from Dart code. |
+ Dart_CObject* object = GetDeserializedDartObject(lib, "getStringList"); |
+ EXPECT_NOTNULL(object); |
+ EXPECT_EQ(Dart_CObject::kArray, object->type); |
+ EXPECT_EQ(kArrayLength, object->value.as_array.length); |
+ for (int i = 0; i < kArrayLength; i++) { |
+ Dart_CObject* element = object->value.as_array.values[i]; |
+ EXPECT_EQ(object->value.as_array.values[0], element); |
+ EXPECT_EQ(Dart_CObject::kString, element->type); |
+ EXPECT_STREQ("Hello, world!", element->value.as_string); |
+ } |
+ free(object->value.as_array.values[0]); |
+ free(object); |
siva
2012/02/02 04:01:57
Here too if GetDesrializedDartObject used a ZoneAl
Søren Gjesse
2012/02/02 09:59:49
Moving to a zone allocator is part up later CL.
|
+ } |
+ { |
+ // Generate a list of doubles from Dart code. |
+ Dart_CObject* object = GetDeserializedDartObject(lib, "getDoubleList"); |
+ EXPECT_NOTNULL(object); |
+ EXPECT_EQ(Dart_CObject::kArray, object->type); |
+ EXPECT_EQ(kArrayLength, object->value.as_array.length); |
+ for (int i = 0; i < kArrayLength; i++) { |
+ Dart_CObject* element = object->value.as_array.values[i]; |
+ EXPECT_EQ(object->value.as_array.values[0], element); |
+ EXPECT_EQ(Dart_CObject::kDouble, element->type); |
+ EXPECT_EQ(3.14, element->value.as_double); |
+ } |
+ free(object->value.as_array.values[0]); |
+ free(object); |
+ } |
+ { |
+ // Generate a list of objects of different types from Dart code. |
+ Dart_CObject* object = GetDeserializedDartObject(lib, "getMixedList"); |
+ EXPECT_NOTNULL(object); |
+ EXPECT_EQ(Dart_CObject::kArray, object->type); |
+ EXPECT_EQ(kArrayLength, object->value.as_array.length); |
+ for (int i = 0; i < kArrayLength; i++) { |
+ Dart_CObject* element = object->value.as_array.values[i]; |
+ if ((i % 2) == 0) { |
+ EXPECT_EQ(object->value.as_array.values[0], element); |
+ EXPECT_EQ(Dart_CObject::kString, element->type); |
+ EXPECT_STREQ("A", element->value.as_string); |
+ } else { |
+ EXPECT_EQ(object->value.as_array.values[1], element); |
+ EXPECT_EQ(Dart_CObject::kDouble, element->type); |
+ EXPECT_STREQ(2.72, element->value.as_double); |
+ } |
+ } |
+ free(object->value.as_array.values[0]); |
+ free(object->value.as_array.values[1]); |
+ free(object); |
+ } |
+ { |
+ // Generate a list of objects of different types from Dart code. |
+ Dart_CObject* object = GetDeserializedDartObject(lib, "getSelfRefList"); |
+ EXPECT_NOTNULL(object); |
+ EXPECT_EQ(Dart_CObject::kArray, object->type); |
+ EXPECT_EQ(kArrayLength, object->value.as_array.length); |
+ for (int i = 0; i < kArrayLength; i++) { |
+ Dart_CObject* element = object->value.as_array.values[i]; |
+ EXPECT_EQ(Dart_CObject::kArray, element->type); |
+ EXPECT_EQ(object, element); |
+ } |
+ free(object); |
+ } |
+ } |
+ Dart_ExitScope(); |
+ Dart_ShutdownIsolate(); |
+} |
+ |
#endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
} // namespace dart |