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

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

Issue 1722733002: In background compilation make a copy of Field in order to freeze its state (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: s Created 4 years, 10 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
« no previous file with comments | « runtime/vm/jit_optimizer.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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 "include/dart_api.h" 8 #include "include/dart_api.h"
9 #include "platform/assert.h" 9 #include "platform/assert.h"
10 #include "platform/utils.h" 10 #include "platform/utils.h"
(...skipping 2863 matching lines...) Expand 10 before | Expand all | Expand 10 after
2874 2874
2875 FINAL_HEAP_OBJECT_IMPLEMENTATION(RedirectionData, Object); 2875 FINAL_HEAP_OBJECT_IMPLEMENTATION(RedirectionData, Object);
2876 friend class Class; 2876 friend class Class;
2877 friend class Function; 2877 friend class Function;
2878 friend class HeapProfiler; 2878 friend class HeapProfiler;
2879 }; 2879 };
2880 2880
2881 2881
2882 class Field : public Object { 2882 class Field : public Object {
2883 public: 2883 public:
2884 RawField* Original() const;
2885 void SetOriginal(const Field& value) const;
2886 bool IsOriginal() const {
2887 if (IsNull()) {
2888 return true;
2889 }
2890 NoSafepointScope no_safepoint;
2891 return !raw_ptr()->owner_->IsField();
2892 }
2893
2894 // Returns a field cloned from 'this'. 'this' is set as the
2895 // original field of result.
2896 RawField* CloneFromOriginal() const;
2897
2884 RawString* name() const { return raw_ptr()->name_; } 2898 RawString* name() const { return raw_ptr()->name_; }
2885 RawString* UserVisibleName() const; // Same as scrubbed name. 2899 RawString* UserVisibleName() const; // Same as scrubbed name.
2886 virtual RawString* DictionaryName() const { return name(); } 2900 virtual RawString* DictionaryName() const { return name(); }
2887 2901
2888 bool is_static() const { return StaticBit::decode(raw_ptr()->kind_bits_); } 2902 bool is_static() const { return StaticBit::decode(raw_ptr()->kind_bits_); }
2889 bool is_final() const { return FinalBit::decode(raw_ptr()->kind_bits_); } 2903 bool is_final() const { return FinalBit::decode(raw_ptr()->kind_bits_); }
2890 bool is_const() const { return ConstBit::decode(raw_ptr()->kind_bits_); } 2904 bool is_const() const { return ConstBit::decode(raw_ptr()->kind_bits_); }
2891 bool is_reflectable() const { 2905 bool is_reflectable() const {
2892 return ReflectableBit::decode(raw_ptr()->kind_bits_); 2906 return ReflectableBit::decode(raw_ptr()->kind_bits_);
2893 } 2907 }
2894 void set_is_reflectable(bool value) const { 2908 void set_is_reflectable(bool value) const {
2909 ASSERT(IsOriginal());
2895 set_kind_bits(ReflectableBit::update(value, raw_ptr()->kind_bits_)); 2910 set_kind_bits(ReflectableBit::update(value, raw_ptr()->kind_bits_));
2896 } 2911 }
2897 bool is_double_initialized() const { 2912 bool is_double_initialized() const {
2898 return DoubleInitializedBit::decode(raw_ptr()->kind_bits_); 2913 return DoubleInitializedBit::decode(raw_ptr()->kind_bits_);
2899 } 2914 }
2900 // Called in parser after allocating field, immutable property otherwise. 2915 // Called in parser after allocating field, immutable property otherwise.
2901 // Marks fields that are initialized with a simple double constant. 2916 // Marks fields that are initialized with a simple double constant.
2902 void set_is_double_initialized(bool value) const { 2917 void set_is_double_initialized(bool value) const {
2903 ASSERT(Thread::Current()->IsMutatorThread()); 2918 ASSERT(Thread::Current()->IsMutatorThread());
2919 ASSERT(IsOriginal());
2904 set_kind_bits(DoubleInitializedBit::update(value, raw_ptr()->kind_bits_)); 2920 set_kind_bits(DoubleInitializedBit::update(value, raw_ptr()->kind_bits_));
2905 } 2921 }
2906 2922
2907 inline intptr_t Offset() const; 2923 inline intptr_t Offset() const;
2908 // Called during class finalization. 2924 // Called during class finalization.
2909 inline void SetOffset(intptr_t offset_in_bytes) const; 2925 inline void SetOffset(intptr_t offset_in_bytes) const;
2910 2926
2911 inline RawInstance* StaticValue() const; 2927 inline RawInstance* StaticValue() const;
2912 inline void SetStaticValue(const Instance& value, 2928 inline void SetStaticValue(const Instance& value,
2913 bool save_initial_value = false) const; 2929 bool save_initial_value = false) const;
2914 2930
2915 RawClass* owner() const; 2931 RawClass* Owner() const;
2916 RawClass* origin() const; // Either mixin class, or same as owner(). 2932 RawClass* Origin() const; // Either mixin class, or same as owner().
2917 RawScript* script() const; 2933 RawScript* Script() const;
2918 RawObject* RawOwner() const { return raw_ptr()->owner_; } 2934 RawObject* RawOwner() const;
2919 2935
2920 RawAbstractType* type() const { return raw_ptr()->type_; } 2936 RawAbstractType* type() const { return raw_ptr()->type_; }
2921 // Used by class finalizer, otherwise initialized in constructor. 2937 // Used by class finalizer, otherwise initialized in constructor.
2922 void SetFieldType(const AbstractType& value) const; 2938 void SetFieldType(const AbstractType& value) const;
2923 2939
2924 static intptr_t InstanceSize() { 2940 static intptr_t InstanceSize() {
2925 return RoundedAllocationSize(sizeof(RawField)); 2941 return RoundedAllocationSize(sizeof(RawField));
2926 } 2942 }
2927 2943
2928 static RawField* New(const String& name, 2944 static RawField* New(const String& name,
2929 bool is_static, 2945 bool is_static,
2930 bool is_final, 2946 bool is_final,
2931 bool is_const, 2947 bool is_const,
2932 bool is_reflectable, 2948 bool is_reflectable,
2933 const Class& owner, 2949 const Class& owner,
2934 const AbstractType& type, 2950 const AbstractType& type,
2935 TokenPosition token_pos); 2951 TokenPosition token_pos);
2936 2952
2937 static RawField* NewTopLevel(const String& name, 2953 static RawField* NewTopLevel(const String& name,
2938 bool is_final, 2954 bool is_final,
2939 bool is_const, 2955 bool is_const,
2940 const Object& owner, 2956 const Object& owner,
2941 TokenPosition token_pos); 2957 TokenPosition token_pos);
2942 2958
2943 // Allocate new field object, clone values from this field. The 2959 // Allocate new field object, clone values from this field. The
2944 // owner of the clone is new_owner. 2960 // owner of the clone is new_owner.
2945 RawField* Clone(const Class& new_owner) const; 2961 RawField* Clone(const Class& new_owner) const;
2962 // Allocate new field object, clone values from this field. The
2963 // original is specified.
2964 RawField* Clone(const Field& original) const;
2946 2965
2947 static intptr_t instance_field_offset() { 2966 static intptr_t instance_field_offset() {
2948 return OFFSET_OF(RawField, value_.offset_); 2967 return OFFSET_OF(RawField, value_.offset_);
2949 } 2968 }
2950 static intptr_t static_value_offset() { 2969 static intptr_t static_value_offset() {
2951 return OFFSET_OF(RawField, value_.static_value_); 2970 return OFFSET_OF(RawField, value_.static_value_);
2952 } 2971 }
2953 2972
2954 static intptr_t kind_bits_offset() { return OFFSET_OF(RawField, kind_bits_); } 2973 static intptr_t kind_bits_offset() { return OFFSET_OF(RawField, kind_bits_); }
2955 2974
2956 TokenPosition token_pos() const { return raw_ptr()->token_pos_; } 2975 TokenPosition token_pos() const { return raw_ptr()->token_pos_; }
2957 2976
2958 bool has_initializer() const { 2977 bool has_initializer() const {
2959 return HasInitializerBit::decode(raw_ptr()->kind_bits_); 2978 return HasInitializerBit::decode(raw_ptr()->kind_bits_);
2960 } 2979 }
2961 // Called by parser after allocating field. 2980 // Called by parser after allocating field.
2962 void set_has_initializer(bool has_initializer) const { 2981 void set_has_initializer(bool has_initializer) const {
2982 ASSERT(IsOriginal());
2963 ASSERT(Thread::Current()->IsMutatorThread()); 2983 ASSERT(Thread::Current()->IsMutatorThread());
2964 set_kind_bits(HasInitializerBit::update(has_initializer, 2984 set_kind_bits(HasInitializerBit::update(has_initializer,
2965 raw_ptr()->kind_bits_)); 2985 raw_ptr()->kind_bits_));
2966 } 2986 }
2967 2987
2968 // Return class id that any non-null value read from this field is guaranteed 2988 // Return class id that any non-null value read from this field is guaranteed
2969 // to have or kDynamicCid if such class id is not known. 2989 // to have or kDynamicCid if such class id is not known.
2970 // Stores to this field must update this information hence the name. 2990 // Stores to this field must update this information hence the name.
2971 intptr_t guarded_cid() const { return raw_ptr()->guarded_cid_; } 2991 intptr_t guarded_cid() const { return raw_ptr()->guarded_cid_; }
2972 2992
(...skipping 30 matching lines...) Expand all
3003 intptr_t UnboxedFieldCid() const { 3023 intptr_t UnboxedFieldCid() const {
3004 return guarded_cid(); 3024 return guarded_cid();
3005 } 3025 }
3006 3026
3007 bool is_unboxing_candidate() const { 3027 bool is_unboxing_candidate() const {
3008 return UnboxingCandidateBit::decode(raw_ptr()->kind_bits_); 3028 return UnboxingCandidateBit::decode(raw_ptr()->kind_bits_);
3009 } 3029 }
3010 // Default 'true', set to false once optimizing compiler determines it should 3030 // Default 'true', set to false once optimizing compiler determines it should
3011 // be boxed. 3031 // be boxed.
3012 void set_is_unboxing_candidate(bool b) const { 3032 void set_is_unboxing_candidate(bool b) const {
3033 ASSERT(IsOriginal());
3013 set_kind_bits(UnboxingCandidateBit::update(b, raw_ptr()->kind_bits_)); 3034 set_kind_bits(UnboxingCandidateBit::update(b, raw_ptr()->kind_bits_));
3014 } 3035 }
3015 3036
3016 static bool IsExternalizableCid(intptr_t cid) { 3037 static bool IsExternalizableCid(intptr_t cid) {
3017 return (cid == kOneByteStringCid) || (cid == kTwoByteStringCid); 3038 return (cid == kOneByteStringCid) || (cid == kTwoByteStringCid);
3018 } 3039 }
3019 3040
3020 enum { 3041 enum {
3021 kUnknownLengthOffset = -1, 3042 kUnknownLengthOffset = -1,
3022 kUnknownFixedLength = -1, 3043 kUnknownFixedLength = -1,
(...skipping 5404 matching lines...) Expand 10 before | Expand all | Expand 10 after
8427 8448
8428 8449
8429 RawObject* MegamorphicCache::GetTargetFunction(const Array& array, 8450 RawObject* MegamorphicCache::GetTargetFunction(const Array& array,
8430 intptr_t index) { 8451 intptr_t index) {
8431 return array.At((index * kEntryLength) + kTargetFunctionIndex); 8452 return array.At((index * kEntryLength) + kTargetFunctionIndex);
8432 } 8453 }
8433 8454
8434 } // namespace dart 8455 } // namespace dart
8435 8456
8436 #endif // VM_OBJECT_H_ 8457 #endif // VM_OBJECT_H_
OLDNEW
« no previous file with comments | « runtime/vm/jit_optimizer.cc ('k') | runtime/vm/object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698