Chromium Code Reviews| 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/bigint_operations.h" | 6 #include "vm/bigint_operations.h" |
| 7 #include "vm/class_finalizer.h" | 7 #include "vm/class_finalizer.h" |
| 8 #include "vm/dart_api_impl.h" | 8 #include "vm/dart_api_impl.h" |
| 9 #include "vm/dart_api_state.h" | 9 #include "vm/dart_api_state.h" |
| 10 #include "vm/snapshot.h" | 10 #include "vm/snapshot.h" |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 35 } | 35 } |
| 36 return false; | 36 return false; |
| 37 } | 37 } |
| 38 | 38 |
| 39 | 39 |
| 40 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { | 40 static uint8_t* allocator(uint8_t* ptr, intptr_t old_size, intptr_t new_size) { |
| 41 return reinterpret_cast<uint8_t*>(realloc(ptr, new_size)); | 41 return reinterpret_cast<uint8_t*>(realloc(ptr, new_size)); |
| 42 } | 42 } |
| 43 | 43 |
| 44 | 44 |
| 45 static void FreeDeserializedDartMessage(Dart_CMessage* cmessage) { | |
| 46 for (int i = 0; i < cmessage->allocated_length; i++) { | |
| 47 free(cmessage->allocated[i]); | |
| 48 } | |
| 49 free(cmessage->original_message - Snapshot::kHeaderSize); | |
| 50 free(cmessage); | |
| 51 } | |
| 52 | |
| 53 | |
| 45 TEST_CASE(SerializeNull) { | 54 TEST_CASE(SerializeNull) { |
| 46 // Write snapshot with object content. | 55 // Write snapshot with object content. |
| 47 uint8_t* buffer; | 56 uint8_t* buffer; |
| 48 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 57 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 49 const Object& null_object = Object::Handle(); | 58 const Object& null_object = Object::Handle(); |
| 50 writer.WriteObject(null_object.raw()); | 59 writer.WriteObject(null_object.raw()); |
| 51 writer.FinalizeBuffer(); | 60 writer.FinalizeBuffer(); |
| 52 | 61 |
| 53 // Create a snapshot object using the buffer. | 62 // Create a snapshot object using the buffer. |
| 54 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 63 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 55 | 64 |
| 56 // Read object back from the snapshot. | 65 // Read object back from the snapshot. |
| 57 SnapshotReader reader(snapshot, Isolate::Current()); | 66 SnapshotReader reader(snapshot, Isolate::Current()); |
| 58 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 67 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 59 EXPECT(Equals(null_object, serialized_object)); | 68 EXPECT(Equals(null_object, serialized_object)); |
| 60 | 69 |
| 61 // Read object back from the snapshot into a C structure. | 70 // Read object back from the snapshot into a C structure. |
|
siva
2012/02/01 01:48:36
If you start a Zone here and use a zone allocator
Søren Gjesse
2012/02/01 12:12:23
Agree. But I wanted to cover the case where the em
| |
| 62 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 71 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 63 writer.BytesWritten(), | 72 writer.BytesWritten(), |
| 64 &allocator); | 73 &allocator); |
| 65 Dart_CObject* cobject = mreader.ReadObject(); | 74 Dart_CObject* cobject = cmessage->object; |
| 66 EXPECT_NOTNULL(cobject); | 75 EXPECT_NOTNULL(cobject); |
| 67 EXPECT_EQ(Dart_CObject::kNull, cobject->type); | 76 EXPECT_EQ(Dart_CObject::kNull, cobject->type); |
| 68 free(cobject); | 77 FreeDeserializedDartMessage(cmessage); |
| 69 } | 78 } |
| 70 | 79 |
| 71 | 80 |
| 72 TEST_CASE(SerializeSmi1) { | 81 TEST_CASE(SerializeSmi1) { |
| 73 // Write snapshot with object content. | 82 // Write snapshot with object content. |
| 74 uint8_t* buffer; | 83 uint8_t* buffer; |
| 75 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 84 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 76 const Smi& smi = Smi::Handle(Smi::New(124)); | 85 const Smi& smi = Smi::Handle(Smi::New(124)); |
| 77 writer.WriteObject(smi.raw()); | 86 writer.WriteObject(smi.raw()); |
| 78 writer.FinalizeBuffer(); | 87 writer.FinalizeBuffer(); |
| 79 | 88 |
| 80 // Create a snapshot object using the buffer. | 89 // Create a snapshot object using the buffer. |
| 81 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 90 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 82 | 91 |
| 83 // Read object back from the snapshot. | 92 // Read object back from the snapshot. |
| 84 SnapshotReader reader(snapshot, Isolate::Current()); | 93 SnapshotReader reader(snapshot, Isolate::Current()); |
| 85 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 94 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 86 EXPECT(Equals(smi, serialized_object)); | 95 EXPECT(Equals(smi, serialized_object)); |
| 87 | 96 |
| 88 // Read object back from the snapshot into a C structure. | 97 // Read object back from the snapshot into a C structure. |
| 89 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 98 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 90 writer.BytesWritten(), | 99 writer.BytesWritten(), |
| 91 &allocator); | 100 &allocator); |
| 92 Dart_CObject* cobject = mreader.ReadObject(); | 101 Dart_CObject* cobject = cmessage->object; |
| 93 EXPECT_NOTNULL(cobject); | 102 EXPECT_NOTNULL(cobject); |
| 94 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 103 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
| 95 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 104 EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
| 96 free(cobject); | 105 FreeDeserializedDartMessage(cmessage); |
|
siva
2012/02/01 01:48:36
Ditto comment here and below about not needing Fre
Søren Gjesse
2012/02/01 12:12:23
See above.
| |
| 97 } | 106 } |
| 98 | 107 |
| 99 | 108 |
| 100 TEST_CASE(SerializeSmi2) { | 109 TEST_CASE(SerializeSmi2) { |
| 101 // Write snapshot with object content. | 110 // Write snapshot with object content. |
| 102 uint8_t* buffer; | 111 uint8_t* buffer; |
| 103 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 112 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 104 const Smi& smi = Smi::Handle(Smi::New(-1)); | 113 const Smi& smi = Smi::Handle(Smi::New(-1)); |
| 105 writer.WriteObject(smi.raw()); | 114 writer.WriteObject(smi.raw()); |
| 106 writer.FinalizeBuffer(); | 115 writer.FinalizeBuffer(); |
| 107 | 116 |
| 108 // Create a snapshot object using the buffer. | 117 // Create a snapshot object using the buffer. |
| 109 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 118 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 110 | 119 |
| 111 // Read object back from the snapshot. | 120 // Read object back from the snapshot. |
| 112 SnapshotReader reader(snapshot, Isolate::Current()); | 121 SnapshotReader reader(snapshot, Isolate::Current()); |
| 113 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 122 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 114 EXPECT(Equals(smi, serialized_object)); | 123 EXPECT(Equals(smi, serialized_object)); |
| 115 | 124 |
| 116 // Read object back from the snapshot into a C structure. | 125 // Read object back from the snapshot into a C structure. |
| 117 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 126 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 118 writer.BytesWritten(), | 127 writer.BytesWritten(), |
| 119 &allocator); | 128 &allocator); |
| 120 Dart_CObject* cobject = mreader.ReadObject(); | 129 Dart_CObject* cobject = cmessage->object; |
| 121 EXPECT_NOTNULL(cobject); | 130 EXPECT_NOTNULL(cobject); |
| 122 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); | 131 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
| 123 EXPECT_EQ(smi.Value(), cobject->value.as_int32); | 132 EXPECT_EQ(smi.Value(), cobject->value.as_int32); |
| 124 free(cobject); | 133 FreeDeserializedDartMessage(cmessage); |
| 125 } | 134 } |
| 126 | 135 |
| 127 | 136 |
| 128 TEST_CASE(SerializeDouble) { | 137 TEST_CASE(SerializeDouble) { |
| 129 // Write snapshot with object content. | 138 // Write snapshot with object content. |
| 130 uint8_t* buffer; | 139 uint8_t* buffer; |
| 131 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 140 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 132 const Double& dbl = Double::Handle(Double::New(101.29)); | 141 const Double& dbl = Double::Handle(Double::New(101.29)); |
| 133 writer.WriteObject(dbl.raw()); | 142 writer.WriteObject(dbl.raw()); |
| 134 writer.FinalizeBuffer(); | 143 writer.FinalizeBuffer(); |
| 135 | 144 |
| 136 // Create a snapshot object using the buffer. | 145 // Create a snapshot object using the buffer. |
| 137 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 146 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 138 | 147 |
| 139 // Read object back from the snapshot. | 148 // Read object back from the snapshot. |
| 140 SnapshotReader reader(snapshot, Isolate::Current()); | 149 SnapshotReader reader(snapshot, Isolate::Current()); |
| 141 const Object& serialized_object = Object::Handle(reader.ReadObject()); | 150 const Object& serialized_object = Object::Handle(reader.ReadObject()); |
| 142 EXPECT(Equals(dbl, serialized_object)); | 151 EXPECT(Equals(dbl, serialized_object)); |
| 143 | 152 |
| 144 // Read object back from the snapshot into a C structure. | 153 // Read object back from the snapshot into a C structure. |
| 145 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 154 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 146 writer.BytesWritten(), | 155 writer.BytesWritten(), |
| 147 &allocator); | 156 &allocator); |
| 148 Dart_CObject* cobject = mreader.ReadObject(); | 157 Dart_CObject* cobject = cmessage->object; |
| 149 EXPECT_NOTNULL(cobject); | 158 EXPECT_NOTNULL(cobject); |
| 150 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); | 159 EXPECT_EQ(Dart_CObject::kDouble, cobject->type); |
| 151 EXPECT_EQ(dbl.value(), cobject->value.as_double); | 160 EXPECT_EQ(dbl.value(), cobject->value.as_double); |
| 152 free(cobject); | 161 FreeDeserializedDartMessage(cmessage); |
| 153 } | 162 } |
| 154 | 163 |
| 155 | 164 |
| 156 TEST_CASE(SerializeBool) { | 165 TEST_CASE(SerializeBool) { |
| 157 // Write snapshot with object content. | 166 // Write snapshot with object content. |
| 158 uint8_t* buffer; | 167 uint8_t* buffer; |
| 159 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 168 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 160 const Bool& bool1 = Bool::Handle(Bool::True()); | 169 const Bool& bool1 = Bool::Handle(Bool::True()); |
| 161 const Bool& bool2 = Bool::Handle(Bool::False()); | 170 const Bool& bool2 = Bool::Handle(Bool::False()); |
| 162 writer.WriteObject(bool1.raw()); | 171 writer.WriteObject(bool1.raw()); |
| 163 writer.WriteObject(bool2.raw()); | 172 writer.WriteObject(bool2.raw()); |
| 164 writer.FinalizeBuffer(); | 173 writer.FinalizeBuffer(); |
| 165 | 174 |
| 166 // Create a snapshot object using the buffer. | 175 // Create a snapshot object using the buffer. |
| 167 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 176 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 168 | 177 |
| 169 // Read object back from the snapshot. | 178 // Read object back from the snapshot. |
| 170 SnapshotReader reader(snapshot, Isolate::Current()); | 179 SnapshotReader reader(snapshot, Isolate::Current()); |
| 171 EXPECT(Bool::True() == reader.ReadObject()); | 180 EXPECT(Bool::True() == reader.ReadObject()); |
| 172 EXPECT(Bool::False() == reader.ReadObject()); | 181 EXPECT(Bool::False() == reader.ReadObject()); |
| 173 | |
| 174 // Read object back from the snapshot into a C structure. | |
| 175 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | |
| 176 writer.BytesWritten(), | |
| 177 &allocator); | |
| 178 Dart_CObject* cobject1 = mreader.ReadObject(); | |
| 179 EXPECT_NOTNULL(cobject1); | |
| 180 EXPECT_EQ(Dart_CObject::kBool, cobject1->type); | |
| 181 EXPECT_EQ(true, cobject1->value.as_bool); | |
| 182 Dart_CObject* cobject2 = mreader.ReadObject(); | |
| 183 EXPECT_NOTNULL(cobject2); | |
| 184 EXPECT_EQ(Dart_CObject::kBool, cobject2->type); | |
| 185 EXPECT_EQ(false, cobject2->value.as_bool); | |
| 186 free(cobject1); | |
| 187 free(cobject2); | |
| 188 } | 182 } |
| 189 | 183 |
| 190 | 184 |
| 185 TEST_CASE(SerializeTrue) { | |
| 186 // Write snapshot with true object. | |
| 187 uint8_t* buffer; | |
| 188 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | |
| 189 const Bool& bl = Bool::Handle(Bool::True()); | |
| 190 writer.WriteObject(bl.raw()); | |
| 191 writer.FinalizeBuffer(); | |
| 192 | |
| 193 // Create a snapshot object using the buffer. | |
| 194 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | |
| 195 USE(snapshot); | |
|
siva
2012/02/01 01:48:36
Why not just Snapshot::SetupFromBuffer(buffer);
Søren Gjesse
2012/02/01 12:12:23
Done.
| |
| 196 | |
| 197 // Read object back from the snapshot into a C structure. | |
| 198 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | |
| 199 writer.BytesWritten(), | |
| 200 &allocator); | |
| 201 Dart_CObject* cobject = cmessage->object; | |
| 202 EXPECT_NOTNULL(cobject); | |
| 203 EXPECT_EQ(Dart_CObject::kBool, cobject->type); | |
| 204 EXPECT_EQ(true, cobject->value.as_bool); | |
| 205 FreeDeserializedDartMessage(cmessage); | |
| 206 } | |
| 207 | |
| 208 | |
| 209 TEST_CASE(SerializeFalse) { | |
| 210 // Write snapshot with false object. | |
| 211 uint8_t* buffer; | |
| 212 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | |
| 213 const Bool& bl = Bool::Handle(Bool::False()); | |
| 214 writer.WriteObject(bl.raw()); | |
| 215 writer.FinalizeBuffer(); | |
| 216 | |
| 217 // Create a snapshot object using the buffer. | |
| 218 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | |
| 219 USE(snapshot); | |
|
siva
2012/02/01 01:48:36
Ditto.
Søren Gjesse
2012/02/01 12:12:23
Done.
| |
| 220 | |
| 221 // Read object back from the snapshot into a C structure. | |
| 222 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | |
| 223 writer.BytesWritten(), | |
| 224 &allocator); | |
| 225 Dart_CObject* cobject = cmessage->object; | |
| 226 EXPECT_NOTNULL(cobject); | |
| 227 EXPECT_EQ(Dart_CObject::kBool, cobject->type); | |
| 228 EXPECT_EQ(false, cobject->value.as_bool); | |
| 229 FreeDeserializedDartMessage(cmessage); | |
| 230 } | |
| 231 | |
| 232 | |
| 191 TEST_CASE(SerializeBigint) { | 233 TEST_CASE(SerializeBigint) { |
| 192 // Write snapshot with object content. | 234 // Write snapshot with object content. |
| 193 uint8_t* buffer; | 235 uint8_t* buffer; |
| 194 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 236 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 195 const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); | 237 const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); |
| 196 writer.WriteObject(bigint.raw()); | 238 writer.WriteObject(bigint.raw()); |
| 197 writer.FinalizeBuffer(); | 239 writer.FinalizeBuffer(); |
| 198 | 240 |
| 199 // Create a snapshot object using the buffer. | 241 // Create a snapshot object using the buffer. |
| 200 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 242 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 201 | 243 |
| 202 // Read object back from the snapshot. | 244 // Read object back from the snapshot. |
| 203 SnapshotReader reader(snapshot, Isolate::Current()); | 245 SnapshotReader reader(snapshot, Isolate::Current()); |
| 204 Bigint& obj = Bigint::Handle(); | 246 Bigint& obj = Bigint::Handle(); |
| 205 obj ^= reader.ReadObject(); | 247 obj ^= reader.ReadObject(); |
| 206 OS::Print("%lld", BigintOperations::ToInt64(obj)); | 248 OS::Print("%lld", BigintOperations::ToInt64(obj)); |
| 207 EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); | 249 EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); |
| 208 | 250 |
| 209 // Read object back from the snapshot into a C structure. | 251 // Read object back from the snapshot into a C structure. |
| 210 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 252 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 211 writer.BytesWritten(), | 253 writer.BytesWritten(), |
| 212 &allocator); | 254 &allocator); |
| 213 Dart_CObject* cobject = mreader.ReadObject(); | 255 Dart_CObject* cobject = cmessage->object; |
| 214 // Bigint not supported. | 256 // Bigint not supported. |
| 215 EXPECT(cobject == NULL); | 257 EXPECT(cobject == NULL); |
| 258 FreeDeserializedDartMessage(cmessage); | |
| 216 } | 259 } |
| 217 | 260 |
| 218 | 261 |
| 219 TEST_CASE(SerializeSingletons) { | 262 TEST_CASE(SerializeSingletons) { |
| 220 // Write snapshot with object content. | 263 // Write snapshot with object content. |
| 221 uint8_t* buffer; | 264 uint8_t* buffer; |
| 222 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 265 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 223 writer.WriteObject(Object::class_class()); | 266 writer.WriteObject(Object::class_class()); |
| 224 writer.WriteObject(Object::null_class()); | 267 writer.WriteObject(Object::null_class()); |
| 225 writer.WriteObject(Object::type_class()); | 268 writer.WriteObject(Object::type_class()); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 280 // Create a snapshot object using the buffer. | 323 // Create a snapshot object using the buffer. |
| 281 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 324 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 282 | 325 |
| 283 // Read object back from the snapshot. | 326 // Read object back from the snapshot. |
| 284 SnapshotReader reader(snapshot, Isolate::Current()); | 327 SnapshotReader reader(snapshot, Isolate::Current()); |
| 285 String& serialized_str = String::Handle(); | 328 String& serialized_str = String::Handle(); |
| 286 serialized_str ^= reader.ReadObject(); | 329 serialized_str ^= reader.ReadObject(); |
| 287 EXPECT(str.Equals(serialized_str)); | 330 EXPECT(str.Equals(serialized_str)); |
| 288 | 331 |
| 289 // Read object back from the snapshot into a C structure. | 332 // Read object back from the snapshot into a C structure. |
| 290 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 333 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 291 writer.BytesWritten(), | 334 writer.BytesWritten(), |
| 292 &allocator); | 335 &allocator); |
| 293 Dart_CObject* cobject = mreader.ReadObject(); | 336 Dart_CObject* cobject = cmessage->object; |
| 294 EXPECT_EQ(Dart_CObject::kString, cobject->type); | 337 EXPECT_EQ(Dart_CObject::kString, cobject->type); |
| 295 EXPECT_STREQ(cstr, cobject->value.as_string); | 338 EXPECT_STREQ(cstr, cobject->value.as_string); |
| 296 free(cobject); | 339 FreeDeserializedDartMessage(cmessage); |
| 297 } | 340 } |
| 298 | 341 |
| 299 | 342 |
| 300 TEST_CASE(SerializeArray) { | 343 TEST_CASE(SerializeArray) { |
| 301 // Write snapshot with object content. | 344 // Write snapshot with object content. |
| 302 uint8_t* buffer; | 345 uint8_t* buffer; |
| 303 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 346 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 304 const int kArrayLength = 10; | 347 const int kArrayLength = 10; |
| 305 Array& array = Array::Handle(Array::New(kArrayLength)); | 348 Array& array = Array::Handle(Array::New(kArrayLength)); |
| 306 Smi& smi = Smi::Handle(); | 349 Smi& smi = Smi::Handle(); |
| 307 for (int i = 0; i < kArrayLength; i++) { | 350 for (int i = 0; i < kArrayLength; i++) { |
| 308 smi ^= Smi::New(i); | 351 smi ^= Smi::New(i); |
| 309 array.SetAt(i, smi); | 352 array.SetAt(i, smi); |
| 310 } | 353 } |
| 311 writer.WriteObject(array.raw()); | 354 writer.WriteObject(array.raw()); |
| 312 writer.FinalizeBuffer(); | 355 writer.FinalizeBuffer(); |
| 313 | 356 |
| 314 // Create a snapshot object using the buffer. | 357 // Create a snapshot object using the buffer. |
| 315 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 358 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 316 | 359 |
| 317 // Read object back from the snapshot. | 360 // Read object back from the snapshot. |
| 318 SnapshotReader reader(snapshot, Isolate::Current()); | 361 SnapshotReader reader(snapshot, Isolate::Current()); |
| 319 Array& serialized_array = Array::Handle(); | 362 Array& serialized_array = Array::Handle(); |
| 320 serialized_array ^= reader.ReadObject(); | 363 serialized_array ^= reader.ReadObject(); |
| 321 EXPECT(array.Equals(serialized_array)); | 364 EXPECT(array.Equals(serialized_array)); |
| 322 | 365 |
| 323 // Read object back from the snapshot into a C structure. | 366 // Read object back from the snapshot into a C structure. |
| 324 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 367 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 325 writer.BytesWritten(), | 368 writer.BytesWritten(), |
| 326 &allocator); | 369 &allocator); |
| 327 Dart_CObject* cobject = mreader.ReadObject(); | 370 Dart_CObject* cobject = cmessage->object; |
| 328 EXPECT_EQ(Dart_CObject::kArray, cobject->type); | 371 EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
| 329 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); | 372 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
| 330 for (int i = 0; i < kArrayLength; i++) { | 373 for (int i = 0; i < kArrayLength; i++) { |
| 331 Dart_CObject* element = cobject->value.as_array.values[i]; | 374 Dart_CObject* element = cobject->value.as_array.values[i]; |
| 332 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 375 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
| 333 EXPECT_EQ(i, element->value.as_int32); | 376 EXPECT_EQ(i, element->value.as_int32); |
| 334 free(element); | |
| 335 } | 377 } |
| 336 free(cobject); | 378 FreeDeserializedDartMessage(cmessage); |
| 337 } | 379 } |
| 338 | 380 |
| 339 | 381 |
| 340 TEST_CASE(SerializeEmptyArray) { | 382 TEST_CASE(SerializeEmptyArray) { |
| 341 // Write snapshot with object content. | 383 // Write snapshot with object content. |
| 342 uint8_t* buffer; | 384 uint8_t* buffer; |
| 343 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 385 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 344 const int kArrayLength = 0; | 386 const int kArrayLength = 0; |
| 345 Array& array = Array::Handle(Array::New(kArrayLength)); | 387 Array& array = Array::Handle(Array::New(kArrayLength)); |
| 346 writer.WriteObject(array.raw()); | 388 writer.WriteObject(array.raw()); |
| 347 writer.FinalizeBuffer(); | 389 writer.FinalizeBuffer(); |
| 348 | 390 |
| 349 // Create a snapshot object using the buffer. | 391 // Create a snapshot object using the buffer. |
| 350 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 392 const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); |
| 351 | 393 |
| 352 // Read object back from the snapshot. | 394 // Read object back from the snapshot. |
| 353 SnapshotReader reader(snapshot, Isolate::Current()); | 395 SnapshotReader reader(snapshot, Isolate::Current()); |
| 354 Array& serialized_array = Array::Handle(); | 396 Array& serialized_array = Array::Handle(); |
| 355 serialized_array ^= reader.ReadObject(); | 397 serialized_array ^= reader.ReadObject(); |
| 356 EXPECT(array.Equals(serialized_array)); | 398 EXPECT(array.Equals(serialized_array)); |
| 357 | 399 |
| 358 // Read object back from the snapshot into a C structure. | 400 // Read object back from the snapshot into a C structure. |
| 359 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 401 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 360 writer.BytesWritten(), | 402 writer.BytesWritten(), |
| 361 &allocator); | 403 &allocator); |
| 362 Dart_CObject* cobject = mreader.ReadObject(); | 404 Dart_CObject* cobject = cmessage->object; |
| 363 EXPECT_EQ(Dart_CObject::kArray, cobject->type); | 405 EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
| 364 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); | 406 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
| 365 EXPECT(cobject->value.as_array.values == NULL); | 407 EXPECT(cobject->value.as_array.values == NULL); |
| 366 free(cobject); | 408 FreeDeserializedDartMessage(cmessage); |
| 367 } | 409 } |
| 368 | 410 |
| 369 | 411 |
| 370 TEST_CASE(SerializeScript) { | 412 TEST_CASE(SerializeScript) { |
| 371 const char* kScriptChars = | 413 const char* kScriptChars = |
| 372 "class A {\n" | 414 "class A {\n" |
| 373 " static bar() { return 42; }\n" | 415 " static bar() { return 42; }\n" |
| 374 " static fly() { return 5; }\n" | 416 " static fly() { return 5; }\n" |
| 375 "}\n"; | 417 "}\n"; |
| 376 | 418 |
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 647 TEST_CASE(IntArrayMessage) { | 689 TEST_CASE(IntArrayMessage) { |
| 648 uint8_t* buffer = NULL; | 690 uint8_t* buffer = NULL; |
| 649 MessageWriter writer(&buffer, &allocator); | 691 MessageWriter writer(&buffer, &allocator); |
| 650 | 692 |
| 651 static const int kArrayLength = 2; | 693 static const int kArrayLength = 2; |
| 652 intptr_t data[kArrayLength] = {1, 2}; | 694 intptr_t data[kArrayLength] = {1, 2}; |
| 653 int len = kArrayLength; | 695 int len = kArrayLength; |
| 654 writer.WriteMessage(len, data); | 696 writer.WriteMessage(len, data); |
| 655 | 697 |
| 656 // Read object back from the snapshot into a C structure. | 698 // Read object back from the snapshot into a C structure. |
| 657 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 699 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 658 writer.BytesWritten(), | 700 writer.BytesWritten(), |
| 659 &allocator); | 701 &allocator); |
| 660 Dart_CObject* value = mreader.ReadObject(); | 702 Dart_CObject* cobject = cmessage->object; |
| 661 EXPECT_EQ(Dart_CObject::kArray, value->type); | 703 EXPECT_EQ(Dart_CObject::kArray, cobject->type); |
| 662 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 704 EXPECT_EQ(kArrayLength, cobject->value.as_array.length); |
| 663 for (int i = 0; i < kArrayLength; i++) { | 705 for (int i = 0; i < kArrayLength; i++) { |
| 664 Dart_CObject* element = value->value.as_array.values[i]; | 706 Dart_CObject* element = cobject->value.as_array.values[i]; |
| 665 EXPECT_EQ(Dart_CObject::kInt32, element->type); | 707 EXPECT_EQ(Dart_CObject::kInt32, element->type); |
| 666 EXPECT_EQ(i + 1, element->value.as_int32); | 708 EXPECT_EQ(i + 1, element->value.as_int32); |
| 667 free(element); | |
| 668 } | 709 } |
| 669 free(value); | 710 FreeDeserializedDartMessage(cmessage); |
| 670 } | 711 } |
| 671 | 712 |
| 672 | 713 |
| 673 // Helper function to call a top level Dart function, serialize the | 714 // Helper function to call a top level Dart function, serialize the |
| 674 // result and deserialize the result into a Dart_CObject structure. | 715 // result and deserialize the result into a Dart_CObject structure. |
| 675 static Dart_CObject* GetDeserializedDartObject(Dart_Handle lib, | 716 static Dart_CMessage* GetDeserializedDartMessage(Dart_Handle lib, |
| 676 const char* dart_function) { | 717 const char* dart_function) { |
| 677 Dart_Handle result; | 718 Dart_Handle result; |
| 678 result = Dart_InvokeStatic(lib, | 719 result = Dart_InvokeStatic(lib, |
| 679 Dart_NewString(""), | 720 Dart_NewString(""), |
| 680 Dart_NewString(dart_function), | 721 Dart_NewString(dart_function), |
| 681 0, | 722 0, |
| 682 NULL); | 723 NULL); |
| 683 EXPECT_VALID(result); | 724 EXPECT_VALID(result); |
| 684 | 725 |
| 685 // Serialize the list into a message. | 726 // Serialize the list into a message. |
| 686 uint8_t* buffer; | 727 uint8_t* buffer; |
| 687 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 728 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 688 const Object& list = Object::Handle(Api::UnwrapHandle(result)); | 729 const Object& list = Object::Handle(Api::UnwrapHandle(result)); |
| 689 writer.WriteObject(list.raw()); | 730 writer.WriteObject(list.raw()); |
| 690 writer.FinalizeBuffer(); | 731 writer.FinalizeBuffer(); |
| 691 | 732 |
| 692 // Read object back from the snapshot into a C structure. | 733 // Read object back from the snapshot into a C structure. |
| 693 CMessageReader reader(buffer + Snapshot::kHeaderSize, | 734 Dart_CMessage* cmessage = Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, |
| 694 writer.BytesWritten(), | 735 writer.BytesWritten(), |
| 695 &allocator); | 736 &allocator); |
| 696 Dart_CObject* value = reader.ReadObject(); | 737 return cmessage; |
| 697 free(buffer); | |
| 698 return value; | |
| 699 } | 738 } |
| 700 | 739 |
| 701 | 740 |
| 702 UNIT_TEST_CASE(DartGeneratedMessages) { | 741 UNIT_TEST_CASE(DartGeneratedMessages) { |
| 703 static const char* kCustomIsolateScriptChars = | 742 static const char* kCustomIsolateScriptChars = |
| 704 "getSmi() {\n" | 743 "getSmi() {\n" |
| 705 " return 42;\n" | 744 " return 42;\n" |
| 706 "}\n" | 745 "}\n" |
| 707 "getString() {\n" | 746 "getString() {\n" |
| 708 " return \"Hello, world!\";\n" | 747 " return \"Hello, world!\";\n" |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 740 | 779 |
| 741 { | 780 { |
| 742 uint8_t* buffer; | 781 uint8_t* buffer; |
| 743 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 782 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 744 Smi& smi = Smi::Handle(); | 783 Smi& smi = Smi::Handle(); |
| 745 smi ^= Api::UnwrapHandle(smi_result); | 784 smi ^= Api::UnwrapHandle(smi_result); |
| 746 writer.WriteObject(smi.raw()); | 785 writer.WriteObject(smi.raw()); |
| 747 writer.FinalizeBuffer(); | 786 writer.FinalizeBuffer(); |
| 748 | 787 |
| 749 // Read object back from the snapshot into a C structure. | 788 // Read object back from the snapshot into a C structure. |
| 750 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 789 Dart_CMessage* cmessage = |
| 790 Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | |
| 751 writer.BytesWritten(), | 791 writer.BytesWritten(), |
| 752 &allocator); | 792 &allocator); |
| 753 Dart_CObject* value = mreader.ReadObject(); | 793 Dart_CObject* cobject = cmessage->object; |
| 754 EXPECT_NOTNULL(value); | 794 EXPECT_NOTNULL(cobject); |
| 755 EXPECT_EQ(Dart_CObject::kInt32, value->type); | 795 EXPECT_EQ(Dart_CObject::kInt32, cobject->type); |
| 756 EXPECT_EQ(42, value->value.as_int32); | 796 EXPECT_EQ(42, cobject->value.as_int32); |
| 757 free(value); | 797 FreeDeserializedDartMessage(cmessage); |
| 758 free(buffer); | |
| 759 } | 798 } |
| 760 { | 799 { |
| 761 uint8_t* buffer; | 800 uint8_t* buffer; |
| 762 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 801 SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); |
| 763 String& str = String::Handle(); | 802 String& str = String::Handle(); |
| 764 str ^= Api::UnwrapHandle(string_result); | 803 str ^= Api::UnwrapHandle(string_result); |
| 765 writer.WriteObject(str.raw()); | 804 writer.WriteObject(str.raw()); |
| 766 writer.FinalizeBuffer(); | 805 writer.FinalizeBuffer(); |
| 767 | 806 |
| 768 // Read object back from the snapshot into a C structure. | 807 // Read object back from the snapshot into a C structure. |
| 769 CMessageReader mreader(buffer + Snapshot::kHeaderSize, | 808 Dart_CMessage* cmessage = |
| 809 Dart_DecodeMessage(buffer + Snapshot::kHeaderSize, | |
| 770 writer.BytesWritten(), | 810 writer.BytesWritten(), |
| 771 &allocator); | 811 &allocator); |
| 772 Dart_CObject* value = mreader.ReadObject(); | 812 Dart_CObject* cobject = cmessage->object; |
| 773 EXPECT_NOTNULL(value); | 813 EXPECT_NOTNULL(cobject); |
| 774 EXPECT_EQ(Dart_CObject::kString, value->type); | 814 EXPECT_EQ(Dart_CObject::kString, cobject->type); |
| 775 EXPECT_STREQ("Hello, world!", value->value.as_string); | 815 EXPECT_STREQ("Hello, world!", cobject->value.as_string); |
| 776 free(value); | 816 FreeDeserializedDartMessage(cmessage); |
| 777 free(buffer); | |
| 778 } | 817 } |
| 779 } | 818 } |
| 780 Dart_ExitScope(); | 819 Dart_ExitScope(); |
| 781 Dart_ShutdownIsolate(); | 820 Dart_ShutdownIsolate(); |
| 782 } | 821 } |
| 783 | 822 |
| 784 | 823 |
| 785 UNIT_TEST_CASE(DartGeneratedListMessages) { | 824 UNIT_TEST_CASE(DartGeneratedListMessages) { |
| 786 const int kArrayLength = 10; | 825 const int kArrayLength = 10; |
| 787 static const char* kScriptChars = | 826 static const char* kScriptChars = |
| (...skipping 26 matching lines...) Expand all Loading... | |
| 814 Dart_EnterScope(); | 853 Dart_EnterScope(); |
| 815 | 854 |
| 816 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 855 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 817 EXPECT_VALID(lib); | 856 EXPECT_VALID(lib); |
| 818 | 857 |
| 819 { | 858 { |
| 820 DARTSCOPE_NOCHECKS(isolate); | 859 DARTSCOPE_NOCHECKS(isolate); |
| 821 | 860 |
| 822 { | 861 { |
| 823 // Generate a list of nulls from Dart code. | 862 // Generate a list of nulls from Dart code. |
| 824 Dart_CObject* value = GetDeserializedDartObject(lib, "getList"); | 863 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getList"); |
| 864 Dart_CObject* value = cmessage->object; | |
| 825 EXPECT_NOTNULL(value); | 865 EXPECT_NOTNULL(value); |
| 826 EXPECT_EQ(Dart_CObject::kArray, value->type); | 866 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 827 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 867 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 828 for (int i = 0; i < kArrayLength; i++) { | 868 for (int i = 0; i < kArrayLength; i++) { |
| 829 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); | 869 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
| 830 free(value->value.as_array.values[i]); | |
| 831 } | 870 } |
| 832 free(value); | 871 FreeDeserializedDartMessage(cmessage); |
| 833 } | 872 } |
| 834 { | 873 { |
| 835 // Generate a list of ints from Dart code. | 874 // Generate a list of ints from Dart code. |
| 836 Dart_CObject* value = GetDeserializedDartObject(lib, "getIntList"); | 875 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getIntList"); |
| 876 Dart_CObject* value = cmessage->object; | |
| 837 EXPECT_NOTNULL(value); | 877 EXPECT_NOTNULL(value); |
| 838 EXPECT_EQ(Dart_CObject::kArray, value->type); | 878 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 839 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 879 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 840 for (int i = 0; i < kArrayLength; i++) { | 880 for (int i = 0; i < kArrayLength; i++) { |
| 841 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); | 881 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[i]->type); |
| 842 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); | 882 EXPECT_EQ(i, value->value.as_array.values[i]->value.as_int32); |
| 843 free(value->value.as_array.values[i]); | |
| 844 } | 883 } |
| 845 free(value); | 884 FreeDeserializedDartMessage(cmessage); |
| 846 } | 885 } |
| 847 { | 886 { |
| 848 // Generate a list of strings from Dart code. | 887 // Generate a list of strings from Dart code. |
| 849 Dart_CObject* value = GetDeserializedDartObject(lib, "getStringList"); | 888 Dart_CMessage* cmessage = |
| 889 GetDeserializedDartMessage(lib, "getStringList"); | |
| 890 Dart_CObject* value = cmessage->object; | |
| 850 EXPECT_NOTNULL(value); | 891 EXPECT_NOTNULL(value); |
| 851 EXPECT_EQ(Dart_CObject::kArray, value->type); | 892 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 852 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 893 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 853 for (int i = 0; i < kArrayLength; i++) { | 894 for (int i = 0; i < kArrayLength; i++) { |
| 854 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[i]->type); | 895 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[i]->type); |
| 855 char buffer[3]; | 896 char buffer[3]; |
| 856 snprintf(buffer, sizeof(buffer), "%d", i); | 897 snprintf(buffer, sizeof(buffer), "%d", i); |
| 857 EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); | 898 EXPECT_STREQ(buffer, value->value.as_array.values[i]->value.as_string); |
| 858 free(value->value.as_array.values[i]); | |
| 859 } | 899 } |
| 860 free(value); | 900 FreeDeserializedDartMessage(cmessage); |
| 861 } | 901 } |
| 862 { | 902 { |
| 863 // Generate a list of objects of different types from Dart code. | 903 // Generate a list of objects of different types from Dart code. |
| 864 Dart_CObject* value = GetDeserializedDartObject(lib, "getMixedList"); | 904 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); |
| 905 Dart_CObject* value = cmessage->object; | |
| 865 EXPECT_NOTNULL(value); | 906 EXPECT_NOTNULL(value); |
| 866 EXPECT_EQ(Dart_CObject::kArray, value->type); | 907 EXPECT_EQ(Dart_CObject::kArray, value->type); |
| 867 EXPECT_EQ(kArrayLength, value->value.as_array.length); | 908 EXPECT_EQ(kArrayLength, value->value.as_array.length); |
| 868 | 909 |
| 869 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[0]->type); | 910 EXPECT_EQ(Dart_CObject::kInt32, value->value.as_array.values[0]->type); |
| 870 EXPECT_EQ(0, value->value.as_array.values[0]->value.as_int32); | 911 EXPECT_EQ(0, value->value.as_array.values[0]->value.as_int32); |
| 871 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[1]->type); | 912 EXPECT_EQ(Dart_CObject::kString, value->value.as_array.values[1]->type); |
| 872 EXPECT_STREQ("1", value->value.as_array.values[1]->value.as_string); | 913 EXPECT_STREQ("1", value->value.as_array.values[1]->value.as_string); |
| 873 EXPECT_EQ(Dart_CObject::kDouble, value->value.as_array.values[2]->type); | 914 EXPECT_EQ(Dart_CObject::kDouble, value->value.as_array.values[2]->type); |
| 874 EXPECT_EQ(2.2, value->value.as_array.values[2]->value.as_double); | 915 EXPECT_EQ(2.2, value->value.as_array.values[2]->value.as_double); |
| 875 EXPECT_EQ(Dart_CObject::kBool, value->value.as_array.values[3]->type); | 916 EXPECT_EQ(Dart_CObject::kBool, value->value.as_array.values[3]->type); |
| 876 EXPECT_EQ(true, value->value.as_array.values[3]->value.as_bool); | 917 EXPECT_EQ(true, value->value.as_array.values[3]->value.as_bool); |
| 877 | 918 |
| 878 for (int i = 0; i < kArrayLength; i++) { | 919 for (int i = 0; i < kArrayLength; i++) { |
| 879 if (i > 3) { | 920 if (i > 3) { |
| 880 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); | 921 EXPECT_EQ(Dart_CObject::kNull, value->value.as_array.values[i]->type); |
| 881 } | 922 } |
| 882 free(value->value.as_array.values[i]); | |
| 883 } | 923 } |
| 884 free(value); | 924 FreeDeserializedDartMessage(cmessage); |
| 885 } | 925 } |
| 886 } | 926 } |
| 887 Dart_ExitScope(); | 927 Dart_ExitScope(); |
| 888 Dart_ShutdownIsolate(); | 928 Dart_ShutdownIsolate(); |
| 889 } | 929 } |
| 890 | 930 |
| 891 | 931 |
| 892 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { | 932 UNIT_TEST_CASE(DartGeneratedListMessagesWithBackref) { |
| 893 const int kArrayLength = 10; | 933 const int kArrayLength = 10; |
| 894 static const char* kScriptChars = | 934 static const char* kScriptChars = |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 926 Dart_EnterScope(); | 966 Dart_EnterScope(); |
| 927 | 967 |
| 928 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); | 968 Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL); |
| 929 EXPECT_VALID(lib); | 969 EXPECT_VALID(lib); |
| 930 | 970 |
| 931 { | 971 { |
| 932 DARTSCOPE_NOCHECKS(isolate); | 972 DARTSCOPE_NOCHECKS(isolate); |
| 933 | 973 |
| 934 { | 974 { |
| 935 // Generate a list of strings from Dart code. | 975 // Generate a list of strings from Dart code. |
| 936 Dart_CObject* object = GetDeserializedDartObject(lib, "getStringList"); | 976 Dart_CMessage* cmessage = |
| 977 GetDeserializedDartMessage(lib, "getStringList"); | |
| 978 Dart_CObject* object = cmessage->object; | |
| 937 EXPECT_NOTNULL(object); | 979 EXPECT_NOTNULL(object); |
| 938 EXPECT_EQ(Dart_CObject::kArray, object->type); | 980 EXPECT_EQ(Dart_CObject::kArray, object->type); |
| 939 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 981 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
| 940 for (int i = 0; i < kArrayLength; i++) { | 982 for (int i = 0; i < kArrayLength; i++) { |
| 941 Dart_CObject* element = object->value.as_array.values[i]; | 983 Dart_CObject* element = object->value.as_array.values[i]; |
| 942 EXPECT_EQ(object->value.as_array.values[0], element); | 984 EXPECT_EQ(object->value.as_array.values[0], element); |
| 943 EXPECT_EQ(Dart_CObject::kString, element->type); | 985 EXPECT_EQ(Dart_CObject::kString, element->type); |
| 944 EXPECT_STREQ("Hello, world!", element->value.as_string); | 986 EXPECT_STREQ("Hello, world!", element->value.as_string); |
| 945 } | 987 } |
| 946 free(object->value.as_array.values[0]); | 988 FreeDeserializedDartMessage(cmessage); |
| 947 free(object); | |
| 948 } | 989 } |
| 949 { | 990 { |
| 950 // Generate a list of doubles from Dart code. | 991 // Generate a list of doubles from Dart code. |
| 951 Dart_CObject* object = GetDeserializedDartObject(lib, "getDoubleList"); | 992 Dart_CMessage* cmessage = |
| 993 GetDeserializedDartMessage(lib, "getDoubleList"); | |
| 994 Dart_CObject* object = cmessage->object; | |
| 952 EXPECT_NOTNULL(object); | 995 EXPECT_NOTNULL(object); |
| 953 EXPECT_EQ(Dart_CObject::kArray, object->type); | 996 EXPECT_EQ(Dart_CObject::kArray, object->type); |
| 954 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 997 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
| 955 for (int i = 0; i < kArrayLength; i++) { | 998 for (int i = 0; i < kArrayLength; i++) { |
| 956 Dart_CObject* element = object->value.as_array.values[i]; | 999 Dart_CObject* element = object->value.as_array.values[i]; |
| 957 EXPECT_EQ(object->value.as_array.values[0], element); | 1000 EXPECT_EQ(object->value.as_array.values[0], element); |
| 958 EXPECT_EQ(Dart_CObject::kDouble, element->type); | 1001 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
| 959 EXPECT_EQ(3.14, element->value.as_double); | 1002 EXPECT_EQ(3.14, element->value.as_double); |
| 960 } | 1003 } |
| 961 free(object->value.as_array.values[0]); | 1004 FreeDeserializedDartMessage(cmessage); |
| 962 free(object); | |
| 963 } | 1005 } |
| 964 { | 1006 { |
| 965 // Generate a list of objects of different types from Dart code. | 1007 // Generate a list of objects of different types from Dart code. |
| 966 Dart_CObject* object = GetDeserializedDartObject(lib, "getMixedList"); | 1008 Dart_CMessage* cmessage = GetDeserializedDartMessage(lib, "getMixedList"); |
| 1009 Dart_CObject* object = cmessage->object; | |
| 967 EXPECT_NOTNULL(object); | 1010 EXPECT_NOTNULL(object); |
| 968 EXPECT_EQ(Dart_CObject::kArray, object->type); | 1011 EXPECT_EQ(Dart_CObject::kArray, object->type); |
| 969 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 1012 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
| 970 for (int i = 0; i < kArrayLength; i++) { | 1013 for (int i = 0; i < kArrayLength; i++) { |
| 971 Dart_CObject* element = object->value.as_array.values[i]; | 1014 Dart_CObject* element = object->value.as_array.values[i]; |
| 972 if ((i % 2) == 0) { | 1015 if ((i % 2) == 0) { |
| 973 EXPECT_EQ(object->value.as_array.values[0], element); | 1016 EXPECT_EQ(object->value.as_array.values[0], element); |
| 974 EXPECT_EQ(Dart_CObject::kString, element->type); | 1017 EXPECT_EQ(Dart_CObject::kString, element->type); |
| 975 EXPECT_STREQ("A", element->value.as_string); | 1018 EXPECT_STREQ("A", element->value.as_string); |
| 976 } else { | 1019 } else { |
| 977 EXPECT_EQ(object->value.as_array.values[1], element); | 1020 EXPECT_EQ(object->value.as_array.values[1], element); |
| 978 EXPECT_EQ(Dart_CObject::kDouble, element->type); | 1021 EXPECT_EQ(Dart_CObject::kDouble, element->type); |
| 979 EXPECT_STREQ(2.72, element->value.as_double); | 1022 EXPECT_STREQ(2.72, element->value.as_double); |
| 980 } | 1023 } |
| 981 } | 1024 } |
| 982 free(object->value.as_array.values[0]); | 1025 FreeDeserializedDartMessage(cmessage); |
| 983 free(object->value.as_array.values[1]); | |
| 984 free(object); | |
| 985 } | 1026 } |
| 986 { | 1027 { |
| 987 // Generate a list of objects of different types from Dart code. | 1028 // Generate a list of objects of different types from Dart code. |
| 988 Dart_CObject* object = GetDeserializedDartObject(lib, "getSelfRefList"); | 1029 Dart_CMessage* cmessage = |
| 1030 GetDeserializedDartMessage(lib, "getSelfRefList"); | |
| 1031 Dart_CObject* object = cmessage->object; | |
| 989 EXPECT_NOTNULL(object); | 1032 EXPECT_NOTNULL(object); |
| 990 EXPECT_EQ(Dart_CObject::kArray, object->type); | 1033 EXPECT_EQ(Dart_CObject::kArray, object->type); |
| 991 EXPECT_EQ(kArrayLength, object->value.as_array.length); | 1034 EXPECT_EQ(kArrayLength, object->value.as_array.length); |
| 992 for (int i = 0; i < kArrayLength; i++) { | 1035 for (int i = 0; i < kArrayLength; i++) { |
| 993 Dart_CObject* element = object->value.as_array.values[i]; | 1036 Dart_CObject* element = object->value.as_array.values[i]; |
| 994 EXPECT_EQ(Dart_CObject::kArray, element->type); | 1037 EXPECT_EQ(Dart_CObject::kArray, element->type); |
| 995 EXPECT_EQ(object, element); | 1038 EXPECT_EQ(object, element); |
| 996 } | 1039 } |
| 997 free(object); | 1040 FreeDeserializedDartMessage(cmessage); |
| 998 } | 1041 } |
| 999 } | 1042 } |
| 1000 Dart_ExitScope(); | 1043 Dart_ExitScope(); |
| 1001 Dart_ShutdownIsolate(); | 1044 Dart_ShutdownIsolate(); |
| 1002 } | 1045 } |
| 1003 | 1046 |
| 1004 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). | 1047 #endif // defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64). |
| 1005 | 1048 |
| 1006 } // namespace dart | 1049 } // namespace dart |
| OLD | NEW |