OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 #if !defined(DART_PRECOMPILED_RUNTIME) | 4 #if !defined(DART_PRECOMPILED_RUNTIME) |
5 | 5 |
6 #include "vm/kernel_binary.h" | 6 #include "vm/kernel_binary.h" |
7 #include "platform/globals.h" | 7 #include "platform/globals.h" |
8 #include "vm/flags.h" | 8 #include "vm/flags.h" |
9 #include "vm/growable_array.h" | 9 #include "vm/growable_array.h" |
10 #include "vm/kernel.h" | 10 #include "vm/kernel.h" |
11 #include "vm/kernel_to_il.h" | 11 #include "vm/kernel_to_il.h" |
12 #include "vm/os.h" | 12 #include "vm/os.h" |
13 | 13 |
14 #if defined(DEBUG) | |
15 #define TRACE_READ_OFFSET() \ | |
16 do { \ | |
17 if (FLAG_trace_kernel_binary) reader->DumpOffset(DART_PRETTY_FUNCTION); \ | |
18 } while (0) | |
19 #else | |
20 #define TRACE_READ_OFFSET() | |
21 #endif | |
22 | 14 |
23 namespace dart { | 15 namespace dart { |
24 | 16 |
25 | 17 |
26 namespace kernel { | 18 namespace kernel { |
27 | 19 |
28 | |
29 Reader::~Reader() { | |
30 delete[] string_offsets_; | |
31 delete[] canonical_name_parents_; | |
32 delete[] canonical_name_strings_; | |
33 } | |
34 | |
35 | |
36 template <typename T> | |
37 template <typename IT> | |
38 void List<T>::ReadFrom(Reader* reader, TreeNode* parent) { | |
39 TRACE_READ_OFFSET(); | |
40 ASSERT(parent != NULL); | |
41 int length = reader->ReadListLength(); | |
42 EnsureInitialized(length); | |
43 | |
44 for (intptr_t i = 0; i < length_; i++) { | |
45 IT* object = GetOrCreate<IT>(i, parent); | |
46 object->ReadFrom(reader); | |
47 } | |
48 } | |
49 | |
50 | |
51 template <typename T> | |
52 template <typename IT> | |
53 void List<T>::ReadFrom(Reader* reader) { | |
54 TRACE_READ_OFFSET(); | |
55 int length = reader->ReadListLength(); | |
56 EnsureInitialized(length); | |
57 | |
58 for (intptr_t i = 0; i < length_; i++) { | |
59 GetOrCreate<IT>(i)->ReadFrom(reader); | |
60 } | |
61 } | |
62 | |
63 | |
64 template <typename T> | |
65 template <typename IT> | |
66 void List<T>::ReadFromStatic(Reader* reader) { | |
67 TRACE_READ_OFFSET(); | |
68 int length = reader->ReadListLength(); | |
69 EnsureInitialized(length); | |
70 | |
71 for (intptr_t i = 0; i < length_; i++) { | |
72 ASSERT(array_[i] == NULL); | |
73 array_[i] = IT::ReadFrom(reader); | |
74 } | |
75 } | |
76 | |
77 | |
78 void TypeParameterList::ReadFrom(Reader* reader) { | |
79 // It is possible for the bound of the first type parameter to refer to | |
80 // the second type parameter. This means we need to create [TypeParameter] | |
81 // objects before reading the bounds. | |
82 int length = reader->ReadListLength(); | |
83 EnsureInitialized(length); | |
84 | |
85 // Make all [TypeParameter]s available in scope. | |
86 for (intptr_t i = 0; i < length; i++) { | |
87 TypeParameter* parameter = (*this)[i] = new TypeParameter(); | |
88 reader->helper()->type_parameters().Push(parameter); | |
89 } | |
90 | |
91 if (length > 0) { | |
92 // Read all [TypeParameter]s and their bounds. | |
93 for (intptr_t i = 0; i < length; i++) { | |
94 (*this)[i]->ReadFrom(reader); | |
95 } | |
96 first_offset = (*this)[0]->kernel_offset_; | |
97 } | |
98 } | |
99 | |
100 | |
101 NamedParameter* NamedParameter::ReadFrom(Reader* reader) { | |
102 TRACE_READ_OFFSET(); | |
103 StringIndex name_index(reader->ReadUInt()); | |
104 DartType* type = DartType::ReadFrom(reader); | |
105 return new NamedParameter(name_index, type); | |
106 } | |
107 | |
108 | |
109 template <typename B, typename S> | |
110 class DowncastReader { | |
111 public: | |
112 static S* ReadFrom(Reader* reader) { | |
113 TRACE_READ_OFFSET(); | |
114 return S::Cast(B::ReadFrom(reader)); | |
115 } | |
116 }; | |
117 | |
118 | |
119 class VariableDeclarationImpl { | |
120 public: | |
121 static VariableDeclaration* ReadFrom(Reader* reader) { | |
122 TRACE_READ_OFFSET(); | |
123 return VariableDeclaration::ReadFromImpl(reader, false); | |
124 } | |
125 }; | |
126 | |
127 | |
128 void SourceTable::ReadFrom(Reader* reader) { | |
129 size_ = reader->ReadUInt(); | |
130 sources_ = new Source[size_]; | |
131 | |
132 // Build a table of the URI offsets. | |
133 intptr_t* end_offsets = new intptr_t[size_]; | |
134 for (intptr_t i = 0; i < size_; ++i) { | |
135 end_offsets[i] = reader->ReadUInt(); | |
136 } | |
137 | |
138 // Read the URI strings. | |
139 intptr_t start_offset = 0; | |
140 for (intptr_t i = 0; i < size_; ++i) { | |
141 intptr_t length = end_offsets[i] - start_offset; | |
142 uint8_t* buffer = new uint8_t[length]; | |
143 memmove(buffer, reader->buffer() + reader->offset(), length); | |
144 reader->Consume(length); | |
145 | |
146 sources_[i].uri_ = buffer; | |
147 sources_[i].uri_size_ = length; | |
148 | |
149 start_offset = end_offsets[i]; | |
150 } | |
151 | |
152 // Read the source code strings and line starts. | |
153 for (intptr_t i = 0; i < size_; ++i) { | |
154 intptr_t length = reader->ReadUInt(); | |
155 uint8_t* string_buffer = new uint8_t[length]; | |
156 memmove(string_buffer, reader->buffer() + reader->offset(), length); | |
157 reader->Consume(length); | |
158 intptr_t line_count = reader->ReadUInt(); | |
159 intptr_t* line_starts = new intptr_t[line_count]; | |
160 intptr_t previous_line_start = 0; | |
161 for (intptr_t j = 0; j < line_count; ++j) { | |
162 intptr_t line_start = reader->ReadUInt() + previous_line_start; | |
163 line_starts[j] = line_start; | |
164 previous_line_start = line_start; | |
165 } | |
166 | |
167 sources_[i].source_code_ = string_buffer; | |
168 sources_[i].source_code_size_ = length; | |
169 sources_[i].line_starts_ = line_starts; | |
170 sources_[i].line_count_ = line_count; | |
171 } | |
172 } | |
173 | |
174 | |
175 Library* Library::ReadFrom(Reader* reader) { | |
176 TRACE_READ_OFFSET(); | |
177 kernel_offset_ = reader->offset(); // no tag. | |
178 int flags = reader->ReadFlags(); | |
179 ASSERT(flags == 0); // external libraries not supported | |
180 kernel_data_ = reader->buffer(); | |
181 kernel_data_size_ = reader->size(); | |
182 | |
183 canonical_name_ = reader->ReadCanonicalNameReference(); | |
184 name_index_ = StringIndex(reader->ReadUInt()); | |
185 import_uri_index_ = reader->CanonicalNameString(canonical_name_); | |
186 source_uri_index_ = reader->ReadUInt(); | |
187 reader->set_current_script_id(source_uri_index_); | |
188 | |
189 annotations_.ReadFromStatic<Expression>(reader); | |
190 dependencies().ReadFromStatic<LibraryDependency>(reader); | |
191 int num_typedefs = reader->ReadUInt(); | |
192 typedefs().EnsureInitialized(num_typedefs); | |
193 for (intptr_t i = 0; i < num_typedefs; i++) { | |
194 typedefs().GetOrCreate<Typedef>(i, this)->ReadFrom(reader); | |
195 } | |
196 int num_classes = reader->ReadUInt(); | |
197 classes().EnsureInitialized(num_classes); | |
198 for (intptr_t i = 0; i < num_classes; i++) { | |
199 Tag tag = reader->ReadTag(); | |
200 ASSERT(tag == kClass); | |
201 NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); | |
202 klass->ReadFrom(reader); | |
203 } | |
204 | |
205 fields().ReadFrom<Field>(reader, this); | |
206 procedures().ReadFrom<Procedure>(reader, this); | |
207 | |
208 return this; | |
209 } | |
210 | |
211 | |
212 LibraryDependency* LibraryDependency::ReadFrom(Reader* reader) { | |
213 TRACE_READ_OFFSET(); | |
214 | |
215 LibraryDependency* node = new LibraryDependency(); | |
216 node->flags_ = reader->ReadFlags(); | |
217 node->annotations_.ReadFromStatic<Expression>(reader); | |
218 node->target_reference_ = Reference::ReadLibraryFrom(reader); | |
219 node->name_index_ = StringIndex(reader->ReadUInt()); | |
220 node->combinators_.ReadFromStatic<Combinator>(reader); | |
221 | |
222 return node; | |
223 } | |
224 | |
225 | |
226 Combinator* Combinator::ReadFrom(Reader* reader) { | |
227 TRACE_READ_OFFSET(); | |
228 | |
229 Combinator* node = new Combinator(); | |
230 node->is_show_ = (reader->ReadByte() == 1); | |
231 int num_names = reader->ReadUInt(); | |
232 node->name_indices_.Initialize(num_names); | |
233 for (intptr_t i = 0; i < num_names; ++i) { | |
234 node->name_indices_[i] = reader->ReadUInt(); | |
235 } | |
236 | |
237 return node; | |
238 } | |
239 | |
240 | |
241 Typedef* Typedef::ReadFrom(Reader* reader) { | |
242 TRACE_READ_OFFSET(); | |
243 | |
244 canonical_name_ = reader->ReadCanonicalNameReference(); | |
245 position_ = reader->ReadPosition(false); | |
246 name_index_ = StringIndex(reader->ReadUInt()); | |
247 source_uri_index_ = reader->ReadUInt(); | |
248 type_parameters_.ReadFrom(reader); | |
249 type_ = DartType::ReadFrom(reader); | |
250 | |
251 return this; | |
252 } | |
253 | |
254 | |
255 Class* Class::ReadFrom(Reader* reader) { | |
256 TRACE_READ_OFFSET(); | |
257 | |
258 kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
259 canonical_name_ = reader->ReadCanonicalNameReference(); | |
260 position_ = reader->ReadPosition(false); | |
261 is_abstract_ = reader->ReadBool(); | |
262 name_index_ = StringIndex(reader->ReadUInt()); | |
263 source_uri_index_ = reader->ReadUInt(); | |
264 reader->set_current_script_id(source_uri_index_); | |
265 reader->record_token_position(position_); | |
266 annotations_.ReadFromStatic<Expression>(reader); | |
267 | |
268 return this; | |
269 } | |
270 | |
271 | |
272 NormalClass* NormalClass::ReadFrom(Reader* reader) { | |
273 TRACE_READ_OFFSET(); | |
274 Class::ReadFrom(reader); | |
275 TypeParameterScope<ReaderHelper> scope(reader->helper()); | |
276 | |
277 type_parameters_.ReadFrom(reader); | |
278 DartType* type = reader->ReadOptional<DartType>(); | |
279 | |
280 super_class_ = InterfaceType::Cast(type); | |
281 reader->ReadOptional<DartType>(); // Mixed-in type is unused. | |
282 implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( | |
283 reader); | |
284 fields_.ReadFrom<Field>(reader, this); | |
285 constructors_.ReadFrom<Constructor>(reader, this); | |
286 procedures_.ReadFrom<Procedure>(reader, this); | |
287 | |
288 return this; | |
289 } | |
290 | |
291 | |
292 NameIndex Reference::ReadMemberFrom(Reader* reader, bool allow_null) { | |
293 TRACE_READ_OFFSET(); | |
294 NameIndex canonical_name = reader->ReadCanonicalNameReference(); | |
295 if ((canonical_name == -1) && !allow_null) { | |
296 FATAL("Expected a valid member reference, but got `null`"); | |
297 } | |
298 return canonical_name; | |
299 } | |
300 | |
301 | |
302 NameIndex Reference::ReadClassFrom(Reader* reader, bool allow_null) { | |
303 TRACE_READ_OFFSET(); | |
304 NameIndex canonical_name = reader->ReadCanonicalNameReference(); | |
305 if ((canonical_name == -1) && !allow_null) { | |
306 FATAL("Expected a valid class reference, but got `null`"); | |
307 } | |
308 return canonical_name; | |
309 } | |
310 | |
311 | |
312 NameIndex Reference::ReadTypedefFrom(Reader* reader) { | |
313 TRACE_READ_OFFSET(); | |
314 NameIndex canonical_name = reader->ReadCanonicalNameReference(); | |
315 if (canonical_name == -1) { | |
316 FATAL("Expected a valid typedef reference, but got `null`"); | |
317 } | |
318 return canonical_name; | |
319 } | |
320 | |
321 | |
322 NameIndex Reference::ReadLibraryFrom(Reader* reader) { | |
323 TRACE_READ_OFFSET(); | |
324 NameIndex canonical_name = reader->ReadCanonicalNameReference(); | |
325 if (canonical_name == -1) { | |
326 FATAL("Expected a valid typedef reference, but got `null`"); | |
327 } | |
328 return canonical_name; | |
329 } | |
330 | |
331 | |
332 Field* Field::ReadFrom(Reader* reader) { | |
333 TRACE_READ_OFFSET(); | |
334 kernel_offset_ = reader->offset(); // Notice the ReadTag() below. | |
335 Tag tag = reader->ReadTag(); | |
336 ASSERT(tag == kField); | |
337 | |
338 canonical_name_ = reader->ReadCanonicalNameReference(); | |
339 position_ = reader->ReadPosition(false); | |
340 end_position_ = reader->ReadPosition(false); | |
341 flags_ = reader->ReadFlags(); | |
342 reader->ReadUInt(); // parent class binary offset (or 0). | |
343 name_ = Name::ReadFrom(reader); | |
344 source_uri_index_ = reader->ReadUInt(); | |
345 reader->set_current_script_id(source_uri_index_); | |
346 reader->record_token_position(position_); | |
347 reader->record_token_position(end_position_); | |
348 annotations_.ReadFromStatic<Expression>(reader); | |
349 type_ = DartType::ReadFrom(reader); | |
350 initializer_ = reader->ReadOptional<Expression>(); | |
351 | |
352 return this; | |
353 } | |
354 | |
355 | |
356 Constructor* Constructor::ReadFrom(Reader* reader) { | |
357 TRACE_READ_OFFSET(); | |
358 kernel_offset_ = reader->offset(); // Notice the ReadTag() below. | |
359 Tag tag = reader->ReadTag(); | |
360 ASSERT(tag == kConstructor); | |
361 | |
362 canonical_name_ = reader->ReadCanonicalNameReference(); | |
363 VariableScope<ReaderHelper> parameters(reader->helper()); | |
364 position_ = reader->ReadPosition(); | |
365 end_position_ = reader->ReadPosition(); | |
366 flags_ = reader->ReadFlags(); | |
367 reader->ReadUInt(); // parent class binary offset. | |
368 name_ = Name::ReadFrom(reader); | |
369 annotations_.ReadFromStatic<Expression>(reader); | |
370 function_ = FunctionNode::ReadFrom(reader); | |
371 initializers_.ReadFromStatic<Initializer>(reader); | |
372 | |
373 return this; | |
374 } | |
375 | |
376 | |
377 Procedure* Procedure::ReadFrom(Reader* reader) { | |
378 TRACE_READ_OFFSET(); | |
379 kernel_offset_ = reader->offset(); // Notice the ReadTag() below. | |
380 Tag tag = reader->ReadTag(); | |
381 ASSERT(tag == kProcedure); | |
382 | |
383 canonical_name_ = reader->ReadCanonicalNameReference(); | |
384 VariableScope<ReaderHelper> parameters(reader->helper()); | |
385 position_ = reader->ReadPosition(false); | |
386 end_position_ = reader->ReadPosition(false); | |
387 kind_ = static_cast<ProcedureKind>(reader->ReadByte()); | |
388 flags_ = reader->ReadFlags(); | |
389 reader->ReadUInt(); // parent class binary offset (or 0). | |
390 name_ = Name::ReadFrom(reader); | |
391 source_uri_index_ = reader->ReadUInt(); | |
392 reader->set_current_script_id(source_uri_index_); | |
393 reader->record_token_position(position_); | |
394 reader->record_token_position(end_position_); | |
395 annotations_.ReadFromStatic<Expression>(reader); | |
396 function_ = reader->ReadOptional<FunctionNode>(); | |
397 | |
398 return this; | |
399 } | |
400 | |
401 | |
402 Initializer* Initializer::ReadFrom(Reader* reader) { | |
403 TRACE_READ_OFFSET(); | |
404 Tag tag = reader->ReadTag(); | |
405 switch (tag) { | |
406 case kInvalidInitializer: | |
407 return InvalidInitializer::ReadFromImpl(reader); | |
408 case kFieldInitializer: | |
409 return FieldInitializer::ReadFromImpl(reader); | |
410 case kSuperInitializer: | |
411 return SuperInitializer::ReadFromImpl(reader); | |
412 case kRedirectingInitializer: | |
413 return RedirectingInitializer::ReadFromImpl(reader); | |
414 case kLocalInitializer: | |
415 return LocalInitializer::ReadFromImpl(reader); | |
416 default: | |
417 UNREACHABLE(); | |
418 } | |
419 return NULL; | |
420 } | |
421 | |
422 | |
423 InvalidInitializer* InvalidInitializer::ReadFromImpl(Reader* reader) { | |
424 TRACE_READ_OFFSET(); | |
425 return new InvalidInitializer(); | |
426 } | |
427 | |
428 | |
429 FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { | |
430 TRACE_READ_OFFSET(); | |
431 FieldInitializer* initializer = new FieldInitializer(); | |
432 initializer->field_reference_ = Reference::ReadMemberFrom(reader); | |
433 initializer->value_ = Expression::ReadFrom(reader); | |
434 | |
435 return initializer; | |
436 } | |
437 | |
438 | |
439 SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { | |
440 TRACE_READ_OFFSET(); | |
441 SuperInitializer* init = new SuperInitializer(); | |
442 init->target_reference_ = Reference::ReadMemberFrom(reader); | |
443 init->arguments_ = Arguments::ReadFrom(reader); | |
444 | |
445 return init; | |
446 } | |
447 | |
448 | |
449 RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { | |
450 TRACE_READ_OFFSET(); | |
451 RedirectingInitializer* init = new RedirectingInitializer(); | |
452 init->target_reference_ = Reference::ReadMemberFrom(reader); | |
453 init->arguments_ = Arguments::ReadFrom(reader); | |
454 | |
455 return init; | |
456 } | |
457 | |
458 | |
459 LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { | |
460 TRACE_READ_OFFSET(); | |
461 LocalInitializer* init = new LocalInitializer(); | |
462 init->variable_ = VariableDeclaration::ReadFromImpl(reader, false); | |
463 | |
464 return init; | |
465 } | |
466 | |
467 | |
468 Expression* Expression::ReadFrom(Reader* reader) { | |
469 TRACE_READ_OFFSET(); | |
470 uint8_t payload = 0; | |
471 Tag tag = reader->ReadTag(&payload); | |
472 switch (tag) { | |
473 case kInvalidExpression: | |
474 return InvalidExpression::ReadFrom(reader); | |
475 case kVariableGet: | |
476 return VariableGet::ReadFrom(reader); | |
477 case kSpecializedVariableGet: | |
478 return VariableGet::ReadFrom(reader, payload); | |
479 case kVariableSet: | |
480 return VariableSet::ReadFrom(reader); | |
481 case kSpecializedVariableSet: | |
482 return VariableSet::ReadFrom(reader, payload); | |
483 case kPropertyGet: | |
484 return PropertyGet::ReadFrom(reader); | |
485 case kPropertySet: | |
486 return PropertySet::ReadFrom(reader); | |
487 case kDirectPropertyGet: | |
488 return DirectPropertyGet::ReadFrom(reader); | |
489 case kDirectPropertySet: | |
490 return DirectPropertySet::ReadFrom(reader); | |
491 case kStaticGet: | |
492 return StaticGet::ReadFrom(reader); | |
493 case kStaticSet: | |
494 return StaticSet::ReadFrom(reader); | |
495 case kMethodInvocation: | |
496 return MethodInvocation::ReadFrom(reader); | |
497 case kDirectMethodInvocation: | |
498 return DirectMethodInvocation::ReadFrom(reader); | |
499 case kStaticInvocation: | |
500 return StaticInvocation::ReadFrom(reader, false); | |
501 case kConstStaticInvocation: | |
502 return StaticInvocation::ReadFrom(reader, true); | |
503 case kConstructorInvocation: | |
504 return ConstructorInvocation::ReadFrom(reader, false); | |
505 case kConstConstructorInvocation: | |
506 return ConstructorInvocation::ReadFrom(reader, true); | |
507 case kNot: | |
508 return Not::ReadFrom(reader); | |
509 case kLogicalExpression: | |
510 return LogicalExpression::ReadFrom(reader); | |
511 case kConditionalExpression: | |
512 return ConditionalExpression::ReadFrom(reader); | |
513 case kStringConcatenation: | |
514 return StringConcatenation::ReadFrom(reader); | |
515 case kIsExpression: | |
516 return IsExpression::ReadFrom(reader); | |
517 case kAsExpression: | |
518 return AsExpression::ReadFrom(reader); | |
519 case kSymbolLiteral: | |
520 return SymbolLiteral::ReadFrom(reader); | |
521 case kTypeLiteral: | |
522 return TypeLiteral::ReadFrom(reader); | |
523 case kThisExpression: | |
524 return ThisExpression::ReadFrom(reader); | |
525 case kRethrow: | |
526 return Rethrow::ReadFrom(reader); | |
527 case kThrow: | |
528 return Throw::ReadFrom(reader); | |
529 case kListLiteral: | |
530 return ListLiteral::ReadFrom(reader, false); | |
531 case kConstListLiteral: | |
532 return ListLiteral::ReadFrom(reader, true); | |
533 case kMapLiteral: | |
534 return MapLiteral::ReadFrom(reader, false); | |
535 case kConstMapLiteral: | |
536 return MapLiteral::ReadFrom(reader, true); | |
537 case kAwaitExpression: | |
538 return AwaitExpression::ReadFrom(reader); | |
539 case kFunctionExpression: | |
540 return FunctionExpression::ReadFrom(reader); | |
541 case kLet: | |
542 return Let::ReadFrom(reader); | |
543 case kVectorCreation: | |
544 return VectorCreation::ReadFrom(reader); | |
545 case kVectorGet: | |
546 return VectorGet::ReadFrom(reader); | |
547 case kVectorSet: | |
548 return VectorSet::ReadFrom(reader); | |
549 case kVectorCopy: | |
550 return VectorCopy::ReadFrom(reader); | |
551 case kClosureCreation: | |
552 return ClosureCreation::ReadFrom(reader); | |
553 case kBigIntLiteral: | |
554 return BigintLiteral::ReadFrom(reader); | |
555 case kStringLiteral: | |
556 return StringLiteral::ReadFrom(reader); | |
557 case kSpecialIntLiteral: | |
558 return IntLiteral::ReadFrom(reader, payload); | |
559 case kNegativeIntLiteral: | |
560 return IntLiteral::ReadFrom(reader, true); | |
561 case kPositiveIntLiteral: | |
562 return IntLiteral::ReadFrom(reader, false); | |
563 case kDoubleLiteral: | |
564 return DoubleLiteral::ReadFrom(reader); | |
565 case kTrueLiteral: | |
566 return BoolLiteral::ReadFrom(reader, true); | |
567 case kFalseLiteral: | |
568 return BoolLiteral::ReadFrom(reader, false); | |
569 case kNullLiteral: | |
570 return NullLiteral::ReadFrom(reader); | |
571 default: | |
572 UNREACHABLE(); | |
573 } | |
574 return NULL; | |
575 } | |
576 | |
577 | |
578 InvalidExpression* InvalidExpression::ReadFrom(Reader* reader) { | |
579 TRACE_READ_OFFSET(); | |
580 InvalidExpression* invalid_expression = new InvalidExpression(); | |
581 invalid_expression->kernel_offset_ = | |
582 reader->offset() - 1; // -1 to include tag byte. | |
583 return invalid_expression; | |
584 } | |
585 | |
586 | |
587 VariableGet* VariableGet::ReadFrom(Reader* reader) { | |
588 TRACE_READ_OFFSET(); | |
589 VariableGet* get = new VariableGet(); | |
590 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
591 get->position_ = reader->ReadPosition(); | |
592 get->variable_kernel_offset_ = reader->ReadUInt(); | |
593 get->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); | |
594 ASSERT(get->variable_->kernel_offset_no_tag() == | |
595 get->variable_kernel_offset_); | |
596 reader->ReadOptional<DartType>(); // Unused promoted type. | |
597 return get; | |
598 } | |
599 | |
600 | |
601 VariableGet* VariableGet::ReadFrom(Reader* reader, uint8_t payload) { | |
602 TRACE_READ_OFFSET(); | |
603 VariableGet* get = new VariableGet(); | |
604 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
605 get->position_ = reader->ReadPosition(); | |
606 get->variable_kernel_offset_ = reader->ReadUInt(); | |
607 get->variable_ = reader->helper()->variables().Lookup(payload); | |
608 ASSERT(get->variable_->kernel_offset_no_tag() == | |
609 get->variable_kernel_offset_); | |
610 return get; | |
611 } | |
612 | |
613 | |
614 VariableSet* VariableSet::ReadFrom(Reader* reader) { | |
615 TRACE_READ_OFFSET(); | |
616 VariableSet* set = new VariableSet(); | |
617 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
618 set->position_ = reader->ReadPosition(); | |
619 set->variable_kernel_offset_ = reader->ReadUInt(); | |
620 set->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); | |
621 ASSERT(set->variable_->kernel_offset_no_tag() == | |
622 set->variable_kernel_offset_); | |
623 set->expression_ = Expression::ReadFrom(reader); | |
624 | |
625 return set; | |
626 } | |
627 | |
628 | |
629 VariableSet* VariableSet::ReadFrom(Reader* reader, uint8_t payload) { | |
630 TRACE_READ_OFFSET(); | |
631 VariableSet* set = new VariableSet(); | |
632 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
633 set->variable_ = reader->helper()->variables().Lookup(payload); | |
634 set->position_ = reader->ReadPosition(); | |
635 set->variable_kernel_offset_ = reader->ReadUInt(); | |
636 ASSERT(set->variable_->kernel_offset_no_tag() == | |
637 set->variable_kernel_offset_); | |
638 set->expression_ = Expression::ReadFrom(reader); | |
639 | |
640 return set; | |
641 } | |
642 | |
643 | |
644 PropertyGet* PropertyGet::ReadFrom(Reader* reader) { | |
645 TRACE_READ_OFFSET(); | |
646 PropertyGet* get = new PropertyGet(); | |
647 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
648 get->position_ = reader->ReadPosition(); | |
649 get->receiver_ = Expression::ReadFrom(reader); | |
650 get->name_ = Name::ReadFrom(reader); | |
651 get->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); | |
652 | |
653 return get; | |
654 } | |
655 | |
656 | |
657 PropertySet* PropertySet::ReadFrom(Reader* reader) { | |
658 TRACE_READ_OFFSET(); | |
659 PropertySet* set = new PropertySet(); | |
660 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
661 set->position_ = reader->ReadPosition(); | |
662 set->receiver_ = Expression::ReadFrom(reader); | |
663 set->name_ = Name::ReadFrom(reader); | |
664 set->value_ = Expression::ReadFrom(reader); | |
665 set->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); | |
666 | |
667 return set; | |
668 } | |
669 | |
670 | |
671 DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { | |
672 TRACE_READ_OFFSET(); | |
673 DirectPropertyGet* get = new DirectPropertyGet(); | |
674 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
675 get->position_ = reader->ReadPosition(); | |
676 get->receiver_ = Expression::ReadFrom(reader); | |
677 get->target_reference_ = Reference::ReadMemberFrom(reader); | |
678 | |
679 return get; | |
680 } | |
681 | |
682 | |
683 DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { | |
684 TRACE_READ_OFFSET(); | |
685 DirectPropertySet* set = new DirectPropertySet(); | |
686 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
687 set->position_ = reader->ReadPosition(); | |
688 set->receiver_ = Expression::ReadFrom(reader); | |
689 set->target_reference_ = Reference::ReadMemberFrom(reader); | |
690 set->value_ = Expression::ReadFrom(reader); | |
691 | |
692 return set; | |
693 } | |
694 | |
695 | |
696 StaticGet* StaticGet::ReadFrom(Reader* reader) { | |
697 TRACE_READ_OFFSET(); | |
698 StaticGet* get = new StaticGet(); | |
699 get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
700 get->position_ = reader->ReadPosition(); | |
701 get->target_reference_ = Reference::ReadMemberFrom(reader); | |
702 return get; | |
703 } | |
704 | |
705 | |
706 StaticSet* StaticSet::ReadFrom(Reader* reader) { | |
707 TRACE_READ_OFFSET(); | |
708 StaticSet* set = new StaticSet(); | |
709 set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
710 set->position_ = reader->ReadPosition(); | |
711 set->target_reference_ = Reference::ReadMemberFrom(reader); | |
712 set->expression_ = Expression::ReadFrom(reader); | |
713 | |
714 return set; | |
715 } | |
716 | |
717 | |
718 Arguments* Arguments::ReadFrom(Reader* reader) { | |
719 TRACE_READ_OFFSET(); | |
720 Arguments* arguments = new Arguments(); | |
721 intptr_t num_arguments = reader->ReadUInt(); | |
722 arguments->types().ReadFromStatic<DartType>(reader); | |
723 arguments->positional().ReadFromStatic<Expression>(reader); | |
724 arguments->named().ReadFromStatic<NamedExpression>(reader); | |
725 ASSERT(arguments->count() == num_arguments); | |
726 | |
727 return arguments; | |
728 } | |
729 | |
730 | |
731 NamedExpression* NamedExpression::ReadFrom(Reader* reader) { | |
732 TRACE_READ_OFFSET(); | |
733 StringIndex name_index(reader->ReadUInt()); | |
734 Expression* expression = Expression::ReadFrom(reader); | |
735 NamedExpression* named = new NamedExpression(name_index, expression); | |
736 | |
737 return named; | |
738 } | |
739 | |
740 | |
741 MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { | |
742 TRACE_READ_OFFSET(); | |
743 MethodInvocation* invocation = new MethodInvocation(); | |
744 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
745 invocation->position_ = reader->ReadPosition(); | |
746 invocation->receiver_ = Expression::ReadFrom(reader); | |
747 invocation->name_ = Name::ReadFrom(reader); | |
748 invocation->arguments_ = Arguments::ReadFrom(reader); | |
749 invocation->interface_target_reference_ = | |
750 Reference::ReadMemberFrom(reader, true); | |
751 | |
752 return invocation; | |
753 } | |
754 | |
755 | |
756 DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { | |
757 TRACE_READ_OFFSET(); | |
758 DirectMethodInvocation* invocation = new DirectMethodInvocation(); | |
759 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
760 invocation->receiver_ = Expression::ReadFrom(reader); | |
761 invocation->target_reference_ = Reference::ReadMemberFrom(reader); | |
762 invocation->arguments_ = Arguments::ReadFrom(reader); | |
763 | |
764 return invocation; | |
765 } | |
766 | |
767 | |
768 StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { | |
769 TRACE_READ_OFFSET(); | |
770 StaticInvocation* invocation = new StaticInvocation(); | |
771 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
772 invocation->is_const_ = is_const; | |
773 invocation->position_ = reader->ReadPosition(); | |
774 invocation->procedure_reference_ = Reference::ReadMemberFrom(reader); | |
775 invocation->arguments_ = Arguments::ReadFrom(reader); | |
776 | |
777 return invocation; | |
778 } | |
779 | |
780 | |
781 ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, | |
782 bool is_const) { | |
783 TRACE_READ_OFFSET(); | |
784 ConstructorInvocation* invocation = new ConstructorInvocation(); | |
785 invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
786 invocation->is_const_ = is_const; | |
787 invocation->position_ = reader->ReadPosition(); | |
788 invocation->target_reference_ = Reference::ReadMemberFrom(reader); | |
789 invocation->arguments_ = Arguments::ReadFrom(reader); | |
790 | |
791 return invocation; | |
792 } | |
793 | |
794 | |
795 Not* Not::ReadFrom(Reader* reader) { | |
796 TRACE_READ_OFFSET(); | |
797 Not* n = new Not(); | |
798 n->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
799 n->expression_ = Expression::ReadFrom(reader); | |
800 | |
801 return n; | |
802 } | |
803 | |
804 | |
805 LogicalExpression* LogicalExpression::ReadFrom(Reader* reader) { | |
806 TRACE_READ_OFFSET(); | |
807 LogicalExpression* expr = new LogicalExpression(); | |
808 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
809 expr->left_ = Expression::ReadFrom(reader); | |
810 expr->operator_ = static_cast<Operator>(reader->ReadByte()); | |
811 expr->right_ = Expression::ReadFrom(reader); | |
812 | |
813 return expr; | |
814 } | |
815 | |
816 | |
817 ConditionalExpression* ConditionalExpression::ReadFrom(Reader* reader) { | |
818 TRACE_READ_OFFSET(); | |
819 ConditionalExpression* expr = new ConditionalExpression(); | |
820 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
821 expr->condition_ = Expression::ReadFrom(reader); | |
822 expr->then_ = Expression::ReadFrom(reader); | |
823 expr->otherwise_ = Expression::ReadFrom(reader); | |
824 reader->ReadOptional<DartType>(); // Unused static type. | |
825 | |
826 return expr; | |
827 } | |
828 | |
829 | |
830 StringConcatenation* StringConcatenation::ReadFrom(Reader* reader) { | |
831 TRACE_READ_OFFSET(); | |
832 StringConcatenation* concat = new StringConcatenation(); | |
833 concat->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
834 concat->position_ = reader->ReadPosition(); | |
835 concat->expressions_.ReadFromStatic<Expression>(reader); | |
836 | |
837 return concat; | |
838 } | |
839 | |
840 | |
841 IsExpression* IsExpression::ReadFrom(Reader* reader) { | |
842 TRACE_READ_OFFSET(); | |
843 IsExpression* expr = new IsExpression(); | |
844 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
845 expr->position_ = reader->ReadPosition(); | |
846 expr->operand_ = Expression::ReadFrom(reader); | |
847 expr->type_ = DartType::ReadFrom(reader); | |
848 | |
849 return expr; | |
850 } | |
851 | |
852 | |
853 AsExpression* AsExpression::ReadFrom(Reader* reader) { | |
854 TRACE_READ_OFFSET(); | |
855 AsExpression* expr = new AsExpression(); | |
856 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
857 expr->position_ = reader->ReadPosition(); | |
858 expr->operand_ = Expression::ReadFrom(reader); | |
859 expr->type_ = DartType::ReadFrom(reader); | |
860 | |
861 return expr; | |
862 } | |
863 | |
864 | |
865 StringLiteral* StringLiteral::ReadFrom(Reader* reader) { | |
866 TRACE_READ_OFFSET(); | |
867 intptr_t offset = reader->offset() - 1; // -1 to include tag byte. | |
868 StringLiteral* lit = new StringLiteral(StringIndex(reader->ReadUInt())); | |
869 lit->kernel_offset_ = offset; | |
870 return lit; | |
871 } | |
872 | |
873 | |
874 BigintLiteral* BigintLiteral::ReadFrom(Reader* reader) { | |
875 TRACE_READ_OFFSET(); | |
876 intptr_t offset = reader->offset() - 1; // -1 to include tag byte. | |
877 BigintLiteral* lit = new BigintLiteral(StringIndex(reader->ReadUInt())); | |
878 lit->kernel_offset_ = offset; | |
879 return lit; | |
880 } | |
881 | |
882 | |
883 IntLiteral* IntLiteral::ReadFrom(Reader* reader, bool is_negative) { | |
884 TRACE_READ_OFFSET(); | |
885 IntLiteral* literal = new IntLiteral(); | |
886 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
887 literal->value_ = is_negative ? -static_cast<int64_t>(reader->ReadUInt()) | |
888 : reader->ReadUInt(); | |
889 return literal; | |
890 } | |
891 | |
892 | |
893 IntLiteral* IntLiteral::ReadFrom(Reader* reader, uint8_t payload) { | |
894 TRACE_READ_OFFSET(); | |
895 IntLiteral* literal = new IntLiteral(); | |
896 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
897 literal->value_ = static_cast<int32_t>(payload) - SpecializedIntLiteralBias; | |
898 return literal; | |
899 } | |
900 | |
901 | |
902 DoubleLiteral* DoubleLiteral::ReadFrom(Reader* reader) { | |
903 TRACE_READ_OFFSET(); | |
904 DoubleLiteral* literal = new DoubleLiteral(); | |
905 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
906 literal->value_index_ = StringIndex(reader->ReadUInt()); | |
907 return literal; | |
908 } | |
909 | |
910 | |
911 BoolLiteral* BoolLiteral::ReadFrom(Reader* reader, bool value) { | |
912 TRACE_READ_OFFSET(); | |
913 BoolLiteral* lit = new BoolLiteral(); | |
914 lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
915 lit->value_ = value; | |
916 return lit; | |
917 } | |
918 | |
919 | |
920 NullLiteral* NullLiteral::ReadFrom(Reader* reader) { | |
921 TRACE_READ_OFFSET(); | |
922 NullLiteral* lit = new NullLiteral(); | |
923 lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
924 return lit; | |
925 } | |
926 | |
927 | |
928 SymbolLiteral* SymbolLiteral::ReadFrom(Reader* reader) { | |
929 TRACE_READ_OFFSET(); | |
930 SymbolLiteral* lit = new SymbolLiteral(); | |
931 lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
932 lit->value_index_ = StringIndex(reader->ReadUInt()); | |
933 return lit; | |
934 } | |
935 | |
936 | |
937 TypeLiteral* TypeLiteral::ReadFrom(Reader* reader) { | |
938 TRACE_READ_OFFSET(); | |
939 TypeLiteral* literal = new TypeLiteral(); | |
940 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
941 literal->type_ = DartType::ReadFrom(reader); | |
942 return literal; | |
943 } | |
944 | |
945 | |
946 ThisExpression* ThisExpression::ReadFrom(Reader* reader) { | |
947 TRACE_READ_OFFSET(); | |
948 ThisExpression* this_expr = new ThisExpression(); | |
949 this_expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
950 return this_expr; | |
951 } | |
952 | |
953 | |
954 Rethrow* Rethrow::ReadFrom(Reader* reader) { | |
955 TRACE_READ_OFFSET(); | |
956 Rethrow* rethrow = new Rethrow(); | |
957 rethrow->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
958 rethrow->position_ = reader->ReadPosition(); | |
959 return rethrow; | |
960 } | |
961 | |
962 | |
963 Throw* Throw::ReadFrom(Reader* reader) { | |
964 TRACE_READ_OFFSET(); | |
965 Throw* t = new Throw(); | |
966 t->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
967 t->position_ = reader->ReadPosition(); | |
968 t->expression_ = Expression::ReadFrom(reader); | |
969 | |
970 return t; | |
971 } | |
972 | |
973 | |
974 ListLiteral* ListLiteral::ReadFrom(Reader* reader, bool is_const) { | |
975 TRACE_READ_OFFSET(); | |
976 ListLiteral* literal = new ListLiteral(); | |
977 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
978 literal->is_const_ = is_const; | |
979 literal->position_ = reader->ReadPosition(); | |
980 literal->type_ = DartType::ReadFrom(reader); | |
981 literal->expressions_.ReadFromStatic<Expression>(reader); | |
982 | |
983 return literal; | |
984 } | |
985 | |
986 | |
987 MapLiteral* MapLiteral::ReadFrom(Reader* reader, bool is_const) { | |
988 TRACE_READ_OFFSET(); | |
989 MapLiteral* literal = new MapLiteral(); | |
990 literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
991 literal->is_const_ = is_const; | |
992 literal->position_ = reader->ReadPosition(); | |
993 literal->key_type_ = DartType::ReadFrom(reader); | |
994 literal->value_type_ = DartType::ReadFrom(reader); | |
995 literal->entries_.ReadFromStatic<MapEntry>(reader); | |
996 | |
997 return literal; | |
998 } | |
999 | |
1000 | |
1001 MapEntry* MapEntry::ReadFrom(Reader* reader) { | |
1002 MapEntry* entry = new MapEntry(); | |
1003 entry->key_ = Expression::ReadFrom(reader); | |
1004 entry->value_ = Expression::ReadFrom(reader); | |
1005 | |
1006 return entry; | |
1007 } | |
1008 | |
1009 | |
1010 AwaitExpression* AwaitExpression::ReadFrom(Reader* reader) { | |
1011 TRACE_READ_OFFSET(); | |
1012 AwaitExpression* await = new AwaitExpression(); | |
1013 await->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1014 await->operand_ = Expression::ReadFrom(reader); | |
1015 | |
1016 return await; | |
1017 } | |
1018 | |
1019 | |
1020 FunctionExpression* FunctionExpression::ReadFrom(Reader* reader) { | |
1021 TRACE_READ_OFFSET(); | |
1022 VariableScope<ReaderHelper> parameters(reader->helper()); | |
1023 FunctionExpression* expr = new FunctionExpression(); | |
1024 expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1025 expr->function_ = FunctionNode::ReadFrom(reader); | |
1026 | |
1027 return expr; | |
1028 } | |
1029 | |
1030 | |
1031 Let* Let::ReadFrom(Reader* reader) { | |
1032 TRACE_READ_OFFSET(); | |
1033 VariableScope<ReaderHelper> vars(reader->helper()); | |
1034 PositionScope scope(reader); | |
1035 | |
1036 Let* let = new Let(); | |
1037 let->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1038 let->variable_ = VariableDeclaration::ReadFromImpl(reader, false); | |
1039 let->body_ = Expression::ReadFrom(reader); | |
1040 let->position_ = reader->min_position(); | |
1041 let->end_position_ = reader->max_position(); | |
1042 | |
1043 return let; | |
1044 } | |
1045 | |
1046 | |
1047 VectorCreation* VectorCreation::ReadFrom(Reader* reader) { | |
1048 TRACE_READ_OFFSET(); | |
1049 | |
1050 VectorCreation* vector_creation = new VectorCreation(); | |
1051 vector_creation->kernel_offset_ = | |
1052 reader->offset() - 1; // -1 to include tag byte. | |
1053 vector_creation->value_ = reader->ReadUInt(); | |
1054 | |
1055 return vector_creation; | |
1056 } | |
1057 | |
1058 | |
1059 VectorGet* VectorGet::ReadFrom(Reader* reader) { | |
1060 TRACE_READ_OFFSET(); | |
1061 | |
1062 VectorGet* vector_get = new VectorGet(); | |
1063 vector_get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1064 vector_get->vector_expression_ = Expression::ReadFrom(reader); | |
1065 vector_get->index_ = reader->ReadUInt(); | |
1066 | |
1067 return vector_get; | |
1068 } | |
1069 | |
1070 | |
1071 VectorSet* VectorSet::ReadFrom(Reader* reader) { | |
1072 TRACE_READ_OFFSET(); | |
1073 | |
1074 VectorSet* vector_set = new VectorSet(); | |
1075 vector_set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1076 vector_set->vector_expression_ = Expression::ReadFrom(reader); | |
1077 vector_set->index_ = reader->ReadUInt(); | |
1078 vector_set->value_ = Expression::ReadFrom(reader); | |
1079 | |
1080 return vector_set; | |
1081 } | |
1082 | |
1083 | |
1084 VectorCopy* VectorCopy::ReadFrom(Reader* reader) { | |
1085 TRACE_READ_OFFSET(); | |
1086 | |
1087 VectorCopy* vector_copy = new VectorCopy(); | |
1088 vector_copy->kernel_offset_ = | |
1089 reader->offset() - 1; // -1 to include tag byte. | |
1090 vector_copy->vector_expression_ = Expression::ReadFrom(reader); | |
1091 | |
1092 return vector_copy; | |
1093 } | |
1094 | |
1095 | |
1096 ClosureCreation* ClosureCreation::ReadFrom(Reader* reader) { | |
1097 TRACE_READ_OFFSET(); | |
1098 | |
1099 ClosureCreation* closure_creation = new ClosureCreation(); | |
1100 closure_creation->kernel_offset_ = | |
1101 reader->offset() - 1; // to include tag byte. | |
1102 closure_creation->top_level_function_reference_ = | |
1103 Reference::ReadMemberFrom(reader); | |
1104 closure_creation->context_vector_ = Expression::ReadFrom(reader); | |
1105 closure_creation->function_type_ = | |
1106 FunctionType::Cast(DartType::ReadFrom(reader)); | |
1107 | |
1108 return closure_creation; | |
1109 } | |
1110 | |
1111 | |
1112 Statement* Statement::ReadFrom(Reader* reader) { | |
1113 TRACE_READ_OFFSET(); | |
1114 Tag tag = reader->ReadTag(); | |
1115 switch (tag) { | |
1116 case kInvalidStatement: | |
1117 return InvalidStatement::ReadFrom(reader); | |
1118 case kExpressionStatement: | |
1119 return ExpressionStatement::ReadFrom(reader); | |
1120 case kBlock: | |
1121 return Block::ReadFromImpl(reader); | |
1122 case kEmptyStatement: | |
1123 return EmptyStatement::ReadFrom(reader); | |
1124 case kAssertStatement: | |
1125 return AssertStatement::ReadFrom(reader); | |
1126 case kLabeledStatement: | |
1127 return LabeledStatement::ReadFrom(reader); | |
1128 case kBreakStatement: | |
1129 return BreakStatement::ReadFrom(reader); | |
1130 case kWhileStatement: | |
1131 return WhileStatement::ReadFrom(reader); | |
1132 case kDoStatement: | |
1133 return DoStatement::ReadFrom(reader); | |
1134 case kForStatement: | |
1135 return ForStatement::ReadFrom(reader); | |
1136 case kForInStatement: | |
1137 return ForInStatement::ReadFrom(reader, false); | |
1138 case kAsyncForInStatement: | |
1139 return ForInStatement::ReadFrom(reader, true); | |
1140 case kSwitchStatement: | |
1141 return SwitchStatement::ReadFrom(reader); | |
1142 case kContinueSwitchStatement: | |
1143 return ContinueSwitchStatement::ReadFrom(reader); | |
1144 case kIfStatement: | |
1145 return IfStatement::ReadFrom(reader); | |
1146 case kReturnStatement: | |
1147 return ReturnStatement::ReadFrom(reader); | |
1148 case kTryCatch: | |
1149 return TryCatch::ReadFrom(reader); | |
1150 case kTryFinally: | |
1151 return TryFinally::ReadFrom(reader); | |
1152 case kYieldStatement: | |
1153 return YieldStatement::ReadFrom(reader); | |
1154 case kVariableDeclaration: | |
1155 return VariableDeclaration::ReadFromImpl(reader, true); | |
1156 case kFunctionDeclaration: | |
1157 return FunctionDeclaration::ReadFrom(reader); | |
1158 default: | |
1159 UNREACHABLE(); | |
1160 } | |
1161 return NULL; | |
1162 } | |
1163 | |
1164 | |
1165 InvalidStatement* InvalidStatement::ReadFrom(Reader* reader) { | |
1166 TRACE_READ_OFFSET(); | |
1167 InvalidStatement* stmt = new InvalidStatement(); | |
1168 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1169 return stmt; | |
1170 } | |
1171 | |
1172 | |
1173 ExpressionStatement* ExpressionStatement::ReadFrom(Reader* reader) { | |
1174 TRACE_READ_OFFSET(); | |
1175 intptr_t offset = reader->offset() - 1; // -1 to include tag byte. | |
1176 ExpressionStatement* stmt = | |
1177 new ExpressionStatement(Expression::ReadFrom(reader)); | |
1178 stmt->kernel_offset_ = offset; | |
1179 | |
1180 return stmt; | |
1181 } | |
1182 | |
1183 | |
1184 Block* Block::ReadFromImpl(Reader* reader) { | |
1185 TRACE_READ_OFFSET(); | |
1186 PositionScope scope(reader); | |
1187 | |
1188 VariableScope<ReaderHelper> vars(reader->helper()); | |
1189 Block* block = new Block(); | |
1190 block->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1191 block->statements().ReadFromStatic<Statement>(reader); | |
1192 block->position_ = reader->min_position(); | |
1193 block->end_position_ = reader->max_position(); | |
1194 | |
1195 return block; | |
1196 } | |
1197 | |
1198 | |
1199 EmptyStatement* EmptyStatement::ReadFrom(Reader* reader) { | |
1200 TRACE_READ_OFFSET(); | |
1201 EmptyStatement* stmt = new EmptyStatement(); | |
1202 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1203 return stmt; | |
1204 } | |
1205 | |
1206 | |
1207 AssertStatement* AssertStatement::ReadFrom(Reader* reader) { | |
1208 TRACE_READ_OFFSET(); | |
1209 AssertStatement* stmt = new AssertStatement(); | |
1210 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1211 stmt->condition_ = Expression::ReadFrom(reader); | |
1212 reader->ReadPosition(); // condition start offset. | |
1213 reader->ReadPosition(); // condition end offset. | |
1214 stmt->message_ = reader->ReadOptional<Expression>(); | |
1215 | |
1216 return stmt; | |
1217 } | |
1218 | |
1219 | |
1220 LabeledStatement* LabeledStatement::ReadFrom(Reader* reader) { | |
1221 TRACE_READ_OFFSET(); | |
1222 LabeledStatement* stmt = new LabeledStatement(); | |
1223 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1224 | |
1225 reader->helper()->labels()->Push(stmt); | |
1226 stmt->body_ = Statement::ReadFrom(reader); | |
1227 reader->helper()->labels()->Pop(stmt); | |
1228 | |
1229 return stmt; | |
1230 } | |
1231 | |
1232 | |
1233 BreakStatement* BreakStatement::ReadFrom(Reader* reader) { | |
1234 TRACE_READ_OFFSET(); | |
1235 BreakStatement* stmt = new BreakStatement(); | |
1236 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1237 stmt->position_ = reader->ReadPosition(); | |
1238 stmt->target_index_ = reader->ReadUInt(); | |
1239 return stmt; | |
1240 } | |
1241 | |
1242 | |
1243 WhileStatement* WhileStatement::ReadFrom(Reader* reader) { | |
1244 TRACE_READ_OFFSET(); | |
1245 WhileStatement* stmt = new WhileStatement(); | |
1246 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1247 stmt->condition_ = Expression::ReadFrom(reader); | |
1248 stmt->body_ = Statement::ReadFrom(reader); | |
1249 | |
1250 return stmt; | |
1251 } | |
1252 | |
1253 | |
1254 DoStatement* DoStatement::ReadFrom(Reader* reader) { | |
1255 TRACE_READ_OFFSET(); | |
1256 DoStatement* dostmt = new DoStatement(); | |
1257 dostmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1258 dostmt->body_ = Statement::ReadFrom(reader); | |
1259 dostmt->condition_ = Expression::ReadFrom(reader); | |
1260 | |
1261 return dostmt; | |
1262 } | |
1263 | |
1264 | |
1265 ForStatement* ForStatement::ReadFrom(Reader* reader) { | |
1266 TRACE_READ_OFFSET(); | |
1267 VariableScope<ReaderHelper> vars(reader->helper()); | |
1268 PositionScope scope(reader); | |
1269 | |
1270 ForStatement* forstmt = new ForStatement(); | |
1271 forstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1272 forstmt->variables_.ReadFromStatic<VariableDeclarationImpl>(reader); | |
1273 forstmt->condition_ = reader->ReadOptional<Expression>(); | |
1274 forstmt->updates_.ReadFromStatic<Expression>(reader); | |
1275 forstmt->body_ = Statement::ReadFrom(reader); | |
1276 forstmt->end_position_ = reader->max_position(); | |
1277 forstmt->position_ = reader->min_position(); | |
1278 | |
1279 return forstmt; | |
1280 } | |
1281 | |
1282 | |
1283 ForInStatement* ForInStatement::ReadFrom(Reader* reader, bool is_async) { | |
1284 TRACE_READ_OFFSET(); | |
1285 VariableScope<ReaderHelper> vars(reader->helper()); | |
1286 PositionScope scope(reader); | |
1287 | |
1288 ForInStatement* forinstmt = new ForInStatement(); | |
1289 forinstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1290 forinstmt->is_async_ = is_async; | |
1291 forinstmt->position_ = reader->ReadPosition(); | |
1292 forinstmt->variable_ = VariableDeclaration::ReadFromImpl(reader, false); | |
1293 forinstmt->iterable_ = Expression::ReadFrom(reader); | |
1294 forinstmt->body_ = Statement::ReadFrom(reader); | |
1295 forinstmt->end_position_ = reader->max_position(); | |
1296 if (!forinstmt->position_.IsReal()) { | |
1297 forinstmt->position_ = reader->min_position(); | |
1298 } | |
1299 forinstmt->variable_->set_end_position(forinstmt->position_); | |
1300 | |
1301 return forinstmt; | |
1302 } | |
1303 | |
1304 | |
1305 SwitchStatement* SwitchStatement::ReadFrom(Reader* reader) { | |
1306 TRACE_READ_OFFSET(); | |
1307 SwitchStatement* stmt = new SwitchStatement(); | |
1308 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1309 stmt->condition_ = Expression::ReadFrom(reader); | |
1310 int count = reader->ReadUInt(); | |
1311 stmt->cases_.EnsureInitialized(count); | |
1312 for (intptr_t i = 0; i < count; i++) { | |
1313 SwitchCase* sc = stmt->cases_.GetOrCreate<SwitchCase>(i); | |
1314 sc->ReadFrom(reader); | |
1315 } | |
1316 | |
1317 return stmt; | |
1318 } | |
1319 | |
1320 | |
1321 SwitchCase* SwitchCase::ReadFrom(Reader* reader) { | |
1322 TRACE_READ_OFFSET(); | |
1323 int length = reader->ReadListLength(); | |
1324 expressions_.EnsureInitialized(length); | |
1325 | |
1326 for (intptr_t i = 0; i < length; i++) { | |
1327 ASSERT(expressions_[i] == NULL); | |
1328 TokenPosition position = reader->ReadPosition(); | |
1329 expressions_[i] = Expression::ReadFrom(reader); | |
1330 expressions_[i]->set_position(position); | |
1331 } | |
1332 is_default_ = reader->ReadBool(); | |
1333 body_ = Statement::ReadFrom(reader); | |
1334 | |
1335 return this; | |
1336 } | |
1337 | |
1338 | |
1339 ContinueSwitchStatement* ContinueSwitchStatement::ReadFrom(Reader* reader) { | |
1340 TRACE_READ_OFFSET(); | |
1341 ContinueSwitchStatement* stmt = new ContinueSwitchStatement(); | |
1342 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1343 stmt->target_index_ = reader->ReadUInt(); | |
1344 | |
1345 return stmt; | |
1346 } | |
1347 | |
1348 | |
1349 IfStatement* IfStatement::ReadFrom(Reader* reader) { | |
1350 TRACE_READ_OFFSET(); | |
1351 IfStatement* ifstmt = new IfStatement(); | |
1352 ifstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1353 ifstmt->condition_ = Expression::ReadFrom(reader); | |
1354 ifstmt->then_ = Statement::ReadFrom(reader); | |
1355 ifstmt->otherwise_ = Statement::ReadFrom(reader); | |
1356 | |
1357 return ifstmt; | |
1358 } | |
1359 | |
1360 | |
1361 ReturnStatement* ReturnStatement::ReadFrom(Reader* reader) { | |
1362 TRACE_READ_OFFSET(); | |
1363 ReturnStatement* ret = new ReturnStatement(); | |
1364 ret->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1365 ret->position_ = reader->ReadPosition(); | |
1366 ret->expression_ = reader->ReadOptional<Expression>(); | |
1367 | |
1368 return ret; | |
1369 } | |
1370 | |
1371 | |
1372 TryCatch* TryCatch::ReadFrom(Reader* reader) { | |
1373 TRACE_READ_OFFSET(); | |
1374 PositionScope scope(reader); | |
1375 | |
1376 TryCatch* tc = new TryCatch(); | |
1377 tc->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1378 tc->body_ = Statement::ReadFrom(reader); | |
1379 reader->ReadBool(); // whether any catch needs a stacktrace. | |
1380 tc->catches_.ReadFromStatic<Catch>(reader); | |
1381 tc->position_ = reader->min_position(); | |
1382 | |
1383 return tc; | |
1384 } | |
1385 | |
1386 | |
1387 Catch* Catch::ReadFrom(Reader* reader) { | |
1388 TRACE_READ_OFFSET(); | |
1389 VariableScope<ReaderHelper> vars(reader->helper()); | |
1390 PositionScope scope(reader); | |
1391 | |
1392 Catch* c = new Catch(); | |
1393 c->kernel_offset_ = reader->offset(); // Catch has no tag. | |
1394 c->guard_ = DartType::ReadFrom(reader); | |
1395 c->exception_ = | |
1396 reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>(); | |
1397 c->stack_trace_ = | |
1398 reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>(); | |
1399 c->body_ = Statement::ReadFrom(reader); | |
1400 c->end_position_ = reader->max_position(); | |
1401 c->position_ = reader->min_position(); | |
1402 | |
1403 return c; | |
1404 } | |
1405 | |
1406 | |
1407 TryFinally* TryFinally::ReadFrom(Reader* reader) { | |
1408 TRACE_READ_OFFSET(); | |
1409 TryFinally* tf = new TryFinally(); | |
1410 tf->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1411 tf->body_ = Statement::ReadFrom(reader); | |
1412 tf->finalizer_ = Statement::ReadFrom(reader); | |
1413 | |
1414 return tf; | |
1415 } | |
1416 | |
1417 | |
1418 YieldStatement* YieldStatement::ReadFrom(Reader* reader) { | |
1419 TRACE_READ_OFFSET(); | |
1420 YieldStatement* stmt = new YieldStatement(); | |
1421 stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1422 stmt->position_ = reader->ReadPosition(); | |
1423 reader->record_yield_token_position(stmt->position_); | |
1424 stmt->flags_ = reader->ReadByte(); | |
1425 stmt->expression_ = Expression::ReadFrom(reader); | |
1426 | |
1427 return stmt; | |
1428 } | |
1429 | |
1430 | |
1431 VariableDeclaration* VariableDeclaration::ReadFrom(Reader* reader) { | |
1432 TRACE_READ_OFFSET(); | |
1433 Tag tag = reader->ReadTag(); | |
1434 ASSERT(tag == kVariableDeclaration); | |
1435 return VariableDeclaration::ReadFromImpl(reader, true); | |
1436 } | |
1437 | |
1438 | |
1439 VariableDeclaration* VariableDeclaration::ReadFromImpl(Reader* reader, | |
1440 bool read_tag) { | |
1441 TRACE_READ_OFFSET(); | |
1442 PositionScope scope(reader); | |
1443 | |
1444 VariableDeclaration* decl = new VariableDeclaration(); | |
1445 // -1 or -0 depending on whether there's a tag or not. | |
1446 decl->kernel_offset_ = reader->offset() - (read_tag ? 1 : 0); | |
1447 decl->kernel_offset_no_tag_ = reader->offset(); | |
1448 decl->position_ = reader->ReadPosition(); | |
1449 decl->equals_position_ = reader->ReadPosition(); | |
1450 decl->flags_ = reader->ReadFlags(); | |
1451 decl->name_index_ = StringIndex(reader->ReadUInt()); | |
1452 decl->type_ = DartType::ReadFrom(reader); | |
1453 decl->initializer_ = reader->ReadOptional<Expression>(); | |
1454 | |
1455 // Go to next token position so it ends *after* the last potentially | |
1456 // debuggable position in the initializer. | |
1457 TokenPosition position = reader->max_position(); | |
1458 if (position.IsReal()) position.Next(); | |
1459 decl->end_position_ = position; | |
1460 reader->helper()->variables().Push(decl); | |
1461 | |
1462 return decl; | |
1463 } | |
1464 | |
1465 | |
1466 FunctionDeclaration* FunctionDeclaration::ReadFrom(Reader* reader) { | |
1467 TRACE_READ_OFFSET(); | |
1468 FunctionDeclaration* decl = new FunctionDeclaration(); | |
1469 decl->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. | |
1470 decl->position_ = reader->ReadPosition(); | |
1471 decl->variable_ = VariableDeclaration::ReadFromImpl(reader, false); | |
1472 VariableScope<ReaderHelper> parameters(reader->helper()); | |
1473 decl->function_ = FunctionNode::ReadFrom(reader); | |
1474 | |
1475 return decl; | |
1476 } | |
1477 | |
1478 | |
1479 Name* Name::ReadFrom(Reader* reader) { | |
1480 StringIndex name_index(reader->ReadUInt()); | |
1481 if ((reader->StringLength(name_index) >= 1) && | |
1482 (reader->CharacterAt(name_index, 0) == '_')) { | |
1483 intptr_t library_reference = reader->ReadCanonicalNameReference(); | |
1484 return new Name(name_index, library_reference); | |
1485 } else { | |
1486 return new Name(name_index, NULL); | |
1487 } | |
1488 } | |
1489 | |
1490 | |
1491 DartType* DartType::ReadFrom(Reader* reader) { | |
1492 TRACE_READ_OFFSET(); | |
1493 Tag tag = reader->ReadTag(); | |
1494 switch (tag) { | |
1495 case kInvalidType: | |
1496 return InvalidType::ReadFrom(reader); | |
1497 case kDynamicType: | |
1498 return DynamicType::ReadFrom(reader); | |
1499 case kVoidType: | |
1500 return VoidType::ReadFrom(reader); | |
1501 case kBottomType: | |
1502 return BottomType::ReadFrom(reader); | |
1503 case kInterfaceType: | |
1504 return InterfaceType::ReadFrom(reader); | |
1505 case kSimpleInterfaceType: | |
1506 return InterfaceType::ReadFrom(reader, true); | |
1507 case kFunctionType: | |
1508 return FunctionType::ReadFrom(reader); | |
1509 case kSimpleFunctionType: | |
1510 return FunctionType::ReadFrom(reader, true); | |
1511 case kTypeParameterType: | |
1512 return TypeParameterType::ReadFrom(reader); | |
1513 case kVectorType: | |
1514 return VectorType::ReadFrom(reader); | |
1515 case kTypedefType: | |
1516 return TypedefType::ReadFrom(reader); | |
1517 default: | |
1518 UNREACHABLE(); | |
1519 } | |
1520 UNREACHABLE(); | |
1521 return NULL; | |
1522 } | |
1523 | |
1524 | |
1525 InvalidType* InvalidType::ReadFrom(Reader* reader) { | |
1526 TRACE_READ_OFFSET(); | |
1527 return new InvalidType(); | |
1528 } | |
1529 | |
1530 | |
1531 DynamicType* DynamicType::ReadFrom(Reader* reader) { | |
1532 TRACE_READ_OFFSET(); | |
1533 return new DynamicType(); | |
1534 } | |
1535 | |
1536 | |
1537 VoidType* VoidType::ReadFrom(Reader* reader) { | |
1538 TRACE_READ_OFFSET(); | |
1539 return new VoidType(); | |
1540 } | |
1541 | |
1542 | |
1543 BottomType* BottomType::ReadFrom(Reader* reader) { | |
1544 TRACE_READ_OFFSET(); | |
1545 return new BottomType(); | |
1546 } | |
1547 | |
1548 | |
1549 InterfaceType* InterfaceType::ReadFrom(Reader* reader) { | |
1550 TRACE_READ_OFFSET(); | |
1551 NameIndex klass_name = Reference::ReadClassFrom(reader); | |
1552 InterfaceType* type = new InterfaceType(klass_name); | |
1553 type->type_arguments().ReadFromStatic<DartType>(reader); | |
1554 return type; | |
1555 } | |
1556 | |
1557 | |
1558 InterfaceType* InterfaceType::ReadFrom(Reader* reader, | |
1559 bool _without_type_arguments_) { | |
1560 TRACE_READ_OFFSET(); | |
1561 NameIndex klass_name = Reference::ReadClassFrom(reader); | |
1562 InterfaceType* type = new InterfaceType(klass_name); | |
1563 ASSERT(_without_type_arguments_); | |
1564 return type; | |
1565 } | |
1566 | |
1567 | |
1568 TypedefType* TypedefType::ReadFrom(Reader* reader) { | |
1569 TRACE_READ_OFFSET(); | |
1570 NameIndex typedef_name = Reference::ReadTypedefFrom(reader); | |
1571 TypedefType* type = new TypedefType(typedef_name); | |
1572 type->type_arguments().ReadFromStatic<DartType>(reader); | |
1573 return type; | |
1574 } | |
1575 | |
1576 | |
1577 FunctionType* FunctionType::ReadFrom(Reader* reader) { | |
1578 TRACE_READ_OFFSET(); | |
1579 FunctionType* type = new FunctionType(); | |
1580 TypeParameterScope<ReaderHelper> scope(reader->helper()); | |
1581 type->type_parameters().ReadFrom(reader); | |
1582 type->required_parameter_count_ = reader->ReadUInt(); | |
1583 intptr_t total_parameter_count = reader->ReadUInt(); | |
1584 type->positional_parameters().ReadFromStatic<DartType>(reader); | |
1585 type->named_parameters().ReadFromStatic<NamedParameter>(reader); | |
1586 ASSERT(type->positional_parameters().length() + | |
1587 type->named_parameters().length() == | |
1588 total_parameter_count); | |
1589 type->return_type_ = DartType::ReadFrom(reader); | |
1590 return type; | |
1591 } | |
1592 | |
1593 | |
1594 FunctionType* FunctionType::ReadFrom(Reader* reader, bool _is_simple_) { | |
1595 TRACE_READ_OFFSET(); | |
1596 FunctionType* type = new FunctionType(); | |
1597 ASSERT(_is_simple_); | |
1598 type->positional_parameters().ReadFromStatic<DartType>(reader); | |
1599 type->required_parameter_count_ = type->positional_parameters().length(); | |
1600 type->return_type_ = DartType::ReadFrom(reader); | |
1601 return type; | |
1602 } | |
1603 | |
1604 | |
1605 TypeParameterType* TypeParameterType::ReadFrom(Reader* reader) { | |
1606 TRACE_READ_OFFSET(); | |
1607 TypeParameterType* type = new TypeParameterType(); | |
1608 type->parameter_ = | |
1609 reader->helper()->type_parameters().Lookup(reader->ReadUInt()); | |
1610 reader->ReadUInt(); // binary offset of parameter list | |
1611 reader->ReadUInt(); // index of parameter | |
1612 // There is an optional promoted bound, currently ignored. | |
1613 delete reader->ReadOptional<DartType>(); | |
1614 return type; | |
1615 } | |
1616 | |
1617 | |
1618 VectorType* VectorType::ReadFrom(Reader* reader) { | |
1619 TRACE_READ_OFFSET(); | |
1620 VectorType* type = new VectorType(); | |
1621 return type; | |
1622 } | |
1623 | |
1624 | |
1625 Program* Program::ReadFrom(Reader* reader) { | 20 Program* Program::ReadFrom(Reader* reader) { |
1626 TRACE_READ_OFFSET(); | |
1627 uint32_t magic = reader->ReadUInt32(); | 21 uint32_t magic = reader->ReadUInt32(); |
1628 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); | 22 if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); |
1629 | 23 |
1630 Program* program = new Program(); | 24 Program* program = new Program(); |
1631 reader->helper()->set_program(program); | 25 program->kernel_data_ = reader->buffer(); |
| 26 program->kernel_data_size_ = reader->size(); |
1632 | 27 |
1633 // Deserialize the string offset table to give fast access to the string data | |
1634 // during deserialization. | |
1635 program->string_table_offset_ = reader->offset(); | 28 program->string_table_offset_ = reader->offset(); |
1636 intptr_t string_count = reader->ReadUInt(); | |
1637 reader->string_offsets_ = new intptr_t[string_count + 1]; | |
1638 intptr_t offset = 0; | |
1639 for (intptr_t i = 0; i < string_count; ++i) { | |
1640 reader->string_offsets_[i] = offset; | |
1641 offset = reader->ReadUInt(); | |
1642 } | |
1643 reader->string_offsets_[string_count] = offset; | |
1644 // Skip the UTF-8 encoded strings. | |
1645 reader->MarkStringDataOffset(); | |
1646 reader->Consume(offset); | |
1647 | 29 |
1648 program->source_table_.ReadFrom(reader); | 30 // Read backwards at the end. |
1649 | 31 reader->set_offset(reader->size() - 4); |
1650 // Deserialize the canonical name table to give fast access to canonical names | 32 program->library_count_ = reader->ReadUInt32(); |
1651 // during deserialization. | 33 reader->set_offset(reader->size() - 4 - 4 * program->library_count_ - 2 * 4); |
1652 program->name_table_offset_ = reader->offset(); | 34 program->name_table_offset_ = reader->ReadUInt32(); |
1653 intptr_t name_count = reader->ReadUInt(); | 35 program->main_method_reference_ = NameIndex(reader->ReadUInt32() - 1); |
1654 reader->canonical_name_parents_ = new NameIndex[name_count]; | |
1655 reader->canonical_name_strings_ = new StringIndex[name_count]; | |
1656 for (int i = 0; i < name_count; ++i) { | |
1657 // The parent name index is biased: 0 is the root name and otherwise N+1 is | |
1658 // the Nth name. | |
1659 reader->canonical_name_parents_[i] = reader->ReadCanonicalNameReference(); | |
1660 reader->canonical_name_strings_[i] = StringIndex(reader->ReadUInt()); | |
1661 } | |
1662 | |
1663 int libraries = reader->ReadUInt(); | |
1664 program->libraries().EnsureInitialized(libraries); | |
1665 for (intptr_t i = 0; i < libraries; i++) { | |
1666 program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); | |
1667 } | |
1668 | |
1669 program->main_method_reference_ = | |
1670 Reference::ReadMemberFrom(reader, /*allow_null=*/true); | |
1671 | 36 |
1672 return program; | 37 return program; |
1673 } | 38 } |
1674 | 39 |
1675 | 40 |
1676 FunctionNode* FunctionNode::ReadFrom(Reader* reader) { | |
1677 TRACE_READ_OFFSET(); | |
1678 TypeParameterScope<ReaderHelper> scope(reader->helper()); | |
1679 | |
1680 FunctionNode* function = new FunctionNode(); | |
1681 // FunctionNode tag not read yet. | |
1682 function->kernel_offset_ = reader->offset(); | |
1683 Tag tag = reader->ReadTag(); | |
1684 ASSERT(tag == kFunctionNode); | |
1685 function->position_ = reader->ReadPosition(); | |
1686 function->end_position_ = reader->ReadPosition(); | |
1687 function->async_marker_ = | |
1688 static_cast<FunctionNode::AsyncMarker>(reader->ReadByte()); | |
1689 function->dart_async_marker_ = | |
1690 static_cast<FunctionNode::AsyncMarker>(reader->ReadByte()); | |
1691 function->type_parameters().ReadFrom(reader); | |
1692 reader->ReadUInt(); // total parameter count. | |
1693 function->required_parameter_count_ = reader->ReadUInt(); | |
1694 function->positional_parameters().ReadFromStatic<VariableDeclarationImpl>( | |
1695 reader); | |
1696 function->named_parameters().ReadFromStatic<VariableDeclarationImpl>(reader); | |
1697 function->return_type_ = DartType::ReadFrom(reader); | |
1698 | |
1699 LabelScope<ReaderHelper, BlockStack<LabeledStatement> > labels( | |
1700 reader->helper()); | |
1701 VariableScope<ReaderHelper> vars(reader->helper()); | |
1702 function->body_ = reader->ReadOptional<Statement>(); | |
1703 | |
1704 return function; | |
1705 } | |
1706 | |
1707 | |
1708 TypeParameter* TypeParameter::ReadFrom(Reader* reader) { | |
1709 TRACE_READ_OFFSET(); | |
1710 kernel_offset_ = reader->offset(); | |
1711 name_index_ = StringIndex(reader->ReadUInt()); | |
1712 bound_ = DartType::ReadFrom(reader); | |
1713 return this; | |
1714 } | |
1715 | |
1716 | |
1717 } // namespace kernel | 41 } // namespace kernel |
1718 | 42 |
1719 | 43 |
1720 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, | 44 kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer, |
1721 intptr_t buffer_length) { | 45 intptr_t buffer_length) { |
1722 kernel::Reader reader(buffer, buffer_length); | 46 kernel::Reader reader(buffer, buffer_length); |
1723 return kernel::Program::ReadFrom(&reader); | 47 return kernel::Program::ReadFrom(&reader); |
1724 } | 48 } |
1725 | 49 |
1726 | 50 |
1727 } // namespace dart | 51 } // namespace dart |
1728 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 52 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |