Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1430)

Unified Diff: runtime/vm/kernel.h

Issue 2411823003: VM support for running Kernel binaries. (Closed)
Patch Set: Address comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/intermediate_language_x64.cc ('k') | runtime/vm/kernel.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/kernel.h
diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
new file mode 100644
index 0000000000000000000000000000000000000000..b6038fc2d119a3b240f720e93b8a158340ca0e3c
--- /dev/null
+++ b/runtime/vm/kernel.h
@@ -0,0 +1,3243 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_KERNEL_H_
+#define VM_KERNEL_H_
+
+#include "platform/assert.h"
+#include "vm/allocation.h"
+#include "vm/globals.h"
+
+#define KERNEL_NODES_DO(M) \
+ M(Name) \
+ M(InferredValue) \
+ M(DartType) \
+ M(InvalidType) \
+ M(DynamicType) \
+ M(VoidType) \
+ M(InterfaceType) \
+ M(FunctionType) \
+ M(TypeParameterType)
+
+#define KERNEL_TREE_NODES_DO(M) \
+ M(Library) \
+ M(Class) \
+ M(NormalClass) \
+ M(MixinClass) \
+ M(Member) \
+ M(Field) \
+ M(Constructor) \
+ M(Procedure) \
+ M(Initializer) \
+ M(InvalidInitializer) \
+ M(FieldInitializer) \
+ M(SuperInitializer) \
+ M(RedirectingInitializer) \
+ M(LocalInitializer) \
+ M(FunctionNode) \
+ M(Expression) \
+ M(InvalidExpression) \
+ M(VariableGet) \
+ M(VariableSet) \
+ M(PropertyGet) \
+ M(PropertySet) \
+ M(DirectPropertyGet) \
+ M(DirectPropertySet) \
+ M(StaticGet) \
+ M(StaticSet) \
+ M(Arguments) \
+ M(NamedExpression) \
+ M(MethodInvocation) \
+ M(DirectMethodInvocation) \
+ M(StaticInvocation) \
+ M(ConstructorInvocation) \
+ M(Not) \
+ M(LogicalExpression) \
+ M(ConditionalExpression) \
+ M(StringConcatenation) \
+ M(IsExpression) \
+ M(AsExpression) \
+ M(BasicLiteral) \
+ M(StringLiteral) \
+ M(BigintLiteral) \
+ M(IntLiteral) \
+ M(DoubleLiteral) \
+ M(BoolLiteral) \
+ M(NullLiteral) \
+ M(SymbolLiteral) \
+ M(TypeLiteral) \
+ M(ThisExpression) \
+ M(Rethrow) \
+ M(Throw) \
+ M(ListLiteral) \
+ M(MapLiteral) \
+ M(MapEntry) \
+ M(AwaitExpression) \
+ M(FunctionExpression) \
+ M(Let) \
+ M(BlockExpression) \
+ M(Statement) \
+ M(InvalidStatement) \
+ M(ExpressionStatement) \
+ M(Block) \
+ M(EmptyStatement) \
+ M(AssertStatement) \
+ M(LabeledStatement) \
+ M(BreakStatement) \
+ M(WhileStatement) \
+ M(DoStatement) \
+ M(ForStatement) \
+ M(ForInStatement) \
+ M(SwitchStatement) \
+ M(SwitchCase) \
+ M(ContinueSwitchStatement) \
+ M(IfStatement) \
+ M(ReturnStatement) \
+ M(TryCatch) \
+ M(Catch) \
+ M(TryFinally) \
+ M(YieldStatement) \
+ M(VariableDeclaration) \
+ M(FunctionDeclaration) \
+ M(TypeParameter) \
+ M(Program)
+
+#define KERNEL_ALL_NODES_DO(M) \
+ M(Node) \
+ KERNEL_NODES_DO(M) \
+ M(TreeNode) \
+ KERNEL_TREE_NODES_DO(M)
+
+#define KERNEL_VISITORS_DO(M) \
+ M(ExpressionVisitor) \
+ M(StatementVisitor) \
+ M(MemberVisitor) \
+ M(ClassVisitor) \
+ M(InitializerVisitor) \
+ M(DartTypeVisitor) \
+ M(ClassReferenceVisitor) \
+ M(MemberReferenceVisitor) \
+ M(TreeVisitor) \
+ M(Visitor)
+
+namespace dart {
+
+namespace kernel {
+
+
+class Reader;
+class TreeNode;
+class TypeParameter;
+class Writer;
+
+// Boxes a value of type `T*` and `delete`s it on destruction.
+template <typename T>
+class Child {
+ public:
+ Child() : pointer_(NULL) {}
+ explicit Child(T* value) : pointer_(value) {}
+
+ ~Child() { delete pointer_; }
+
+ // Support `Child<T> box = T* obj`.
+ T*& operator=(T* value) {
+ ASSERT(pointer_ == NULL);
+ return pointer_ = value;
+ }
+
+ // Implicitly convert `Child<T>` to `T*`.
+ operator T*&() { return pointer_; }
+
+ T* operator->() { return pointer_; }
+
+ private:
+ T* pointer_;
+};
+
+// Boxes a value of type `T*` (only used to mark a member as a weak reference).
+template <typename T>
+class Ref {
+ public:
+ Ref() : pointer_(NULL) {}
+ explicit Ref(T* value) : pointer_(value) {}
+
+ // Support `Ref<T> box = T* obj`.
+ T*& operator=(T* value) {
+ ASSERT(pointer_ == NULL);
+ return pointer_ = value;
+ }
+
+ // Implicitly convert `Ref<T>` to `T*`.
+ operator T*&() { return pointer_; }
+
+ T* operator->() { return pointer_; }
+
+ private:
+ T* pointer_;
+};
+
+
+template <typename T>
+class List {
+ public:
+ List() : array_(NULL), length_(0) {}
+ ~List();
+
+ template <typename IT>
+ void ReadFrom(Reader* reader);
+
+ template <typename IT>
+ void ReadFrom(Reader* reader, TreeNode* parent);
+
+ template <typename IT>
+ void ReadFromStatic(Reader* reader);
+
+ void WriteTo(Writer* writer);
+
+ template <typename IT>
+ void WriteToStatic(Writer* writer);
+
+ // Extends the array to at least be able to hold [length] elements.
+ //
+ // Free places will be filled with `NULL` values.
+ void EnsureInitialized(int length);
+
+ // Returns element at [index].
+ //
+ // If the array is not big enough, it will be grown via `EnsureInitialized`.
+ // If the element doesn't exist, it will be created via `new IT()`.
+ template <typename IT>
+ IT* GetOrCreate(int index);
+
+ template <typename IT, typename PT>
+ IT* GetOrCreate(int index, PT* parent);
+
+ // Returns element at [index].
+ T*& operator[](int index) {
+ ASSERT(index < length_);
+ return array_[index];
+ }
+
+ int length() { return length_; }
+
+ T** raw_array() { return array_; }
+
+ private:
+ T** array_;
+ int length_;
+
+ DISALLOW_COPY_AND_ASSIGN(List);
+};
+
+
+class TypeParameterList : public List<TypeParameter> {
+ public:
+ void ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+};
+
+
+template <typename A, typename B>
+class Tuple {
+ public:
+ static Tuple<A, B>* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ Tuple(A* a, B* b) : first_(a), second_(b) {}
+
+ A* first() { return first_; }
+ B* second() { return second_; }
+
+ private:
+ Tuple() {}
+
+ Ref<A> first_;
+ Child<B> second_;
+
+ DISALLOW_COPY_AND_ASSIGN(Tuple);
+};
+
+
+class String {
+ public:
+ static String* ReadFrom(Reader* reader);
+ static String* ReadFromImpl(Reader* reader);
+ void WriteTo(Writer* writer);
+ void WriteToImpl(Writer* writer);
+
+ String(const uint8_t* utf8, int length) {
+ buffer_ = new uint8_t[length];
+ size_ = length;
+ memmove(buffer_, utf8, length);
+ }
+ ~String() { delete[] buffer_; }
+
+ uint8_t* buffer() { return buffer_; }
+ int size() { return size_; }
+
+ bool is_empty() { return size_ == 0; }
+
+ private:
+ uint8_t* buffer_;
+ int size_;
+
+ DISALLOW_COPY_AND_ASSIGN(String);
+};
+
+
+class StringTable {
+ public:
+ void ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ List<String>& strings() { return strings_; }
+
+ private:
+ StringTable() {}
+
+ friend class Program;
+
+ List<String> strings_;
+
+ DISALLOW_COPY_AND_ASSIGN(StringTable);
+};
+
+
+class LineStartingTable {
+ public:
+ void ReadFrom(Reader* reader, intptr_t length);
+ void WriteTo(Writer* writer);
+ ~LineStartingTable() {
+ for (intptr_t i = 0; i < size_; ++i) {
+ delete[] values_[i];
+ }
+ delete[] values_;
+ }
+
+ intptr_t size() { return size_; }
+ intptr_t* valuesFor(int i) { return values_[i]; }
+
+ private:
+ LineStartingTable() : values_(NULL), size_(0) {}
+
+ friend class Program;
+
+ intptr_t** values_;
+ intptr_t size_;
+
+ DISALLOW_COPY_AND_ASSIGN(LineStartingTable);
+};
+
+// Forward declare all classes.
+#define DO(name) class name;
+KERNEL_ALL_NODES_DO(DO)
+KERNEL_VISITORS_DO(DO)
+#undef DO
+
+
+#define DEFINE_CASTING_OPERATIONS(klass) \
+ virtual bool Is##klass() { return true; } \
+ \
+ static klass* Cast(Node* node) { \
+ ASSERT(node == NULL || node->Is##klass()); \
+ return static_cast<klass*>(node); \
+ } \
+ \
+ virtual Node::NodeType Type() { return Node::kType##klass; }
+
+#define DEFINE_IS_OPERATION(klass) \
+ virtual bool Is##klass() { return false; }
+
+#define DEFINE_ALL_IS_OPERATIONS() \
+ KERNEL_NODES_DO(DEFINE_IS_OPERATION) \
+ DEFINE_IS_OPERATION(TreeNode) \
+ KERNEL_TREE_NODES_DO(DEFINE_IS_OPERATION)
+
+
+class Node {
+ public:
+ virtual ~Node();
+
+ enum NodeType {
+#define DO(name) kType##name,
+ KERNEL_ALL_NODES_DO(DO)
+#undef DO
+
+ kNumTypes
+ };
+
+ DEFINE_ALL_IS_OPERATIONS();
+ DEFINE_CASTING_OPERATIONS(Node);
+
+ virtual void AcceptVisitor(Visitor* visitor) = 0;
+ virtual void VisitChildren(Visitor* visitor) = 0;
+
+ protected:
+ Node() { }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Node);
+};
+
+
+class TreeNode : public Node {
+ public:
+ virtual ~TreeNode();
+
+ DEFINE_CASTING_OPERATIONS(TreeNode);
+
+ virtual void AcceptVisitor(Visitor* visitor);
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor) = 0;
+
+ protected:
+ TreeNode() {}
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TreeNode);
+};
+
+
+class Library : public TreeNode {
+ public:
+ Library* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~Library();
+
+ DEFINE_CASTING_OPERATIONS(Library);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ String* import_uri() { return import_uri_; }
+ String* name() { return name_; }
+ List<Class>& classes() { return classes_; }
+ List<Field>& fields() { return fields_; }
+ List<Procedure>& procedures() { return procedures_; }
+
+ bool IsCorelibrary() {
+ static const char* dart_library = "dart:";
+ static intptr_t dart_library_length = strlen(dart_library);
+ static const char* patch_library = "dart:_patch";
+ static intptr_t patch_library_length = strlen(patch_library);
+
+ if (name_->size() < 5) return false;
+
+ // Check for dart: prefix.
+ char* buffer = reinterpret_cast<char*>(import_uri_->buffer());
+ if (strncmp(buffer, dart_library, dart_library_length) != 0) {
+ return false;
+ }
+
+ // Rasta emits dart:_patch and we should treat it as a user library.
+ if (name_->size() == patch_library_length &&
+ strncmp(buffer, patch_library, patch_library_length) == 0) {
+ return false;
+ }
+ return true;
+ }
+
+ private:
+ Library() : name_(NULL) {}
+
+ template <typename T>
+ friend class List;
+
+ Ref<String> name_;
+ Ref<String> import_uri_;
+ List<Class> classes_;
+ List<Field> fields_;
+ List<Procedure> procedures_;
+
+ DISALLOW_COPY_AND_ASSIGN(Library);
+};
+
+
+class Class : public TreeNode {
+ public:
+ Class* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~Class();
+
+ DEFINE_CASTING_OPERATIONS(Class);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void AcceptClassVisitor(ClassVisitor* visitor) = 0;
+ virtual void AcceptReferenceVisitor(ClassReferenceVisitor* visitor) = 0;
+
+ Library* parent() { return parent_; }
+ String* name() { return name_; }
+ bool is_abstract() { return is_abstract_; }
+ List<Expression>& annotations() { return annotations_; }
+
+ virtual List<TypeParameter>& type_parameters() = 0;
+ virtual List<InterfaceType>& implemented_classes() = 0;
+ virtual List<Field>& fields() = 0;
+ virtual List<Constructor>& constructors() = 0;
+ virtual List<Procedure>& procedures() = 0;
+
+ protected:
+ Class() : is_abstract_(false) {}
+
+ private:
+ template <typename T>
+ friend class List;
+
+ Ref<Library> parent_;
+ Ref<String> name_;
+ bool is_abstract_;
+ List<Expression> annotations_;
+
+ DISALLOW_COPY_AND_ASSIGN(Class);
+};
+
+
+class NormalClass : public Class {
+ public:
+ NormalClass* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~NormalClass();
+
+ DEFINE_CASTING_OPERATIONS(NormalClass);
+
+ virtual void AcceptClassVisitor(ClassVisitor* visitor);
+ virtual void AcceptReferenceVisitor(ClassReferenceVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ virtual TypeParameterList& type_parameters() { return type_parameters_; }
+ InterfaceType* super_class() { return super_class_; }
+ virtual List<InterfaceType>& implemented_classes() {
+ return implemented_classes_;
+ }
+ virtual List<Constructor>& constructors() { return constructors_; }
+ virtual List<Procedure>& procedures() { return procedures_; }
+ virtual List<Field>& fields() { return fields_; }
+
+ private:
+ NormalClass() {}
+
+ template <typename T>
+ friend class List;
+
+ TypeParameterList type_parameters_;
+ Child<InterfaceType> super_class_;
+ List<InterfaceType> implemented_classes_;
+ List<Constructor> constructors_;
+ List<Procedure> procedures_;
+ List<Field> fields_;
+
+ DISALLOW_COPY_AND_ASSIGN(NormalClass);
+};
+
+
+class MixinClass : public Class {
+ public:
+ MixinClass* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~MixinClass();
+
+ DEFINE_CASTING_OPERATIONS(MixinClass);
+
+ virtual void AcceptClassVisitor(ClassVisitor* visitor);
+ virtual void AcceptReferenceVisitor(ClassReferenceVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ virtual TypeParameterList& type_parameters() { return type_parameters_; }
+ InterfaceType* first() { return first_; }
+ InterfaceType* second() { return second_; }
+ virtual List<InterfaceType>& implemented_classes() {
+ return implemented_classes_;
+ }
+ virtual List<Constructor>& constructors() { return constructors_; }
+ virtual List<Field>& fields() { return fields_; }
+ virtual List<Procedure>& procedures() { return procedures_; }
+
+ private:
+ MixinClass() {}
+
+ template <typename T>
+ friend class List;
+
+ TypeParameterList type_parameters_;
+ Child<InterfaceType> first_;
+ Child<InterfaceType> second_;
+ List<InterfaceType> implemented_classes_;
+ List<Constructor> constructors_;
+
+ // Dummy instances which are empty lists.
+ List<Field> fields_;
+ List<Procedure> procedures_;
+
+ DISALLOW_COPY_AND_ASSIGN(MixinClass);
+};
+
+
+class Member : public TreeNode {
+ public:
+ virtual ~Member();
+
+ DEFINE_CASTING_OPERATIONS(Member);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void AcceptMemberVisitor(MemberVisitor* visitor) = 0;
+ virtual void AcceptReferenceVisitor(MemberReferenceVisitor* visitor) = 0;
+
+ TreeNode* parent() { return parent_; }
+ Name* name() { return name_; }
+ List<Expression>& annotations() { return annotations_; }
+
+ protected:
+ Member() { }
+
+ template <typename T>
+ friend class List;
+
+ Ref<TreeNode> parent_;
+ Child<Name> name_;
+ List<Expression> annotations_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Member);
+};
+
+
+class Field : public Member {
+ public:
+ enum Flags {
+ kFlagFinal = 1 << 0,
+ kFlagConst = 1 << 1,
+ kFlagStatic = 1 << 2,
+ };
+
+ Field* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~Field();
+
+ DEFINE_CASTING_OPERATIONS(Field);
+
+ virtual void AcceptMemberVisitor(MemberVisitor* visitor);
+ virtual void AcceptReferenceVisitor(MemberReferenceVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ bool IsConst() { return (flags_ & kFlagConst) == kFlagConst; }
+ bool IsFinal() { return (flags_ & kFlagFinal) == kFlagFinal; }
+ bool IsStatic() { return (flags_ & kFlagStatic) == kFlagStatic; }
+
+ DartType* type() { return type_; }
+ InferredValue* inferred_value() { return inferred_value_; }
+ Expression* initializer() { return initializer_; }
+
+ private:
+ Field() {}
+
+ template <typename T>
+ friend class List;
+
+ word flags_;
+ Child<DartType> type_;
+ Child<InferredValue> inferred_value_;
+ Child<Expression> initializer_;
+
+ DISALLOW_COPY_AND_ASSIGN(Field);
+};
+
+
+class Constructor : public Member {
+ public:
+ enum Flags {
+ kFlagConst = 1 << 0,
+ kFlagExternal = 1 << 1,
+ };
+
+ Constructor* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~Constructor();
+
+ DEFINE_CASTING_OPERATIONS(Constructor);
+
+ virtual void AcceptMemberVisitor(MemberVisitor* visitor);
+ virtual void AcceptReferenceVisitor(MemberReferenceVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ bool IsExternal() { return (flags_ & kFlagExternal) == kFlagExternal; }
+ bool IsConst() { return (flags_ & kFlagConst) == kFlagConst; }
+
+ FunctionNode* function() { return function_; }
+ List<Initializer>& initializers() { return initializers_; }
+
+ private:
+ template <typename T>
+ friend class List;
+
+ Constructor() {}
+
+ uint8_t flags_;
+ Child<FunctionNode> function_;
+ List<Initializer> initializers_;
+
+ DISALLOW_COPY_AND_ASSIGN(Constructor);
+};
+
+
+class Procedure : public Member {
+ public:
+ enum Flags {
+ kFlagStatic = 1 << 0,
+ kFlagAbstract = 1 << 1,
+ kFlagExternal = 1 << 2,
+ kFlagConst = 1 << 3, // Only for external const factories.
+ };
+
+ // Keep in sync with package:dynamo/lib/ast.dart:ProcedureKind
+ enum ProcedureKind {
+ kMethod,
+ kGetter,
+ kSetter,
+ kOperator,
+ kFactory,
+
+ kIncompleteProcedure = 255
+ };
+
+ Procedure* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~Procedure();
+
+ DEFINE_CASTING_OPERATIONS(Procedure);
+
+ virtual void AcceptMemberVisitor(MemberVisitor* visitor);
+ virtual void AcceptReferenceVisitor(MemberReferenceVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ ProcedureKind kind() { return kind_; }
+ FunctionNode* function() { return function_; }
+
+ bool IsStatic() { return (flags_ & kFlagStatic) == kFlagStatic; }
+ bool IsAbstract() { return (flags_ & kFlagAbstract) == kFlagAbstract; }
+ bool IsExternal() { return (flags_ & kFlagExternal) == kFlagExternal; }
+ bool IsConst() { return (flags_ & kFlagConst) == kFlagConst; }
+
+ private:
+ Procedure() : kind_(kIncompleteProcedure), flags_(0), function_(NULL) {}
+
+ template <typename T>
+ friend class List;
+
+ ProcedureKind kind_;
+ word flags_;
+ Child<FunctionNode> function_;
+
+ DISALLOW_COPY_AND_ASSIGN(Procedure);
+};
+
+
+class Initializer : public TreeNode {
+ public:
+ static Initializer* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer) = 0;
+
+ virtual ~Initializer();
+
+ DEFINE_CASTING_OPERATIONS(Initializer);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void AcceptInitializerVisitor(InitializerVisitor* visitor) = 0;
+
+ protected:
+ Initializer() { }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Initializer);
+};
+
+
+class InvalidInitializer : public Initializer {
+ public:
+ static InvalidInitializer* ReadFromImpl(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~InvalidInitializer();
+
+ DEFINE_CASTING_OPERATIONS(InvalidInitializer);
+ virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ private:
+ InvalidInitializer() { }
+
+ DISALLOW_COPY_AND_ASSIGN(InvalidInitializer);
+};
+
+
+class FieldInitializer : public Initializer {
+ public:
+ static FieldInitializer* ReadFromImpl(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~FieldInitializer();
+
+ DEFINE_CASTING_OPERATIONS(FieldInitializer);
+
+ virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Field* field() { return field_; }
+ Expression* value() { return value_; }
+
+ private:
+ FieldInitializer() {}
+
+ Ref<Field> field_;
+ Child<Expression> value_;
+
+ DISALLOW_COPY_AND_ASSIGN(FieldInitializer);
+};
+
+
+class SuperInitializer : public Initializer {
+ public:
+ static SuperInitializer* ReadFromImpl(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~SuperInitializer();
+
+ DEFINE_CASTING_OPERATIONS(SuperInitializer);
+
+ virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Constructor* target() { return target_; }
+ Arguments* arguments() { return arguments_; }
+
+ private:
+ SuperInitializer() {}
+
+ Ref<Constructor> target_;
+ Child<Arguments> arguments_;
+
+ DISALLOW_COPY_AND_ASSIGN(SuperInitializer);
+};
+
+
+class RedirectingInitializer : public Initializer {
+ public:
+ static RedirectingInitializer* ReadFromImpl(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~RedirectingInitializer();
+
+ DEFINE_CASTING_OPERATIONS(RedirectingInitializer);
+
+ virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Constructor* target() { return target_; }
+ Arguments* arguments() { return arguments_; }
+
+ private:
+ RedirectingInitializer() {}
+
+ Ref<Constructor> target_;
+ Child<Arguments> arguments_;
+
+ DISALLOW_COPY_AND_ASSIGN(RedirectingInitializer);
+};
+
+
+class LocalInitializer : public Initializer {
+ public:
+ static LocalInitializer* ReadFromImpl(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~LocalInitializer();
+
+ DEFINE_CASTING_OPERATIONS(LocalInitializer);
+
+ virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ VariableDeclaration* variable() { return variable_; }
+
+ private:
+ LocalInitializer() {}
+
+ Child<VariableDeclaration> variable_;
+
+ DISALLOW_COPY_AND_ASSIGN(LocalInitializer);
+};
+
+
+class FunctionNode : public TreeNode {
+ public:
+ enum AsyncMarker {
+ kSync = 0,
+ kSyncStar = 1,
+ kAsync = 2,
+ kAsyncStar = 3,
+ kSyncYielding = 4,
+ };
+
+ static FunctionNode* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~FunctionNode();
+
+ DEFINE_CASTING_OPERATIONS(FunctionNode);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ AsyncMarker async_marker() { return async_marker_; }
+ TypeParameterList& type_parameters() { return type_parameters_; }
+ int required_parameter_count() { return required_parameter_count_; }
+ List<VariableDeclaration>& positional_parameters() {
+ return positional_parameters_;
+ }
+ List<VariableDeclaration>& named_parameters() { return named_parameters_; }
+ DartType* return_type() { return return_type_; }
+ InferredValue* inferred_return_value() { return inferred_return_value_; }
+ Statement* body() { return body_; }
+
+ private:
+ FunctionNode() {}
+
+ AsyncMarker async_marker_;
+ TypeParameterList type_parameters_;
+ int required_parameter_count_;
+ List<VariableDeclaration> positional_parameters_;
+ List<VariableDeclaration> named_parameters_;
+ Child<DartType> return_type_;
+ Child<InferredValue> inferred_return_value_;
+ Child<Statement> body_;
+
+ DISALLOW_COPY_AND_ASSIGN(FunctionNode);
+};
+
+
+class Expression : public TreeNode {
+ public:
+ static Expression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer) = 0;
+
+ virtual ~Expression();
+
+ DEFINE_CASTING_OPERATIONS(Expression);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor) = 0;
+
+ protected:
+ Expression() { }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Expression);
+};
+
+
+class InvalidExpression : public Expression {
+ public:
+ static InvalidExpression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~InvalidExpression();
+ virtual void VisitChildren(Visitor* visitor);
+
+ DEFINE_CASTING_OPERATIONS(InvalidExpression);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+
+ private:
+ InvalidExpression() { }
+
+ DISALLOW_COPY_AND_ASSIGN(InvalidExpression);
+};
+
+
+class VariableGet : public Expression {
+ public:
+ static VariableGet* ReadFrom(Reader* reader);
+ static VariableGet* ReadFrom(Reader* reader, uint8_t payload);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~VariableGet();
+
+ DEFINE_CASTING_OPERATIONS(VariableGet);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ VariableDeclaration* variable() { return variable_; }
+
+ private:
+ VariableGet() {}
+
+ Ref<VariableDeclaration> variable_;
+
+ DISALLOW_COPY_AND_ASSIGN(VariableGet);
+};
+
+
+class VariableSet : public Expression {
+ public:
+ static VariableSet* ReadFrom(Reader* reader);
+ static VariableSet* ReadFrom(Reader* reader, uint8_t payload);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~VariableSet();
+
+ DEFINE_CASTING_OPERATIONS(VariableSet);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ VariableDeclaration* variable() { return variable_; }
+ Expression* expression() { return expression_; }
+
+ private:
+ VariableSet() {}
+
+ Ref<VariableDeclaration> variable_;
+ Child<Expression> expression_;
+
+ DISALLOW_COPY_AND_ASSIGN(VariableSet);
+};
+
+
+class PropertyGet : public Expression {
+ public:
+ static PropertyGet* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~PropertyGet();
+
+ DEFINE_CASTING_OPERATIONS(PropertyGet);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* receiver() { return receiver_; }
+ Name* name() { return name_; }
+
+ private:
+ PropertyGet() {}
+
+ Child<Expression> receiver_;
+ Child<Name> name_;
+ Ref<Member> interfaceTarget_;
+
+ DISALLOW_COPY_AND_ASSIGN(PropertyGet);
+};
+
+
+class PropertySet : public Expression {
+ public:
+ static PropertySet* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~PropertySet();
+
+ DEFINE_CASTING_OPERATIONS(PropertySet);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* receiver() { return receiver_; }
+ Name* name() { return name_; }
+ Expression* value() { return value_; }
+
+ private:
+ PropertySet() {}
+
+ Child<Expression> receiver_;
+ Child<Name> name_;
+ Child<Expression> value_;
+ Ref<Member> interfaceTarget_;
+
+ DISALLOW_COPY_AND_ASSIGN(PropertySet);
+};
+
+
+class DirectPropertyGet : public Expression {
+ public:
+ static DirectPropertyGet* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~DirectPropertyGet();
+
+ DEFINE_CASTING_OPERATIONS(DirectPropertyGet);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* receiver() { return receiver_; }
+ Member* target() { return target_; }
+
+ private:
+ DirectPropertyGet() {}
+
+ Child<Expression> receiver_;
+ Ref<Member> target_;
+
+ DISALLOW_COPY_AND_ASSIGN(DirectPropertyGet);
+};
+
+
+class DirectPropertySet : public Expression {
+ public:
+ static DirectPropertySet* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~DirectPropertySet();
+
+ DEFINE_CASTING_OPERATIONS(DirectPropertySet);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* receiver() { return receiver_; }
+ Member* target() { return target_; }
+ Expression* value() { return value_; }
+
+ private:
+ DirectPropertySet() {}
+
+ Child<Expression> receiver_;
+ Ref<Member> target_;
+ Child<Expression> value_;
+
+ DISALLOW_COPY_AND_ASSIGN(DirectPropertySet);
+};
+
+
+class StaticGet : public Expression {
+ public:
+ static StaticGet* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~StaticGet();
+
+ DEFINE_CASTING_OPERATIONS(StaticGet);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Member* target() { return target_; }
+
+ private:
+ StaticGet() {}
+
+ Ref<Member> target_;
+
+ DISALLOW_COPY_AND_ASSIGN(StaticGet);
+};
+
+
+class StaticSet : public Expression {
+ public:
+ static StaticSet* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~StaticSet();
+
+ DEFINE_CASTING_OPERATIONS(StaticSet);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Member* target() { return target_; }
+ Expression* expression() { return expression_; }
+
+ private:
+ StaticSet() {}
+
+ Ref<Member> target_;
+ Child<Expression> expression_;
+
+ DISALLOW_COPY_AND_ASSIGN(StaticSet);
+};
+
+
+class Arguments : public TreeNode {
+ public:
+ static Arguments* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~Arguments();
+
+ DEFINE_CASTING_OPERATIONS(Arguments);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ List<DartType>& types() { return types_; }
+ List<Expression>& positional() { return positional_; }
+ List<NamedExpression>& named() { return named_; }
+
+ int count() { return positional_.length() + named_.length(); }
+
+ private:
+ Arguments() {}
+
+ List<DartType> types_;
+ List<Expression> positional_;
+ List<NamedExpression> named_;
+
+ DISALLOW_COPY_AND_ASSIGN(Arguments);
+};
+
+
+class NamedExpression : public TreeNode {
+ public:
+ static NamedExpression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ NamedExpression(String* name, Expression* expr)
+ : name_(name), expression_(expr) {}
+ virtual ~NamedExpression();
+
+ DEFINE_CASTING_OPERATIONS(NamedExpression);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ String* name() { return name_; }
+ Expression* expression() { return expression_; }
+
+ private:
+ NamedExpression() {}
+
+ Ref<String> name_;
+ Child<Expression> expression_;
+
+ DISALLOW_COPY_AND_ASSIGN(NamedExpression);
+};
+
+
+class MethodInvocation : public Expression {
+ public:
+ static MethodInvocation* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~MethodInvocation();
+
+ DEFINE_CASTING_OPERATIONS(MethodInvocation);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* receiver() { return receiver_; }
+ Name* name() { return name_; }
+ Arguments* arguments() { return arguments_; }
+
+ private:
+ MethodInvocation() {}
+
+ Child<Expression> receiver_;
+ Child<Name> name_;
+ Child<Arguments> arguments_;
+ Ref<Member> interfaceTarget_;
+
+ DISALLOW_COPY_AND_ASSIGN(MethodInvocation);
+};
+
+
+class DirectMethodInvocation : public Expression {
+ public:
+ static DirectMethodInvocation* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~DirectMethodInvocation();
+
+ DEFINE_CASTING_OPERATIONS(DirectMethodInvocation);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* receiver() { return receiver_; }
+ Procedure* target() { return target_; }
+ Arguments* arguments() { return arguments_; }
+
+ private:
+ DirectMethodInvocation() {}
+
+ Child<Expression> receiver_;
+ Ref<Procedure> target_;
+ Child<Arguments> arguments_;
+
+ DISALLOW_COPY_AND_ASSIGN(DirectMethodInvocation);
+};
+
+
+class StaticInvocation : public Expression {
+ public:
+ static StaticInvocation* ReadFrom(Reader* reader, bool is_const);
+ virtual void WriteTo(Writer* writer);
+
+ explicit StaticInvocation(Procedure* procedure, Arguments* args,
+ bool is_const)
+ : procedure_(procedure), arguments_(args), is_const_(is_const) {}
+ ~StaticInvocation();
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Procedure* procedure() { return procedure_; }
+ Arguments* arguments() { return arguments_; }
+ bool is_const() { return is_const_; }
+
+ private:
+ StaticInvocation() {}
+
+ Ref<Procedure> procedure_;
+ Child<Arguments> arguments_;
+ bool is_const_;
+
+ DISALLOW_COPY_AND_ASSIGN(StaticInvocation);
+};
+
+
+class ConstructorInvocation : public Expression {
+ public:
+ static ConstructorInvocation* ReadFrom(Reader* reader, bool is_const);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~ConstructorInvocation();
+
+ DEFINE_CASTING_OPERATIONS(ConstructorInvocation);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ bool is_const() { return is_const_; }
+ Constructor* target() { return target_; }
+ Arguments* arguments() { return arguments_; }
+
+ private:
+ ConstructorInvocation() {}
+
+ bool is_const_;
+ Ref<Constructor> target_;
+ Child<Arguments> arguments_;
+
+ DISALLOW_COPY_AND_ASSIGN(ConstructorInvocation);
+};
+
+
+class Not : public Expression {
+ public:
+ static Not* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~Not();
+
+ DEFINE_CASTING_OPERATIONS(Not);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* expression() { return expression_; }
+
+ private:
+ Not() {}
+
+ Child<Expression> expression_;
+
+ DISALLOW_COPY_AND_ASSIGN(Not);
+};
+
+
+class LogicalExpression : public Expression {
+ public:
+ enum Operator { kAnd, kOr };
+
+ static LogicalExpression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~LogicalExpression();
+
+ DEFINE_CASTING_OPERATIONS(LogicalExpression);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* left() { return left_; }
+ Operator op() { return operator_; }
+ Expression* right() { return right_; }
+
+ private:
+ LogicalExpression() {}
+
+ Child<Expression> left_;
+ Operator operator_;
+ Child<Expression> right_;
+
+ DISALLOW_COPY_AND_ASSIGN(LogicalExpression);
+};
+
+
+class ConditionalExpression : public Expression {
+ public:
+ static ConditionalExpression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~ConditionalExpression();
+
+ DEFINE_CASTING_OPERATIONS(ConditionalExpression);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* condition() { return condition_; }
+ Expression* then() { return then_; }
+ Expression* otherwise() { return otherwise_; }
+
+ private:
+ ConditionalExpression() {}
+
+ Child<Expression> condition_;
+ Child<Expression> then_;
+ Child<Expression> otherwise_;
+
+ DISALLOW_COPY_AND_ASSIGN(ConditionalExpression);
+};
+
+
+class StringConcatenation : public Expression {
+ public:
+ static StringConcatenation* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~StringConcatenation();
+
+ DEFINE_CASTING_OPERATIONS(StringConcatenation);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ List<Expression>& expressions() { return expressions_; }
+
+ private:
+ StringConcatenation() {}
+
+ List<Expression> expressions_;
+
+ DISALLOW_COPY_AND_ASSIGN(StringConcatenation);
+};
+
+
+class IsExpression : public Expression {
+ public:
+ static IsExpression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~IsExpression();
+
+ DEFINE_CASTING_OPERATIONS(IsExpression);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* operand() { return operand_; }
+ DartType* type() { return type_; }
+
+ private:
+ IsExpression() {}
+
+ Child<Expression> operand_;
+ Child<DartType> type_;
+
+ DISALLOW_COPY_AND_ASSIGN(IsExpression);
+};
+
+
+class AsExpression : public Expression {
+ public:
+ static AsExpression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~AsExpression();
+
+ DEFINE_CASTING_OPERATIONS(AsExpression);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* operand() { return operand_; }
+ DartType* type() { return type_; }
+
+ private:
+ AsExpression() {}
+
+ Child<Expression> operand_;
+ Child<DartType> type_;
+
+ DISALLOW_COPY_AND_ASSIGN(AsExpression);
+};
+
+
+class BasicLiteral : public Expression {
+ public:
+ virtual ~BasicLiteral();
+
+ DEFINE_CASTING_OPERATIONS(BasicLiteral);
+
+ virtual void VisitChildren(Visitor* visitor);
+};
+
+
+class StringLiteral : public BasicLiteral {
+ public:
+ static StringLiteral* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+
+ explicit StringLiteral(String* string) : value_(string) {}
+ virtual ~StringLiteral();
+
+ DEFINE_CASTING_OPERATIONS(StringLiteral);
+
+ String* value() { return value_; }
+
+ protected:
+ StringLiteral() {}
+
+ Ref<String> value_;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(StringLiteral);
+};
+
+
+class BigintLiteral : public StringLiteral {
+ public:
+ static BigintLiteral* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+
+ explicit BigintLiteral(String* string) : StringLiteral(string) {}
+ virtual ~BigintLiteral();
+
+ DEFINE_CASTING_OPERATIONS(BigintLiteral);
+
+ private:
+ BigintLiteral() {}
+
+ DISALLOW_COPY_AND_ASSIGN(BigintLiteral);
+};
+
+
+class IntLiteral : public BasicLiteral {
+ public:
+ static IntLiteral* ReadFrom(Reader* reader, bool is_negative);
+ static IntLiteral* ReadFrom(Reader* reader, uint8_t payload);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~IntLiteral();
+
+ DEFINE_CASTING_OPERATIONS(IntLiteral);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+
+ int64_t value() { return value_; }
+
+ private:
+ IntLiteral() {}
+
+ int64_t value_;
+
+ DISALLOW_COPY_AND_ASSIGN(IntLiteral);
+};
+
+
+class DoubleLiteral : public BasicLiteral {
+ public:
+ static DoubleLiteral* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~DoubleLiteral();
+
+ DEFINE_CASTING_OPERATIONS(DoubleLiteral);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+
+ String* value() { return value_; }
+
+ private:
+ DoubleLiteral() {}
+
+ Ref<String> value_;
+
+ DISALLOW_COPY_AND_ASSIGN(DoubleLiteral);
+};
+
+
+class BoolLiteral : public BasicLiteral {
+ public:
+ static BoolLiteral* ReadFrom(Reader* reader, bool value);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~BoolLiteral();
+
+ DEFINE_CASTING_OPERATIONS(BoolLiteral);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+
+ bool value() { return value_; }
+
+ private:
+ BoolLiteral() {}
+
+ bool value_;
+
+ DISALLOW_COPY_AND_ASSIGN(BoolLiteral);
+};
+
+
+class NullLiteral : public BasicLiteral {
+ public:
+ static NullLiteral* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~NullLiteral();
+
+ DEFINE_CASTING_OPERATIONS(NullLiteral);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+
+ private:
+ NullLiteral() { }
+
+ DISALLOW_COPY_AND_ASSIGN(NullLiteral);
+};
+
+
+class SymbolLiteral : public Expression {
+ public:
+ static SymbolLiteral* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~SymbolLiteral();
+
+ DEFINE_CASTING_OPERATIONS(SymbolLiteral);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ String* value() { return value_; }
+
+ private:
+ SymbolLiteral() {}
+
+ Ref<String> value_;
+
+ DISALLOW_COPY_AND_ASSIGN(SymbolLiteral);
+};
+
+
+class TypeLiteral : public Expression {
+ public:
+ static TypeLiteral* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~TypeLiteral();
+
+ DEFINE_CASTING_OPERATIONS(TypeLiteral);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ DartType* type() { return type_; }
+
+ private:
+ TypeLiteral() {}
+
+ Child<DartType> type_;
+
+ DISALLOW_COPY_AND_ASSIGN(TypeLiteral);
+};
+
+
+class ThisExpression : public Expression {
+ public:
+ static ThisExpression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~ThisExpression();
+
+ DEFINE_CASTING_OPERATIONS(ThisExpression);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ private:
+ ThisExpression() { }
+
+ DISALLOW_COPY_AND_ASSIGN(ThisExpression);
+};
+
+
+class Rethrow : public Expression {
+ public:
+ static Rethrow* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~Rethrow();
+
+ DEFINE_CASTING_OPERATIONS(Rethrow);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ private:
+ Rethrow() { }
+
+ DISALLOW_COPY_AND_ASSIGN(Rethrow);
+};
+
+
+class Throw : public Expression {
+ public:
+ static Throw* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~Throw();
+
+ DEFINE_CASTING_OPERATIONS(Throw);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* expression() { return expression_; }
+
+ private:
+ Throw() {}
+
+ Child<Expression> expression_;
+
+ DISALLOW_COPY_AND_ASSIGN(Throw);
+};
+
+
+class ListLiteral : public Expression {
+ public:
+ static ListLiteral* ReadFrom(Reader* reader, bool is_const);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~ListLiteral();
+
+ DEFINE_CASTING_OPERATIONS(ListLiteral);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ bool is_const() { return is_const_; }
+ DartType* type() { return type_; }
+ List<Expression>& expressions() { return expressions_; }
+
+ private:
+ ListLiteral() {}
+
+ bool is_const_;
+ Child<DartType> type_;
+ List<Expression> expressions_;
+
+ DISALLOW_COPY_AND_ASSIGN(ListLiteral);
+};
+
+
+class MapLiteral : public Expression {
+ public:
+ static MapLiteral* ReadFrom(Reader* reader, bool is_const);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~MapLiteral();
+
+ DEFINE_CASTING_OPERATIONS(MapLiteral);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ bool is_const() { return is_const_; }
+ DartType* key_type() { return key_type_; }
+ DartType* value_type() { return value_type_; }
+ List<MapEntry>& entries() { return entries_; }
+
+ private:
+ MapLiteral() {}
+
+ bool is_const_;
+ Child<DartType> key_type_;
+ Child<DartType> value_type_;
+ List<MapEntry> entries_;
+
+ DISALLOW_COPY_AND_ASSIGN(MapLiteral);
+};
+
+
+class MapEntry : public TreeNode {
+ public:
+ static MapEntry* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~MapEntry();
+
+ DEFINE_CASTING_OPERATIONS(MapEntry);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* key() { return key_; }
+ Expression* value() { return value_; }
+
+ private:
+ MapEntry() {}
+
+ template <typename T>
+ friend class List;
+
+ Child<Expression> key_;
+ Child<Expression> value_;
+
+ DISALLOW_COPY_AND_ASSIGN(MapEntry);
+};
+
+
+class AwaitExpression : public Expression {
+ public:
+ static AwaitExpression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~AwaitExpression();
+
+ DEFINE_CASTING_OPERATIONS(AwaitExpression);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* operand() { return operand_; }
+
+ private:
+ AwaitExpression() {}
+
+ Child<Expression> operand_;
+
+ DISALLOW_COPY_AND_ASSIGN(AwaitExpression);
+};
+
+
+class FunctionExpression : public Expression {
+ public:
+ static FunctionExpression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~FunctionExpression();
+
+ DEFINE_CASTING_OPERATIONS(FunctionExpression);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ FunctionNode* function() { return function_; }
+
+ private:
+ FunctionExpression() {}
+
+ Child<FunctionNode> function_;
+
+ DISALLOW_COPY_AND_ASSIGN(FunctionExpression);
+};
+
+
+class Let : public Expression {
+ public:
+ static Let* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~Let();
+
+ DEFINE_CASTING_OPERATIONS(Let);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ VariableDeclaration* variable() { return variable_; }
+ Expression* body() { return body_; }
+
+ private:
+ Let() {}
+
+ Child<VariableDeclaration> variable_;
+ Child<Expression> body_;
+
+ DISALLOW_COPY_AND_ASSIGN(Let);
+};
+
+
+class BlockExpression : public Expression {
+ public:
+ static BlockExpression* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~BlockExpression();
+
+ DEFINE_CASTING_OPERATIONS(BlockExpression);
+
+ virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Block* body() { return body_; }
+ Expression* value() { return value_; }
+
+ private:
+ BlockExpression() {}
+
+ Child<Block> body_;
+ Child<Expression> value_;
+
+ DISALLOW_COPY_AND_ASSIGN(BlockExpression);
+};
+
+
+class Statement : public TreeNode {
+ public:
+ static Statement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer) = 0;
+
+ virtual ~Statement();
+
+ DEFINE_CASTING_OPERATIONS(Statement);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor) = 0;
+
+ protected:
+ Statement() { }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Statement);
+};
+
+
+class InvalidStatement : public Statement {
+ public:
+ static InvalidStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~InvalidStatement();
+
+ DEFINE_CASTING_OPERATIONS(InvalidStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ private:
+ InvalidStatement() { }
+
+ DISALLOW_COPY_AND_ASSIGN(InvalidStatement);
+};
+
+
+class ExpressionStatement : public Statement {
+ public:
+ static ExpressionStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ explicit ExpressionStatement(Expression* exp) : expression_(exp) {}
+ virtual ~ExpressionStatement();
+
+ DEFINE_CASTING_OPERATIONS(ExpressionStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* expression() { return expression_; }
+
+ private:
+ ExpressionStatement() {}
+
+ Child<Expression> expression_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExpressionStatement);
+};
+
+
+class Block : public Statement {
+ public:
+ static Block* ReadFromImpl(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+ void WriteToImpl(Writer* writer);
+
+ virtual ~Block();
+
+ DEFINE_CASTING_OPERATIONS(Block);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ List<Statement>& statements() { return statements_; }
+
+ private:
+ Block() {}
+
+ List<Statement> statements_;
+
+ DISALLOW_COPY_AND_ASSIGN(Block);
+};
+
+
+class EmptyStatement : public Statement {
+ public:
+ static EmptyStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~EmptyStatement();
+
+ DEFINE_CASTING_OPERATIONS(EmptyStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ private:
+ EmptyStatement() { }
+
+ DISALLOW_COPY_AND_ASSIGN(EmptyStatement);
+};
+
+
+class AssertStatement : public Statement {
+ public:
+ static AssertStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~AssertStatement();
+
+ DEFINE_CASTING_OPERATIONS(AssertStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* condition() { return condition_; }
+ Expression* message() { return message_; }
+
+ private:
+ AssertStatement() {}
+
+ Child<Expression> condition_;
+ Child<Expression> message_;
+
+ DISALLOW_COPY_AND_ASSIGN(AssertStatement);
+};
+
+
+class LabeledStatement : public Statement {
+ public:
+ static LabeledStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~LabeledStatement();
+
+ DEFINE_CASTING_OPERATIONS(LabeledStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Statement* body() { return body_; }
+
+ private:
+ LabeledStatement() {}
+
+ Child<Statement> body_;
+
+ DISALLOW_COPY_AND_ASSIGN(LabeledStatement);
+};
+
+
+class BreakStatement : public Statement {
+ public:
+ static BreakStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~BreakStatement();
+
+ DEFINE_CASTING_OPERATIONS(BreakStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ LabeledStatement* target() { return target_; }
+
+ private:
+ BreakStatement() {}
+
+ Ref<LabeledStatement> target_;
+
+ DISALLOW_COPY_AND_ASSIGN(BreakStatement);
+};
+
+
+class WhileStatement : public Statement {
+ public:
+ static WhileStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~WhileStatement();
+
+ DEFINE_CASTING_OPERATIONS(WhileStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* condition() { return condition_; }
+ Statement* body() { return body_; }
+
+ private:
+ WhileStatement() {}
+
+ Child<Expression> condition_;
+ Child<Statement> body_;
+
+ DISALLOW_COPY_AND_ASSIGN(WhileStatement);
+};
+
+
+class DoStatement : public Statement {
+ public:
+ static DoStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~DoStatement();
+
+ DEFINE_CASTING_OPERATIONS(DoStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* condition() { return condition_; }
+ Statement* body() { return body_; }
+
+ private:
+ DoStatement() {}
+
+ Child<Expression> condition_;
+ Child<Statement> body_;
+
+ DISALLOW_COPY_AND_ASSIGN(DoStatement);
+};
+
+
+class ForStatement : public Statement {
+ public:
+ static ForStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~ForStatement();
+
+ DEFINE_CASTING_OPERATIONS(ForStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ List<VariableDeclaration>& variables() { return variables_; }
+ Expression* condition() { return condition_; }
+ List<Expression>& updates() { return updates_; }
+ Statement* body() { return body_; }
+
+ private:
+ ForStatement() {}
+
+ List<VariableDeclaration> variables_;
+ Child<Expression> condition_;
+ List<Expression> updates_;
+ Child<Statement> body_;
+
+ DISALLOW_COPY_AND_ASSIGN(ForStatement);
+};
+
+
+class ForInStatement : public Statement {
+ public:
+ static ForInStatement* ReadFrom(Reader* reader, bool is_async);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~ForInStatement();
+
+ DEFINE_CASTING_OPERATIONS(ForInStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ VariableDeclaration* variable() { return variable_; }
+ Expression* iterable() { return iterable_; }
+ Statement* body() { return body_; }
+ bool is_async() { return is_async_; }
+
+ private:
+ ForInStatement() {}
+
+ Child<VariableDeclaration> variable_;
+ Child<Expression> iterable_;
+ Child<Statement> body_;
+ bool is_async_;
+
+ DISALLOW_COPY_AND_ASSIGN(ForInStatement);
+};
+
+
+class SwitchStatement : public Statement {
+ public:
+ static SwitchStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~SwitchStatement();
+
+ DEFINE_CASTING_OPERATIONS(SwitchStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* condition() { return condition_; }
+ List<SwitchCase>& cases() { return cases_; }
+
+ private:
+ SwitchStatement() {}
+
+ Child<Expression> condition_;
+ List<SwitchCase> cases_;
+
+ DISALLOW_COPY_AND_ASSIGN(SwitchStatement);
+};
+
+
+class SwitchCase : public TreeNode {
+ public:
+ SwitchCase* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~SwitchCase();
+
+ DEFINE_CASTING_OPERATIONS(SwitchCase);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ List<Expression>& expressions() { return expressions_; }
+ bool is_default() { return is_default_; }
+ Statement* body() { return body_; }
+
+ private:
+ SwitchCase() {}
+
+ template <typename T>
+ friend class List;
+
+ List<Expression> expressions_;
+ bool is_default_;
+ Child<Statement> body_;
+
+ DISALLOW_COPY_AND_ASSIGN(SwitchCase);
+};
+
+
+class ContinueSwitchStatement : public Statement {
+ public:
+ static ContinueSwitchStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~ContinueSwitchStatement();
+
+ DEFINE_CASTING_OPERATIONS(ContinueSwitchStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ SwitchCase* target() { return target_; }
+
+ private:
+ ContinueSwitchStatement() {}
+
+ Ref<SwitchCase> target_;
+
+ DISALLOW_COPY_AND_ASSIGN(ContinueSwitchStatement);
+};
+
+
+class IfStatement : public Statement {
+ public:
+ static IfStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~IfStatement();
+
+ DEFINE_CASTING_OPERATIONS(IfStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* condition() { return condition_; }
+ Statement* then() { return then_; }
+ Statement* otherwise() { return otherwise_; }
+
+ private:
+ IfStatement() {}
+
+ Child<Expression> condition_;
+ Child<Statement> then_;
+ Child<Statement> otherwise_;
+
+ DISALLOW_COPY_AND_ASSIGN(IfStatement);
+};
+
+
+class ReturnStatement : public Statement {
+ public:
+ static ReturnStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~ReturnStatement();
+
+ DEFINE_CASTING_OPERATIONS(ReturnStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Expression* expression() { return expression_; }
+
+ private:
+ ReturnStatement() {}
+
+ Child<Expression> expression_;
+
+ DISALLOW_COPY_AND_ASSIGN(ReturnStatement);
+};
+
+
+class TryCatch : public Statement {
+ public:
+ static TryCatch* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~TryCatch();
+
+ DEFINE_CASTING_OPERATIONS(TryCatch);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Statement* body() { return body_; }
+ List<Catch>& catches() { return catches_; }
+
+ private:
+ TryCatch() {}
+
+ Child<Statement> body_;
+ List<Catch> catches_;
+
+ DISALLOW_COPY_AND_ASSIGN(TryCatch);
+};
+
+
+class Catch : public TreeNode {
+ public:
+ static Catch* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~Catch();
+
+ DEFINE_CASTING_OPERATIONS(Catch);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ DartType* guard() { return guard_; }
+ VariableDeclaration* exception() { return exception_; }
+ VariableDeclaration* stack_trace() { return stack_trace_; }
+ Statement* body() { return body_; }
+
+ private:
+ Catch() {}
+
+ template <typename T>
+ friend class List;
+
+ Child<DartType> guard_;
+ Child<VariableDeclaration> exception_;
+ Child<VariableDeclaration> stack_trace_;
+ Child<Statement> body_;
+
+ DISALLOW_COPY_AND_ASSIGN(Catch);
+};
+
+
+class TryFinally : public Statement {
+ public:
+ static TryFinally* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~TryFinally();
+
+ DEFINE_CASTING_OPERATIONS(TryFinally);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Statement* body() { return body_; }
+ Statement* finalizer() { return finalizer_; }
+
+ private:
+ TryFinally() {}
+
+ Child<Statement> body_;
+ Child<Statement> finalizer_;
+
+ DISALLOW_COPY_AND_ASSIGN(TryFinally);
+};
+
+
+class YieldStatement : public Statement {
+ public:
+ enum {
+ kFlagYieldStar = 1 << 0,
+ kFlagNative = 1 << 1,
+ };
+ static YieldStatement* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~YieldStatement();
+
+ DEFINE_CASTING_OPERATIONS(YieldStatement);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ bool is_yield_start() { return (flags_ & kFlagYieldStar) == kFlagYieldStar; }
+ bool is_native() { return (flags_ & kFlagNative) == kFlagNative; }
+ Expression* expression() { return expression_; }
+
+ private:
+ YieldStatement() {}
+
+ word flags_;
+ Child<Expression> expression_;
+
+ DISALLOW_COPY_AND_ASSIGN(YieldStatement);
+};
+
+
+class VariableDeclaration : public Statement {
+ public:
+ enum Flags {
+ kFlagFinal = 1 << 0,
+ kFlagConst = 1 << 1,
+ };
+
+ static VariableDeclaration* ReadFrom(Reader* reader);
+ static VariableDeclaration* ReadFromImpl(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+ void WriteToImpl(Writer* writer);
+
+ virtual ~VariableDeclaration();
+
+ DEFINE_CASTING_OPERATIONS(VariableDeclaration);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ bool IsConst() { return (flags_ & kFlagConst) == kFlagConst; }
+ bool IsFinal() { return (flags_ & kFlagFinal) == kFlagFinal; }
+
+ String* name() { return name_; }
+ DartType* type() { return type_; }
+ InferredValue* inferred_value() { return inferred_value_; }
+ Expression* initializer() { return initializer_; }
+
+ private:
+ VariableDeclaration() {}
+
+ template <typename T>
+ friend class List;
+
+ word flags_;
+ Ref<String> name_;
+ Child<DartType> type_;
+ Child<InferredValue> inferred_value_;
+ Child<Expression> initializer_;
+
+ DISALLOW_COPY_AND_ASSIGN(VariableDeclaration);
+};
+
+
+class FunctionDeclaration : public Statement {
+ public:
+ static FunctionDeclaration* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer);
+
+ virtual ~FunctionDeclaration();
+
+ DEFINE_CASTING_OPERATIONS(FunctionDeclaration);
+
+ virtual void AcceptStatementVisitor(StatementVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ VariableDeclaration* variable() { return variable_; }
+ FunctionNode* function() { return function_; }
+
+ private:
+ FunctionDeclaration() {}
+
+ Child<VariableDeclaration> variable_;
+ Child<FunctionNode> function_;
+
+ DISALLOW_COPY_AND_ASSIGN(FunctionDeclaration);
+};
+
+
+class Name : public Node {
+ public:
+ static Name* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~Name();
+
+ DEFINE_CASTING_OPERATIONS(Name);
+
+ virtual void AcceptVisitor(Visitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ String* string() { return string_; }
+ Library* library() { return library_; }
+
+ private:
+ Name(String* string, Library* library) : string_(string), library_(library) {}
+
+ Ref<String> string_;
+ Ref<Library> library_;
+
+ DISALLOW_COPY_AND_ASSIGN(Name);
+};
+
+
+class InferredValue : public Node {
+ public:
+ static const uint8_t kNull = 1 << 0;
+ static const uint8_t kInteger = 1 << 1;
+ static const uint8_t kDouble = 1 << 2;
+ static const uint8_t kString = 1 << 3;
+ static const uint8_t kOther = 1 << 4;
+
+ enum BaseClassKind {
+ kNone,
+ kExact,
+ kSubclass,
+ kSubtype,
+ };
+
+ static InferredValue* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~InferredValue();
+
+ DEFINE_CASTING_OPERATIONS(InferredValue);
+
+ virtual void AcceptVisitor(Visitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ bool IsInterfaceType() { return kind_ == kSubtype; }
+ bool IsExactClass() { return kind_ == kExact; }
+ bool IsSubclass() { return kind_ == kSubclass; }
+
+ bool CanBeNull() { return (value_bits_ & kNull) != 0; }
+ bool CanBeInteger() { return (value_bits_ & kInteger) != 0; }
+ bool CanBeDouble() { return (value_bits_ & kDouble) != 0; }
+ bool CanBeString() { return (value_bits_ & kString) != 0; }
+
+ bool IsAlwaysNull() { return value_bits_ == kNull; }
+ bool IsAlwaysInteger() { return value_bits_ == kInteger; }
+ bool IsAlwaysDouble() { return value_bits_ == kDouble; }
+ bool IsAlwaysString() { return value_bits_ == kString; }
+
+ Class* klass() { return klass_; }
+ BaseClassKind kind() { return kind_; }
+ uint8_t value_bits() { return value_bits_; }
+
+ private:
+ InferredValue() { }
+
+ Ref<Class> klass_;
+ BaseClassKind kind_;
+ uint8_t value_bits_;
+
+ DISALLOW_COPY_AND_ASSIGN(InferredValue);
+};
+
+
+class DartType : public Node {
+ public:
+ static DartType* ReadFrom(Reader* reader);
+ virtual void WriteTo(Writer* writer) = 0;
+
+ virtual ~DartType();
+
+ DEFINE_CASTING_OPERATIONS(DartType);
+
+ virtual void AcceptVisitor(Visitor* visitor);
+ virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor) = 0;
+
+ protected:
+ DartType() { }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(DartType);
+};
+
+
+class InvalidType : public DartType {
+ public:
+ static InvalidType* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~InvalidType();
+
+ DEFINE_CASTING_OPERATIONS(InvalidType);
+
+ virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ private:
+ InvalidType() { }
+
+ DISALLOW_COPY_AND_ASSIGN(InvalidType);
+};
+
+
+class DynamicType : public DartType {
+ public:
+ static DynamicType* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~DynamicType();
+
+ DEFINE_CASTING_OPERATIONS(DynamicType);
+
+ virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ private:
+ DynamicType() { }
+
+ DISALLOW_COPY_AND_ASSIGN(DynamicType);
+};
+
+
+class VoidType : public DartType {
+ public:
+ static VoidType* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~VoidType();
+
+ DEFINE_CASTING_OPERATIONS(VoidType);
+
+ virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ private:
+ VoidType() { }
+
+ DISALLOW_COPY_AND_ASSIGN(VoidType);
+};
+
+
+class InterfaceType : public DartType {
+ public:
+ static InterfaceType* ReadFrom(Reader* reader);
+ static InterfaceType* ReadFrom(Reader* reader, bool _without_type_arguments_);
+ void WriteTo(Writer* writer);
+
+ explicit InterfaceType(Class* klass) : klass_(klass) {}
+ virtual ~InterfaceType();
+
+ DEFINE_CASTING_OPERATIONS(InterfaceType);
+
+ virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ Class* klass() { return klass_; }
+ List<DartType>& type_arguments() { return type_arguments_; }
+
+ private:
+ InterfaceType() {}
+
+ Ref<Class> klass_;
+ List<DartType> type_arguments_;
+
+ DISALLOW_COPY_AND_ASSIGN(InterfaceType);
+};
+
+
+class FunctionType : public DartType {
+ public:
+ static FunctionType* ReadFrom(Reader* reader);
+ static FunctionType* ReadFrom(Reader* reader, bool _without_type_arguments_);
+ void WriteTo(Writer* writer);
+
+ virtual ~FunctionType();
+
+ DEFINE_CASTING_OPERATIONS(FunctionType);
+
+ virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ TypeParameterList& type_parameters() { return type_parameters_; }
+ int required_parameter_count() { return required_parameter_count_; }
+ List<DartType>& positional_parameters() { return positional_parameters_; }
+ List<Tuple<String, DartType> >& named_parameters() {
+ return named_parameters_;
+ }
+ DartType* return_type() { return return_type_; }
+
+ private:
+ FunctionType() {}
+
+ TypeParameterList type_parameters_;
+ int required_parameter_count_;
+ List<DartType> positional_parameters_;
+ List<Tuple<String, DartType> > named_parameters_;
+ Child<DartType> return_type_;
+
+ DISALLOW_COPY_AND_ASSIGN(FunctionType);
+};
+
+
+class TypeParameterType : public DartType {
+ public:
+ static TypeParameterType* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~TypeParameterType();
+
+ DEFINE_CASTING_OPERATIONS(TypeParameterType);
+
+ virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ TypeParameter* parameter() { return parameter_; }
+
+ private:
+ TypeParameterType() {}
+
+ Ref<TypeParameter> parameter_;
+
+ DISALLOW_COPY_AND_ASSIGN(TypeParameterType);
+};
+
+
+class TypeParameter : public TreeNode {
+ public:
+ TypeParameter* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~TypeParameter();
+
+ DEFINE_CASTING_OPERATIONS(TypeParameter);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ String* name() { return name_; }
+ DartType* bound() { return bound_; }
+
+ private:
+ TypeParameter() {}
+
+ template <typename T>
+ friend class List;
+ friend class TypeParameterList;
+
+ Ref<String> name_;
+ Child<DartType> bound_;
+
+ DISALLOW_COPY_AND_ASSIGN(TypeParameter);
+};
+
+
+class Program : public TreeNode {
+ public:
+ static Program* ReadFrom(Reader* reader);
+ void WriteTo(Writer* writer);
+
+ virtual ~Program();
+
+ DEFINE_CASTING_OPERATIONS(Program);
+
+ virtual void AcceptTreeVisitor(TreeVisitor* visitor);
+ virtual void VisitChildren(Visitor* visitor);
+
+ StringTable& string_table() { return string_table_; }
+ List<Library>& libraries() { return libraries_; }
+ Procedure* main_method() { return main_method_; }
+
+ private:
+ Program() {}
+
+ List<Library> libraries_;
+ Ref<Procedure> main_method_;
+ StringTable string_table_;
+
+ DISALLOW_COPY_AND_ASSIGN(Program);
+};
+
+
+class Reference : public AllStatic {
+ public:
+ static Member* ReadMemberFrom(Reader* reader, bool allow_null = false);
+ static void WriteMemberTo(Writer* writer, Member* member,
+ bool allow_null = false);
+
+ static Class* ReadClassFrom(Reader* reader, bool allow_null = false);
+ static void WriteClassTo(Writer* writer, Class* klass,
+ bool allow_null = false);
+
+ static String* ReadStringFrom(Reader* reader);
+ static void WriteStringTo(Writer* writer, String* string); // NOLINT
+};
+
+
+class ExpressionVisitor {
+ public:
+ virtual ~ExpressionVisitor() {}
+
+ virtual void VisitDefaultExpression(Expression* node) = 0;
+ virtual void VisitDefaultBasicLiteral(BasicLiteral* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitInvalidExpression(InvalidExpression* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitVariableGet(VariableGet* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitVariableSet(VariableSet* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitPropertyGet(PropertyGet* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitPropertySet(PropertySet* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitDirectPropertyGet(DirectPropertyGet* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitDirectPropertySet(DirectPropertySet* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitStaticGet(StaticGet* node) { VisitDefaultExpression(node); }
+ virtual void VisitStaticSet(StaticSet* node) { VisitDefaultExpression(node); }
+ virtual void VisitMethodInvocation(MethodInvocation* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitDirectMethodInvocation(DirectMethodInvocation* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitStaticInvocation(StaticInvocation* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitConstructorInvocation(ConstructorInvocation* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitNot(Not* node) { VisitDefaultExpression(node); }
+ virtual void VisitLogicalExpression(LogicalExpression* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitConditionalExpression(ConditionalExpression* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitStringConcatenation(StringConcatenation* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitIsExpression(IsExpression* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitAsExpression(AsExpression* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitSymbolLiteral(SymbolLiteral* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitTypeLiteral(TypeLiteral* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitThisExpression(ThisExpression* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitRethrow(Rethrow* node) { VisitDefaultExpression(node); }
+ virtual void VisitThrow(Throw* node) { VisitDefaultExpression(node); }
+ virtual void VisitListLiteral(ListLiteral* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitMapLiteral(MapLiteral* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitAwaitExpression(AwaitExpression* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitFunctionExpression(FunctionExpression* node) {
+ VisitDefaultExpression(node);
+ }
+ virtual void VisitStringLiteral(StringLiteral* node) {
+ VisitDefaultBasicLiteral(node);
+ }
+ virtual void VisitBigintLiteral(BigintLiteral* node) {
+ VisitDefaultBasicLiteral(node);
+ }
+ virtual void VisitIntLiteral(IntLiteral* node) {
+ VisitDefaultBasicLiteral(node);
+ }
+ virtual void VisitDoubleLiteral(DoubleLiteral* node) {
+ VisitDefaultBasicLiteral(node);
+ }
+ virtual void VisitBoolLiteral(BoolLiteral* node) {
+ VisitDefaultBasicLiteral(node);
+ }
+ virtual void VisitNullLiteral(NullLiteral* node) {
+ VisitDefaultBasicLiteral(node);
+ }
+ virtual void VisitLet(Let* node) { VisitDefaultExpression(node); }
+ virtual void VisitBlockExpression(BlockExpression* node) {
+ VisitDefaultExpression(node);
+ }
+};
+
+
+class StatementVisitor {
+ public:
+ virtual ~StatementVisitor() {}
+
+ virtual void VisitDefaultStatement(Statement* node) = 0;
+ virtual void VisitInvalidStatement(InvalidStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitExpressionStatement(ExpressionStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitBlock(Block* node) { VisitDefaultStatement(node); }
+ virtual void VisitEmptyStatement(EmptyStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitAssertStatement(AssertStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitLabeledStatement(LabeledStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitBreakStatement(BreakStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitWhileStatement(WhileStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitDoStatement(DoStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitForStatement(ForStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitForInStatement(ForInStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitSwitchStatement(SwitchStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitContinueSwitchStatement(ContinueSwitchStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitIfStatement(IfStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitReturnStatement(ReturnStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitTryCatch(TryCatch* node) { VisitDefaultStatement(node); }
+ virtual void VisitTryFinally(TryFinally* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitYieldStatement(YieldStatement* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitVariableDeclaration(VariableDeclaration* node) {
+ VisitDefaultStatement(node);
+ }
+ virtual void VisitFunctionDeclaration(FunctionDeclaration* node) {
+ VisitDefaultStatement(node);
+ }
+};
+
+
+class MemberVisitor {
+ public:
+ virtual ~MemberVisitor() {}
+
+ virtual void VisitDefaultMember(Member* node) = 0;
+ virtual void VisitConstructor(Constructor* node) { VisitDefaultMember(node); }
+ virtual void VisitProcedure(Procedure* node) { VisitDefaultMember(node); }
+ virtual void VisitField(Field* node) { VisitDefaultMember(node); }
+};
+
+
+class ClassVisitor {
+ public:
+ virtual ~ClassVisitor() {}
+
+ virtual void VisitDefaultClass(Class* node) = 0;
+ virtual void VisitNormalClass(NormalClass* node) { VisitDefaultClass(node); }
+ virtual void VisitMixinClass(MixinClass* node) { VisitDefaultClass(node); }
+};
+
+
+class InitializerVisitor {
+ public:
+ virtual ~InitializerVisitor() {}
+
+ virtual void VisitDefaultInitializer(Initializer* node) = 0;
+ virtual void VisitInvalidInitializer(InvalidInitializer* node) {
+ VisitDefaultInitializer(node);
+ }
+ virtual void VisitFieldInitializer(FieldInitializer* node) {
+ VisitDefaultInitializer(node);
+ }
+ virtual void VisitSuperInitializer(SuperInitializer* node) {
+ VisitDefaultInitializer(node);
+ }
+ virtual void VisitRedirectingInitializer(RedirectingInitializer* node) {
+ VisitDefaultInitializer(node);
+ }
+ virtual void VisitLocalInitializer(LocalInitializer* node) {
+ VisitDefaultInitializer(node);
+ }
+};
+
+
+class DartTypeVisitor {
+ public:
+ virtual ~DartTypeVisitor() {}
+
+ virtual void VisitDefaultDartType(DartType* node) = 0;
+ virtual void VisitInvalidType(InvalidType* node) {
+ VisitDefaultDartType(node);
+ }
+ virtual void VisitDynamicType(DynamicType* node) {
+ VisitDefaultDartType(node);
+ }
+ virtual void VisitVoidType(VoidType* node) { VisitDefaultDartType(node); }
+ virtual void VisitInterfaceType(InterfaceType* node) {
+ VisitDefaultDartType(node);
+ }
+ virtual void VisitFunctionType(FunctionType* node) {
+ VisitDefaultDartType(node);
+ }
+ virtual void VisitTypeParameterType(TypeParameterType* node) {
+ VisitDefaultDartType(node);
+ }
+};
+
+
+class ClassReferenceVisitor {
+ public:
+ virtual ~ClassReferenceVisitor() {}
+
+ virtual void VisitDefaultClassReference(Class* node) = 0;
+ virtual void VisitNormalClassReference(NormalClass* node) {
+ VisitDefaultClassReference(node);
+ }
+ virtual void VisitMixinClassReference(MixinClass* node) {
+ VisitDefaultClassReference(node);
+ }
+};
+
+
+class MemberReferenceVisitor {
+ public:
+ virtual ~MemberReferenceVisitor() {}
+
+ virtual void VisitDefaultMemberReference(Member* node) = 0;
+ virtual void VisitFieldReference(Field* node) {
+ VisitDefaultMemberReference(node);
+ }
+ virtual void VisitConstructorReference(Constructor* node) {
+ VisitDefaultMemberReference(node);
+ }
+ virtual void VisitProcedureReference(Procedure* node) {
+ VisitDefaultMemberReference(node);
+ }
+};
+
+
+class TreeVisitor : public ExpressionVisitor,
+ public StatementVisitor,
+ public MemberVisitor,
+ public ClassVisitor,
+ public InitializerVisitor {
+ public:
+ virtual ~TreeVisitor() {}
+
+ virtual void VisitDefaultTreeNode(TreeNode* node) = 0;
+ virtual void VisitDefaultStatement(Statement* node) {
+ VisitDefaultTreeNode(node);
+ }
+ virtual void VisitDefaultExpression(Expression* node) {
+ VisitDefaultTreeNode(node);
+ }
+ virtual void VisitDefaultMember(Member* node) { VisitDefaultTreeNode(node); }
+ virtual void VisitDefaultClass(Class* node) { VisitDefaultTreeNode(node); }
+ virtual void VisitDefaultInitializer(Initializer* node) {
+ VisitDefaultTreeNode(node);
+ }
+
+ virtual void VisitLibrary(Library* node) { VisitDefaultTreeNode(node); }
+ virtual void VisitTypeParameter(TypeParameter* node) {
+ VisitDefaultTreeNode(node);
+ }
+ virtual void VisitFunctionNode(FunctionNode* node) {
+ VisitDefaultTreeNode(node);
+ }
+ virtual void VisitArguments(Arguments* node) { VisitDefaultTreeNode(node); }
+ virtual void VisitNamedExpression(NamedExpression* node) {
+ VisitDefaultTreeNode(node);
+ }
+ virtual void VisitSwitchCase(SwitchCase* node) { VisitDefaultTreeNode(node); }
+ virtual void VisitCatch(Catch* node) { VisitDefaultTreeNode(node); }
+ virtual void VisitMapEntry(MapEntry* node) { VisitDefaultTreeNode(node); }
+ virtual void VisitProgram(Program* node) { VisitDefaultTreeNode(node); }
+};
+
+
+class Visitor : public TreeVisitor,
+ public DartTypeVisitor,
+ public ClassReferenceVisitor,
+ public MemberReferenceVisitor {
+ public:
+ virtual ~Visitor() {}
+
+ virtual void VisitDefaultNode(Node* node) = 0;
+ virtual void VisitInferredValue(InferredValue* node) {
+ VisitDefaultNode(node);
+ }
+ virtual void VisitDefaultTreeNode(TreeNode* node) { VisitDefaultNode(node); }
+ virtual void VisitDefaultDartType(DartType* node) { VisitDefaultNode(node); }
+ virtual void VisitName(Name* node) { VisitDefaultNode(node); }
+ virtual void VisitDefaultClassReference(Class* node) {
+ VisitDefaultNode(node);
+ }
+ virtual void VisitDefaultMemberReference(Member* node) {
+ VisitDefaultNode(node);
+ }
+};
+
+
+class RecursiveVisitor : public Visitor {
+ public:
+ virtual ~RecursiveVisitor() {}
+
+ virtual void VisitDefaultNode(Node* node) { node->VisitChildren(this); }
+
+ virtual void VisitDefaultClassReference(Class* node) {}
+ virtual void VisitDefaultMemberReference(Member* node) {}
+};
+
+
+template <typename T>
+List<T>::~List() {
+ for (int i = 0; i < length_; i++) {
+ delete array_[i];
+ }
+ delete[] array_;
+}
+
+
+template <typename T>
+void List<T>::EnsureInitialized(int length) {
+ if (length < length_) return;
+
+ T** old_array = array_;
+ int old_length = length_;
+
+ // TODO(27590) Maybe we should use double-growth instead to avoid running
+ // into the quadratic case.
+ length_ = length;
+ array_ = new T*[length_];
+
+ // Move old elements at the start (if necessary).
+ int offset = 0;
+ if (old_array != NULL) {
+ for (; offset < old_length; offset++) {
+ array_[offset] = old_array[offset];
+ }
+ }
+
+ // Set the rest to NULL.
+ for (; offset < length_; offset++) {
+ array_[offset] = NULL;
+ }
+
+ delete[] old_array;
+}
+
+
+template <typename T>
+template <typename IT>
+IT* List<T>::GetOrCreate(int index) {
+ EnsureInitialized(index + 1);
+
+ T* member = array_[index];
+ if (member == NULL) {
+ member = array_[index] = new IT();
+ }
+ return IT::Cast(member);
+}
+
+
+template <typename T>
+template <typename IT, typename PT>
+IT* List<T>::GetOrCreate(int index, PT* parent) {
+ EnsureInitialized(index + 1);
+
+ T* member = array_[index];
+ if (member == NULL) {
+ member = array_[index] = new IT();
+ member->parent_ = parent;
+ } else {
+ ASSERT(member->parent_ == parent);
+ }
+ return IT::Cast(member);
+}
+
+} // namespace kernel
+
+kernel::Program* ReadPrecompiledKernelFromBuffer(const uint8_t* buffer,
+ intptr_t buffer_length);
+
+class ByteWriter {
+ public:
+ virtual ~ByteWriter();
+
+ virtual void WriteByte(uint8_t byte) = 0;
+
+ virtual void WriteBytes(uint8_t* buffer, int count) = 0;
+};
+
+
+void WritePrecompiledKernel(ByteWriter* out, kernel::Program* program);
+
+
+} // namespace dart
+
+#endif // VM_KERNEL_H_
« no previous file with comments | « runtime/vm/intermediate_language_x64.cc ('k') | runtime/vm/kernel.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698