OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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 library universe.side_effects; | 5 library universe.side_effects; |
6 | 6 |
7 class SideEffects { | 7 class SideEffects { |
8 // Changes flags. | 8 // Changes flags. |
9 static const int FLAG_CHANGES_INDEX = 0; | 9 static const int FLAG_CHANGES_INDEX = 0; |
10 static const int FLAG_CHANGES_INSTANCE_PROPERTY = FLAG_CHANGES_INDEX + 1; | 10 static const int FLAG_CHANGES_INSTANCE_PROPERTY = FLAG_CHANGES_INDEX + 1; |
11 static const int FLAG_CHANGES_STATIC_PROPERTY | 11 static const int FLAG_CHANGES_STATIC_PROPERTY = |
12 = FLAG_CHANGES_INSTANCE_PROPERTY + 1; | 12 FLAG_CHANGES_INSTANCE_PROPERTY + 1; |
13 static const int FLAG_CHANGES_COUNT = FLAG_CHANGES_STATIC_PROPERTY + 1; | 13 static const int FLAG_CHANGES_COUNT = FLAG_CHANGES_STATIC_PROPERTY + 1; |
14 | 14 |
15 // Depends flags (one for each changes flag). | 15 // Depends flags (one for each changes flag). |
16 static const int FLAG_DEPENDS_ON_INDEX_STORE = FLAG_CHANGES_COUNT; | 16 static const int FLAG_DEPENDS_ON_INDEX_STORE = FLAG_CHANGES_COUNT; |
17 static const int FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE = | 17 static const int FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE = |
18 FLAG_DEPENDS_ON_INDEX_STORE + 1; | 18 FLAG_DEPENDS_ON_INDEX_STORE + 1; |
19 static const int FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE = | 19 static const int FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE = |
20 FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE + 1; | 20 FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE + 1; |
21 static const int FLAG_DEPENDS_ON_COUNT = | 21 static const int FLAG_DEPENDS_ON_COUNT = |
22 FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE + 1; | 22 FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE + 1; |
23 | 23 |
24 int _flags = 0; | 24 int _flags = 0; |
25 | 25 |
26 SideEffects() { | 26 SideEffects() { |
27 setAllSideEffects(); | 27 setAllSideEffects(); |
28 setDependsOnSomething(); | 28 setDependsOnSomething(); |
29 } | 29 } |
30 | 30 |
31 SideEffects.empty() { | 31 SideEffects.empty() { |
32 clearAllDependencies(); | 32 clearAllDependencies(); |
33 clearAllSideEffects(); | 33 clearAllSideEffects(); |
34 } | 34 } |
35 | 35 |
36 bool operator==(other) => _flags == other._flags; | 36 bool operator ==(other) => _flags == other._flags; |
37 | 37 |
38 int get hashCode => throw new UnsupportedError('SideEffects.hashCode'); | 38 int get hashCode => throw new UnsupportedError('SideEffects.hashCode'); |
39 | 39 |
40 bool _getFlag(int position) => (_flags & (1 << position)) != 0; | 40 bool _getFlag(int position) => (_flags & (1 << position)) != 0; |
41 void _setFlag(int position) { _flags |= (1 << position); } | 41 void _setFlag(int position) { |
42 void _clearFlag(int position) { _flags &= ~(1 << position); } | 42 _flags |= (1 << position); |
| 43 } |
| 44 |
| 45 void _clearFlag(int position) { |
| 46 _flags &= ~(1 << position); |
| 47 } |
43 | 48 |
44 int getChangesFlags() => _flags & ((1 << FLAG_CHANGES_COUNT) - 1); | 49 int getChangesFlags() => _flags & ((1 << FLAG_CHANGES_COUNT) - 1); |
45 int getDependsOnFlags() { | 50 int getDependsOnFlags() { |
46 return (_flags & ((1 << FLAG_DEPENDS_ON_COUNT) - 1)) >> FLAG_CHANGES_COUNT; | 51 return (_flags & ((1 << FLAG_DEPENDS_ON_COUNT) - 1)) >> FLAG_CHANGES_COUNT; |
47 } | 52 } |
48 | 53 |
49 bool hasSideEffects() => getChangesFlags() != 0; | 54 bool hasSideEffects() => getChangesFlags() != 0; |
50 bool dependsOnSomething() => getDependsOnFlags() != 0; | 55 bool dependsOnSomething() => getDependsOnFlags() != 0; |
51 | 56 |
52 void setAllSideEffects() { _flags |= ((1 << FLAG_CHANGES_COUNT) - 1); } | 57 void setAllSideEffects() { |
| 58 _flags |= ((1 << FLAG_CHANGES_COUNT) - 1); |
| 59 } |
53 | 60 |
54 void clearAllSideEffects() { _flags &= ~((1 << FLAG_CHANGES_COUNT) - 1); } | 61 void clearAllSideEffects() { |
| 62 _flags &= ~((1 << FLAG_CHANGES_COUNT) - 1); |
| 63 } |
55 | 64 |
56 void setDependsOnSomething() { | 65 void setDependsOnSomething() { |
57 int count = FLAG_DEPENDS_ON_COUNT - FLAG_CHANGES_COUNT; | 66 int count = FLAG_DEPENDS_ON_COUNT - FLAG_CHANGES_COUNT; |
58 _flags |= (((1 << count) - 1) << FLAG_CHANGES_COUNT); | 67 _flags |= (((1 << count) - 1) << FLAG_CHANGES_COUNT); |
59 } | 68 } |
| 69 |
60 void clearAllDependencies() { | 70 void clearAllDependencies() { |
61 int count = FLAG_DEPENDS_ON_COUNT - FLAG_CHANGES_COUNT; | 71 int count = FLAG_DEPENDS_ON_COUNT - FLAG_CHANGES_COUNT; |
62 _flags &= ~(((1 << count) - 1) << FLAG_CHANGES_COUNT); | 72 _flags &= ~(((1 << count) - 1) << FLAG_CHANGES_COUNT); |
63 } | 73 } |
64 | 74 |
65 bool dependsOnStaticPropertyStore() { | 75 bool dependsOnStaticPropertyStore() { |
66 return _getFlag(FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE); | 76 return _getFlag(FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE); |
67 } | 77 } |
| 78 |
68 void setDependsOnStaticPropertyStore() { | 79 void setDependsOnStaticPropertyStore() { |
69 _setFlag(FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE); | 80 _setFlag(FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE); |
70 } | 81 } |
| 82 |
71 void clearDependsOnStaticPropertyStore() { | 83 void clearDependsOnStaticPropertyStore() { |
72 _clearFlag(FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE); | 84 _clearFlag(FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE); |
73 } | 85 } |
74 void setChangesStaticProperty() { _setFlag(FLAG_CHANGES_STATIC_PROPERTY); } | 86 |
| 87 void setChangesStaticProperty() { |
| 88 _setFlag(FLAG_CHANGES_STATIC_PROPERTY); |
| 89 } |
| 90 |
75 void clearChangesStaticProperty() { | 91 void clearChangesStaticProperty() { |
76 _clearFlag(FLAG_CHANGES_STATIC_PROPERTY); | 92 _clearFlag(FLAG_CHANGES_STATIC_PROPERTY); |
77 } | 93 } |
| 94 |
78 bool changesStaticProperty() => _getFlag(FLAG_CHANGES_STATIC_PROPERTY); | 95 bool changesStaticProperty() => _getFlag(FLAG_CHANGES_STATIC_PROPERTY); |
79 | 96 |
80 bool dependsOnIndexStore() => _getFlag(FLAG_DEPENDS_ON_INDEX_STORE); | 97 bool dependsOnIndexStore() => _getFlag(FLAG_DEPENDS_ON_INDEX_STORE); |
81 void setDependsOnIndexStore() { _setFlag(FLAG_DEPENDS_ON_INDEX_STORE); } | 98 void setDependsOnIndexStore() { |
82 void clearDependsOnIndexStore() { _clearFlag(FLAG_DEPENDS_ON_INDEX_STORE); } | 99 _setFlag(FLAG_DEPENDS_ON_INDEX_STORE); |
83 void setChangesIndex() { _setFlag(FLAG_CHANGES_INDEX); } | 100 } |
84 void clearChangesIndex() { _clearFlag(FLAG_CHANGES_INDEX); } | 101 |
| 102 void clearDependsOnIndexStore() { |
| 103 _clearFlag(FLAG_DEPENDS_ON_INDEX_STORE); |
| 104 } |
| 105 |
| 106 void setChangesIndex() { |
| 107 _setFlag(FLAG_CHANGES_INDEX); |
| 108 } |
| 109 |
| 110 void clearChangesIndex() { |
| 111 _clearFlag(FLAG_CHANGES_INDEX); |
| 112 } |
| 113 |
85 bool changesIndex() => _getFlag(FLAG_CHANGES_INDEX); | 114 bool changesIndex() => _getFlag(FLAG_CHANGES_INDEX); |
86 | 115 |
87 bool dependsOnInstancePropertyStore() { | 116 bool dependsOnInstancePropertyStore() { |
88 return _getFlag(FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE); | 117 return _getFlag(FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE); |
89 } | 118 } |
| 119 |
90 void setDependsOnInstancePropertyStore() { | 120 void setDependsOnInstancePropertyStore() { |
91 _setFlag(FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE); | 121 _setFlag(FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE); |
92 } | 122 } |
| 123 |
93 void clearDependsOnInstancePropertyStore() { | 124 void clearDependsOnInstancePropertyStore() { |
94 _setFlag(FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE); | 125 _setFlag(FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE); |
95 } | 126 } |
| 127 |
96 void setChangesInstanceProperty() { | 128 void setChangesInstanceProperty() { |
97 _setFlag(FLAG_CHANGES_INSTANCE_PROPERTY); | 129 _setFlag(FLAG_CHANGES_INSTANCE_PROPERTY); |
98 } | 130 } |
| 131 |
99 void clearChangesInstanceProperty() { | 132 void clearChangesInstanceProperty() { |
100 _clearFlag(FLAG_CHANGES_INSTANCE_PROPERTY); | 133 _clearFlag(FLAG_CHANGES_INSTANCE_PROPERTY); |
101 } | 134 } |
| 135 |
102 bool changesInstanceProperty() => _getFlag(FLAG_CHANGES_INSTANCE_PROPERTY); | 136 bool changesInstanceProperty() => _getFlag(FLAG_CHANGES_INSTANCE_PROPERTY); |
103 | 137 |
104 static int computeDependsOnFlags(int flags) => flags << FLAG_CHANGES_COUNT; | 138 static int computeDependsOnFlags(int flags) => flags << FLAG_CHANGES_COUNT; |
105 | 139 |
106 bool dependsOn(int dependsFlags) => (_flags & dependsFlags) != 0; | 140 bool dependsOn(int dependsFlags) => (_flags & dependsFlags) != 0; |
107 | 141 |
108 void add(SideEffects other) { | 142 void add(SideEffects other) { |
109 _flags |= other._flags; | 143 _flags |= other._flags; |
110 } | 144 } |
111 | 145 |
(...skipping 10 matching lines...) Expand all Loading... |
122 if (!dependsOnSomething()) buffer.write(' nothing'); | 156 if (!dependsOnSomething()) buffer.write(' nothing'); |
123 buffer.write(', Changes'); | 157 buffer.write(', Changes'); |
124 if (changesIndex()) buffer.write(' []'); | 158 if (changesIndex()) buffer.write(' []'); |
125 if (changesInstanceProperty()) buffer.write(' field'); | 159 if (changesInstanceProperty()) buffer.write(' field'); |
126 if (changesStaticProperty()) buffer.write(' static'); | 160 if (changesStaticProperty()) buffer.write(' static'); |
127 if (!hasSideEffects()) buffer.write(' nothing'); | 161 if (!hasSideEffects()) buffer.write(' nothing'); |
128 buffer.write('.'); | 162 buffer.write('.'); |
129 return buffer.toString(); | 163 return buffer.toString(); |
130 } | 164 } |
131 } | 165 } |
OLD | NEW |