| 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 |