Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | |
| 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. | |
| 4 | |
| 5 #ifndef VM_TOKEN_DESCRIPTOR_H_ | |
| 6 #define VM_TOKEN_DESCRIPTOR_H_ | |
| 7 | |
| 8 #include "platform/utils.h" | |
| 9 #include "vm/allocation.h" | |
| 10 | |
| 11 namespace dart { | |
| 12 | |
| 13 // The token space is organized as follows: | |
| 14 // | |
| 15 // Sentinel values start at -1 and move towards negative infinity: | |
| 16 // kNoSourcePos -> -1 | |
| 17 // ClassifyingTokenDescriptors 1 -> -1 - 1 | |
| 18 // ClassifyingTokenDescriptors N -> -1 - N | |
| 19 // | |
| 20 // Synthetically created AstNodes are given real source positions but encoded | |
| 21 // as negative numbers from [kSmiMin32, -1 - N]. For example: | |
| 22 // | |
| 23 // A source position of 0 in a synthetic AstNode would be encoded as -2 - N. | |
| 24 // A source position of 1 in a synthetic AstNode would be encoded as -3 - N. | |
| 25 // | |
| 26 // All other AstNodes are given real source positions encoded as positive | |
| 27 // integers. | |
| 28 // | |
| 29 // This organization allows for ~1 billion token positions. | |
| 30 // | |
| 31 // NOTE: While token positions are passed around as an intptr_t they are encoded | |
|
hausner
2016/01/28 18:43:25
The intptr_t reference is not true anymore.
Cutch
2016/02/02 18:00:20
Done.
| |
| 32 // into the snapshot as an int32_t. | |
|
rmacnak
2016/01/28 18:21:50
encoded into the snapshot and stored on the heap
Cutch
2016/02/02 18:00:20
Acknowledged.
| |
| 33 | |
| 34 #define SENTINEL_TOKEN_DESCRIPTORS(V) \ | |
| 35 V(NoSource, -1) \ | |
| 36 V(Box, -2) \ | |
| 37 V(ParallelMove, -3) \ | |
| 38 V(TempMove, -4) \ | |
| 39 V(Constant, -5) \ | |
| 40 V(PushArgument, -6) \ | |
| 41 V(ControlFlow, -7) \ | |
| 42 V(Context, -8) \ | |
| 43 V(MethodExtractor, -9) \ | |
| 44 V(Last, -10) // Always keep this at the end. | |
| 45 | |
| 46 // An immutable token position representing a debug safe source position, | |
| 47 // a synthetic source position, or a classifying token position. | |
| 48 class TokenDescriptor { | |
| 49 public: | |
| 50 TokenDescriptor() | |
| 51 : value_(kNoSource.value()) { | |
| 52 } | |
| 53 | |
| 54 explicit TokenDescriptor(intptr_t value) | |
| 55 : value_(value) { | |
| 56 } | |
| 57 | |
| 58 inline bool operator==(const TokenDescriptor& b) const { | |
| 59 return value() == b.value(); | |
| 60 } | |
| 61 | |
| 62 inline bool operator!=(const TokenDescriptor& b) const { | |
| 63 return !(*this == b); | |
| 64 } | |
| 65 | |
| 66 inline bool operator<(const TokenDescriptor& b) const { | |
| 67 return value() < b.value(); | |
| 68 } | |
| 69 | |
| 70 inline bool operator>(const TokenDescriptor& b) const { | |
| 71 return b < *this; | |
| 72 } | |
| 73 | |
| 74 inline bool operator<=(const TokenDescriptor& b) { | |
| 75 return !(*this > b); | |
| 76 } | |
| 77 | |
| 78 inline bool operator>=(const TokenDescriptor& b) { | |
| 79 return !(*this < b); | |
| 80 } | |
| 81 | |
| 82 static const intptr_t kMaxSentinelDescriptors = 64; | |
| 83 | |
| 84 #define DECLARE_VALUES(name, value) \ | |
| 85 static const TokenDescriptor k##name; | |
| 86 SENTINEL_TOKEN_DESCRIPTORS(DECLARE_VALUES); | |
| 87 #undef DECLARE_VALUES | |
| 88 static const TokenDescriptor kMinSource; | |
| 89 static const TokenDescriptor kMaxSource; | |
| 90 | |
| 91 // Decode from a snapshot. | |
| 92 static TokenDescriptor SnapshotDecode(int32_t value); | |
| 93 | |
| 94 // Encode for writing into a snapshot. | |
| 95 int32_t SnapshotEncode(); | |
| 96 | |
| 97 void Next() { | |
| 98 ASSERT(IsReal()); | |
| 99 value_++; | |
| 100 } | |
| 101 | |
| 102 // The raw value. | |
| 103 intptr_t value() const { | |
| 104 return value_; | |
| 105 } | |
| 106 | |
| 107 // Token position constants. | |
| 108 static const intptr_t kNoSourcePos = -1; | |
| 109 static const intptr_t kMinSourcePos = 0; | |
| 110 static const intptr_t kMaxSourcePos = kSmiMax32 - kMaxSentinelDescriptors - 2; | |
| 111 | |
| 112 // Is |this| a classifying sentinel source position? | |
|
rmacnak
2016/01/28 18:21:50
+ Classifying positions are used by the profiler t
| |
| 113 bool IsClassifying() const { | |
| 114 return (value_ >= kBox.value()) && (value_ <= kLast.value()); | |
| 115 } | |
| 116 | |
| 117 // Is |this| the no source position sentinel? | |
| 118 bool IsNoSource() const { | |
| 119 return *this == kNoSource; | |
| 120 } | |
| 121 | |
| 122 // Is |this| a synthetic source position? | |
|
rmacnak
2016/01/28 18:21:50
+ Synthetic source positions are used by the profi
| |
| 123 bool IsSynthetic() const; | |
| 124 | |
| 125 // Is |this| a real source position? | |
| 126 bool IsReal() const { | |
| 127 return value_ >= kMinSourcePos; | |
| 128 } | |
| 129 | |
| 130 // Is |this| a source position? | |
| 131 bool IsSourcePosition() const { | |
| 132 return IsReal() || IsNoSource() || IsSynthetic(); | |
| 133 } | |
| 134 | |
| 135 // Is |this| a debug pause source position? | |
| 136 bool IsDebugPause() const { | |
| 137 // Sanity check some values here. | |
| 138 ASSERT(kNoSource.value() == kNoSourcePos); | |
| 139 ASSERT(kLast.value() < kNoSource.value()); | |
| 140 ASSERT(kLast.value() > -kMaxSentinelDescriptors); | |
| 141 return IsReal(); | |
| 142 } | |
| 143 | |
| 144 // Encode |value| into a synthetic source position. | |
| 145 static TokenDescriptor ToSynthetic(TokenDescriptor tp) { | |
| 146 const intptr_t value = tp.value(); | |
| 147 if (tp.IsClassifying() || tp.IsNoSource()) { | |
| 148 return tp; | |
| 149 } | |
| 150 if (tp.IsSynthetic()) { | |
| 151 return tp; | |
| 152 } | |
| 153 const TokenDescriptor synthetic_value = | |
| 154 TokenDescriptor((kLast.value() - 1) - value); | |
| 155 ASSERT(synthetic_value.IsSynthetic()); | |
| 156 ASSERT(synthetic_value.value() < kLast.value()); | |
| 157 return synthetic_value; | |
| 158 } | |
| 159 | |
| 160 // Decode |synthetic_value| from a synthetic source position. | |
| 161 static TokenDescriptor FromSynthetic(TokenDescriptor tp) { | |
| 162 const intptr_t synthetic_value = tp.value(); | |
| 163 if (tp.IsClassifying() || tp.IsNoSource()) { | |
| 164 return tp; | |
| 165 } | |
| 166 if (!tp.IsSynthetic()) { | |
| 167 return tp; | |
| 168 } | |
| 169 const TokenDescriptor value = | |
| 170 TokenDescriptor(-synthetic_value + (kLast.value() - 1)); | |
| 171 ASSERT(!value.IsSynthetic()); | |
| 172 return value; | |
| 173 } | |
| 174 | |
| 175 const char* ToCString() const; | |
| 176 | |
| 177 private: | |
| 178 int32_t value_; | |
| 179 | |
| 180 DISALLOW_ALLOCATION(); | |
| 181 }; | |
| 182 | |
| 183 } // namespace dart | |
| 184 | |
| 185 #endif // VM_TOKEN_DESCRIPTOR_H_ | |
| OLD | NEW |