| OLD | NEW | 
|---|
| 1 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file | 1 // Copyright (c) 2011, 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 "vm/snapshot.h" | 5 #include "vm/snapshot.h" | 
| 6 | 6 | 
| 7 #include "vm/assert.h" | 7 #include "vm/assert.h" | 
| 8 #include "vm/bigint_operations.h" | 8 #include "vm/bigint_operations.h" | 
| 9 #include "vm/class_finalizer.h" | 9 #include "vm/class_finalizer.h" | 
| 10 #include "vm/unit_test.h" | 10 #include "vm/unit_test.h" | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 46   uint8_t* buffer; | 46   uint8_t* buffer; | 
| 47   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 47   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 
| 48   const Object& null_object = Object::Handle(); | 48   const Object& null_object = Object::Handle(); | 
| 49   writer.WriteObject(null_object.raw()); | 49   writer.WriteObject(null_object.raw()); | 
| 50   writer.FinalizeBuffer(); | 50   writer.FinalizeBuffer(); | 
| 51 | 51 | 
| 52   // Create a snapshot object using the buffer. | 52   // Create a snapshot object using the buffer. | 
| 53   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 53   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 
| 54 | 54 | 
| 55   // Read object back from the snapshot. | 55   // Read object back from the snapshot. | 
| 56   Isolate* isolate= Isolate::Current(); | 56   SnapshotReader reader(snapshot, Isolate::Current()); | 
| 57   SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |  | 
| 58   const Object& serialized_object = Object::Handle(reader.ReadObject()); | 57   const Object& serialized_object = Object::Handle(reader.ReadObject()); | 
| 59   EXPECT(Equals(null_object, serialized_object)); | 58   EXPECT(Equals(null_object, serialized_object)); | 
| 60 } | 59 } | 
| 61 | 60 | 
| 62 | 61 | 
| 63 TEST_CASE(SerializeSmi1) { | 62 TEST_CASE(SerializeSmi1) { | 
| 64   // Write snapshot with object content. | 63   // Write snapshot with object content. | 
| 65   uint8_t* buffer; | 64   uint8_t* buffer; | 
| 66   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 65   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 
| 67   const Smi& smi = Smi::Handle(Smi::New(124)); | 66   const Smi& smi = Smi::Handle(Smi::New(124)); | 
| 68   writer.WriteObject(smi.raw()); | 67   writer.WriteObject(smi.raw()); | 
| 69   writer.FinalizeBuffer(); | 68   writer.FinalizeBuffer(); | 
| 70 | 69 | 
| 71   // Create a snapshot object using the buffer. | 70   // Create a snapshot object using the buffer. | 
| 72   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 71   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 
| 73 | 72 | 
| 74   // Read object back from the snapshot. | 73   // Read object back from the snapshot. | 
| 75   Isolate* isolate= Isolate::Current(); | 74   SnapshotReader reader(snapshot, Isolate::Current()); | 
| 76   SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |  | 
| 77   const Object& serialized_object = Object::Handle(reader.ReadObject()); | 75   const Object& serialized_object = Object::Handle(reader.ReadObject()); | 
| 78   EXPECT(Equals(smi, serialized_object)); | 76   EXPECT(Equals(smi, serialized_object)); | 
| 79 } | 77 } | 
| 80 | 78 | 
| 81 | 79 | 
| 82 TEST_CASE(SerializeSmi2) { | 80 TEST_CASE(SerializeSmi2) { | 
| 83   // Write snapshot with object content. | 81   // Write snapshot with object content. | 
| 84   uint8_t* buffer; | 82   uint8_t* buffer; | 
| 85   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 83   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 
| 86   const Smi& smi = Smi::Handle(Smi::New(-1)); | 84   const Smi& smi = Smi::Handle(Smi::New(-1)); | 
| 87   writer.WriteObject(smi.raw()); | 85   writer.WriteObject(smi.raw()); | 
| 88   writer.FinalizeBuffer(); | 86   writer.FinalizeBuffer(); | 
| 89 | 87 | 
| 90   // Create a snapshot object using the buffer. | 88   // Create a snapshot object using the buffer. | 
| 91   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 89   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 
| 92 | 90 | 
| 93   // Read object back from the snapshot. | 91   // Read object back from the snapshot. | 
| 94   Isolate* isolate= Isolate::Current(); | 92   SnapshotReader reader(snapshot, Isolate::Current()); | 
| 95   SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |  | 
| 96   const Object& serialized_object = Object::Handle(reader.ReadObject()); | 93   const Object& serialized_object = Object::Handle(reader.ReadObject()); | 
| 97   EXPECT(Equals(smi, serialized_object)); | 94   EXPECT(Equals(smi, serialized_object)); | 
| 98 } | 95 } | 
| 99 | 96 | 
| 100 | 97 | 
| 101 TEST_CASE(SerializeDouble) { | 98 TEST_CASE(SerializeDouble) { | 
| 102   // Write snapshot with object content. | 99   // Write snapshot with object content. | 
| 103   uint8_t* buffer; | 100   uint8_t* buffer; | 
| 104   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 101   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 
| 105   const Double& dbl = Double::Handle(Double::New(101.29)); | 102   const Double& dbl = Double::Handle(Double::New(101.29)); | 
| 106   writer.WriteObject(dbl.raw()); | 103   writer.WriteObject(dbl.raw()); | 
| 107   writer.FinalizeBuffer(); | 104   writer.FinalizeBuffer(); | 
| 108 | 105 | 
| 109   // Create a snapshot object using the buffer. | 106   // Create a snapshot object using the buffer. | 
| 110   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 107   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 
| 111 | 108 | 
| 112   // Read object back from the snapshot. | 109   // Read object back from the snapshot. | 
| 113   Isolate* isolate= Isolate::Current(); | 110   SnapshotReader reader(snapshot, Isolate::Current()); | 
| 114   SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |  | 
| 115   const Object& serialized_object = Object::Handle(reader.ReadObject()); | 111   const Object& serialized_object = Object::Handle(reader.ReadObject()); | 
| 116   EXPECT(Equals(dbl, serialized_object)); | 112   EXPECT(Equals(dbl, serialized_object)); | 
| 117 } | 113 } | 
| 118 | 114 | 
| 119 | 115 | 
| 120 TEST_CASE(SerializeBool) { | 116 TEST_CASE(SerializeBool) { | 
| 121   // Write snapshot with object content. | 117   // Write snapshot with object content. | 
| 122   uint8_t* buffer; | 118   uint8_t* buffer; | 
| 123   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 119   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 
| 124   const Bool& bool1 = Bool::Handle(Bool::True()); | 120   const Bool& bool1 = Bool::Handle(Bool::True()); | 
| 125   const Bool& bool2 = Bool::Handle(Bool::False()); | 121   const Bool& bool2 = Bool::Handle(Bool::False()); | 
| 126   writer.WriteObject(bool1.raw()); | 122   writer.WriteObject(bool1.raw()); | 
| 127   writer.WriteObject(bool2.raw()); | 123   writer.WriteObject(bool2.raw()); | 
| 128   writer.FinalizeBuffer(); | 124   writer.FinalizeBuffer(); | 
| 129 | 125 | 
| 130   // Create a snapshot object using the buffer. | 126   // Create a snapshot object using the buffer. | 
| 131   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 127   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 
| 132 | 128 | 
| 133   // Read object back from the snapshot. | 129   // Read object back from the snapshot. | 
| 134   Isolate* isolate= Isolate::Current(); | 130   SnapshotReader reader(snapshot, Isolate::Current()); | 
| 135   SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |  | 
| 136   EXPECT(Bool::True() == reader.ReadObject()); | 131   EXPECT(Bool::True() == reader.ReadObject()); | 
| 137   EXPECT(Bool::False() == reader.ReadObject()); | 132   EXPECT(Bool::False() == reader.ReadObject()); | 
| 138 } | 133 } | 
| 139 | 134 | 
| 140 | 135 | 
| 141 TEST_CASE(SerializeBigint) { | 136 TEST_CASE(SerializeBigint) { | 
| 142   // Write snapshot with object content. | 137   // Write snapshot with object content. | 
| 143   uint8_t* buffer; | 138   uint8_t* buffer; | 
| 144   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 139   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 
| 145   const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); | 140   const Bigint& bigint = Bigint::Handle(Bigint::New(0xfffffffffLL)); | 
| 146   writer.WriteObject(bigint.raw()); | 141   writer.WriteObject(bigint.raw()); | 
| 147   writer.FinalizeBuffer(); | 142   writer.FinalizeBuffer(); | 
| 148 | 143 | 
| 149   // Create a snapshot object using the buffer. | 144   // Create a snapshot object using the buffer. | 
| 150   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 145   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 
| 151 | 146 | 
| 152   // Read object back from the snapshot. | 147   // Read object back from the snapshot. | 
| 153   Isolate* isolate= Isolate::Current(); | 148   SnapshotReader reader(snapshot, Isolate::Current()); | 
| 154   SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |  | 
| 155   Bigint& obj = Bigint::Handle(); | 149   Bigint& obj = Bigint::Handle(); | 
| 156   obj ^= reader.ReadObject(); | 150   obj ^= reader.ReadObject(); | 
| 157   OS::Print("%lld", BigintOperations::ToInt64(obj)); | 151   OS::Print("%lld", BigintOperations::ToInt64(obj)); | 
| 158   EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); | 152   EXPECT_EQ(BigintOperations::ToInt64(bigint), BigintOperations::ToInt64(obj)); | 
| 159 } | 153 } | 
| 160 | 154 | 
| 161 | 155 | 
| 162 TEST_CASE(SerializeSingletons) { | 156 TEST_CASE(SerializeSingletons) { | 
| 163   // Write snapshot with object content. | 157   // Write snapshot with object content. | 
| 164   uint8_t* buffer; | 158   uint8_t* buffer; | 
| (...skipping 16 matching lines...) Expand all  Loading... | 
| 181   writer.WriteObject(Object::pc_descriptors_class()); | 175   writer.WriteObject(Object::pc_descriptors_class()); | 
| 182   writer.WriteObject(Object::exception_handlers_class()); | 176   writer.WriteObject(Object::exception_handlers_class()); | 
| 183   writer.WriteObject(Object::context_class()); | 177   writer.WriteObject(Object::context_class()); | 
| 184   writer.WriteObject(Object::context_scope_class()); | 178   writer.WriteObject(Object::context_scope_class()); | 
| 185   writer.FinalizeBuffer(); | 179   writer.FinalizeBuffer(); | 
| 186 | 180 | 
| 187   // Create a snapshot object using the buffer. | 181   // Create a snapshot object using the buffer. | 
| 188   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 182   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 
| 189 | 183 | 
| 190   // Read object back from the snapshot. | 184   // Read object back from the snapshot. | 
| 191   Isolate* isolate= Isolate::Current(); | 185   SnapshotReader reader(snapshot, Isolate::Current()); | 
| 192   SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |  | 
| 193   EXPECT(Object::class_class() == reader.ReadObject()); | 186   EXPECT(Object::class_class() == reader.ReadObject()); | 
| 194   EXPECT(Object::null_class() == reader.ReadObject()); | 187   EXPECT(Object::null_class() == reader.ReadObject()); | 
| 195   EXPECT(Object::type_class() == reader.ReadObject()); | 188   EXPECT(Object::type_class() == reader.ReadObject()); | 
| 196   EXPECT(Object::type_parameter_class() == reader.ReadObject()); | 189   EXPECT(Object::type_parameter_class() == reader.ReadObject()); | 
| 197   EXPECT(Object::instantiated_type_class() == reader.ReadObject()); | 190   EXPECT(Object::instantiated_type_class() == reader.ReadObject()); | 
| 198   EXPECT(Object::abstract_type_arguments_class() == reader.ReadObject()); | 191   EXPECT(Object::abstract_type_arguments_class() == reader.ReadObject()); | 
| 199   EXPECT(Object::type_arguments_class() == reader.ReadObject()); | 192   EXPECT(Object::type_arguments_class() == reader.ReadObject()); | 
| 200   EXPECT(Object::instantiated_type_arguments_class() == reader.ReadObject()); | 193   EXPECT(Object::instantiated_type_arguments_class() == reader.ReadObject()); | 
| 201   EXPECT(Object::function_class() == reader.ReadObject()); | 194   EXPECT(Object::function_class() == reader.ReadObject()); | 
| 202   EXPECT(Object::field_class() == reader.ReadObject()); | 195   EXPECT(Object::field_class() == reader.ReadObject()); | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 217   uint8_t* buffer; | 210   uint8_t* buffer; | 
| 218   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 211   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 
| 219   String& str = String::Handle(String::New("This string shall be serialized")); | 212   String& str = String::Handle(String::New("This string shall be serialized")); | 
| 220   writer.WriteObject(str.raw()); | 213   writer.WriteObject(str.raw()); | 
| 221   writer.FinalizeBuffer(); | 214   writer.FinalizeBuffer(); | 
| 222 | 215 | 
| 223   // Create a snapshot object using the buffer. | 216   // Create a snapshot object using the buffer. | 
| 224   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 217   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 
| 225 | 218 | 
| 226   // Read object back from the snapshot. | 219   // Read object back from the snapshot. | 
| 227   Isolate* isolate= Isolate::Current(); | 220   SnapshotReader reader(snapshot, Isolate::Current()); | 
| 228   SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |  | 
| 229   String& serialized_str = String::Handle(); | 221   String& serialized_str = String::Handle(); | 
| 230   serialized_str ^= reader.ReadObject(); | 222   serialized_str ^= reader.ReadObject(); | 
| 231   EXPECT(str.Equals(serialized_str)); | 223   EXPECT(str.Equals(serialized_str)); | 
| 232 } | 224 } | 
| 233 | 225 | 
| 234 | 226 | 
| 235 TEST_CASE(SerializeArray) { | 227 TEST_CASE(SerializeArray) { | 
| 236   // Write snapshot with object content. | 228   // Write snapshot with object content. | 
| 237   uint8_t* buffer; | 229   uint8_t* buffer; | 
| 238   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 230   SnapshotWriter writer(Snapshot::kMessage, &buffer, &allocator); | 
| 239   const int kArrayLength = 10; | 231   const int kArrayLength = 10; | 
| 240   Array& array = Array::Handle(Array::New(kArrayLength)); | 232   Array& array = Array::Handle(Array::New(kArrayLength)); | 
| 241   Smi& smi = Smi::Handle(); | 233   Smi& smi = Smi::Handle(); | 
| 242   for (int i = 0; i < kArrayLength; i++) { | 234   for (int i = 0; i < kArrayLength; i++) { | 
| 243     smi ^= Smi::New(i); | 235     smi ^= Smi::New(i); | 
| 244     array.SetAt(i, smi); | 236     array.SetAt(i, smi); | 
| 245   } | 237   } | 
| 246   writer.WriteObject(array.raw()); | 238   writer.WriteObject(array.raw()); | 
| 247   writer.FinalizeBuffer(); | 239   writer.FinalizeBuffer(); | 
| 248 | 240 | 
| 249   // Create a snapshot object using the buffer. | 241   // Create a snapshot object using the buffer. | 
| 250   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 242   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 
| 251 | 243 | 
| 252   // Read object back from the snapshot. | 244   // Read object back from the snapshot. | 
| 253   Isolate* isolate= Isolate::Current(); | 245   SnapshotReader reader(snapshot, Isolate::Current()); | 
| 254   SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |  | 
| 255   Array& serialized_array = Array::Handle(); | 246   Array& serialized_array = Array::Handle(); | 
| 256   serialized_array ^= reader.ReadObject(); | 247   serialized_array ^= reader.ReadObject(); | 
| 257   EXPECT(array.Equals(serialized_array)); | 248   EXPECT(array.Equals(serialized_array)); | 
| 258 } | 249 } | 
| 259 | 250 | 
| 260 | 251 | 
| 261 TEST_CASE(SerializeScript) { | 252 TEST_CASE(SerializeScript) { | 
| 262   const char* kScriptChars = | 253   const char* kScriptChars = | 
| 263       "class A {\n" | 254       "class A {\n" | 
| 264       "  static bar() { return 42; }\n" | 255       "  static bar() { return 42; }\n" | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
| 276   // Write snapshot with object content. | 267   // Write snapshot with object content. | 
| 277   uint8_t* buffer; | 268   uint8_t* buffer; | 
| 278   SnapshotWriter writer(Snapshot::kScript, &buffer, &allocator); | 269   SnapshotWriter writer(Snapshot::kScript, &buffer, &allocator); | 
| 279   writer.WriteObject(script.raw()); | 270   writer.WriteObject(script.raw()); | 
| 280   writer.FinalizeBuffer(); | 271   writer.FinalizeBuffer(); | 
| 281 | 272 | 
| 282   // Create a snapshot object using the buffer. | 273   // Create a snapshot object using the buffer. | 
| 283   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 274   const Snapshot* snapshot = Snapshot::SetupFromBuffer(buffer); | 
| 284 | 275 | 
| 285   // Read object back from the snapshot. | 276   // Read object back from the snapshot. | 
| 286   Isolate* isolate= Isolate::Current(); | 277   SnapshotReader reader(snapshot, Isolate::Current()); | 
| 287   SnapshotReader reader(snapshot, isolate->heap(), isolate->object_store()); |  | 
| 288   Script& serialized_script = Script::Handle(); | 278   Script& serialized_script = Script::Handle(); | 
| 289   serialized_script ^= reader.ReadObject(); | 279   serialized_script ^= reader.ReadObject(); | 
| 290 | 280 | 
| 291   // Check if the serialized script object matches the original script. | 281   // Check if the serialized script object matches the original script. | 
| 292   String& str = String::Handle(); | 282   String& str = String::Handle(); | 
| 293   str ^= serialized_script.source(); | 283   str ^= serialized_script.source(); | 
| 294   EXPECT(source.Equals(str)); | 284   EXPECT(source.Equals(str)); | 
| 295   str ^= serialized_script.url(); | 285   str ^= serialized_script.url(); | 
| 296   EXPECT(url.Equals(str)); | 286   EXPECT(url.Equals(str)); | 
| 297   const TokenStream& expected_tokens = TokenStream::Handle(script.tokens()); | 287   const TokenStream& expected_tokens = TokenStream::Handle(script.tokens()); | 
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 530     Dart_ExitScope(); | 520     Dart_ExitScope(); | 
| 531   } | 521   } | 
| 532   Dart_ShutdownIsolate(); | 522   Dart_ShutdownIsolate(); | 
| 533   free(full_snapshot); | 523   free(full_snapshot); | 
| 534   free(script_snapshot); | 524   free(script_snapshot); | 
| 535 } | 525 } | 
| 536 | 526 | 
| 537 #endif  // TARGET_ARCH_IA32. | 527 #endif  // TARGET_ARCH_IA32. | 
| 538 | 528 | 
| 539 }  // namespace dart | 529 }  // namespace dart | 
| OLD | NEW | 
|---|