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 |