Index: runtime/vm/kernel_binary.cc |
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc |
index 3d47148702967e0b57b6c466a2f32ff8f71399bf..d9735b875da3cc2df07fcba4efeba82f1fe1b7f5 100644 |
--- a/runtime/vm/kernel_binary.cc |
+++ b/runtime/vm/kernel_binary.cc |
@@ -11,1709 +11,33 @@ |
#include "vm/kernel_to_il.h" |
#include "vm/os.h" |
-#if defined(DEBUG) |
-#define TRACE_READ_OFFSET() \ |
- do { \ |
- if (FLAG_trace_kernel_binary) reader->DumpOffset(DART_PRETTY_FUNCTION); \ |
- } while (0) |
-#else |
-#define TRACE_READ_OFFSET() |
-#endif |
namespace dart { |
namespace kernel { |
- |
-Reader::~Reader() { |
- delete[] string_offsets_; |
- delete[] canonical_name_parents_; |
- delete[] canonical_name_strings_; |
-} |
- |
- |
-template <typename T> |
-template <typename IT> |
-void List<T>::ReadFrom(Reader* reader, TreeNode* parent) { |
- TRACE_READ_OFFSET(); |
- ASSERT(parent != NULL); |
- int length = reader->ReadListLength(); |
- EnsureInitialized(length); |
- |
- for (intptr_t i = 0; i < length_; i++) { |
- IT* object = GetOrCreate<IT>(i, parent); |
- object->ReadFrom(reader); |
- } |
-} |
- |
- |
-template <typename T> |
-template <typename IT> |
-void List<T>::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- int length = reader->ReadListLength(); |
- EnsureInitialized(length); |
- |
- for (intptr_t i = 0; i < length_; i++) { |
- GetOrCreate<IT>(i)->ReadFrom(reader); |
- } |
-} |
- |
- |
-template <typename T> |
-template <typename IT> |
-void List<T>::ReadFromStatic(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- int length = reader->ReadListLength(); |
- EnsureInitialized(length); |
- |
- for (intptr_t i = 0; i < length_; i++) { |
- ASSERT(array_[i] == NULL); |
- array_[i] = IT::ReadFrom(reader); |
- } |
-} |
- |
- |
-void TypeParameterList::ReadFrom(Reader* reader) { |
- // It is possible for the bound of the first type parameter to refer to |
- // the second type parameter. This means we need to create [TypeParameter] |
- // objects before reading the bounds. |
- int length = reader->ReadListLength(); |
- EnsureInitialized(length); |
- |
- // Make all [TypeParameter]s available in scope. |
- for (intptr_t i = 0; i < length; i++) { |
- TypeParameter* parameter = (*this)[i] = new TypeParameter(); |
- reader->helper()->type_parameters().Push(parameter); |
- } |
- |
- if (length > 0) { |
- // Read all [TypeParameter]s and their bounds. |
- for (intptr_t i = 0; i < length; i++) { |
- (*this)[i]->ReadFrom(reader); |
- } |
- first_offset = (*this)[0]->kernel_offset_; |
- } |
-} |
- |
- |
-NamedParameter* NamedParameter::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- StringIndex name_index(reader->ReadUInt()); |
- DartType* type = DartType::ReadFrom(reader); |
- return new NamedParameter(name_index, type); |
-} |
- |
- |
-template <typename B, typename S> |
-class DowncastReader { |
- public: |
- static S* ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- return S::Cast(B::ReadFrom(reader)); |
- } |
-}; |
- |
- |
-class VariableDeclarationImpl { |
- public: |
- static VariableDeclaration* ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- return VariableDeclaration::ReadFromImpl(reader, false); |
- } |
-}; |
- |
- |
-void SourceTable::ReadFrom(Reader* reader) { |
- size_ = reader->ReadUInt(); |
- sources_ = new Source[size_]; |
- |
- // Build a table of the URI offsets. |
- intptr_t* end_offsets = new intptr_t[size_]; |
- for (intptr_t i = 0; i < size_; ++i) { |
- end_offsets[i] = reader->ReadUInt(); |
- } |
- |
- // Read the URI strings. |
- intptr_t start_offset = 0; |
- for (intptr_t i = 0; i < size_; ++i) { |
- intptr_t length = end_offsets[i] - start_offset; |
- uint8_t* buffer = new uint8_t[length]; |
- memmove(buffer, reader->buffer() + reader->offset(), length); |
- reader->Consume(length); |
- |
- sources_[i].uri_ = buffer; |
- sources_[i].uri_size_ = length; |
- |
- start_offset = end_offsets[i]; |
- } |
- |
- // Read the source code strings and line starts. |
- for (intptr_t i = 0; i < size_; ++i) { |
- intptr_t length = reader->ReadUInt(); |
- uint8_t* string_buffer = new uint8_t[length]; |
- memmove(string_buffer, reader->buffer() + reader->offset(), length); |
- reader->Consume(length); |
- intptr_t line_count = reader->ReadUInt(); |
- intptr_t* line_starts = new intptr_t[line_count]; |
- intptr_t previous_line_start = 0; |
- for (intptr_t j = 0; j < line_count; ++j) { |
- intptr_t line_start = reader->ReadUInt() + previous_line_start; |
- line_starts[j] = line_start; |
- previous_line_start = line_start; |
- } |
- |
- sources_[i].source_code_ = string_buffer; |
- sources_[i].source_code_size_ = length; |
- sources_[i].line_starts_ = line_starts; |
- sources_[i].line_count_ = line_count; |
- } |
-} |
- |
- |
-Library* Library::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- kernel_offset_ = reader->offset(); // no tag. |
- int flags = reader->ReadFlags(); |
- ASSERT(flags == 0); // external libraries not supported |
- kernel_data_ = reader->buffer(); |
- kernel_data_size_ = reader->size(); |
- |
- canonical_name_ = reader->ReadCanonicalNameReference(); |
- name_index_ = StringIndex(reader->ReadUInt()); |
- import_uri_index_ = reader->CanonicalNameString(canonical_name_); |
- source_uri_index_ = reader->ReadUInt(); |
- reader->set_current_script_id(source_uri_index_); |
- |
- annotations_.ReadFromStatic<Expression>(reader); |
- dependencies().ReadFromStatic<LibraryDependency>(reader); |
- int num_typedefs = reader->ReadUInt(); |
- typedefs().EnsureInitialized(num_typedefs); |
- for (intptr_t i = 0; i < num_typedefs; i++) { |
- typedefs().GetOrCreate<Typedef>(i, this)->ReadFrom(reader); |
- } |
- int num_classes = reader->ReadUInt(); |
- classes().EnsureInitialized(num_classes); |
- for (intptr_t i = 0; i < num_classes; i++) { |
- Tag tag = reader->ReadTag(); |
- ASSERT(tag == kClass); |
- NormalClass* klass = classes().GetOrCreate<NormalClass>(i, this); |
- klass->ReadFrom(reader); |
- } |
- |
- fields().ReadFrom<Field>(reader, this); |
- procedures().ReadFrom<Procedure>(reader, this); |
- |
- return this; |
-} |
- |
- |
-LibraryDependency* LibraryDependency::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- |
- LibraryDependency* node = new LibraryDependency(); |
- node->flags_ = reader->ReadFlags(); |
- node->annotations_.ReadFromStatic<Expression>(reader); |
- node->target_reference_ = Reference::ReadLibraryFrom(reader); |
- node->name_index_ = StringIndex(reader->ReadUInt()); |
- node->combinators_.ReadFromStatic<Combinator>(reader); |
- |
- return node; |
-} |
- |
- |
-Combinator* Combinator::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- |
- Combinator* node = new Combinator(); |
- node->is_show_ = (reader->ReadByte() == 1); |
- int num_names = reader->ReadUInt(); |
- node->name_indices_.Initialize(num_names); |
- for (intptr_t i = 0; i < num_names; ++i) { |
- node->name_indices_[i] = reader->ReadUInt(); |
- } |
- |
- return node; |
-} |
- |
- |
-Typedef* Typedef::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- |
- canonical_name_ = reader->ReadCanonicalNameReference(); |
- position_ = reader->ReadPosition(false); |
- name_index_ = StringIndex(reader->ReadUInt()); |
- source_uri_index_ = reader->ReadUInt(); |
- type_parameters_.ReadFrom(reader); |
- type_ = DartType::ReadFrom(reader); |
- |
- return this; |
-} |
- |
- |
-Class* Class::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- |
- kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- canonical_name_ = reader->ReadCanonicalNameReference(); |
- position_ = reader->ReadPosition(false); |
- is_abstract_ = reader->ReadBool(); |
- name_index_ = StringIndex(reader->ReadUInt()); |
- source_uri_index_ = reader->ReadUInt(); |
- reader->set_current_script_id(source_uri_index_); |
- reader->record_token_position(position_); |
- annotations_.ReadFromStatic<Expression>(reader); |
- |
- return this; |
-} |
- |
- |
-NormalClass* NormalClass::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- Class::ReadFrom(reader); |
- TypeParameterScope<ReaderHelper> scope(reader->helper()); |
- |
- type_parameters_.ReadFrom(reader); |
- DartType* type = reader->ReadOptional<DartType>(); |
- |
- super_class_ = InterfaceType::Cast(type); |
- reader->ReadOptional<DartType>(); // Mixed-in type is unused. |
- implemented_classes_.ReadFromStatic<DowncastReader<DartType, InterfaceType> >( |
- reader); |
- fields_.ReadFrom<Field>(reader, this); |
- constructors_.ReadFrom<Constructor>(reader, this); |
- procedures_.ReadFrom<Procedure>(reader, this); |
- |
- return this; |
-} |
- |
- |
-NameIndex Reference::ReadMemberFrom(Reader* reader, bool allow_null) { |
- TRACE_READ_OFFSET(); |
- NameIndex canonical_name = reader->ReadCanonicalNameReference(); |
- if ((canonical_name == -1) && !allow_null) { |
- FATAL("Expected a valid member reference, but got `null`"); |
- } |
- return canonical_name; |
-} |
- |
- |
-NameIndex Reference::ReadClassFrom(Reader* reader, bool allow_null) { |
- TRACE_READ_OFFSET(); |
- NameIndex canonical_name = reader->ReadCanonicalNameReference(); |
- if ((canonical_name == -1) && !allow_null) { |
- FATAL("Expected a valid class reference, but got `null`"); |
- } |
- return canonical_name; |
-} |
- |
- |
-NameIndex Reference::ReadTypedefFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- NameIndex canonical_name = reader->ReadCanonicalNameReference(); |
- if (canonical_name == -1) { |
- FATAL("Expected a valid typedef reference, but got `null`"); |
- } |
- return canonical_name; |
-} |
- |
- |
-NameIndex Reference::ReadLibraryFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- NameIndex canonical_name = reader->ReadCanonicalNameReference(); |
- if (canonical_name == -1) { |
- FATAL("Expected a valid typedef reference, but got `null`"); |
- } |
- return canonical_name; |
-} |
- |
- |
-Field* Field::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- kernel_offset_ = reader->offset(); // Notice the ReadTag() below. |
- Tag tag = reader->ReadTag(); |
- ASSERT(tag == kField); |
- |
- canonical_name_ = reader->ReadCanonicalNameReference(); |
- position_ = reader->ReadPosition(false); |
- end_position_ = reader->ReadPosition(false); |
- flags_ = reader->ReadFlags(); |
- reader->ReadUInt(); // parent class binary offset (or 0). |
- name_ = Name::ReadFrom(reader); |
- source_uri_index_ = reader->ReadUInt(); |
- reader->set_current_script_id(source_uri_index_); |
- reader->record_token_position(position_); |
- reader->record_token_position(end_position_); |
- annotations_.ReadFromStatic<Expression>(reader); |
- type_ = DartType::ReadFrom(reader); |
- initializer_ = reader->ReadOptional<Expression>(); |
- |
- return this; |
-} |
- |
- |
-Constructor* Constructor::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- kernel_offset_ = reader->offset(); // Notice the ReadTag() below. |
- Tag tag = reader->ReadTag(); |
- ASSERT(tag == kConstructor); |
- |
- canonical_name_ = reader->ReadCanonicalNameReference(); |
- VariableScope<ReaderHelper> parameters(reader->helper()); |
- position_ = reader->ReadPosition(); |
- end_position_ = reader->ReadPosition(); |
- flags_ = reader->ReadFlags(); |
- reader->ReadUInt(); // parent class binary offset. |
- name_ = Name::ReadFrom(reader); |
- annotations_.ReadFromStatic<Expression>(reader); |
- function_ = FunctionNode::ReadFrom(reader); |
- initializers_.ReadFromStatic<Initializer>(reader); |
- |
- return this; |
-} |
- |
- |
-Procedure* Procedure::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- kernel_offset_ = reader->offset(); // Notice the ReadTag() below. |
- Tag tag = reader->ReadTag(); |
- ASSERT(tag == kProcedure); |
- |
- canonical_name_ = reader->ReadCanonicalNameReference(); |
- VariableScope<ReaderHelper> parameters(reader->helper()); |
- position_ = reader->ReadPosition(false); |
- end_position_ = reader->ReadPosition(false); |
- kind_ = static_cast<ProcedureKind>(reader->ReadByte()); |
- flags_ = reader->ReadFlags(); |
- reader->ReadUInt(); // parent class binary offset (or 0). |
- name_ = Name::ReadFrom(reader); |
- source_uri_index_ = reader->ReadUInt(); |
- reader->set_current_script_id(source_uri_index_); |
- reader->record_token_position(position_); |
- reader->record_token_position(end_position_); |
- annotations_.ReadFromStatic<Expression>(reader); |
- function_ = reader->ReadOptional<FunctionNode>(); |
- |
- return this; |
-} |
- |
- |
-Initializer* Initializer::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- Tag tag = reader->ReadTag(); |
- switch (tag) { |
- case kInvalidInitializer: |
- return InvalidInitializer::ReadFromImpl(reader); |
- case kFieldInitializer: |
- return FieldInitializer::ReadFromImpl(reader); |
- case kSuperInitializer: |
- return SuperInitializer::ReadFromImpl(reader); |
- case kRedirectingInitializer: |
- return RedirectingInitializer::ReadFromImpl(reader); |
- case kLocalInitializer: |
- return LocalInitializer::ReadFromImpl(reader); |
- default: |
- UNREACHABLE(); |
- } |
- return NULL; |
-} |
- |
- |
-InvalidInitializer* InvalidInitializer::ReadFromImpl(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- return new InvalidInitializer(); |
-} |
- |
- |
-FieldInitializer* FieldInitializer::ReadFromImpl(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- FieldInitializer* initializer = new FieldInitializer(); |
- initializer->field_reference_ = Reference::ReadMemberFrom(reader); |
- initializer->value_ = Expression::ReadFrom(reader); |
- |
- return initializer; |
-} |
- |
- |
-SuperInitializer* SuperInitializer::ReadFromImpl(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- SuperInitializer* init = new SuperInitializer(); |
- init->target_reference_ = Reference::ReadMemberFrom(reader); |
- init->arguments_ = Arguments::ReadFrom(reader); |
- |
- return init; |
-} |
- |
- |
-RedirectingInitializer* RedirectingInitializer::ReadFromImpl(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- RedirectingInitializer* init = new RedirectingInitializer(); |
- init->target_reference_ = Reference::ReadMemberFrom(reader); |
- init->arguments_ = Arguments::ReadFrom(reader); |
- |
- return init; |
-} |
- |
- |
-LocalInitializer* LocalInitializer::ReadFromImpl(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- LocalInitializer* init = new LocalInitializer(); |
- init->variable_ = VariableDeclaration::ReadFromImpl(reader, false); |
- |
- return init; |
-} |
- |
- |
-Expression* Expression::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- uint8_t payload = 0; |
- Tag tag = reader->ReadTag(&payload); |
- switch (tag) { |
- case kInvalidExpression: |
- return InvalidExpression::ReadFrom(reader); |
- case kVariableGet: |
- return VariableGet::ReadFrom(reader); |
- case kSpecializedVariableGet: |
- return VariableGet::ReadFrom(reader, payload); |
- case kVariableSet: |
- return VariableSet::ReadFrom(reader); |
- case kSpecializedVariableSet: |
- return VariableSet::ReadFrom(reader, payload); |
- case kPropertyGet: |
- return PropertyGet::ReadFrom(reader); |
- case kPropertySet: |
- return PropertySet::ReadFrom(reader); |
- case kDirectPropertyGet: |
- return DirectPropertyGet::ReadFrom(reader); |
- case kDirectPropertySet: |
- return DirectPropertySet::ReadFrom(reader); |
- case kStaticGet: |
- return StaticGet::ReadFrom(reader); |
- case kStaticSet: |
- return StaticSet::ReadFrom(reader); |
- case kMethodInvocation: |
- return MethodInvocation::ReadFrom(reader); |
- case kDirectMethodInvocation: |
- return DirectMethodInvocation::ReadFrom(reader); |
- case kStaticInvocation: |
- return StaticInvocation::ReadFrom(reader, false); |
- case kConstStaticInvocation: |
- return StaticInvocation::ReadFrom(reader, true); |
- case kConstructorInvocation: |
- return ConstructorInvocation::ReadFrom(reader, false); |
- case kConstConstructorInvocation: |
- return ConstructorInvocation::ReadFrom(reader, true); |
- case kNot: |
- return Not::ReadFrom(reader); |
- case kLogicalExpression: |
- return LogicalExpression::ReadFrom(reader); |
- case kConditionalExpression: |
- return ConditionalExpression::ReadFrom(reader); |
- case kStringConcatenation: |
- return StringConcatenation::ReadFrom(reader); |
- case kIsExpression: |
- return IsExpression::ReadFrom(reader); |
- case kAsExpression: |
- return AsExpression::ReadFrom(reader); |
- case kSymbolLiteral: |
- return SymbolLiteral::ReadFrom(reader); |
- case kTypeLiteral: |
- return TypeLiteral::ReadFrom(reader); |
- case kThisExpression: |
- return ThisExpression::ReadFrom(reader); |
- case kRethrow: |
- return Rethrow::ReadFrom(reader); |
- case kThrow: |
- return Throw::ReadFrom(reader); |
- case kListLiteral: |
- return ListLiteral::ReadFrom(reader, false); |
- case kConstListLiteral: |
- return ListLiteral::ReadFrom(reader, true); |
- case kMapLiteral: |
- return MapLiteral::ReadFrom(reader, false); |
- case kConstMapLiteral: |
- return MapLiteral::ReadFrom(reader, true); |
- case kAwaitExpression: |
- return AwaitExpression::ReadFrom(reader); |
- case kFunctionExpression: |
- return FunctionExpression::ReadFrom(reader); |
- case kLet: |
- return Let::ReadFrom(reader); |
- case kVectorCreation: |
- return VectorCreation::ReadFrom(reader); |
- case kVectorGet: |
- return VectorGet::ReadFrom(reader); |
- case kVectorSet: |
- return VectorSet::ReadFrom(reader); |
- case kVectorCopy: |
- return VectorCopy::ReadFrom(reader); |
- case kClosureCreation: |
- return ClosureCreation::ReadFrom(reader); |
- case kBigIntLiteral: |
- return BigintLiteral::ReadFrom(reader); |
- case kStringLiteral: |
- return StringLiteral::ReadFrom(reader); |
- case kSpecialIntLiteral: |
- return IntLiteral::ReadFrom(reader, payload); |
- case kNegativeIntLiteral: |
- return IntLiteral::ReadFrom(reader, true); |
- case kPositiveIntLiteral: |
- return IntLiteral::ReadFrom(reader, false); |
- case kDoubleLiteral: |
- return DoubleLiteral::ReadFrom(reader); |
- case kTrueLiteral: |
- return BoolLiteral::ReadFrom(reader, true); |
- case kFalseLiteral: |
- return BoolLiteral::ReadFrom(reader, false); |
- case kNullLiteral: |
- return NullLiteral::ReadFrom(reader); |
- default: |
- UNREACHABLE(); |
- } |
- return NULL; |
-} |
- |
- |
-InvalidExpression* InvalidExpression::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- InvalidExpression* invalid_expression = new InvalidExpression(); |
- invalid_expression->kernel_offset_ = |
- reader->offset() - 1; // -1 to include tag byte. |
- return invalid_expression; |
-} |
- |
- |
-VariableGet* VariableGet::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- VariableGet* get = new VariableGet(); |
- get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- get->position_ = reader->ReadPosition(); |
- get->variable_kernel_offset_ = reader->ReadUInt(); |
- get->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); |
- ASSERT(get->variable_->kernel_offset_no_tag() == |
- get->variable_kernel_offset_); |
- reader->ReadOptional<DartType>(); // Unused promoted type. |
- return get; |
-} |
- |
- |
-VariableGet* VariableGet::ReadFrom(Reader* reader, uint8_t payload) { |
- TRACE_READ_OFFSET(); |
- VariableGet* get = new VariableGet(); |
- get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- get->position_ = reader->ReadPosition(); |
- get->variable_kernel_offset_ = reader->ReadUInt(); |
- get->variable_ = reader->helper()->variables().Lookup(payload); |
- ASSERT(get->variable_->kernel_offset_no_tag() == |
- get->variable_kernel_offset_); |
- return get; |
-} |
- |
- |
-VariableSet* VariableSet::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- VariableSet* set = new VariableSet(); |
- set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- set->position_ = reader->ReadPosition(); |
- set->variable_kernel_offset_ = reader->ReadUInt(); |
- set->variable_ = reader->helper()->variables().Lookup(reader->ReadUInt()); |
- ASSERT(set->variable_->kernel_offset_no_tag() == |
- set->variable_kernel_offset_); |
- set->expression_ = Expression::ReadFrom(reader); |
- |
- return set; |
-} |
- |
- |
-VariableSet* VariableSet::ReadFrom(Reader* reader, uint8_t payload) { |
- TRACE_READ_OFFSET(); |
- VariableSet* set = new VariableSet(); |
- set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- set->variable_ = reader->helper()->variables().Lookup(payload); |
- set->position_ = reader->ReadPosition(); |
- set->variable_kernel_offset_ = reader->ReadUInt(); |
- ASSERT(set->variable_->kernel_offset_no_tag() == |
- set->variable_kernel_offset_); |
- set->expression_ = Expression::ReadFrom(reader); |
- |
- return set; |
-} |
- |
- |
-PropertyGet* PropertyGet::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- PropertyGet* get = new PropertyGet(); |
- get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- get->position_ = reader->ReadPosition(); |
- get->receiver_ = Expression::ReadFrom(reader); |
- get->name_ = Name::ReadFrom(reader); |
- get->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); |
- |
- return get; |
-} |
- |
- |
-PropertySet* PropertySet::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- PropertySet* set = new PropertySet(); |
- set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- set->position_ = reader->ReadPosition(); |
- set->receiver_ = Expression::ReadFrom(reader); |
- set->name_ = Name::ReadFrom(reader); |
- set->value_ = Expression::ReadFrom(reader); |
- set->interface_target_reference_ = Reference::ReadMemberFrom(reader, true); |
- |
- return set; |
-} |
- |
- |
-DirectPropertyGet* DirectPropertyGet::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- DirectPropertyGet* get = new DirectPropertyGet(); |
- get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- get->position_ = reader->ReadPosition(); |
- get->receiver_ = Expression::ReadFrom(reader); |
- get->target_reference_ = Reference::ReadMemberFrom(reader); |
- |
- return get; |
-} |
- |
- |
-DirectPropertySet* DirectPropertySet::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- DirectPropertySet* set = new DirectPropertySet(); |
- set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- set->position_ = reader->ReadPosition(); |
- set->receiver_ = Expression::ReadFrom(reader); |
- set->target_reference_ = Reference::ReadMemberFrom(reader); |
- set->value_ = Expression::ReadFrom(reader); |
- |
- return set; |
-} |
- |
- |
-StaticGet* StaticGet::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- StaticGet* get = new StaticGet(); |
- get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- get->position_ = reader->ReadPosition(); |
- get->target_reference_ = Reference::ReadMemberFrom(reader); |
- return get; |
-} |
- |
- |
-StaticSet* StaticSet::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- StaticSet* set = new StaticSet(); |
- set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- set->position_ = reader->ReadPosition(); |
- set->target_reference_ = Reference::ReadMemberFrom(reader); |
- set->expression_ = Expression::ReadFrom(reader); |
- |
- return set; |
-} |
- |
- |
-Arguments* Arguments::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- Arguments* arguments = new Arguments(); |
- intptr_t num_arguments = reader->ReadUInt(); |
- arguments->types().ReadFromStatic<DartType>(reader); |
- arguments->positional().ReadFromStatic<Expression>(reader); |
- arguments->named().ReadFromStatic<NamedExpression>(reader); |
- ASSERT(arguments->count() == num_arguments); |
- |
- return arguments; |
-} |
- |
- |
-NamedExpression* NamedExpression::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- StringIndex name_index(reader->ReadUInt()); |
- Expression* expression = Expression::ReadFrom(reader); |
- NamedExpression* named = new NamedExpression(name_index, expression); |
- |
- return named; |
-} |
- |
- |
-MethodInvocation* MethodInvocation::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- MethodInvocation* invocation = new MethodInvocation(); |
- invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- invocation->position_ = reader->ReadPosition(); |
- invocation->receiver_ = Expression::ReadFrom(reader); |
- invocation->name_ = Name::ReadFrom(reader); |
- invocation->arguments_ = Arguments::ReadFrom(reader); |
- invocation->interface_target_reference_ = |
- Reference::ReadMemberFrom(reader, true); |
- |
- return invocation; |
-} |
- |
- |
-DirectMethodInvocation* DirectMethodInvocation::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- DirectMethodInvocation* invocation = new DirectMethodInvocation(); |
- invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- invocation->receiver_ = Expression::ReadFrom(reader); |
- invocation->target_reference_ = Reference::ReadMemberFrom(reader); |
- invocation->arguments_ = Arguments::ReadFrom(reader); |
- |
- return invocation; |
-} |
- |
- |
-StaticInvocation* StaticInvocation::ReadFrom(Reader* reader, bool is_const) { |
- TRACE_READ_OFFSET(); |
- StaticInvocation* invocation = new StaticInvocation(); |
- invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- invocation->is_const_ = is_const; |
- invocation->position_ = reader->ReadPosition(); |
- invocation->procedure_reference_ = Reference::ReadMemberFrom(reader); |
- invocation->arguments_ = Arguments::ReadFrom(reader); |
- |
- return invocation; |
-} |
- |
- |
-ConstructorInvocation* ConstructorInvocation::ReadFrom(Reader* reader, |
- bool is_const) { |
- TRACE_READ_OFFSET(); |
- ConstructorInvocation* invocation = new ConstructorInvocation(); |
- invocation->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- invocation->is_const_ = is_const; |
- invocation->position_ = reader->ReadPosition(); |
- invocation->target_reference_ = Reference::ReadMemberFrom(reader); |
- invocation->arguments_ = Arguments::ReadFrom(reader); |
- |
- return invocation; |
-} |
- |
- |
-Not* Not::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- Not* n = new Not(); |
- n->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- n->expression_ = Expression::ReadFrom(reader); |
- |
- return n; |
-} |
- |
- |
-LogicalExpression* LogicalExpression::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- LogicalExpression* expr = new LogicalExpression(); |
- expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- expr->left_ = Expression::ReadFrom(reader); |
- expr->operator_ = static_cast<Operator>(reader->ReadByte()); |
- expr->right_ = Expression::ReadFrom(reader); |
- |
- return expr; |
-} |
- |
- |
-ConditionalExpression* ConditionalExpression::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- ConditionalExpression* expr = new ConditionalExpression(); |
- expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- expr->condition_ = Expression::ReadFrom(reader); |
- expr->then_ = Expression::ReadFrom(reader); |
- expr->otherwise_ = Expression::ReadFrom(reader); |
- reader->ReadOptional<DartType>(); // Unused static type. |
- |
- return expr; |
-} |
- |
- |
-StringConcatenation* StringConcatenation::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- StringConcatenation* concat = new StringConcatenation(); |
- concat->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- concat->position_ = reader->ReadPosition(); |
- concat->expressions_.ReadFromStatic<Expression>(reader); |
- |
- return concat; |
-} |
- |
- |
-IsExpression* IsExpression::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- IsExpression* expr = new IsExpression(); |
- expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- expr->position_ = reader->ReadPosition(); |
- expr->operand_ = Expression::ReadFrom(reader); |
- expr->type_ = DartType::ReadFrom(reader); |
- |
- return expr; |
-} |
- |
- |
-AsExpression* AsExpression::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- AsExpression* expr = new AsExpression(); |
- expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- expr->position_ = reader->ReadPosition(); |
- expr->operand_ = Expression::ReadFrom(reader); |
- expr->type_ = DartType::ReadFrom(reader); |
- |
- return expr; |
-} |
- |
- |
-StringLiteral* StringLiteral::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- intptr_t offset = reader->offset() - 1; // -1 to include tag byte. |
- StringLiteral* lit = new StringLiteral(StringIndex(reader->ReadUInt())); |
- lit->kernel_offset_ = offset; |
- return lit; |
-} |
- |
- |
-BigintLiteral* BigintLiteral::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- intptr_t offset = reader->offset() - 1; // -1 to include tag byte. |
- BigintLiteral* lit = new BigintLiteral(StringIndex(reader->ReadUInt())); |
- lit->kernel_offset_ = offset; |
- return lit; |
-} |
- |
- |
-IntLiteral* IntLiteral::ReadFrom(Reader* reader, bool is_negative) { |
- TRACE_READ_OFFSET(); |
- IntLiteral* literal = new IntLiteral(); |
- literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- literal->value_ = is_negative ? -static_cast<int64_t>(reader->ReadUInt()) |
- : reader->ReadUInt(); |
- return literal; |
-} |
- |
- |
-IntLiteral* IntLiteral::ReadFrom(Reader* reader, uint8_t payload) { |
- TRACE_READ_OFFSET(); |
- IntLiteral* literal = new IntLiteral(); |
- literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- literal->value_ = static_cast<int32_t>(payload) - SpecializedIntLiteralBias; |
- return literal; |
-} |
- |
- |
-DoubleLiteral* DoubleLiteral::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- DoubleLiteral* literal = new DoubleLiteral(); |
- literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- literal->value_index_ = StringIndex(reader->ReadUInt()); |
- return literal; |
-} |
- |
- |
-BoolLiteral* BoolLiteral::ReadFrom(Reader* reader, bool value) { |
- TRACE_READ_OFFSET(); |
- BoolLiteral* lit = new BoolLiteral(); |
- lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- lit->value_ = value; |
- return lit; |
-} |
- |
- |
-NullLiteral* NullLiteral::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- NullLiteral* lit = new NullLiteral(); |
- lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- return lit; |
-} |
- |
- |
-SymbolLiteral* SymbolLiteral::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- SymbolLiteral* lit = new SymbolLiteral(); |
- lit->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- lit->value_index_ = StringIndex(reader->ReadUInt()); |
- return lit; |
-} |
- |
- |
-TypeLiteral* TypeLiteral::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- TypeLiteral* literal = new TypeLiteral(); |
- literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- literal->type_ = DartType::ReadFrom(reader); |
- return literal; |
-} |
- |
- |
-ThisExpression* ThisExpression::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- ThisExpression* this_expr = new ThisExpression(); |
- this_expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- return this_expr; |
-} |
- |
- |
-Rethrow* Rethrow::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- Rethrow* rethrow = new Rethrow(); |
- rethrow->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- rethrow->position_ = reader->ReadPosition(); |
- return rethrow; |
-} |
- |
- |
-Throw* Throw::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- Throw* t = new Throw(); |
- t->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- t->position_ = reader->ReadPosition(); |
- t->expression_ = Expression::ReadFrom(reader); |
- |
- return t; |
-} |
- |
- |
-ListLiteral* ListLiteral::ReadFrom(Reader* reader, bool is_const) { |
- TRACE_READ_OFFSET(); |
- ListLiteral* literal = new ListLiteral(); |
- literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- literal->is_const_ = is_const; |
- literal->position_ = reader->ReadPosition(); |
- literal->type_ = DartType::ReadFrom(reader); |
- literal->expressions_.ReadFromStatic<Expression>(reader); |
- |
- return literal; |
-} |
- |
- |
-MapLiteral* MapLiteral::ReadFrom(Reader* reader, bool is_const) { |
- TRACE_READ_OFFSET(); |
- MapLiteral* literal = new MapLiteral(); |
- literal->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- literal->is_const_ = is_const; |
- literal->position_ = reader->ReadPosition(); |
- literal->key_type_ = DartType::ReadFrom(reader); |
- literal->value_type_ = DartType::ReadFrom(reader); |
- literal->entries_.ReadFromStatic<MapEntry>(reader); |
- |
- return literal; |
-} |
- |
- |
-MapEntry* MapEntry::ReadFrom(Reader* reader) { |
- MapEntry* entry = new MapEntry(); |
- entry->key_ = Expression::ReadFrom(reader); |
- entry->value_ = Expression::ReadFrom(reader); |
- |
- return entry; |
-} |
- |
- |
-AwaitExpression* AwaitExpression::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- AwaitExpression* await = new AwaitExpression(); |
- await->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- await->operand_ = Expression::ReadFrom(reader); |
- |
- return await; |
-} |
- |
- |
-FunctionExpression* FunctionExpression::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- VariableScope<ReaderHelper> parameters(reader->helper()); |
- FunctionExpression* expr = new FunctionExpression(); |
- expr->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- expr->function_ = FunctionNode::ReadFrom(reader); |
- |
- return expr; |
-} |
- |
- |
-Let* Let::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- VariableScope<ReaderHelper> vars(reader->helper()); |
- PositionScope scope(reader); |
- |
- Let* let = new Let(); |
- let->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- let->variable_ = VariableDeclaration::ReadFromImpl(reader, false); |
- let->body_ = Expression::ReadFrom(reader); |
- let->position_ = reader->min_position(); |
- let->end_position_ = reader->max_position(); |
- |
- return let; |
-} |
- |
- |
-VectorCreation* VectorCreation::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- |
- VectorCreation* vector_creation = new VectorCreation(); |
- vector_creation->kernel_offset_ = |
- reader->offset() - 1; // -1 to include tag byte. |
- vector_creation->value_ = reader->ReadUInt(); |
- |
- return vector_creation; |
-} |
- |
- |
-VectorGet* VectorGet::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- |
- VectorGet* vector_get = new VectorGet(); |
- vector_get->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- vector_get->vector_expression_ = Expression::ReadFrom(reader); |
- vector_get->index_ = reader->ReadUInt(); |
- |
- return vector_get; |
-} |
- |
- |
-VectorSet* VectorSet::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- |
- VectorSet* vector_set = new VectorSet(); |
- vector_set->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- vector_set->vector_expression_ = Expression::ReadFrom(reader); |
- vector_set->index_ = reader->ReadUInt(); |
- vector_set->value_ = Expression::ReadFrom(reader); |
- |
- return vector_set; |
-} |
- |
- |
-VectorCopy* VectorCopy::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- |
- VectorCopy* vector_copy = new VectorCopy(); |
- vector_copy->kernel_offset_ = |
- reader->offset() - 1; // -1 to include tag byte. |
- vector_copy->vector_expression_ = Expression::ReadFrom(reader); |
- |
- return vector_copy; |
-} |
- |
- |
-ClosureCreation* ClosureCreation::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- |
- ClosureCreation* closure_creation = new ClosureCreation(); |
- closure_creation->kernel_offset_ = |
- reader->offset() - 1; // to include tag byte. |
- closure_creation->top_level_function_reference_ = |
- Reference::ReadMemberFrom(reader); |
- closure_creation->context_vector_ = Expression::ReadFrom(reader); |
- closure_creation->function_type_ = |
- FunctionType::Cast(DartType::ReadFrom(reader)); |
- |
- return closure_creation; |
-} |
- |
- |
-Statement* Statement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- Tag tag = reader->ReadTag(); |
- switch (tag) { |
- case kInvalidStatement: |
- return InvalidStatement::ReadFrom(reader); |
- case kExpressionStatement: |
- return ExpressionStatement::ReadFrom(reader); |
- case kBlock: |
- return Block::ReadFromImpl(reader); |
- case kEmptyStatement: |
- return EmptyStatement::ReadFrom(reader); |
- case kAssertStatement: |
- return AssertStatement::ReadFrom(reader); |
- case kLabeledStatement: |
- return LabeledStatement::ReadFrom(reader); |
- case kBreakStatement: |
- return BreakStatement::ReadFrom(reader); |
- case kWhileStatement: |
- return WhileStatement::ReadFrom(reader); |
- case kDoStatement: |
- return DoStatement::ReadFrom(reader); |
- case kForStatement: |
- return ForStatement::ReadFrom(reader); |
- case kForInStatement: |
- return ForInStatement::ReadFrom(reader, false); |
- case kAsyncForInStatement: |
- return ForInStatement::ReadFrom(reader, true); |
- case kSwitchStatement: |
- return SwitchStatement::ReadFrom(reader); |
- case kContinueSwitchStatement: |
- return ContinueSwitchStatement::ReadFrom(reader); |
- case kIfStatement: |
- return IfStatement::ReadFrom(reader); |
- case kReturnStatement: |
- return ReturnStatement::ReadFrom(reader); |
- case kTryCatch: |
- return TryCatch::ReadFrom(reader); |
- case kTryFinally: |
- return TryFinally::ReadFrom(reader); |
- case kYieldStatement: |
- return YieldStatement::ReadFrom(reader); |
- case kVariableDeclaration: |
- return VariableDeclaration::ReadFromImpl(reader, true); |
- case kFunctionDeclaration: |
- return FunctionDeclaration::ReadFrom(reader); |
- default: |
- UNREACHABLE(); |
- } |
- return NULL; |
-} |
- |
- |
-InvalidStatement* InvalidStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- InvalidStatement* stmt = new InvalidStatement(); |
- stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- return stmt; |
-} |
- |
- |
-ExpressionStatement* ExpressionStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- intptr_t offset = reader->offset() - 1; // -1 to include tag byte. |
- ExpressionStatement* stmt = |
- new ExpressionStatement(Expression::ReadFrom(reader)); |
- stmt->kernel_offset_ = offset; |
- |
- return stmt; |
-} |
- |
- |
-Block* Block::ReadFromImpl(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- PositionScope scope(reader); |
- |
- VariableScope<ReaderHelper> vars(reader->helper()); |
- Block* block = new Block(); |
- block->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- block->statements().ReadFromStatic<Statement>(reader); |
- block->position_ = reader->min_position(); |
- block->end_position_ = reader->max_position(); |
- |
- return block; |
-} |
- |
- |
-EmptyStatement* EmptyStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- EmptyStatement* stmt = new EmptyStatement(); |
- stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- return stmt; |
-} |
- |
- |
-AssertStatement* AssertStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- AssertStatement* stmt = new AssertStatement(); |
- stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- stmt->condition_ = Expression::ReadFrom(reader); |
- reader->ReadPosition(); // condition start offset. |
- reader->ReadPosition(); // condition end offset. |
- stmt->message_ = reader->ReadOptional<Expression>(); |
- |
- return stmt; |
-} |
- |
- |
-LabeledStatement* LabeledStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- LabeledStatement* stmt = new LabeledStatement(); |
- stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- |
- reader->helper()->labels()->Push(stmt); |
- stmt->body_ = Statement::ReadFrom(reader); |
- reader->helper()->labels()->Pop(stmt); |
- |
- return stmt; |
-} |
- |
- |
-BreakStatement* BreakStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- BreakStatement* stmt = new BreakStatement(); |
- stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- stmt->position_ = reader->ReadPosition(); |
- stmt->target_index_ = reader->ReadUInt(); |
- return stmt; |
-} |
- |
- |
-WhileStatement* WhileStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- WhileStatement* stmt = new WhileStatement(); |
- stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- stmt->condition_ = Expression::ReadFrom(reader); |
- stmt->body_ = Statement::ReadFrom(reader); |
- |
- return stmt; |
-} |
- |
- |
-DoStatement* DoStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- DoStatement* dostmt = new DoStatement(); |
- dostmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- dostmt->body_ = Statement::ReadFrom(reader); |
- dostmt->condition_ = Expression::ReadFrom(reader); |
- |
- return dostmt; |
-} |
- |
- |
-ForStatement* ForStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- VariableScope<ReaderHelper> vars(reader->helper()); |
- PositionScope scope(reader); |
- |
- ForStatement* forstmt = new ForStatement(); |
- forstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- forstmt->variables_.ReadFromStatic<VariableDeclarationImpl>(reader); |
- forstmt->condition_ = reader->ReadOptional<Expression>(); |
- forstmt->updates_.ReadFromStatic<Expression>(reader); |
- forstmt->body_ = Statement::ReadFrom(reader); |
- forstmt->end_position_ = reader->max_position(); |
- forstmt->position_ = reader->min_position(); |
- |
- return forstmt; |
-} |
- |
- |
-ForInStatement* ForInStatement::ReadFrom(Reader* reader, bool is_async) { |
- TRACE_READ_OFFSET(); |
- VariableScope<ReaderHelper> vars(reader->helper()); |
- PositionScope scope(reader); |
- |
- ForInStatement* forinstmt = new ForInStatement(); |
- forinstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- forinstmt->is_async_ = is_async; |
- forinstmt->position_ = reader->ReadPosition(); |
- forinstmt->variable_ = VariableDeclaration::ReadFromImpl(reader, false); |
- forinstmt->iterable_ = Expression::ReadFrom(reader); |
- forinstmt->body_ = Statement::ReadFrom(reader); |
- forinstmt->end_position_ = reader->max_position(); |
- if (!forinstmt->position_.IsReal()) { |
- forinstmt->position_ = reader->min_position(); |
- } |
- forinstmt->variable_->set_end_position(forinstmt->position_); |
- |
- return forinstmt; |
-} |
- |
- |
-SwitchStatement* SwitchStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- SwitchStatement* stmt = new SwitchStatement(); |
- stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- stmt->condition_ = Expression::ReadFrom(reader); |
- int count = reader->ReadUInt(); |
- stmt->cases_.EnsureInitialized(count); |
- for (intptr_t i = 0; i < count; i++) { |
- SwitchCase* sc = stmt->cases_.GetOrCreate<SwitchCase>(i); |
- sc->ReadFrom(reader); |
- } |
- |
- return stmt; |
-} |
- |
- |
-SwitchCase* SwitchCase::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- int length = reader->ReadListLength(); |
- expressions_.EnsureInitialized(length); |
- |
- for (intptr_t i = 0; i < length; i++) { |
- ASSERT(expressions_[i] == NULL); |
- TokenPosition position = reader->ReadPosition(); |
- expressions_[i] = Expression::ReadFrom(reader); |
- expressions_[i]->set_position(position); |
- } |
- is_default_ = reader->ReadBool(); |
- body_ = Statement::ReadFrom(reader); |
- |
- return this; |
-} |
- |
- |
-ContinueSwitchStatement* ContinueSwitchStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- ContinueSwitchStatement* stmt = new ContinueSwitchStatement(); |
- stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- stmt->target_index_ = reader->ReadUInt(); |
- |
- return stmt; |
-} |
- |
- |
-IfStatement* IfStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- IfStatement* ifstmt = new IfStatement(); |
- ifstmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- ifstmt->condition_ = Expression::ReadFrom(reader); |
- ifstmt->then_ = Statement::ReadFrom(reader); |
- ifstmt->otherwise_ = Statement::ReadFrom(reader); |
- |
- return ifstmt; |
-} |
- |
- |
-ReturnStatement* ReturnStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- ReturnStatement* ret = new ReturnStatement(); |
- ret->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- ret->position_ = reader->ReadPosition(); |
- ret->expression_ = reader->ReadOptional<Expression>(); |
- |
- return ret; |
-} |
- |
- |
-TryCatch* TryCatch::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- PositionScope scope(reader); |
- |
- TryCatch* tc = new TryCatch(); |
- tc->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- tc->body_ = Statement::ReadFrom(reader); |
- reader->ReadBool(); // whether any catch needs a stacktrace. |
- tc->catches_.ReadFromStatic<Catch>(reader); |
- tc->position_ = reader->min_position(); |
- |
- return tc; |
-} |
- |
- |
-Catch* Catch::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- VariableScope<ReaderHelper> vars(reader->helper()); |
- PositionScope scope(reader); |
- |
- Catch* c = new Catch(); |
- c->kernel_offset_ = reader->offset(); // Catch has no tag. |
- c->guard_ = DartType::ReadFrom(reader); |
- c->exception_ = |
- reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>(); |
- c->stack_trace_ = |
- reader->ReadOptional<VariableDeclaration, VariableDeclarationImpl>(); |
- c->body_ = Statement::ReadFrom(reader); |
- c->end_position_ = reader->max_position(); |
- c->position_ = reader->min_position(); |
- |
- return c; |
-} |
- |
- |
-TryFinally* TryFinally::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- TryFinally* tf = new TryFinally(); |
- tf->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- tf->body_ = Statement::ReadFrom(reader); |
- tf->finalizer_ = Statement::ReadFrom(reader); |
- |
- return tf; |
-} |
- |
- |
-YieldStatement* YieldStatement::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- YieldStatement* stmt = new YieldStatement(); |
- stmt->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- stmt->position_ = reader->ReadPosition(); |
- reader->record_yield_token_position(stmt->position_); |
- stmt->flags_ = reader->ReadByte(); |
- stmt->expression_ = Expression::ReadFrom(reader); |
- |
- return stmt; |
-} |
- |
- |
-VariableDeclaration* VariableDeclaration::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- Tag tag = reader->ReadTag(); |
- ASSERT(tag == kVariableDeclaration); |
- return VariableDeclaration::ReadFromImpl(reader, true); |
-} |
- |
- |
-VariableDeclaration* VariableDeclaration::ReadFromImpl(Reader* reader, |
- bool read_tag) { |
- TRACE_READ_OFFSET(); |
- PositionScope scope(reader); |
- |
- VariableDeclaration* decl = new VariableDeclaration(); |
- // -1 or -0 depending on whether there's a tag or not. |
- decl->kernel_offset_ = reader->offset() - (read_tag ? 1 : 0); |
- decl->kernel_offset_no_tag_ = reader->offset(); |
- decl->position_ = reader->ReadPosition(); |
- decl->equals_position_ = reader->ReadPosition(); |
- decl->flags_ = reader->ReadFlags(); |
- decl->name_index_ = StringIndex(reader->ReadUInt()); |
- decl->type_ = DartType::ReadFrom(reader); |
- decl->initializer_ = reader->ReadOptional<Expression>(); |
- |
- // Go to next token position so it ends *after* the last potentially |
- // debuggable position in the initializer. |
- TokenPosition position = reader->max_position(); |
- if (position.IsReal()) position.Next(); |
- decl->end_position_ = position; |
- reader->helper()->variables().Push(decl); |
- |
- return decl; |
-} |
- |
- |
-FunctionDeclaration* FunctionDeclaration::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- FunctionDeclaration* decl = new FunctionDeclaration(); |
- decl->kernel_offset_ = reader->offset() - 1; // -1 to include tag byte. |
- decl->position_ = reader->ReadPosition(); |
- decl->variable_ = VariableDeclaration::ReadFromImpl(reader, false); |
- VariableScope<ReaderHelper> parameters(reader->helper()); |
- decl->function_ = FunctionNode::ReadFrom(reader); |
- |
- return decl; |
-} |
- |
- |
-Name* Name::ReadFrom(Reader* reader) { |
- StringIndex name_index(reader->ReadUInt()); |
- if ((reader->StringLength(name_index) >= 1) && |
- (reader->CharacterAt(name_index, 0) == '_')) { |
- intptr_t library_reference = reader->ReadCanonicalNameReference(); |
- return new Name(name_index, library_reference); |
- } else { |
- return new Name(name_index, NULL); |
- } |
-} |
- |
- |
-DartType* DartType::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- Tag tag = reader->ReadTag(); |
- switch (tag) { |
- case kInvalidType: |
- return InvalidType::ReadFrom(reader); |
- case kDynamicType: |
- return DynamicType::ReadFrom(reader); |
- case kVoidType: |
- return VoidType::ReadFrom(reader); |
- case kBottomType: |
- return BottomType::ReadFrom(reader); |
- case kInterfaceType: |
- return InterfaceType::ReadFrom(reader); |
- case kSimpleInterfaceType: |
- return InterfaceType::ReadFrom(reader, true); |
- case kFunctionType: |
- return FunctionType::ReadFrom(reader); |
- case kSimpleFunctionType: |
- return FunctionType::ReadFrom(reader, true); |
- case kTypeParameterType: |
- return TypeParameterType::ReadFrom(reader); |
- case kVectorType: |
- return VectorType::ReadFrom(reader); |
- case kTypedefType: |
- return TypedefType::ReadFrom(reader); |
- default: |
- UNREACHABLE(); |
- } |
- UNREACHABLE(); |
- return NULL; |
-} |
- |
- |
-InvalidType* InvalidType::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- return new InvalidType(); |
-} |
- |
- |
-DynamicType* DynamicType::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- return new DynamicType(); |
-} |
- |
- |
-VoidType* VoidType::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- return new VoidType(); |
-} |
- |
- |
-BottomType* BottomType::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- return new BottomType(); |
-} |
- |
- |
-InterfaceType* InterfaceType::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- NameIndex klass_name = Reference::ReadClassFrom(reader); |
- InterfaceType* type = new InterfaceType(klass_name); |
- type->type_arguments().ReadFromStatic<DartType>(reader); |
- return type; |
-} |
- |
- |
-InterfaceType* InterfaceType::ReadFrom(Reader* reader, |
- bool _without_type_arguments_) { |
- TRACE_READ_OFFSET(); |
- NameIndex klass_name = Reference::ReadClassFrom(reader); |
- InterfaceType* type = new InterfaceType(klass_name); |
- ASSERT(_without_type_arguments_); |
- return type; |
-} |
- |
- |
-TypedefType* TypedefType::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- NameIndex typedef_name = Reference::ReadTypedefFrom(reader); |
- TypedefType* type = new TypedefType(typedef_name); |
- type->type_arguments().ReadFromStatic<DartType>(reader); |
- return type; |
-} |
- |
- |
-FunctionType* FunctionType::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- FunctionType* type = new FunctionType(); |
- TypeParameterScope<ReaderHelper> scope(reader->helper()); |
- type->type_parameters().ReadFrom(reader); |
- type->required_parameter_count_ = reader->ReadUInt(); |
- intptr_t total_parameter_count = reader->ReadUInt(); |
- type->positional_parameters().ReadFromStatic<DartType>(reader); |
- type->named_parameters().ReadFromStatic<NamedParameter>(reader); |
- ASSERT(type->positional_parameters().length() + |
- type->named_parameters().length() == |
- total_parameter_count); |
- type->return_type_ = DartType::ReadFrom(reader); |
- return type; |
-} |
- |
- |
-FunctionType* FunctionType::ReadFrom(Reader* reader, bool _is_simple_) { |
- TRACE_READ_OFFSET(); |
- FunctionType* type = new FunctionType(); |
- ASSERT(_is_simple_); |
- type->positional_parameters().ReadFromStatic<DartType>(reader); |
- type->required_parameter_count_ = type->positional_parameters().length(); |
- type->return_type_ = DartType::ReadFrom(reader); |
- return type; |
-} |
- |
- |
-TypeParameterType* TypeParameterType::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- TypeParameterType* type = new TypeParameterType(); |
- type->parameter_ = |
- reader->helper()->type_parameters().Lookup(reader->ReadUInt()); |
- reader->ReadUInt(); // binary offset of parameter list |
- reader->ReadUInt(); // index of parameter |
- // There is an optional promoted bound, currently ignored. |
- delete reader->ReadOptional<DartType>(); |
- return type; |
-} |
- |
- |
-VectorType* VectorType::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- VectorType* type = new VectorType(); |
- return type; |
-} |
- |
- |
Program* Program::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
uint32_t magic = reader->ReadUInt32(); |
if (magic != kMagicProgramFile) FATAL("Invalid magic identifier"); |
Program* program = new Program(); |
- reader->helper()->set_program(program); |
+ program->kernel_data_ = reader->buffer(); |
+ program->kernel_data_size_ = reader->size(); |
- // Deserialize the string offset table to give fast access to the string data |
- // during deserialization. |
program->string_table_offset_ = reader->offset(); |
- intptr_t string_count = reader->ReadUInt(); |
- reader->string_offsets_ = new intptr_t[string_count + 1]; |
- intptr_t offset = 0; |
- for (intptr_t i = 0; i < string_count; ++i) { |
- reader->string_offsets_[i] = offset; |
- offset = reader->ReadUInt(); |
- } |
- reader->string_offsets_[string_count] = offset; |
- // Skip the UTF-8 encoded strings. |
- reader->MarkStringDataOffset(); |
- reader->Consume(offset); |
- |
- program->source_table_.ReadFrom(reader); |
- |
- // Deserialize the canonical name table to give fast access to canonical names |
- // during deserialization. |
- program->name_table_offset_ = reader->offset(); |
- intptr_t name_count = reader->ReadUInt(); |
- reader->canonical_name_parents_ = new NameIndex[name_count]; |
- reader->canonical_name_strings_ = new StringIndex[name_count]; |
- for (int i = 0; i < name_count; ++i) { |
- // The parent name index is biased: 0 is the root name and otherwise N+1 is |
- // the Nth name. |
- reader->canonical_name_parents_[i] = reader->ReadCanonicalNameReference(); |
- reader->canonical_name_strings_[i] = StringIndex(reader->ReadUInt()); |
- } |
- int libraries = reader->ReadUInt(); |
- program->libraries().EnsureInitialized(libraries); |
- for (intptr_t i = 0; i < libraries; i++) { |
- program->libraries().GetOrCreate<Library>(i)->ReadFrom(reader); |
- } |
- |
- program->main_method_reference_ = |
- Reference::ReadMemberFrom(reader, /*allow_null=*/true); |
+ // Read backwards at the end. |
+ reader->set_offset(reader->size() - 4); |
+ program->library_count_ = reader->ReadUInt32(); |
+ reader->set_offset(reader->size() - 4 - 4 * program->library_count_ - 2 * 4); |
+ program->name_table_offset_ = reader->ReadUInt32(); |
+ program->main_method_reference_ = NameIndex(reader->ReadUInt32() - 1); |
return program; |
} |
-FunctionNode* FunctionNode::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- TypeParameterScope<ReaderHelper> scope(reader->helper()); |
- |
- FunctionNode* function = new FunctionNode(); |
- // FunctionNode tag not read yet. |
- function->kernel_offset_ = reader->offset(); |
- Tag tag = reader->ReadTag(); |
- ASSERT(tag == kFunctionNode); |
- function->position_ = reader->ReadPosition(); |
- function->end_position_ = reader->ReadPosition(); |
- function->async_marker_ = |
- static_cast<FunctionNode::AsyncMarker>(reader->ReadByte()); |
- function->dart_async_marker_ = |
- static_cast<FunctionNode::AsyncMarker>(reader->ReadByte()); |
- function->type_parameters().ReadFrom(reader); |
- reader->ReadUInt(); // total parameter count. |
- function->required_parameter_count_ = reader->ReadUInt(); |
- function->positional_parameters().ReadFromStatic<VariableDeclarationImpl>( |
- reader); |
- function->named_parameters().ReadFromStatic<VariableDeclarationImpl>(reader); |
- function->return_type_ = DartType::ReadFrom(reader); |
- |
- LabelScope<ReaderHelper, BlockStack<LabeledStatement> > labels( |
- reader->helper()); |
- VariableScope<ReaderHelper> vars(reader->helper()); |
- function->body_ = reader->ReadOptional<Statement>(); |
- |
- return function; |
-} |
- |
- |
-TypeParameter* TypeParameter::ReadFrom(Reader* reader) { |
- TRACE_READ_OFFSET(); |
- kernel_offset_ = reader->offset(); |
- name_index_ = StringIndex(reader->ReadUInt()); |
- bound_ = DartType::ReadFrom(reader); |
- return this; |
-} |
- |
- |
} // namespace kernel |