Chromium Code Reviews| Index: frog/leg/ssa/builder.dart |
| diff --git a/frog/leg/ssa/builder.dart b/frog/leg/ssa/builder.dart |
| index bff34c72b9c5640db45444c9efd646e472c0e065..bd79bb89ca199480325affb71fe7667e7e7a6cfd 100644 |
| --- a/frog/leg/ssa/builder.dart |
| +++ b/frog/leg/ssa/builder.dart |
| @@ -276,9 +276,15 @@ class LocalsHandler { |
| params.forEachParameter((Element element) { |
| HParameterValue parameter = new HParameterValue(element); |
| builder.add(parameter); |
| - // Note that for constructors [element] could be a field-element which we |
| - // treat as if it was a local. |
| directLocals[element] = parameter; |
| + // If the [element] is a field-parameter (such as [:this.x:] then |
| + // initialize the field element with its value. |
| + // Note that in the constructor factory we treat fields as if they were |
| + // locals. |
|
ngeoffray
2012/03/15 10:06:01
It looks like you should have an if/else here:
if
floitsch
2012/03/15 14:11:04
Done.
|
| + if (element.kind == ElementKind.FIELD_PARAMETER) { |
| + FieldParameterElement fieldParameterElement = element; |
| + directLocals[fieldParameterElement.fieldElement] = parameter; |
| + } |
| }); |
| if (closureData.thisElement !== null) { |
| // Once closures have been mapped to classes their instance members might |
| @@ -791,8 +797,14 @@ class SsaBuilder implements Visitor { |
| int index = 0; |
| FunctionParameters parameters = |
| nextConstructor.computeParameters(compiler); |
| - parameters.forEachParameter((parameter) { |
| - localsHandler.updateLocal(parameter, arguments[index++]); |
| + parameters.forEachParameter((Element parameter) { |
| + HInstruction argument = arguments[index++]; |
| + localsHandler.updateLocal(parameter, argument); |
|
ngeoffray
2012/03/15 10:06:01
ditto for the if/else. The field parameter element
floitsch
2012/03/15 14:11:04
Done.
|
| + if (parameter.kind == ElementKind.FIELD_PARAMETER) { |
| + FieldParameterElement fieldParameterElement = parameter; |
| + localsHandler.updateLocal(fieldParameterElement.fieldElement, |
| + argument); |
| + } |
| }); |
| } else { |
| // A field initializer. |
| @@ -821,6 +833,10 @@ class SsaBuilder implements Visitor { |
| HGraph buildFactory(ClassElement classElement, |
| FunctionElement functionElement) { |
| FunctionExpression function = functionElement.parseNode(compiler); |
| + // Note that constructors (like any other static function) do not need |
| + // to deal with optional arguments. It is the callers job to provide all |
| + // arguments as if they were positional. |
| + |
| // The initializer list could contain closures. |
| openFunction(functionElement, function); |