Chromium Code Reviews| Index: frog/leg/ssa/closure.dart |
| diff --git a/frog/leg/ssa/closure.dart b/frog/leg/ssa/closure.dart |
| index 6964dddb007d8d2de4de2a3ab20b2378e94cefd4..3f2e184a7390d1fe25ca98a88ed5d2d8316c7f52 100644 |
| --- a/frog/leg/ssa/closure.dart |
| +++ b/frog/leg/ssa/closure.dart |
| @@ -22,6 +22,8 @@ class ClosureScope { |
| } |
| class ClosureData { |
| + // The closure's or method's element before any translation. |
| + final FunctionElement closureElement; |
|
ngeoffray
2012/02/13 10:13:38
Should it just be null for non-closures?
floitsch
2012/02/13 12:03:42
Done.
|
| // The globalizedClosureElement will be null for methods that are not local |
| // closures. |
| final ClassElement globalizedClosureElement; |
|
ngeoffray
2012/02/13 10:13:38
How about renaming it to closureClassElement?
floitsch
2012/02/13 12:03:42
Done.
|
| @@ -49,11 +51,16 @@ class ClosureData { |
| final Set<Element> usedVariablesInTry; |
| - ClosureData(this.globalizedClosureElement, this.callElement, this.thisElement) |
| + ClosureData(this.closureElement, |
| + this.globalizedClosureElement, |
| + this.callElement, |
| + this.thisElement) |
| : this.freeVariableMapping = new Map<Element, Element>(), |
| this.capturedFieldMapping = new Map<Element, Element>(), |
| this.capturingScopes = new Map<Node, ClosureScope>(), |
| this.usedVariablesInTry = new Set<Element>(); |
| + |
| + bool isClosure() => globalizedClosureElement !== null; |
| } |
| Map<Node, ClosureData> _closureDataCache; |
| @@ -266,7 +273,8 @@ class ClosureTranslator extends AbstractVisitor { |
| // The nested function's 'this' is the same as the one for the outer |
| // function. It could be [null] if we are inside a static method. |
| Element thisElement = closureData.thisElement; |
| - return new ClosureData(globalizedElement, callElement, thisElement); |
| + return new ClosureData(element, globalizedElement, |
| + callElement, thisElement); |
| } |
| visitFunctionExpression(FunctionExpression node) { |
| @@ -303,7 +311,7 @@ class ClosureTranslator extends AbstractVisitor { |
| ElementKind.PARAMETER, |
| thisEnclosingElement); |
| } |
| - closureData = new ClosureData(null, null, thisElement); |
| + closureData = new ClosureData(element, null, null, thisElement); |
| } |
| scopeVariables = new List<Element>(); |
| @@ -334,18 +342,18 @@ class ClosureTranslator extends AbstractVisitor { |
| List<Element> freeVariables = |
| savedClosureData.freeVariableMapping.getKeys(); |
| assert(freeVariables.isEmpty() || savedInsideClosure); |
| - for (Element element in freeVariables) { |
| - assert(capturedVariableMapping[element] == null || |
| - capturedVariableMapping[element] == element); |
| - capturedVariableMapping[element] = element; |
| - useLocal(element); |
| + for (Element freeElement in freeVariables) { |
| + assert(capturedVariableMapping[freeElement] == null || |
| + capturedVariableMapping[freeElement] == freeElement); |
| + capturedVariableMapping[freeElement] = freeElement; |
| + useLocal(freeElement); |
| } |
| // If we just visited a closure we declare it. This is not always correct |
| // since some closures are used as expressions and don't introduce any |
| // name. But in this case the added local is simply not used. |
| if (savedInsideClosure) { |
| - declareLocal(elements[node]); |
| + declareLocal(element); |
| } |
| } |