| Index: runtime/vm/kernel.h
|
| diff --git a/runtime/vm/kernel.h b/runtime/vm/kernel.h
|
| index ebdac48dc470631c545f8881b55b8fe90ea1ce73..a104a9cae2a8edd19883f525d1cb4f0eee86372e 100644
|
| --- a/runtime/vm/kernel.h
|
| +++ b/runtime/vm/kernel.h
|
| @@ -9,6 +9,7 @@
|
| #include "platform/assert.h"
|
| #include "vm/allocation.h"
|
| #include "vm/globals.h"
|
| +#include "vm/growable_array.h"
|
| #include "vm/token_position.h"
|
|
|
|
|
| @@ -356,6 +357,47 @@ KERNEL_VISITORS_DO(DO)
|
| DEFINE_IS_OPERATION(TreeNode) \
|
| KERNEL_TREE_NODES_DO(DEFINE_IS_OPERATION)
|
|
|
| +class Class;
|
| +class Constructor;
|
| +class Field;
|
| +class Library;
|
| +class LinkedNode;
|
| +class Member;
|
| +class Procedure;
|
| +
|
| +class CanonicalName {
|
| + public:
|
| + String* name() { return name_; }
|
| + CanonicalName* parent() { return parent_; }
|
| + LinkedNode* definition() { return definition_; }
|
| + bool is_referenced() { return is_referenced_; }
|
| + void set_referenced(bool referenced) { is_referenced_ = referenced; }
|
| +
|
| + void BindTo(LinkedNode* definition);
|
| + void Unbind();
|
| + CanonicalName* AddChild(String* name);
|
| +
|
| + Library* AsLibrary();
|
| + Class* AsClass();
|
| + Member* AsMember();
|
| + Field* AsField();
|
| + Constructor* AsConstructor();
|
| + Procedure* AsProcedure();
|
| +
|
| + static CanonicalName* NewRoot();
|
| +
|
| + ~CanonicalName();
|
| +
|
| + private:
|
| + CanonicalName();
|
| +
|
| + bool is_referenced_;
|
| + Ref<CanonicalName> parent_;
|
| + Ref<String> name_;
|
| + Ref<LinkedNode> definition_;
|
| + MallocGrowableArray<CanonicalName*> children_;
|
| +};
|
| +
|
|
|
| class Node {
|
| public:
|
| @@ -400,7 +442,25 @@ class TreeNode : public Node {
|
| };
|
|
|
|
|
| -class Library : public TreeNode {
|
| +class LinkedNode : public TreeNode {
|
| + public:
|
| + virtual ~LinkedNode();
|
| +
|
| + CanonicalName* canonical_name() { return canonical_name_; }
|
| +
|
| + protected:
|
| + LinkedNode() {}
|
| +
|
| + private:
|
| + Ref<CanonicalName> canonical_name_;
|
| +
|
| + friend class CanonicalName;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(LinkedNode);
|
| +};
|
| +
|
| +
|
| +class Library : public LinkedNode {
|
| public:
|
| Library* ReadFrom(Reader* reader);
|
|
|
| @@ -457,7 +517,7 @@ class Library : public TreeNode {
|
| };
|
|
|
|
|
| -class Class : public TreeNode {
|
| +class Class : public LinkedNode {
|
| public:
|
| Class* ReadFrom(Reader* reader);
|
|
|
| @@ -580,7 +640,7 @@ class MixinClass : public Class {
|
| };
|
|
|
|
|
| -class Member : public TreeNode {
|
| +class Member : public LinkedNode {
|
| public:
|
| virtual ~Member();
|
|
|
| @@ -796,13 +856,13 @@ class FieldInitializer : public Initializer {
|
| virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| - Field* field() { return field_; }
|
| + Field* field() { return field_reference_->AsField(); }
|
| Expression* value() { return value_; }
|
|
|
| private:
|
| FieldInitializer() {}
|
|
|
| - Ref<Field> field_;
|
| + Ref<CanonicalName> field_reference_;
|
| Child<Expression> value_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(FieldInitializer);
|
| @@ -820,13 +880,13 @@ class SuperInitializer : public Initializer {
|
| virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| - Constructor* target() { return target_; }
|
| + Constructor* target() { return target_reference_->AsConstructor(); }
|
| Arguments* arguments() { return arguments_; }
|
|
|
| private:
|
| SuperInitializer() {}
|
|
|
| - Ref<Constructor> target_;
|
| + Ref<CanonicalName> target_reference_;
|
| Child<Arguments> arguments_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(SuperInitializer);
|
| @@ -844,13 +904,13 @@ class RedirectingInitializer : public Initializer {
|
| virtual void AcceptInitializerVisitor(InitializerVisitor* visitor);
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| - Constructor* target() { return target_; }
|
| + Constructor* target() { return target_reference_->AsConstructor(); }
|
| Arguments* arguments() { return arguments_; }
|
|
|
| private:
|
| RedirectingInitializer() {}
|
|
|
| - Ref<Constructor> target_;
|
| + Ref<CanonicalName> target_reference_;
|
| Child<Arguments> arguments_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(RedirectingInitializer);
|
| @@ -1039,7 +1099,7 @@ class PropertyGet : public Expression {
|
|
|
| Child<Expression> receiver_;
|
| Child<Name> name_;
|
| - Ref<Member> interfaceTarget_;
|
| + Ref<CanonicalName> interface_target_reference_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(PropertyGet);
|
| };
|
| @@ -1066,7 +1126,7 @@ class PropertySet : public Expression {
|
| Child<Expression> receiver_;
|
| Child<Name> name_;
|
| Child<Expression> value_;
|
| - Ref<Member> interfaceTarget_;
|
| + Ref<CanonicalName> interface_target_reference_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(PropertySet);
|
| };
|
| @@ -1084,13 +1144,13 @@ class DirectPropertyGet : public Expression {
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| Expression* receiver() { return receiver_; }
|
| - Member* target() { return target_; }
|
| + Member* target() { return target_reference_->AsMember(); }
|
|
|
| private:
|
| DirectPropertyGet() {}
|
|
|
| Child<Expression> receiver_;
|
| - Ref<Member> target_;
|
| + Ref<CanonicalName> target_reference_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(DirectPropertyGet);
|
| };
|
| @@ -1108,14 +1168,14 @@ class DirectPropertySet : public Expression {
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| Expression* receiver() { return receiver_; }
|
| - Member* target() { return target_; }
|
| + Member* target() { return target_reference_->AsMember(); }
|
| Expression* value() { return value_; }
|
|
|
| private:
|
| DirectPropertySet() {}
|
|
|
| Child<Expression> receiver_;
|
| - Ref<Member> target_;
|
| + Ref<CanonicalName> target_reference_;
|
| Child<Expression> value_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(DirectPropertySet);
|
| @@ -1133,12 +1193,12 @@ class StaticGet : public Expression {
|
| virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| - Member* target() { return target_; }
|
| + Member* target() { return target_reference_->AsMember(); }
|
|
|
| private:
|
| StaticGet() {}
|
|
|
| - Ref<Member> target_;
|
| + Ref<CanonicalName> target_reference_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(StaticGet);
|
| };
|
| @@ -1155,13 +1215,13 @@ class StaticSet : public Expression {
|
| virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| - Member* target() { return target_; }
|
| + Member* target() { return target_reference_->AsMember(); }
|
| Expression* expression() { return expression_; }
|
|
|
| private:
|
| StaticSet() {}
|
|
|
| - Ref<Member> target_;
|
| + Ref<CanonicalName> target_reference_;
|
| Child<Expression> expression_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(StaticSet);
|
| @@ -1243,7 +1303,7 @@ class MethodInvocation : public Expression {
|
| Child<Expression> receiver_;
|
| Child<Name> name_;
|
| Child<Arguments> arguments_;
|
| - Ref<Member> interfaceTarget_;
|
| + Ref<CanonicalName> interface_target_reference_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(MethodInvocation);
|
| };
|
| @@ -1261,14 +1321,14 @@ class DirectMethodInvocation : public Expression {
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| Expression* receiver() { return receiver_; }
|
| - Procedure* target() { return target_; }
|
| + Procedure* target() { return target_reference_->AsProcedure(); }
|
| Arguments* arguments() { return arguments_; }
|
|
|
| private:
|
| DirectMethodInvocation() {}
|
|
|
| Child<Expression> receiver_;
|
| - Ref<Procedure> target_;
|
| + Ref<CanonicalName> target_reference_;
|
| Child<Arguments> arguments_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(DirectMethodInvocation);
|
| @@ -1283,14 +1343,14 @@ class StaticInvocation : public Expression {
|
| virtual void AcceptExpressionVisitor(ExpressionVisitor* visitor);
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| - Procedure* procedure() { return procedure_; }
|
| + Procedure* procedure() { return procedure_reference_->AsProcedure(); }
|
| Arguments* arguments() { return arguments_; }
|
| bool is_const() { return is_const_; }
|
|
|
| private:
|
| StaticInvocation() {}
|
|
|
| - Ref<Procedure> procedure_;
|
| + Ref<CanonicalName> procedure_reference_;
|
| Child<Arguments> arguments_;
|
| bool is_const_;
|
|
|
| @@ -1310,14 +1370,14 @@ class ConstructorInvocation : public Expression {
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| bool is_const() { return is_const_; }
|
| - Constructor* target() { return target_; }
|
| + Constructor* target() { return target_reference_->AsConstructor(); }
|
| Arguments* arguments() { return arguments_; }
|
|
|
| private:
|
| ConstructorInvocation() {}
|
|
|
| bool is_const_;
|
| - Ref<Constructor> target_;
|
| + Ref<CanonicalName> target_reference_;
|
| Child<Arguments> arguments_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(ConstructorInvocation);
|
| @@ -2463,14 +2523,17 @@ class Name : public Node {
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| String* string() { return string_; }
|
| - Library* library() { return library_; }
|
| + Library* library() {
|
| + if (library_reference_ == NULL) return NULL;
|
| + return library_reference_->AsLibrary();
|
| + }
|
|
|
| private:
|
| - Name(String* string, Library* library)
|
| - : string_(string), library_(library) {} // NOLINT
|
| + Name(String* string, CanonicalName* library_reference)
|
| + : string_(string), library_reference_(library_reference) {} // NOLINT
|
|
|
| Ref<String> string_;
|
| - Ref<Library> library_;
|
| + Ref<CanonicalName> library_reference_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(Name);
|
| };
|
| @@ -2514,14 +2577,14 @@ class InferredValue : public Node {
|
| bool IsAlwaysDouble() { return value_bits_ == kDouble; }
|
| bool IsAlwaysString() { return value_bits_ == kString; }
|
|
|
| - Class* klass() { return klass_; }
|
| + Class* klass() { return klass_reference_->AsClass(); }
|
| BaseClassKind kind() { return kind_; }
|
| uint8_t value_bits() { return value_bits_; }
|
|
|
| private:
|
| InferredValue() {}
|
|
|
| - Ref<Class> klass_;
|
| + Ref<CanonicalName> klass_reference_;
|
| BaseClassKind kind_;
|
| uint8_t value_bits_;
|
|
|
| @@ -2607,7 +2670,8 @@ class InterfaceType : public DartType {
|
| static InterfaceType* ReadFrom(Reader* reader);
|
| static InterfaceType* ReadFrom(Reader* reader, bool _without_type_arguments_);
|
|
|
| - explicit InterfaceType(Class* klass) : klass_(klass) {}
|
| + explicit InterfaceType(CanonicalName* klass_reference)
|
| + : klass_reference_(klass_reference) {}
|
| virtual ~InterfaceType();
|
|
|
| DEFINE_CASTING_OPERATIONS(InterfaceType);
|
| @@ -2615,13 +2679,13 @@ class InterfaceType : public DartType {
|
| virtual void AcceptDartTypeVisitor(DartTypeVisitor* visitor);
|
| virtual void VisitChildren(Visitor* visitor);
|
|
|
| - Class* klass() { return klass_; }
|
| + Class* klass() { return klass_reference_->AsClass(); }
|
| List<DartType>& type_arguments() { return type_arguments_; }
|
|
|
| private:
|
| InterfaceType() {}
|
|
|
| - Ref<Class> klass_;
|
| + Ref<CanonicalName> klass_reference_;
|
| List<DartType> type_arguments_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(InterfaceType);
|
| @@ -2726,13 +2790,18 @@ class Program : public TreeNode {
|
| StringTable& source_uri_table() { return source_uri_table_; }
|
| SourceTable& source_table() { return source_table_; }
|
| List<Library>& libraries() { return libraries_; }
|
| - Procedure* main_method() { return main_method_; }
|
| + Procedure* main_method() {
|
| + if (main_method_reference_ == NULL) return NULL;
|
| + return main_method_reference_->AsProcedure();
|
| + }
|
| + CanonicalName* canonical_name_root() { return canonical_name_root_; }
|
|
|
| private:
|
| Program() {}
|
|
|
| + Child<CanonicalName> canonical_name_root_;
|
| List<Library> libraries_;
|
| - Ref<Procedure> main_method_;
|
| + Ref<CanonicalName> main_method_reference_;
|
| StringTable string_table_;
|
| StringTable source_uri_table_;
|
| SourceTable source_table_;
|
| @@ -2743,9 +2812,9 @@ class Program : public TreeNode {
|
|
|
| class Reference : public AllStatic {
|
| public:
|
| - static Member* ReadMemberFrom(Reader* reader, bool allow_null = false);
|
| + static CanonicalName* ReadMemberFrom(Reader* reader, bool allow_null = false);
|
|
|
| - static Class* ReadClassFrom(Reader* reader, bool allow_null = false);
|
| + static CanonicalName* ReadClassFrom(Reader* reader, bool allow_null = false);
|
|
|
| static String* ReadStringFrom(Reader* reader);
|
| };
|
|
|