| 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 "include/dart_debugger_api.h" | 5 #include "include/dart_debugger_api.h" |
| 6 #include "platform/assert.h" | 6 #include "platform/assert.h" |
| 7 #include "vm/bigint_operations.h" | 7 #include "vm/bigint_operations.h" |
| 8 #include "vm/class_finalizer.h" | 8 #include "vm/class_finalizer.h" |
| 9 #include "vm/dart_api_impl.h" | 9 #include "vm/dart_api_impl.h" |
| 10 #include "vm/dart_api_state.h" | 10 #include "vm/dart_api_state.h" |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 45 | 45 |
| 46 | 46 |
| 47 static uint8_t* zone_allocator( | 47 static uint8_t* zone_allocator( |
| 48 uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | 48 uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
| 49 Zone* zone = Isolate::Current()->current_zone(); | 49 Zone* zone = Isolate::Current()->current_zone(); |
| 50 return reinterpret_cast<uint8_t*>( | 50 return reinterpret_cast<uint8_t*>( |
| 51 zone->Reallocate(reinterpret_cast<uword>(ptr), old_size, new_size)); | 51 zone->Reallocate(reinterpret_cast<uword>(ptr), old_size, new_size)); |
| 52 } | 52 } |
| 53 | 53 |
| 54 | 54 |
| 55 static Dart_CMessage* DecodeMessage(uint8_t* message, | 55 static Dart_CObject* DecodeMessage(uint8_t* message, |
| 56 intptr_t length, | 56 intptr_t length, |
| 57 ReAlloc allocator) { | 57 ReAlloc allocator) { |
| 58 CMessageReader message_reader(message, length, allocator); | 58 CMessageReader message_reader(message, length, allocator); |
| 59 return message_reader.ReadMessage(); | 59 return message_reader.ReadMessage(); |
| 60 } | 60 } |
| 61 | 61 |
| 62 | 62 |
| 63 // Compare two Dart_CObject object graphs rooted in first and |
| 64 // second. The second graph will be destroyed by this operation no matter |
| 65 // whether the graphs are equal or not. |
| 66 static void CompareDartCObjects(Dart_CObject* first, Dart_CObject* second) { |
| 67 // Return immediately if entering a cycle. |
| 68 if (second->type == Dart_CObject::kNumberOfTypes) return; |
| 69 |
| 70 EXPECT_NE(first, second); |
| 71 EXPECT_EQ(first->type, second->type); |
| 72 switch (first->type) { |
| 73 case Dart_CObject::kNull: |
| 74 // Nothing more to compare. |
| 75 break; |
| 76 case Dart_CObject::kBool: |
| 77 EXPECT_EQ(first->value.as_bool, second->value.as_bool); |
| 78 break; |
| 79 case Dart_CObject::kInt32: |
| 80 EXPECT_EQ(first->value.as_int32, second->value.as_int32); |
| 81 break; |
| 82 case Dart_CObject::kDouble: |
| 83 EXPECT_EQ(first->value.as_double, second->value.as_double); |
| 84 break; |
| 85 case Dart_CObject::kString: |
| 86 EXPECT_STREQ(first->value.as_string, second->value.as_string); |
| 87 break; |
| 88 case Dart_CObject::kArray: |
| 89 // Use invalid type as a visited marker to avoid infinite |
| 90 // recursion on graphs with cycles. |
| 91 second->type = Dart_CObject::kNumberOfTypes; |
| 92 EXPECT_EQ(first->value.as_array.length, second->value.as_array.length); |
| 93 for (int i = 0; i < first->value.as_array.length; i++) { |
| 94 CompareDartCObjects(first->value.as_array.values[i], |
| 95 second->value.as_array.values[i]); |
| 96 } |
| 97 break; |
| 98 default: |
| 99 EXPECT(false); |
| 100 } |
| 101 } |
| 102 |
| 103 |
| 104 static void CheckEncodeDecodeMessage(Dart_CObject* root) { |
| 105 // Encode and decode the message. |
| 106 uint8_t* buffer = NULL; |
| 107 MessageWriter writer(&buffer, &malloc_allocator); |
| 108 writer.WriteCMessage(root); |
| 109 |
| 110 Zone zone(Isolate::Current()); |
| 111 Dart_CObject* new_root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 112 writer.BytesWritten(), |
| 113 &zone_allocator); |
| 114 |
| 115 // Check that the two messages are the same. |
| 116 CompareDartCObjects(root, new_root); |
| 117 } |
| 118 |
| 63 TEST_CASE(SerializeNull) { | 119 TEST_CASE(SerializeNull) { |
| 64 Zone zone(Isolate::Current()); | 120 Zone zone(Isolate::Current()); |
| 65 | 121 |
| 66 // Write snapshot with object content. | 122 // Write snapshot with object content. |
| 67 uint8_t* buffer; | 123 uint8_t* buffer; |
| 68 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 124 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 69 const Object& null_object = Object::Handle(); | 125 const Object& null_object = Object::Handle(); |
| 70 writer.WriteObject(null_object.raw()); | 126 writer.WriteObject(null_object.raw()); |
| 71 writer.FinalizeBuffer(); | 127 writer.FinalizeBuffer(); |
| 72 | 128 |
| 73 // Create a snapshot object using the buffer. | 129 // Create a snapshot object using the buffer. |
| 74 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 130 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 75 | 131 |
| 76 // Read object back from the snapshot. | 132 // Read object back from the snapshot. |
| 77 SnapshotReader reader(snapshot, Isolate::Current()); | 133 SnapshotReader reader(snapshot, Isolate::Current()); |
| 78 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 134 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 79 EXPECT(Equals(null_object, serialized_object)); | 135 EXPECT(Equals(null_object, serialized_object)); |
| 80 | 136 |
| 81 // Read object back from the snapshot into a C structure. | 137 // Read object back from the snapshot into a C structure. |
| 82 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 138 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 83 writer.BytesWritten(), | 139 writer.BytesWritten(), |
| 84 &zone_allocator); | 140 &zone_allocator); |
| 85 Dart_CObject* cobject = cmessage->root; | 141 EXPECT_NOTNULL(root); |
| 86 EXPECT_NOTNULL(cobject); | 142 EXPECT_EQ(Dart_CObject::kNull, root->type); |
| 87 EXPECT_EQ(Dart_CObject::kNull, cobject->type); | 143 CheckEncodeDecodeMessage(root); |
| 88 } | 144 } |
| 89 | 145 |
| 90 | 146 |
| 91 TEST_CASE(SerializeSmi1) { | 147 TEST_CASE(SerializeSmi1) { |
| 92 Zone zone(Isolate::Current()); | 148 Zone zone(Isolate::Current()); |
| 93 | 149 |
| 94 // Write snapshot with object content. | 150 // Write snapshot with object content. |
| 95 uint8_t* buffer; | 151 uint8_t* buffer; |
| 96 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 152 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 97 const Smi& smi = Smi::Handle(Smi::New(124)); | 153 const Smi& smi = Smi::Handle(Smi::New(124)); |
| 98 writer.WriteObject(smi.raw()); | 154 writer.WriteObject(smi.raw()); |
| 99 writer.FinalizeBuffer(); | 155 writer.FinalizeBuffer(); |
| 100 | 156 |
| 101 // Create a snapshot object using the buffer. | 157 // Create a snapshot object using the buffer. |
| 102 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 158 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 103 | 159 |
| 104 // Read object back from the snapshot. | 160 // Read object back from the snapshot. |
| 105 SnapshotReader reader(snapshot, Isolate::Current()); | 161 SnapshotReader reader(snapshot, Isolate::Current()); |
| 106 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 162 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 107 EXPECT(Equals(smi, serialized_object)); | 163 EXPECT(Equals(smi, serialized_object)); |
| 108 | 164 |
| 109 // Read object back from the snapshot into a C structure. | 165 // Read object back from the snapshot into a C structure. |
| 110 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 166 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 111 writer.BytesWritten(), | 167 writer.BytesWritten(), |
| 112 &zone_allocator); | 168 &zone_allocator); |
| 113 Dart_CObject* cobject = cmessage->root; | 169 EXPECT_NOTNULL(root); |
| 114 EXPECT_NOTNULL(cobject); | 170 EXPECT_EQ(Dart_CObject::kInt32, root->type); |
| 115 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 171 EXPECT_EQ(smi.Value(), root->value.as_int32); |
| 116 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 172 CheckEncodeDecodeMessage(root); |
| 117 } | 173 } |
| 118 | 174 |
| 119 | 175 |
| 120 TEST_CASE(SerializeSmi2) { | 176 TEST_CASE(SerializeSmi2) { |
| 121 Zone zone(Isolate::Current()); | 177 Zone zone(Isolate::Current()); |
| 122 | 178 |
| 123 // Write snapshot with object content. | 179 // Write snapshot with object content. |
| 124 uint8_t* buffer; | 180 uint8_t* buffer; |
| 125 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 181 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 126 const Smi& smi = Smi::Handle(Smi::New(-1)); | 182 const Smi& smi = Smi::Handle(Smi::New(-1)); |
| 127 writer.WriteObject(smi.raw()); | 183 writer.WriteObject(smi.raw()); |
| 128 writer.FinalizeBuffer(); | 184 writer.FinalizeBuffer(); |
| 129 | 185 |
| 130 // Create a snapshot object using the buffer. | 186 // Create a snapshot object using the buffer. |
| 131 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 187 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 132 | 188 |
| 133 // Read object back from the snapshot. | 189 // Read object back from the snapshot. |
| 134 SnapshotReader reader(snapshot, Isolate::Current()); | 190 SnapshotReader reader(snapshot, Isolate::Current()); |
| 135 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 191 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 136 EXPECT(Equals(smi, serialized_object)); | 192 EXPECT(Equals(smi, serialized_object)); |
| 137 | 193 |
| 138 // Read object back from the snapshot into a C structure. | 194 // Read object back from the snapshot into a C structure. |
| 139 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 195 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 140 writer.BytesWritten(), | 196 writer.BytesWritten(), |
| 141 &zone_allocator); | 197 &zone_allocator); |
| 142 Dart_CObject* cobject = cmessage->root; | 198 EXPECT_NOTNULL(root); |
| 143 EXPECT_NOTNULL(cobject); | 199 EXPECT_EQ(Dart_CObject::kInt32, root->type); |
| 144 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 200 EXPECT_EQ(smi.Value(), root->value.as_int32); |
| 145 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 201 CheckEncodeDecodeMessage(root); |
| 146 } | 202 } |
| 147 | 203 |
| 148 | 204 |
| 149 TEST_CASE(SerializeDouble) { | 205 TEST_CASE(SerializeDouble) { |
| 150 Zone zone(Isolate::Current()); | 206 Zone zone(Isolate::Current()); |
| 151 | 207 |
| 152 // Write snapshot with object content. | 208 // Write snapshot with object content. |
| 153 uint8_t* buffer; | 209 uint8_t* buffer; |
| 154 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 210 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 155 const Double& dbl = Double::Handle(Double::New(101.29)); | 211 const Double& dbl = Double::Handle(Double::New(101.29)); |
| 156 writer.WriteObject(dbl.raw()); | 212 writer.WriteObject(dbl.raw()); |
| 157 writer.FinalizeBuffer(); | 213 writer.FinalizeBuffer(); |
| 158 | 214 |
| 159 // Create a snapshot object using the buffer. | 215 // Create a snapshot object using the buffer. |
| 160 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 216 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 161 | 217 |
| 162 // Read object back from the snapshot. | 218 // Read object back from the snapshot. |
| 163 SnapshotReader reader(snapshot, Isolate::Current()); | 219 SnapshotReader reader(snapshot, Isolate::Current()); |
| 164 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 220 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 165 EXPECT(Equals(dbl, serialized_object)); | 221 EXPECT(Equals(dbl, serialized_object)); |
| 166 | 222 |
| 167 // Read object back from the snapshot into a C structure. | 223 // Read object back from the snapshot into a C structure. |
| 168 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 224 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 169 writer.BytesWritten(), | 225 writer.BytesWritten(), |
| 170 &zone_allocator); | 226 &zone_allocator); |
| 171 Dart_CObject* cobject = cmessage->root; | 227 EXPECT_NOTNULL(root); |
| 172 EXPECT_NOTNULL(cobject); | 228 EXPECT_EQ(Dart_CObject::kDouble, root->type); |
| 173 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); | 229 EXPECT_EQ(dbl.value(), root->value.as_double); |
| 174 EXPECT_EQ(dbl.value(), cobject->value.as_double); | 230 CheckEncodeDecodeMessage(root); |
| 175 } | 231 } |
| 176 | 232 |
| 177 | 233 |
| 178 TEST_CASE(SerializeBool) { | 234 TEST_CASE(SerializeBool) { |
| 179 Zone zone(Isolate::Current()); | 235 Zone zone(Isolate::Current()); |
| 180 | 236 |
| 181 // Write snapshot with object content. | 237 // Write snapshot with object content. |
| 182 uint8_t* buffer; | 238 uint8_t* buffer; |
| 183 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 239 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 184 const Bool& bool1 = Bool::Handle(Bool::True()); | 240 const Bool& bool1 = Bool::Handle(Bool::True()); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 204 uint8_t* buffer; | 260 uint8_t* buffer; |
| 205 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 261 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 206 const Bool& bl = Bool::Handle(Bool::True()); | 262 const Bool& bl = Bool::Handle(Bool::True()); |
| 207 writer.WriteObject(bl.raw()); | 263 writer.WriteObject(bl.raw()); |
| 208 writer.FinalizeBuffer(); | 264 writer.FinalizeBuffer(); |
| 209 | 265 |
| 210 // Create a snapshot object using the buffer. | 266 // Create a snapshot object using the buffer. |
| 211 Snapshot::SetupFromBuffer(buffer); | 267 Snapshot::SetupFromBuffer(buffer); |
| 212 | 268 |
| 213 // Read object back from the snapshot into a C structure. | 269 // Read object back from the snapshot into a C structure. |
| 214 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 270 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 215 writer.BytesWritten(), | 271 writer.BytesWritten(), |
| 216 &zone_allocator); | 272 &zone_allocator); |
| 217 Dart_CObject* cobject = cmessage->root; | 273 EXPECT_NOTNULL(root); |
| 218 EXPECT_NOTNULL(cobject); | 274 EXPECT_EQ(Dart_CObject::kBool, root->type); |
| 219 EXPECT_EQ(Dart_CObject::kBool, cobject->type); | 275 EXPECT_EQ(true, root->value.as_bool); |
| 220 EXPECT_EQ(true, cobject->value.as_bool); | 276 CheckEncodeDecodeMessage(root); |
| 221 } | 277 } |
| 222 | 278 |
| 223 | 279 |
| 224 TEST_CASE(SerializeFalse) { | 280 TEST_CASE(SerializeFalse) { |
| 225 Zone zone(Isolate::Current()); | 281 Zone zone(Isolate::Current()); |
| 226 | 282 |
| 227 // Write snapshot with false object. | 283 // Write snapshot with false object. |
| 228 uint8_t* buffer; | 284 uint8_t* buffer; |
| 229 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 285 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 230 const Bool& bl = Bool::Handle(Bool::False()); | 286 const Bool& bl = Bool::Handle(Bool::False()); |
| 231 writer.WriteObject(bl.raw()); | 287 writer.WriteObject(bl.raw()); |
| 232 writer.FinalizeBuffer(); | 288 writer.FinalizeBuffer(); |
| 233 | 289 |
| 234 // Create a snapshot object using the buffer. | 290 // Create a snapshot object using the buffer. |
| 235 Snapshot::SetupFromBuffer(buffer); | 291 Snapshot::SetupFromBuffer(buffer); |
| 236 | 292 |
| 237 // Read object back from the snapshot into a C structure. | 293 // Read object back from the snapshot into a C structure. |
| 238 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 294 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 239 writer.BytesWritten(), | 295 writer.BytesWritten(), |
| 240 &zone_allocator); | 296 &zone_allocator); |
| 241 Dart_CObject* cobject = cmessage->root; | 297 EXPECT_NOTNULL(root); |
| 242 EXPECT_NOTNULL(cobject); | 298 EXPECT_EQ(Dart_CObject::kBool, root->type); |
| 243 EXPECT_EQ(Dart_CObject::kBool, cobject->type); | 299 EXPECT_EQ(false, root->value.as_bool); |
| 244 EXPECT_EQ(false, cobject->value.as_bool); | 300 CheckEncodeDecodeMessage(root); |
| 245 } | 301 } |
| 246 | 302 |
| 247 | 303 |
| 248 TEST_CASE(SerializeBigint) { | 304 TEST_CASE(SerializeBigint) { |
| 249 Zone zone(Isolate::Current()); | 305 Zone zone(Isolate::Current()); |
| 250 | 306 |
| 251 // Write snapshot with object content. | 307 // Write snapshot with object content. |
| 252 uint8_t* buffer; | 308 uint8_t* buffer; |
| 253 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 309 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 254 const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); | 310 const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); |
| 255 writer.WriteObject(bigint.raw()); | 311 writer.WriteObject(bigint.raw()); |
| 256 writer.FinalizeBuffer(); | 312 writer.FinalizeBuffer(); |
| 257 | 313 |
| 258 // Create a snapshot object using the buffer. | 314 // Create a snapshot object using the buffer. |
| 259 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 315 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 260 | 316 |
| 261 // Read object back from the snapshot. | 317 // Read object back from the snapshot. |
| 262 SnapshotReader reader(snapshot, Isolate::Current()); | 318 SnapshotReader reader(snapshot, Isolate::Current()); |
| 263 Bigint& obj = Bigint::Handle(); | 319 Bigint& obj = Bigint::Handle(); |
| 264 obj ^= reader.ReadObject(); | 320 obj ^= reader.ReadObject(); |
| 265 OS::Print("%lld", BigintOperations::ToInt64(obj)); | 321 OS::Print("%lld", BigintOperations::ToInt64(obj)); |
| 266 EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); | 322 EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); |
| 267 | 323 |
| 268 // Read object back from the snapshot into a C structure. | 324 // Read object back from the snapshot into a C structure. |
| 269 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 325 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 270 writer.BytesWritten(), | 326 writer.BytesWritten(), |
| 271 &zone_allocator); | 327 &zone_allocator); |
| 272 Dart_CObject* cobject = cmessage->root; | |
| 273 // Bigint not supported. | 328 // Bigint not supported. |
| 274 EXPECT(cobject == NULL); | 329 EXPECT(root == NULL); |
| 275 } | 330 } |
| 276 | 331 |
| 277 | 332 |
| 278 TEST_CASE(SerializeSingletons) { | 333 TEST_CASE(SerializeSingletons) { |
| 279 // Write snapshot with object content. | 334 // Write snapshot with object content. |
| 280 uint8_t* buffer; | 335 uint8_t* buffer; |
| 281 SnapshotWriter writer(Snapshot::kMessage, &buffer, &malloc_allocator); | 336 SnapshotWriter writer(Snapshot::kMessage, &buffer, &malloc_allocator); |
| 282 writer.WriteObject(Object::class_class()); | 337 writer.WriteObject(Object::class_class()); |
| 283 writer.WriteObject(Object::null_class()); | 338 writer.WriteObject(Object::null_class()); |
| 284 writer.WriteObject(Object::type_class()); | 339 writer.WriteObject(Object::type_class()); |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 // Create a snapshot object using the buffer. | 398 // Create a snapshot object using the buffer. |
| 344 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 399 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 345 | 400 |
| 346 // Read object back from the snapshot. | 401 // Read object back from the snapshot. |
| 347 SnapshotReader reader(snapshot, Isolate::Current()); | 402 SnapshotReader reader(snapshot, Isolate::Current()); |
| 348 String& serialized_str = String::Handle(); | 403 String& serialized_str = String::Handle(); |
| 349 serialized_str ^= reader.ReadObject(); | 404 serialized_str ^= reader.ReadObject(); |
| 350 EXPECT(str.Equals(serialized_str)); | 405 EXPECT(str.Equals(serialized_str)); |
| 351 | 406 |
| 352 // Read object back from the snapshot into a C structure. | 407 // Read object back from the snapshot into a C structure. |
| 353 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 408 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 354 writer.BytesWritten(), | 409 writer.BytesWritten(), |
| 355 &zone_allocator); | 410 &zone_allocator); |
| 356 Dart_CObject* cobject = cmessage->root; | 411 EXPECT_EQ(Dart_CObject::kString, root->type); |
| 357 EXPECT_EQ(Dart_CObject::kString, cobject->type); | 412 EXPECT_STREQ(cstr, root->value.as_string); |
| 358 EXPECT_STREQ(cstr, cobject->value.as_string); | 413 CheckEncodeDecodeMessage(root); |
| 359 } | 414 } |
| 360 | 415 |
| 361 | 416 |
| 362 TEST_CASE(SerializeArray) { | 417 TEST_CASE(SerializeArray) { |
| 363 Zone zone(Isolate::Current()); | 418 Zone zone(Isolate::Current()); |
| 364 | 419 |
| 365 // Write snapshot with object content. | 420 // Write snapshot with object content. |
| 366 uint8_t* buffer; | 421 uint8_t* buffer; |
| 367 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 422 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 368 const int kArrayLength = 10; | 423 const int kArrayLength = 10; |
| 369 Array& array = Array::Handle(Array::New(kArrayLength)); | 424 Array& array = Array::Handle(Array::New(kArrayLength)); |
| 370 Smi& smi = Smi::Handle(); | 425 Smi& smi = Smi::Handle(); |
| 371 for (int i = 0; i < kArrayLength; i++) { | 426 for (int i = 0; i < kArrayLength; i++) { |
| 372 smi ^= Smi::New(i); | 427 smi ^= Smi::New(i); |
| 373 array.SetAt(i, smi); | 428 array.SetAt(i, smi); |
| 374 } | 429 } |
| 375 writer.WriteObject(array.raw()); | 430 writer.WriteObject(array.raw()); |
| 376 writer.FinalizeBuffer(); | 431 writer.FinalizeBuffer(); |
| 377 | 432 |
| 378 // Create a snapshot object using the buffer. | 433 // Create a snapshot object using the buffer. |
| 379 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 434 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 380 | 435 |
| 381 // Read object back from the snapshot. | 436 // Read object back from the snapshot. |
| 382 SnapshotReader reader(snapshot, Isolate::Current()); | 437 SnapshotReader reader(snapshot, Isolate::Current()); |
| 383 Array& serialized_array = Array::Handle(); | 438 Array& serialized_array = Array::Handle(); |
| 384 serialized_array ^= reader.ReadObject(); | 439 serialized_array ^= reader.ReadObject(); |
| 385 EXPECT(array.Equals(serialized_array)); | 440 EXPECT(array.Equals(serialized_array)); |
| 386 | 441 |
| 387 // Read object back from the snapshot into a C structure. | 442 // Read object back from the snapshot into a C structure. |
| 388 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 443 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 389 writer.BytesWritten(), | 444 writer.BytesWritten(), |
| 390 &zone_allocator); | 445 &zone_allocator); |
| 391 Dart_CObject* cobject = cmessage->root; | 446 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 392 EXPECT_EQ(Dart_CObject::kArray, cobject->type); | 447 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 393 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); | |
| 394 for (int i = 0; i < kArrayLength; i++) { | 448 for (int i = 0; i < kArrayLength; i++) { |
| 395 Dart_CObject* element = cobject->value.as_array.values[i]; | 449 Dart_CObject* element = root->value.as_array.values[i]; |
| 396 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 450 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
| 397 EXPECT_EQ(i, element->value.as_int32); | 451 EXPECT_EQ(i, element->value.as_int32); |
| 398 } | 452 } |
| 453 CheckEncodeDecodeMessage(root); |
| 399 } | 454 } |
| 400 | 455 |
| 401 | 456 |
| 402 TEST_CASE(SerializeEmptyArray) { | 457 TEST_CASE(SerializeEmptyArray) { |
| 403 Zone zone(Isolate::Current()); | 458 Zone zone(Isolate::Current()); |
| 404 | 459 |
| 405 // Write snapshot with object content. | 460 // Write snapshot with object content. |
| 406 uint8_t* buffer; | 461 uint8_t* buffer; |
| 407 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 462 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 408 const int kArrayLength = 0; | 463 const int kArrayLength = 0; |
| 409 Array& array = Array::Handle(Array::New(kArrayLength)); | 464 Array& array = Array::Handle(Array::New(kArrayLength)); |
| 410 writer.WriteObject(array.raw()); | 465 writer.WriteObject(array.raw()); |
| 411 writer.FinalizeBuffer(); | 466 writer.FinalizeBuffer(); |
| 412 | 467 |
| 413 // Create a snapshot object using the buffer. | 468 // Create a snapshot object using the buffer. |
| 414 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 469 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 415 | 470 |
| 416 // Read object back from the snapshot. | 471 // Read object back from the snapshot. |
| 417 SnapshotReader reader(snapshot, Isolate::Current()); | 472 SnapshotReader reader(snapshot, Isolate::Current()); |
| 418 Array& serialized_array = Array::Handle(); | 473 Array& serialized_array = Array::Handle(); |
| 419 serialized_array ^= reader.ReadObject(); | 474 serialized_array ^= reader.ReadObject(); |
| 420 EXPECT(array.Equals(serialized_array)); | 475 EXPECT(array.Equals(serialized_array)); |
| 421 | 476 |
| 422 // Read object back from the snapshot into a C structure. | 477 // Read object back from the snapshot into a C structure. |
| 423 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 478 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 424 writer.BytesWritten(), | 479 writer.BytesWritten(), |
| 425 &zone_allocator); | 480 &zone_allocator); |
| 426 Dart_CObject* cobject = cmessage->root; | 481 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 427 EXPECT_EQ(Dart_CObject::kArray, cobject->type); | 482 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 428 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); | 483 EXPECT(root->value.as_array.values == NULL); |
| 429 EXPECT(cobject->value.as_array.values == NULL); | 484 CheckEncodeDecodeMessage(root); |
| 430 } | 485 } |
| 431 | 486 |
| 432 | 487 |
| 433 TEST_CASE(SerializeScript) { | 488 TEST_CASE(SerializeScript) { |
| 434 const char* kScriptChars = | 489 const char* kScriptChars = |
| 435 "class A {\n" | 490 "class A {\n" |
| 436 " static bar() { return 42; }\n" | 491 " static bar() { return 42; }\n" |
| 437 " static fly() { return 5; }\n" | 492 " static fly() { return 5; }\n" |
| 438 "}\n"; | 493 "}\n"; |
| 439 | 494 |
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 741 Zone zone(Isolate::Current()); | 796 Zone zone(Isolate::Current()); |
| 742 uint8_t* buffer = NULL; | 797 uint8_t* buffer = NULL; |
| 743 MessageWriter writer(&buffer, &zone_allocator); | 798 MessageWriter writer(&buffer, &zone_allocator); |
| 744 | 799 |
| 745 static const int kArrayLength = 2; | 800 static const int kArrayLength = 2; |
| 746 intptr_t data[kArrayLength] = {1, 2}; | 801 intptr_t data[kArrayLength] = {1, 2}; |
| 747 int len = kArrayLength; | 802 int len = kArrayLength; |
| 748 writer.WriteMessage(len, data); | 803 writer.WriteMessage(len, data); |
| 749 | 804 |
| 750 // Read object back from the snapshot into a C structure. | 805 // Read object back from the snapshot into a C structure. |
| 751 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 806 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 752 writer.BytesWritten(), | 807 writer.BytesWritten(), |
| 753 &zone_allocator); | 808 &zone_allocator); |
| 754 Dart_CObject* cobject = cmessage->root; | 809 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 755 EXPECT_EQ(Dart_CObject::kArray, cobject->type); | 810 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 756 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); | |
| 757 for (int i = 0; i < kArrayLength; i++) { | 811 for (int i = 0; i < kArrayLength; i++) { |
| 758 Dart_CObject* element = cobject->value.as_array.values[i]; | 812 Dart_CObject* element = root->value.as_array.values[i]; |
| 759 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 813 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
| 760 EXPECT_EQ(i + 1, element->value.as_int32); | 814 EXPECT_EQ(i + 1, element->value.as_int32); |
| 761 } | 815 } |
| 816 CheckEncodeDecodeMessage(root); |
| 762 } | 817 } |
| 763 | 818 |
| 764 | 819 |
| 765 // Helper function to call a top level Dart function, serialize the | 820 // Helper function to call a top level Dart function, serialize the |
| 766 // result and deserialize the result into a Dart_CObject structure. | 821 // result and deserialize the result into a Dart_CObject structure. |
| 767 static Dart_CMessage* GetDeserializedDartMessage(Dart_Handle lib, | 822 static Dart_CObject* GetDeserializedDartMessage(Dart_Handle lib, |
| 768 const char* dart_function) { | 823 const char* dart_function) { |
| 769 Dart_Handle result; | 824 Dart_Handle result; |
| 770 result = Dart_InvokeStatic(lib, | 825 result = Dart_InvokeStatic(lib, |
| 771 Dart_NewString(""), | 826 Dart_NewString(""), |
| 772 Dart_NewString(dart_function), | 827 Dart_NewString(dart_function), |
| 773 0, | 828 0, |
| 774 NULL); | 829 NULL); |
| 775 EXPECT_VALID(result); | 830 EXPECT_VALID(result); |
| 776 | 831 |
| 777 // Serialize the list into a message. | 832 // Serialize the list into a message. |
| 778 uint8_t* buffer; | 833 uint8_t* buffer; |
| 779 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 834 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 780 const Object& list = Object::Handle(Api::UnwrapHandle(result)); | 835 const Object& list = Object::Handle(Api::UnwrapHandle(result)); |
| 781 writer.WriteObject(list.raw()); | 836 writer.WriteObject(list.raw()); |
| 782 writer.FinalizeBuffer(); | 837 writer.FinalizeBuffer(); |
| 783 | 838 |
| 784 // Read object back from the snapshot into a C structure. | 839 // Read object back from the snapshot into a C structure. |
| 785 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 840 return DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 786 writer.BytesWritten(), | 841 writer.BytesWritten(), |
| 787 &zone_allocator); | 842 &zone_allocator); |
| 788 return cmessage; | |
| 789 } | 843 } |
| 790 | 844 |
| 791 | 845 |
| 792 UNIT_TEST_CASE(DartGeneratedMessages) { | 846 UNIT_TEST_CASE(DartGeneratedMessages) { |
| 793 static const char* kCustomIsolateScriptChars = | 847 static const char* kCustomIsolateScriptChars = |
| 794 "getSmi() {\n" | 848 "getSmi() {\n" |
| 795 " return 42;\n" | 849 " return 42;\n" |
| 796 "}\n" | 850 "}\n" |
| 797 "getString() {\n" | 851 "getString() {\n" |
| 798 " return \"Hello, world!\";\n" | 852 " return \"Hello, world!\";\n" |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 831 { | 885 { |
| 832 Zone zone(Isolate::Current()); | 886 Zone zone(Isolate::Current()); |
| 833 uint8_t* buffer; | 887 uint8_t* buffer; |
| 834 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 888 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 835 Smi& smi = Smi::Handle(); | 889 Smi& smi = Smi::Handle(); |
| 836 smi ^= Api::UnwrapHandle(smi_result); | 890 smi ^= Api::UnwrapHandle(smi_result); |
| 837 writer.WriteObject(smi.raw()); | 891 writer.WriteObject(smi.raw()); |
| 838 writer.FinalizeBuffer(); | 892 writer.FinalizeBuffer(); |
| 839 | 893 |
| 840 // Read object back from the snapshot into a C structure. | 894 // Read object back from the snapshot into a C structure. |
| 841 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 895 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 842 writer.BytesWritten(), | 896 writer.BytesWritten(), |
| 843 &zone_allocator); | 897 &zone_allocator); |
| 844 Dart_CObject* cobject = cmessage->root; | 898 EXPECT_NOTNULL(root); |
| 845 EXPECT_NOTNULL(cobject); | 899 EXPECT_EQ(Dart_CObject::kInt32, root->type); |
| 846 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 900 EXPECT_EQ(42, root->value.as_int32); |
| 847 EXPECT_EQ(42, cobject->value.as_int32); | 901 CheckEncodeDecodeMessage(root); |
| 848 } | 902 } |
| 849 { | 903 { |
| 850 Zone zone(Isolate::Current()); | 904 Zone zone(Isolate::Current()); |
| 851 uint8_t* buffer; | 905 uint8_t* buffer; |
| 852 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); | 906 SnapshotWriter writer(Snapshot::kMessage, &buffer, &zone_allocator); |
| 853 String& str = String::Handle(); | 907 String& str = String::Handle(); |
| 854 str ^= Api::UnwrapHandle(string_result); | 908 str ^= Api::UnwrapHandle(string_result); |
| 855 writer.WriteObject(str.raw()); | 909 writer.WriteObject(str.raw()); |
| 856 writer.FinalizeBuffer(); | 910 writer.FinalizeBuffer(); |
| 857 | 911 |
| 858 // Read object back from the snapshot into a C structure. | 912 // Read object back from the snapshot into a C structure. |
| 859 Dart_CMessage* cmessage = DecodeMessage(buffer + Snapshot::kHeaderSize, | 913 Dart_CObject* root = DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 860 writer.BytesWritten(), | 914 writer.BytesWritten(), |
| 861 &zone_allocator); | 915 &zone_allocator); |
| 862 Dart_CObject* cobject = cmessage->root; | 916 EXPECT_NOTNULL(root); |
| 863 EXPECT_NOTNULL(cobject); | 917 EXPECT_EQ(Dart_CObject::kString, root->type); |
| 864 EXPECT_EQ(Dart_CObject::kString, cobject->type); | 918 EXPECT_STREQ("Hello, world!", root->value.as_string); |
| 865 EXPECT_STREQ("Hello, world!", cobject->value.as_string); | 919 CheckEncodeDecodeMessage(root); |
| 866 } | 920 } |
| 867 } | 921 } |
| 868 Dart_ExitScope(); | 922 Dart_ExitScope(); |
| 869 Dart_ShutdownIsolate(); | 923 Dart_ShutdownIsolate(); |
| 870 } | 924 } |
| 871 | 925 |
| 872 | 926 |
| 873 UNIT_TEST_CASE(DartGeneratedListMessages) { | 927 UNIT_TEST_CASE(DartGeneratedListMessages) { |
| 874 const int kArrayLength = 10; | 928 const int kArrayLength = 10; |
| 875 static const char* kScriptChars = | 929 static const char* kScriptChars = |
| (...skipping 23 matching lines...) Expand all Loading... |
| 899 TestCase::CreateTestIsolate(); | 953 TestCase::CreateTestIsolate(); |
| 900 Isolate* isolate = Isolate::Current(); | 954 Isolate* isolate = Isolate::Current(); |
| 901 EXPECT(isolate != NULL); | 955 EXPECT(isolate != NULL); |
| 902 Dart_EnterScope(); | 956 Dart_EnterScope(); |
| 903 | 957 |
| 904 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 958 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 905 EXPECT_VALID(lib); | 959 EXPECT_VALID(lib); |
| 906 | 960 |
| 907 { | 961 { |
| 908 DARTSCOPE_NOCHECKS(isolate); | 962 DARTSCOPE_NOCHECKS(isolate); |
| 909 | |
| 910 { | 963 { |
| 911 // Generate a list of nulls from Dart code. | 964 // Generate a list of nulls from Dart code. |
| 912 Zone zone(Isolate::Current()); | 965 Zone zone(Isolate::Current()); |
| 913 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList"); | 966 Dart_CObject* root = GetDeserializedDartMessage(lib, "getList"); |
| 914 Dart_CObject* value = cmessage->root; | 967 EXPECT_NOTNULL(root); |
| 915 EXPECT_NOTNULL(value); | 968 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 916 EXPECT_EQ(Dart_CObject::kArray, value->type); | 969 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 917 EXPECT_EQ(kArrayLength, value->value.as_array.length); | |
| 918 for (int i = 0; i < kArrayLength; i++) { | 970 for (int i = 0; i < kArrayLength; i++) { |
| 919 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); | 971 EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type); |
| 920 } | 972 } |
| 973 CheckEncodeDecodeMessage(root); |
| 921 } | 974 } |
| 922 { | 975 { |
| 923 // Generate a list of ints from Dart code. | 976 // Generate a list of ints from Dart code. |
| 924 Zone zone(Isolate::Current()); | 977 Zone zone(Isolate::Current()); |
| 925 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getIntList"); | 978 Dart_CObject* root = GetDeserializedDartMessage(lib, "getIntList"); |
| 926 Dart_CObject* value = cmessage->root; | 979 EXPECT_NOTNULL(root); |
| 927 EXPECT_NOTNULL(value); | 980 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 928 EXPECT_EQ(Dart_CObject::kArray, value->type); | 981 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 929 EXPECT_EQ(kArrayLength, value->value.as_array.length); | |
| 930 for (int i = 0; i < kArrayLength; i++) { | 982 for (int i = 0; i < kArrayLength; i++) { |
| 931 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); | 983 EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[i]->type); |
| 932 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); | 984 EXPECT_EQ(i, root->value.as_array.values[i]->value.as_int32); |
| 933 } | 985 } |
| 986 CheckEncodeDecodeMessage(root); |
| 934 } | 987 } |
| 935 { | 988 { |
| 936 // Generate a list of strings from Dart code. | 989 // Generate a list of strings from Dart code. |
| 937 Zone zone(Isolate::Current()); | 990 Zone zone(Isolate::Current()); |
| 938 Dart_CMessage* cmessage = | 991 Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); |
| 939 GetDeserializedDartMessage(lib, "getStringList"); | 992 EXPECT_NOTNULL(root); |
| 940 Dart_CObject* value = cmessage->root; | 993 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 941 EXPECT_NOTNULL(value); | 994 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 942 EXPECT_EQ(Dart_CObject::kArray, value->type); | |
| 943 EXPECT_EQ(kArrayLength, value->value.as_array.length); | |
| 944 for (int i = 0; i < kArrayLength; i++) { | 995 for (int i = 0; i < kArrayLength; i++) { |
| 945 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[i]->type); | 996 EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[i]->type); |
| 946 char buffer[3]; | 997 char buffer[3]; |
| 947 snprintf(buffer, sizeof(buffer), "%d", i); | 998 snprintf(buffer, sizeof(buffer), "%d", i); |
| 948 EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); | 999 EXPECT_STREQ(buffer, root->value.as_array.values[i]->value.as_string); |
| 949 } | 1000 } |
| 950 } | 1001 } |
| 951 { | 1002 { |
| 952 // Generate a list of objects of different types from Dart code. | 1003 // Generate a list of objects of different types from Dart code. |
| 953 Zone zone(Isolate::Current()); | 1004 Zone zone(Isolate::Current()); |
| 954 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); | 1005 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |
| 955 Dart_CObject* value = cmessage->root; | 1006 EXPECT_NOTNULL(root); |
| 956 EXPECT_NOTNULL(value); | 1007 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 957 EXPECT_EQ(Dart_CObject::kArray, value->type); | 1008 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 958 EXPECT_EQ(kArrayLength, value->value.as_array.length); | |
| 959 | 1009 |
| 960 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[0]->type); | 1010 EXPECT_EQ(Dart_CObject::kInt32, root->value.as_array.values[0]->type); |
| 961 EXPECT_EQ(0, value->value.as_array.values[0]->value.as_int32); | 1011 EXPECT_EQ(0, root->value.as_array.values[0]->value.as_int32); |
| 962 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[1]->type); | 1012 EXPECT_EQ(Dart_CObject::kString, root->value.as_array.values[1]->type); |
| 963 EXPECT_STREQ("1", value->value.as_array.values[1]->value.as_string); | 1013 EXPECT_STREQ("1", root->value.as_array.values[1]->value.as_string); |
| 964 EXPECT_EQ(Dart_CObject::kDouble, value->value.as_array.values[2]->type); | 1014 EXPECT_EQ(Dart_CObject::kDouble, root->value.as_array.values[2]->type); |
| 965 EXPECT_EQ(2.2, value->value.as_array.values[2]->value.as_double); | 1015 EXPECT_EQ(2.2, root->value.as_array.values[2]->value.as_double); |
| 966 EXPECT_EQ(Dart_CObject::kBool, value->value.as_array.values[3]->type); | 1016 EXPECT_EQ(Dart_CObject::kBool, root->value.as_array.values[3]->type); |
| 967 EXPECT_EQ(true, value->value.as_array.values[3]->value.as_bool); | 1017 EXPECT_EQ(true, root->value.as_array.values[3]->value.as_bool); |
| 968 | 1018 |
| 969 for (int i = 0; i < kArrayLength; i++) { | 1019 for (int i = 0; i < kArrayLength; i++) { |
| 970 if (i > 3) { | 1020 if (i > 3) { |
| 971 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); | 1021 EXPECT_EQ(Dart_CObject::kNull, root->value.as_array.values[i]->type); |
| 972 } | 1022 } |
| 973 } | 1023 } |
| 974 } | 1024 } |
| 975 } | 1025 } |
| 976 Dart_ExitScope(); | 1026 Dart_ExitScope(); |
| 977 Dart_ShutdownIsolate(); | 1027 Dart_ShutdownIsolate(); |
| 978 } | 1028 } |
| 979 | 1029 |
| 980 | 1030 |
| 981 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { | 1031 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1016 | 1066 |
| 1017 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 1067 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 1018 EXPECT_VALID(lib); | 1068 EXPECT_VALID(lib); |
| 1019 | 1069 |
| 1020 { | 1070 { |
| 1021 DARTSCOPE_NOCHECKS(isolate); | 1071 DARTSCOPE_NOCHECKS(isolate); |
| 1022 | 1072 |
| 1023 { | 1073 { |
| 1024 // Generate a list of strings from Dart code. | 1074 // Generate a list of strings from Dart code. |
| 1025 Zone zone(Isolate::Current()); | 1075 Zone zone(Isolate::Current()); |
| 1026 Dart_CMessage* cmessage = | 1076 Dart_CObject* root = GetDeserializedDartMessage(lib, "getStringList"); |
| 1027 GetDeserializedDartMessage(lib, "getStringList"); | 1077 EXPECT_NOTNULL(root); |
| 1028 Dart_CObject* object = cmessage->root; | 1078 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1029 EXPECT_NOTNULL(object); | 1079 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1030 EXPECT_EQ(Dart_CObject::kArray, object->type); | |
| 1031 EXPECT_EQ(kArrayLength, object->value.as_array.length); | |
| 1032 for (int i = 0; i < kArrayLength; i++) { | 1080 for (int i = 0; i < kArrayLength; i++) { |
| 1033 Dart_CObject* element = object->value.as_array.values[i]; | 1081 Dart_CObject* element = root->value.as_array.values[i]; |
| 1034 EXPECT_EQ(object->value.as_array.values[0], element); | 1082 EXPECT_EQ(root->value.as_array.values[0], element); |
| 1035 EXPECT_EQ(Dart_CObject::kString, element->type); | 1083 EXPECT_EQ(Dart_CObject::kString, element->type); |
| 1036 EXPECT_STREQ("Hello, world!", element->value.as_string); | 1084 EXPECT_STREQ("Hello, world!", element->value.as_string); |
| 1037 } | 1085 } |
| 1038 } | 1086 } |
| 1039 { | 1087 { |
| 1040 // Generate a list of doubles from Dart code. | 1088 // Generate a list of doubles from Dart code. |
| 1041 Zone zone(Isolate::Current()); | 1089 Zone zone(Isolate::Current()); |
| 1042 Dart_CMessage* cmessage = | 1090 Dart_CObject* root = GetDeserializedDartMessage(lib, "getDoubleList"); |
| 1043 GetDeserializedDartMessage(lib, "getDoubleList"); | 1091 EXPECT_NOTNULL(root); |
| 1044 Dart_CObject* object = cmessage->root; | 1092 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1045 EXPECT_NOTNULL(object); | 1093 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1046 EXPECT_EQ(Dart_CObject::kArray, object->type); | |
| 1047 EXPECT_EQ(kArrayLength, object->value.as_array.length); | |
| 1048 for (int i = 0; i < kArrayLength; i++) { | 1094 for (int i = 0; i < kArrayLength; i++) { |
| 1049 Dart_CObject* element = object->value.as_array.values[i]; | 1095 Dart_CObject* element = root->value.as_array.values[i]; |
| 1050 EXPECT_EQ(object->value.as_array.values[0], element); | 1096 EXPECT_EQ(root->value.as_array.values[0], element); |
| 1051 EXPECT_EQ(Dart_CObject::kDouble, element->type); | 1097 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
| 1052 EXPECT_EQ(3.14, element->value.as_double); | 1098 EXPECT_EQ(3.14, element->value.as_double); |
| 1053 } | 1099 } |
| 1054 } | 1100 } |
| 1055 { | 1101 { |
| 1056 // Generate a list of objects of different types from Dart code. | 1102 // Generate a list of objects of different types from Dart code. |
| 1057 Zone zone(Isolate::Current()); | 1103 Zone zone(Isolate::Current()); |
| 1058 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); | 1104 Dart_CObject* root = GetDeserializedDartMessage(lib, "getMixedList"); |
| 1059 Dart_CObject* object = cmessage->root; | 1105 EXPECT_NOTNULL(root); |
| 1060 EXPECT_NOTNULL(object); | 1106 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1061 EXPECT_EQ(Dart_CObject::kArray, object->type); | 1107 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1062 EXPECT_EQ(kArrayLength, object->value.as_array.length); | |
| 1063 for (int i = 0; i < kArrayLength; i++) { | 1108 for (int i = 0; i < kArrayLength; i++) { |
| 1064 Dart_CObject* element = object->value.as_array.values[i]; | 1109 Dart_CObject* element = root->value.as_array.values[i]; |
| 1065 if ((i % 2) == 0) { | 1110 if ((i % 2) == 0) { |
| 1066 EXPECT_EQ(object->value.as_array.values[0], element); | 1111 EXPECT_EQ(root->value.as_array.values[0], element); |
| 1067 EXPECT_EQ(Dart_CObject::kString, element->type); | 1112 EXPECT_EQ(Dart_CObject::kString, element->type); |
| 1068 EXPECT_STREQ("A", element->value.as_string); | 1113 EXPECT_STREQ("A", element->value.as_string); |
| 1069 } else { | 1114 } else { |
| 1070 EXPECT_EQ(object->value.as_array.values[1], element); | 1115 EXPECT_EQ(root->value.as_array.values[1], element); |
| 1071 EXPECT_EQ(Dart_CObject::kDouble, element->type); | 1116 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
| 1072 EXPECT_STREQ(2.72, element->value.as_double); | 1117 EXPECT_STREQ(2.72, element->value.as_double); |
| 1073 } | 1118 } |
| 1074 } | 1119 } |
| 1075 } | 1120 } |
| 1076 { | 1121 { |
| 1077 // Generate a list of objects of different types from Dart code. | 1122 // Generate a list of objects of different types from Dart code. |
| 1078 Zone zone(Isolate::Current()); | 1123 Zone zone(Isolate::Current()); |
| 1079 Dart_CMessage* cmessage = | 1124 Dart_CObject* root = GetDeserializedDartMessage(lib, "getSelfRefList"); |
| 1080 GetDeserializedDartMessage(lib, "getSelfRefList"); | 1125 EXPECT_NOTNULL(root); |
| 1081 Dart_CObject* object = cmessage->root; | 1126 EXPECT_EQ(Dart_CObject::kArray, root->type); |
| 1082 EXPECT_NOTNULL(object); | 1127 EXPECT_EQ(kArrayLength, root->value.as_array.length); |
| 1083 EXPECT_EQ(Dart_CObject::kArray, object->type); | |
| 1084 EXPECT_EQ(kArrayLength, object->value.as_array.length); | |
| 1085 for (int i = 0; i < kArrayLength; i++) { | 1128 for (int i = 0; i < kArrayLength; i++) { |
| 1086 Dart_CObject* element = object->value.as_array.values[i]; | 1129 Dart_CObject* element = root->value.as_array.values[i]; |
| 1087 EXPECT_EQ(Dart_CObject::kArray, element->type); | 1130 EXPECT_EQ(Dart_CObject::kArray, element->type); |
| 1088 EXPECT_EQ(object, element); | 1131 EXPECT_EQ(root, element); |
| 1089 } | 1132 } |
| 1090 } | 1133 } |
| 1091 } | 1134 } |
| 1092 Dart_ExitScope(); | 1135 Dart_ExitScope(); |
| 1093 Dart_ShutdownIsolate(); | 1136 Dart_ShutdownIsolate(); |
| 1094 } | 1137 } |
| 1095 | 1138 |
| 1139 |
| 1140 UNIT_TEST_CASE(PostCObject) { |
| 1141 // Create a native port for posting from C to Dart |
| 1142 TestIsolateScope __test_isolate__; |
| 1143 const char* kScriptChars = |
| 1144 "void main() {\n" |
| 1145 " var messageCount = 0;\n" |
| 1146 " var exception = '';\n" |
| 1147 " var port = new ReceivePort();\n" |
| 1148 " port.receive((message, replyTo) {\n" |
| 1149 " exception += message.toString();\n" |
| 1150 " messageCount++;\n" |
| 1151 " if (messageCount == 7) throw new Exception(exception);\n" |
| 1152 " });\n" |
| 1153 " return port.toSendPort();\n" |
| 1154 "}\n"; |
| 1155 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 1156 Dart_EnterScope(); |
| 1157 |
| 1158 // xxx |
| 1159 Dart_Handle send_port = Dart_InvokeStatic(lib, |
| 1160 Dart_NewString(""), |
| 1161 Dart_NewString("main"), |
| 1162 0, |
| 1163 NULL); |
| 1164 EXPECT_VALID(send_port); |
| 1165 Dart_Handle result = |
| 1166 Dart_GetInstanceField(send_port, Dart_NewString("_id")); |
| 1167 ASSERT(!Dart_IsError(result)); |
| 1168 ASSERT(Dart_IsInteger(result)); |
| 1169 int64_t send_port_id; |
| 1170 Dart_Handle result2 = Dart_IntegerToInt64(result, &send_port_id); |
| 1171 ASSERT(!Dart_IsError(result2)); |
| 1172 |
| 1173 // Setup single object message. |
| 1174 Dart_CObject object; |
| 1175 |
| 1176 object.type = Dart_CObject::kNull; |
| 1177 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 1178 |
| 1179 object.type = Dart_CObject::kBool; |
| 1180 object.value.as_bool = true; |
| 1181 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 1182 |
| 1183 object.type = Dart_CObject::kBool; |
| 1184 object.value.as_bool = false; |
| 1185 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 1186 |
| 1187 object.type = Dart_CObject::kInt32; |
| 1188 object.value.as_int32 = 123; |
| 1189 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 1190 |
| 1191 object.type = Dart_CObject::kString; |
| 1192 object.value.as_string = const_cast<char*>("456"); |
| 1193 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 1194 |
| 1195 object.type = Dart_CObject::kDouble; |
| 1196 object.value.as_double = 3.14; |
| 1197 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 1198 |
| 1199 object.type = Dart_CObject::kArray; |
| 1200 object.value.as_array.length = 0; |
| 1201 EXPECT(Dart_PostCObject(send_port_id, &object)); |
| 1202 |
| 1203 result = Dart_RunLoop(); |
| 1204 EXPECT(Dart_IsError(result)); |
| 1205 EXPECT(Dart_ErrorHasException(result)); |
| 1206 EXPECT_SUBSTRING("Exception: nulltruefalse1234563.14[]\n", |
| 1207 Dart_GetError(result)); |
| 1208 |
| 1209 Dart_ExitScope(); |
| 1210 } |
| 1211 |
| 1096 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 1212 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
| 1097 | 1213 |
| 1098 } // namespace dart | 1214 } // namespace dart |
| OLD | NEW |