| OLD | NEW |
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 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 | 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 kernel.transformations.closure.context; | 5 library kernel.transformations.closure.context; |
| 6 | 6 |
| 7 import '../../ast.dart' | 7 import '../../ast.dart' |
| 8 show | 8 show |
| 9 Expression, | 9 Expression, |
| 10 NullLiteral, | 10 NullLiteral, |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 parent, | 122 parent, |
| 123 converter.rewriter.contextDeclaration, | 123 converter.rewriter.contextDeclaration, |
| 124 converter.rewriter.vectorCreation); | 124 converter.rewriter.vectorCreation); |
| 125 } | 125 } |
| 126 | 126 |
| 127 Expression get expression => accessor.buildSimpleRead(); | 127 Expression get expression => accessor.buildSimpleRead(); |
| 128 | 128 |
| 129 Accessor get accessor => new VariableAccessor(self, null, TreeNode.noOffset); | 129 Accessor get accessor => new VariableAccessor(self, null, TreeNode.noOffset); |
| 130 | 130 |
| 131 void extend(VariableDeclaration variable, Expression value) { | 131 void extend(VariableDeclaration variable, Expression value) { |
| 132 // Increase index by 1, because the parent occupies item 0, and all other | 132 // Increase index by 2, because the type arguments vector occupies position |
| 133 // variables are therefore shifted by 1. | 133 // 0, the parent occupies position 1, and all other variables are therefore |
| 134 // shifted by 2. |
| 134 VectorSet initializer = | 135 VectorSet initializer = |
| 135 new VectorSet(expression, variables.length + 1, value); | 136 new VectorSet(expression, variables.length + 2, value); |
| 136 value.parent = initializer; | 137 value.parent = initializer; |
| 137 | 138 |
| 138 converter.rewriter.insertExtendContext(initializer); | 139 converter.rewriter.insertExtendContext(initializer); |
| 139 | 140 |
| 140 ++vectorCreation.length; | 141 ++vectorCreation.length; |
| 141 variables.add(variable); | 142 variables.add(variable); |
| 142 initializers[variable] = initializer; | 143 initializers[variable] = initializer; |
| 143 } | 144 } |
| 144 | 145 |
| 145 void update(VariableDeclaration variable, Expression value) { | 146 void update(VariableDeclaration variable, Expression value) { |
| 146 VectorSet initializer = initializers[variable]; | 147 VectorSet initializer = initializers[variable]; |
| 147 initializer.value = value; | 148 initializer.value = value; |
| 148 value.parent = initializer; | 149 value.parent = initializer; |
| 149 } | 150 } |
| 150 | 151 |
| 151 Expression lookup(VariableDeclaration variable) { | 152 Expression lookup(VariableDeclaration variable) { |
| 152 var index = variables.indexOf(variable); | 153 var index = variables.indexOf(variable); |
| 153 // Increase index by 1 in case of success, because the parent occupies | 154 // Increase index by 2 in case of success, because the type arguments vector |
| 154 // item 0, and all other variables are therefore shifted by 1. | 155 // occupies position 0, the parent occupies position 1, and all other |
| 156 // variables are therefore shifted by 2. |
| 155 return index == -1 | 157 return index == -1 |
| 156 ? parent.lookup(variable) | 158 ? parent.lookup(variable) |
| 157 : new VectorGet(expression, index + 1); | 159 : new VectorGet(expression, index + 2); |
| 158 } | 160 } |
| 159 | 161 |
| 160 Expression assign(VariableDeclaration variable, Expression value, | 162 Expression assign(VariableDeclaration variable, Expression value, |
| 161 {bool voidContext: false}) { | 163 {bool voidContext: false}) { |
| 162 var index = variables.indexOf(variable); | 164 var index = variables.indexOf(variable); |
| 163 // Increase index by 1 in case of success, because the parent occupies | 165 // Increase index by 2 in case of success, because the type arguments vector |
| 164 // item 0, and all other variables are therefore shifted by 1. | 166 // occupies position 0, the parent occupies position 1, and all other |
| 167 // variables are therefore shifted by 2. |
| 165 return index == -1 | 168 return index == -1 |
| 166 ? parent.assign(variable, value, voidContext: voidContext) | 169 ? parent.assign(variable, value, voidContext: voidContext) |
| 167 : new VectorSet(expression, index + 1, value); | 170 : new VectorSet(expression, index + 2, value); |
| 168 } | 171 } |
| 169 | 172 |
| 170 Context toNestedContext([Accessor accessor]) { | 173 Context toNestedContext([Accessor accessor]) { |
| 171 accessor ??= this.accessor; | 174 accessor ??= this.accessor; |
| 172 List<List<VariableDeclaration>> variabless = <List<VariableDeclaration>>[]; | 175 List<List<VariableDeclaration>> variabless = <List<VariableDeclaration>>[]; |
| 173 var current = this; | 176 var current = this; |
| 174 while (current != null && current is! NoContext) { | 177 while (current != null && current is! NoContext) { |
| 175 if (current is LocalContext) { | 178 if (current is LocalContext) { |
| 176 variabless.add(current.variables); | 179 variabless.add(current.variables); |
| 177 current = current.parent; | 180 current = current.parent; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 203 void extend(VariableDeclaration variable, Expression value) { | 206 void extend(VariableDeclaration variable, Expression value) { |
| 204 converter.context = new LocalContext(converter, this) | 207 converter.context = new LocalContext(converter, this) |
| 205 ..extend(variable, value); | 208 ..extend(variable, value); |
| 206 } | 209 } |
| 207 | 210 |
| 208 Expression lookup(VariableDeclaration variable) { | 211 Expression lookup(VariableDeclaration variable) { |
| 209 Expression context = expression; | 212 Expression context = expression; |
| 210 for (var variables in variabless) { | 213 for (var variables in variabless) { |
| 211 var index = variables.indexOf(variable); | 214 var index = variables.indexOf(variable); |
| 212 if (index != -1) { | 215 if (index != -1) { |
| 213 // Increase index by 1, because the parent occupies item 0, and all | 216 // Increase index by 2 in case of success, because the type arguments |
| 214 // other variables are therefore shifted by 1. | 217 // vector occupies position 0, the parent occupies item 1, and all other |
| 215 return new VectorGet(context, index + 1); | 218 // variables are therefore shifted by 2. |
| 219 return new VectorGet(context, index + 2); |
| 216 } | 220 } |
| 217 // Item 0 of a context always points to its parent. | 221 // Item 1 of a context always points to its parent. |
| 218 context = new VectorGet(context, 0); | 222 context = new VectorGet(context, 1); |
| 219 } | 223 } |
| 220 throw 'Unbound NestedContext.lookup($variable)'; | 224 throw 'Unbound NestedContext.lookup($variable)'; |
| 221 } | 225 } |
| 222 | 226 |
| 223 Expression assign(VariableDeclaration variable, Expression value, | 227 Expression assign(VariableDeclaration variable, Expression value, |
| 224 {bool voidContext: false}) { | 228 {bool voidContext: false}) { |
| 225 Expression context = expression; | 229 Expression context = expression; |
| 226 for (List<VariableDeclaration> variables in variabless) { | 230 for (List<VariableDeclaration> variables in variabless) { |
| 227 var index = variables.indexOf(variable); | 231 var index = variables.indexOf(variable); |
| 228 if (index != -1) { | 232 if (index != -1) { |
| 229 // Increase index by 1, because the parent occupies item 0, and all | 233 // Increase index by 2 in case of success, because the type arguments |
| 230 // other variables are therefore shifted by 1. | 234 // vector occupies position 0, the parent occupies item 1, and all other |
| 231 return new VectorSet(context, index + 1, value); | 235 // variables are therefore shifted by 2. |
| 236 return new VectorSet(context, index + 2, value); |
| 232 } | 237 } |
| 233 // Item 0 of a context always points to its parent. | 238 // Item 1 of a context always points to its parent. |
| 234 context = new VectorGet(context, 0); | 239 context = new VectorGet(context, 1); |
| 235 } | 240 } |
| 236 throw 'Unbound NestedContext.lookup($variable)'; | 241 throw 'Unbound NestedContext.lookup($variable)'; |
| 237 } | 242 } |
| 238 | 243 |
| 239 Context toNestedContext([Accessor accessor]) { | 244 Context toNestedContext([Accessor accessor]) { |
| 240 return new NestedContext(converter, accessor ?? this.accessor, variabless); | 245 return new NestedContext(converter, accessor ?? this.accessor, variabless); |
| 241 } | 246 } |
| 242 } | 247 } |
| OLD | NEW |