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

Side by Side Diff: runtime/vm/object.h

Issue 8289027: Set type argument vector at compile time in type of closure parameters; this (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: '' Created 9 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/code_generator_ia32.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_OBJECT_H_ 5 #ifndef VM_OBJECT_H_
6 #define VM_OBJECT_H_ 6 #define VM_OBJECT_H_
7 7
8 #include "vm/assert.h" 8 #include "vm/assert.h"
9 #include "vm/dart.h" 9 #include "vm/dart.h"
10 #include "vm/globals.h" 10 #include "vm/globals.h"
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after
384 // The associated function may be a closure function (with code) or a 384 // The associated function may be a closure function (with code) or a
385 // signature function (without code) solely describing the result type and 385 // signature function (without code) solely describing the result type and
386 // parameter types of the signature. 386 // parameter types of the signature.
387 RawFunction* signature_function() const { 387 RawFunction* signature_function() const {
388 return raw_ptr()->signature_function_; 388 return raw_ptr()->signature_function_;
389 } 389 }
390 static intptr_t signature_function_offset() { 390 static intptr_t signature_function_offset() {
391 return OFFSET_OF(RawClass, signature_function_); 391 return OFFSET_OF(RawClass, signature_function_);
392 } 392 }
393 393
394 // Return the signature type of this signature class.
395 // For example, if this class represents a signature of the form
396 // '<T, R>(T, [b: B, c: C]) => R', then its signature type is a parameterized
397 // type with this class as the type class and type parameters 'T' and 'R'
398 // as its type argument vector.
399 RawType* SignatureType() const;
400
394 RawLibrary* library() const { return raw_ptr()->library_; } 401 RawLibrary* library() const { return raw_ptr()->library_; }
395 void set_library(const Library& value) const; 402 void set_library(const Library& value) const;
396 403
397 // The type parameters are specified as an array of Strings. 404 // The type parameters are specified as an array of Strings.
398 RawArray* type_parameters() const { return raw_ptr()->type_parameters_; } 405 RawArray* type_parameters() const { return raw_ptr()->type_parameters_; }
399 void set_type_parameters(const Array& value) const; 406 void set_type_parameters(const Array& value) const;
400 intptr_t NumTypeParameters() const; 407 intptr_t NumTypeParameters() const;
401 408
402 // Type parameters may optionally extend a Type (VarType if no extends). 409 // Type parameters may optionally extend a Type (VarType if no extends).
403 RawTypeArray* type_parameter_extends() const { 410 RawTypeArray* type_parameter_extends() const {
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
583 590
584 // Return a class object corresponding to the specified kind. If 591 // Return a class object corresponding to the specified kind. If
585 // a canonicalized version of it exists then that object is returned 592 // a canonicalized version of it exists then that object is returned
586 // otherwise a new object is allocated and returned. 593 // otherwise a new object is allocated and returned.
587 static RawClass* GetClass(ObjectKind kind); 594 static RawClass* GetClass(ObjectKind kind);
588 595
589 private: 596 private:
590 void set_name(const String& value) const; 597 void set_name(const String& value) const;
591 void set_script(const Script& value) const; 598 void set_script(const Script& value) const;
592 void set_signature_function(const Function& value) const; 599 void set_signature_function(const Function& value) const;
600 void set_signature_type(const Type& value) const;
593 void set_class_state(int8_t state) const; 601 void set_class_state(int8_t state) const;
594 602
595 void set_constants(const Array& value) const; 603 void set_constants(const Array& value) const;
596 RawArray* constants() const; 604 RawArray* constants() const;
597 605
598 void set_num_constants(intptr_t value) const; 606 void set_num_constants(intptr_t value) const;
599 intptr_t num_constants() const; 607 intptr_t num_constants() const;
600 608
601 void CalculateFieldOffsets() const; 609 void CalculateFieldOffsets() const;
602 610
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
647 // Type is an abstract superclass. 655 // Type is an abstract superclass.
648 // Subclasses of Type are ParameterizedType, TypeParameter, and 656 // Subclasses of Type are ParameterizedType, TypeParameter, and
649 // InstantiatedType. 657 // InstantiatedType.
650 // 658 //
651 // Caution: 'RawType*' denotes a 'raw' pointer to a VM object of class Type, 659 // Caution: 'RawType*' denotes a 'raw' pointer to a VM object of class Type,
652 // as opposed to 'Type' denoting a 'handle' to the same object. 'RawType' does 660 // as opposed to 'Type' denoting a 'handle' to the same object. 'RawType' does
653 // not relate to a 'raw type', as opposed to a 'cooked type' or 'rare type'. 661 // not relate to a 'raw type', as opposed to a 'cooked type' or 'rare type'.
654 class Type : public Object { 662 class Type : public Object {
655 public: 663 public:
656 virtual bool IsFinalized() const; 664 virtual bool IsFinalized() const;
665 virtual bool IsBeingFinalized() const;
657 virtual bool IsResolved() const; 666 virtual bool IsResolved() const;
658 virtual bool HasResolvedTypeClass() const; 667 virtual bool HasResolvedTypeClass() const;
659 virtual RawClass* type_class() const; 668 virtual RawClass* type_class() const;
660 virtual RawUnresolvedClass* unresolved_class() const; 669 virtual RawUnresolvedClass* unresolved_class() const;
661 virtual RawTypeArguments* arguments() const; 670 virtual RawTypeArguments* arguments() const;
662 virtual bool IsInstantiated() const; 671 virtual bool IsInstantiated() const;
663 672
664 // Instantiate this type using the given type argument vector starting at the 673 // Instantiate this type using the given type argument vector starting at the
665 // given offset. 674 // given offset.
666 // Return a new type, or return 'this' if it is already instantiated. 675 // Return a new type, or return 'this' if it is already instantiated.
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 800
792 // A ParameterizedType consists of a class, possibly parameterized with type 801 // A ParameterizedType consists of a class, possibly parameterized with type
793 // arguments. Example: C<T1, T2>. 802 // arguments. Example: C<T1, T2>.
794 // An unresolved class is a String specifying the class name. 803 // An unresolved class is a String specifying the class name.
795 class ParameterizedType : public Type { 804 class ParameterizedType : public Type {
796 public: 805 public:
797 virtual bool IsFinalized() const { 806 virtual bool IsFinalized() const {
798 return raw_ptr()->type_state_ == RawParameterizedType::kFinalized; 807 return raw_ptr()->type_state_ == RawParameterizedType::kFinalized;
799 } 808 }
800 void set_is_finalized() const; 809 void set_is_finalized() const;
801 bool is_being_finalized() const { 810 virtual bool IsBeingFinalized() const {
802 return raw_ptr()->type_state_ == RawParameterizedType::kBeingFinalized; 811 return raw_ptr()->type_state_ == RawParameterizedType::kBeingFinalized;
803 } 812 }
804 void set_is_being_finalized() const; 813 void set_is_being_finalized() const;
805 virtual bool IsResolved() const; // Class and all arguments classes resolved. 814 virtual bool IsResolved() const; // Class and all arguments classes resolved.
806 virtual bool HasResolvedTypeClass() const; // Own type class resolved. 815 virtual bool HasResolvedTypeClass() const; // Own type class resolved.
807 virtual RawClass* type_class() const; 816 virtual RawClass* type_class() const;
808 void set_type_class(const Object& value) const; 817 void set_type_class(const Object& value) const;
809 virtual RawUnresolvedClass* unresolved_class() const; 818 virtual RawUnresolvedClass* unresolved_class() const;
810 virtual RawTypeArguments* arguments() const; 819 virtual RawTypeArguments* arguments() const;
811 void set_arguments(const TypeArguments& value) const; 820 void set_arguments(const TypeArguments& value) const;
(...skipping 20 matching lines...) Expand all
832 841
833 842
834 // A TypeParameter, in the context of a parameterized class, references a type 843 // A TypeParameter, in the context of a parameterized class, references a type
835 // parameter of a class by its index (and by its name for debugging purposes). 844 // parameter of a class by its index (and by its name for debugging purposes).
836 // For example, the type parameter 'V' is specified as index 1 in the context of 845 // For example, the type parameter 'V' is specified as index 1 in the context of
837 // the class HashMap<K, V>. At compile time, the TypeParameter is not 846 // the class HashMap<K, V>. At compile time, the TypeParameter is not
838 // instantiated yet, i.e. it is only a place holder. 847 // instantiated yet, i.e. it is only a place holder.
839 class TypeParameter : public Type { 848 class TypeParameter : public Type {
840 public: 849 public:
841 virtual bool IsFinalized() const { return true; } 850 virtual bool IsFinalized() const { return true; }
851 virtual bool IsBeingFinalized() const { return false; }
842 virtual bool IsResolved() const { return true; } 852 virtual bool IsResolved() const { return true; }
843 virtual bool HasResolvedTypeClass() const { return false; } 853 virtual bool HasResolvedTypeClass() const { return false; }
844 virtual RawString* Name() const { return raw_ptr()->name_; } 854 virtual RawString* Name() const { return raw_ptr()->name_; }
845 virtual intptr_t Index() const { return raw_ptr()->index_; } 855 virtual intptr_t Index() const { return raw_ptr()->index_; }
846 virtual bool IsInstantiated() const { return false; } 856 virtual bool IsInstantiated() const { return false; }
847 virtual RawType* InstantiateFrom( 857 virtual RawType* InstantiateFrom(
848 const TypeArguments& instantiator_type_arguments, 858 const TypeArguments& instantiator_type_arguments,
849 intptr_t offset) const; 859 intptr_t offset) const;
850 860
851 static intptr_t InstanceSize() { 861 static intptr_t InstanceSize() {
(...skipping 17 matching lines...) Expand all
869 // An instance of InstantiatedType consists of an uninstantiated Type object 879 // An instance of InstantiatedType consists of an uninstantiated Type object
870 // and of a TypeArguments object. The type is uninstantiated, because it 880 // and of a TypeArguments object. The type is uninstantiated, because it
871 // refers to at least one TypeParameter object, i.e. to a type that is not known 881 // refers to at least one TypeParameter object, i.e. to a type that is not known
872 // at compile time. 882 // at compile time.
873 // The type argument vector is the instantiator, because each type parameter 883 // The type argument vector is the instantiator, because each type parameter
874 // with index i in the uninstantiated type can be substituted (or 884 // with index i in the uninstantiated type can be substituted (or
875 // "instantiated") with the type at index i in the type argument vector. 885 // "instantiated") with the type at index i in the type argument vector.
876 class InstantiatedType : public Type { 886 class InstantiatedType : public Type {
877 public: 887 public:
878 virtual bool IsFinalized() const { return true; } 888 virtual bool IsFinalized() const { return true; }
889 virtual bool IsBeingFinalized() const { return false; }
879 virtual bool IsResolved() const { return true; } 890 virtual bool IsResolved() const { return true; }
880 virtual bool HasResolvedTypeClass() const { return true; } 891 virtual bool HasResolvedTypeClass() const { return true; }
881 virtual RawClass* type_class() const; 892 virtual RawClass* type_class() const;
882 virtual RawTypeArguments* arguments() const; 893 virtual RawTypeArguments* arguments() const;
883 virtual bool IsInstantiated() const { return true; } 894 virtual bool IsInstantiated() const { return true; }
884 895
885 RawType* uninstantiated_type() const { 896 RawType* uninstantiated_type() const {
886 return raw_ptr()->uninstantiated_type_; 897 return raw_ptr()->uninstantiated_type_;
887 } 898 }
888 RawTypeArguments* instantiator_type_arguments() const { 899 RawTypeArguments* instantiator_type_arguments() const {
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1034 static RawInstantiatedTypeArguments* New(); 1045 static RawInstantiatedTypeArguments* New();
1035 1046
1036 HEAP_OBJECT_IMPLEMENTATION(InstantiatedTypeArguments, TypeArguments); 1047 HEAP_OBJECT_IMPLEMENTATION(InstantiatedTypeArguments, TypeArguments);
1037 friend class Class; 1048 friend class Class;
1038 }; 1049 };
1039 1050
1040 1051
1041 class Function : public Object { 1052 class Function : public Object {
1042 public: 1053 public:
1043 RawString* name() const { return raw_ptr()->name_; } 1054 RawString* name() const { return raw_ptr()->name_; }
1044 RawString* Signature() const; 1055
1056 // Build a string of the form '<T, R>(T, [b: B, c: C]) => R' representing the
1057 // signature of the given function.
1058 RawString* Signature() const {
1059 return BuildSignature(false, TypeArguments::Handle(), 0);
1060 }
1061
1062 // Build a string of the form '(A, [b: B, c: C]) => D' representing the
1063 // signature of the given function, where all generic types (e.g. '<T, R>' in
1064 // '<T, R>(T, [b: B, c: C]) => R') are instantiated using the given
1065 // instantiator type argument vector (e.g. '<A, D>').
1066 RawString* InstantiatedSignatureFrom(const TypeArguments& instantiator,
1067 intptr_t offset) const {
1068 return BuildSignature(true, instantiator, offset);
1069 }
1070
1071 // Returns true if the signature of this function is instantiated, i.e. if it
1072 // does not involve generic parameter types or generic result type.
1073 bool HasInstantiatedSignature() const;
1045 1074
1046 RawClass* owner() const { return raw_ptr()->owner_; } 1075 RawClass* owner() const { return raw_ptr()->owner_; }
1047 void set_owner(const Class& value) const; 1076 void set_owner(const Class& value) const;
1048 1077
1049 RawType* result_type() const { return raw_ptr()->result_type_; } 1078 RawType* result_type() const { return raw_ptr()->result_type_; }
1050 void set_result_type(const Type& value) const; 1079 void set_result_type(const Type& value) const;
1051 1080
1052 RawType* ParameterTypeAt(intptr_t index) const; 1081 RawType* ParameterTypeAt(intptr_t index) const;
1053 void SetParameterTypeAt(intptr_t index, const Type& value) const; 1082 void SetParameterTypeAt(intptr_t index, const Type& value) const;
1054 void set_parameter_types(const Array& value) const; 1083 void set_parameter_types(const Array& value) const;
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 private: 1254 private:
1226 void set_name(const String& value) const; 1255 void set_name(const String& value) const;
1227 void set_kind(RawFunction::Kind value) const; 1256 void set_kind(RawFunction::Kind value) const;
1228 void set_is_static(bool is_static) const; 1257 void set_is_static(bool is_static) const;
1229 void set_is_const(bool is_const) const; 1258 void set_is_const(bool is_const) const;
1230 void set_parent_function(const Function& value) const; 1259 void set_parent_function(const Function& value) const;
1231 void set_token_index(intptr_t value) const; 1260 void set_token_index(intptr_t value) const;
1232 void set_implicit_closure_function(const Function& value) const; 1261 void set_implicit_closure_function(const Function& value) const;
1233 static RawFunction* New(); 1262 static RawFunction* New();
1234 1263
1264 RawString* BuildSignature(bool instantiate,
1265 const TypeArguments& instantiator,
1266 intptr_t offset) const;
1267
1235 // Checks the subtype or assignability relationship between the type of this 1268 // Checks the subtype or assignability relationship between the type of this
1236 // function and the type of the other function. 1269 // function and the type of the other function.
1237 bool TestType(TypeTestKind test, const Function& other) const; 1270 bool TestType(TypeTestKind test, const Function& other) const;
1238 1271
1239 HEAP_OBJECT_IMPLEMENTATION(Function, Object); 1272 HEAP_OBJECT_IMPLEMENTATION(Function, Object);
1240 friend class Class; 1273 friend class Class;
1241 }; 1274 };
1242 1275
1243 1276
1244 class Field : public Object { 1277 class Field : public Object {
(...skipping 1598 matching lines...) Expand 10 before | Expand all | Expand 10 after
2843 } 2876 }
2844 2877
2845 2878
2846 void Context::SetAt(intptr_t index, const Instance& value) const { 2879 void Context::SetAt(intptr_t index, const Instance& value) const {
2847 StorePointer(InstanceAddr(index), value.raw()); 2880 StorePointer(InstanceAddr(index), value.raw());
2848 } 2881 }
2849 2882
2850 } // namespace dart 2883 } // namespace dart
2851 2884
2852 #endif // VM_OBJECT_H_ 2885 #endif // VM_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/code_generator_ia32.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698