Chromium Code Reviews| Index: pkg/compiler/lib/src/js_backend/codegen/codegen.dart |
| diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart |
| index afa440bec33b65f56c0a90a43eeab57044668b4a..cf740e707344f772e645a0fd17feb5bc9d4c25c7 100644 |
| --- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart |
| +++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart |
| @@ -328,12 +328,6 @@ class CodeGenerator extends tree_ir.Visitor<dynamic, js.Expression> { |
| } |
| @override |
| - js.Expression visitReifyTypeVar(tree_ir.ReifyTypeVar node) { |
| - return giveup(node); |
| - // TODO: implement visitReifyTypeVar |
| - } |
| - |
| - @override |
| js.Expression visitThis(tree_ir.This node) { |
| return new js.This(); |
| } |
| @@ -510,9 +504,49 @@ class CodeGenerator extends tree_ir.Visitor<dynamic, js.Expression> { |
| visitStatement(node.next); |
| } |
| + js.Expression buildStaticHelperInvocation(FunctionElement helper, |
| + List<js.Expression> arguments) { |
| + registry.registerStaticUse(helper); |
| + return buildStaticInvoke(new Selector.fromElement(helper), helper, |
| + arguments); |
| + } |
| + |
| + @override |
| + js.Expression visitReifyRuntimeType(tree_ir.ReifyRuntimeType node) { |
| + FunctionElement createType = glue.getCreateRuntimeType(); |
| + FunctionElement typeToString = glue.getRuntimeTypeToString(); |
| + return buildStaticHelperInvocation(createType, |
| + [buildStaticHelperInvocation(typeToString, |
| + [visitExpression(node.value)])]); |
| + } |
| + |
| + @override |
| + js.Expression visitReadTypeVariable(tree_ir.ReadTypeVariable node) { |
| + if (node.context != node.variable.element.enclosingClass) { |
| + giveup(node, 'substitution not implemented'); |
|
asgerf
2015/03/02 13:52:36
I am confused. This should never happen because th
karlklose
2015/03/05 09:54:58
Acknowledged.
|
| + } |
| + js.Expression index = js.number(glue.getTypeVariableIndex(node.variable)); |
| + if (glue.needsSubstitutionForTypeVariableAccess(node.context)) { |
| + js.Expression substitution = glue.getSubstitutionName(node.context); |
| + return buildStaticHelperInvocation( |
| + glue.getTypeArgumentWithSubstitution(), |
| + [visitExpression(node.target), substitution, index]); |
| + } else { |
| + return buildStaticHelperInvocation( |
| + glue.getTypeArgumentByIndex(), |
| + [visitExpression(node.target), index]); |
| + } |
| + } |
| + |
| + |
| // Dart-specific IR nodes |
| @override |
| + visitReifyTypeVar(tree_ir.ReifyTypeVar node) { |
| + return errorUnsupportedNode(node); |
| + } |
| + |
| + @override |
| visitFunctionExpression(tree_ir.FunctionExpression node) { |
| return errorUnsupportedNode(node); |
| } |
| @@ -532,7 +566,7 @@ class CodeGenerator extends tree_ir.Visitor<dynamic, js.Expression> { |
| return errorUnsupportedNode(node); |
| } |
| - dynamic errorUnsupportedNode(tree_ir.DartSpecificNode node) { |
| + errorUnsupportedNode(tree_ir.DartSpecificNode node) { |
| throw "Unsupported node in JS backend: $node"; |
| } |
| } |