Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(199)

Side by Side Diff: pkg/compiler/lib/src/js_backend/codegen/codegen.dart

Issue 1011403003: cps-ir: Set runtime type information for new objects that require it. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Update comment. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 code_generator; 5 library code_generator;
6 6
7 import 'glue.dart'; 7 import 'glue.dart';
8 8
9 import '../../tree_ir/tree_ir_nodes.dart' as tree_ir; 9 import '../../tree_ir/tree_ir_nodes.dart' as tree_ir;
10 import '../../js/js.dart' as js; 10 import '../../js/js.dart' as js;
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
199 } else { 199 } else {
200 js.Expression elementAccess = glue.staticFunctionAccess(target); 200 js.Expression elementAccess = glue.staticFunctionAccess(target);
201 return new js.Call(elementAccess, arguments, 201 return new js.Call(elementAccess, arguments,
202 sourceInformation: sourceInformation); 202 sourceInformation: sourceInformation);
203 } 203 }
204 } 204 }
205 205
206 @override 206 @override
207 js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) { 207 js.Expression visitInvokeConstructor(tree_ir.InvokeConstructor node) {
208 checkStaticTargetIsValid(node, node.target); 208 checkStaticTargetIsValid(node, node.target);
209 if (node.constant != null) return giveup(node);
209 210
210 if (node.constant != null) return giveup(node); 211 ClassElement instantiatedClass = node.target.enclosingClass;
211 registry.registerInstantiatedClass(node.target.enclosingClass); 212 registry.registerInstantiatedClass(instantiatedClass);
212 Selector selector = node.selector; 213 Selector selector = node.selector;
213 FunctionElement target = node.target; 214 FunctionElement target = node.target;
214 List<js.Expression> arguments = visitArguments(node.arguments); 215 List<js.Expression> arguments = visitArguments(node.arguments);
215 return buildStaticInvoke(selector, target, arguments); 216 return buildStaticInvoke(selector, target, arguments);
216 } 217 }
217 218
218 void registerMethodInvoke(tree_ir.InvokeMethod node) { 219 void registerMethodInvoke(tree_ir.InvokeMethod node) {
219 Selector selector = node.selector; 220 Selector selector = node.selector;
220 if (selector.isGetter) { 221 if (selector.isGetter) {
221 registry.registerDynamicGetter(selector); 222 registry.registerDynamicGetter(selector);
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 } 495 }
495 496
496 @override 497 @override
497 js.Expression visitCreateBox(tree_ir.CreateBox node) { 498 js.Expression visitCreateBox(tree_ir.CreateBox node) {
498 return new js.ObjectInitializer([]); 499 return new js.ObjectInitializer([]);
499 } 500 }
500 501
501 @override 502 @override
502 js.Expression visitCreateInstance(tree_ir.CreateInstance node) { 503 js.Expression visitCreateInstance(tree_ir.CreateInstance node) {
503 registry.registerInstantiatedClass(node.classElement); 504 registry.registerInstantiatedClass(node.classElement);
504 return new js.New(glue.constructorAccess(node.classElement), 505 js.Expression instance = new js.New(
505 node.arguments.map(visitExpression).toList()); 506 glue.constructorAccess(node.classElement),
507 node.arguments.map(visitExpression).toList());
508 if (node.typeInformation != null) {
509 FunctionElement helper = glue.getAddRuntimeTypeInformation();
510 js.Expression typeInformation = new js.ArrayInitializer(
511 node.typeInformation.map(visitExpression).toList());
512 return buildStaticHelperInvocation(helper,
513 <js.Expression>[instance, typeInformation]);
514 } else {
515 return instance;
516 }
506 } 517 }
507 518
508 @override 519 @override
509 js.Expression visitGetField(tree_ir.GetField node) { 520 js.Expression visitGetField(tree_ir.GetField node) {
510 return new js.PropertyAccess.field( 521 return new js.PropertyAccess.field(
511 visitExpression(node.object), 522 visitExpression(node.object),
512 glue.instanceFieldPropertyName(node.field)); 523 glue.instanceFieldPropertyName(node.field));
513 } 524 }
514 525
515 @override 526 @override
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
548 return buildStaticHelperInvocation( 559 return buildStaticHelperInvocation(
549 glue.getTypeArgumentWithSubstitution(), 560 glue.getTypeArgumentWithSubstitution(),
550 [visitExpression(node.target), substitution, index]); 561 [visitExpression(node.target), substitution, index]);
551 } else { 562 } else {
552 return buildStaticHelperInvocation( 563 return buildStaticHelperInvocation(
553 glue.getTypeArgumentByIndex(), 564 glue.getTypeArgumentByIndex(),
554 [visitExpression(node.target), index]); 565 [visitExpression(node.target), index]);
555 } 566 }
556 } 567 }
557 568
569 @override
570 js.Expression visitTypeExpression(tree_ir.TypeExpression node) {
571 List<js.Expression> arguments =
572 node.arguments.map(visitExpression).toList(growable: false);
573 return glue.generateTypeRepresentation(node.dartType, arguments);
574 }
558 575
559 // Dart-specific IR nodes 576 // Dart-specific IR nodes
560 577
561 @override 578 @override
562 visitReifyTypeVar(tree_ir.ReifyTypeVar node) { 579 visitReifyTypeVar(tree_ir.ReifyTypeVar node) {
563 return errorUnsupportedNode(node); 580 return errorUnsupportedNode(node);
564 } 581 }
565 582
566 @override 583 @override
567 visitFunctionExpression(tree_ir.FunctionExpression node) { 584 visitFunctionExpression(tree_ir.FunctionExpression node) {
(...skipping 12 matching lines...) Expand all
580 597
581 @override 598 @override
582 visitSuperInitializer(tree_ir.SuperInitializer node) { 599 visitSuperInitializer(tree_ir.SuperInitializer node) {
583 return errorUnsupportedNode(node); 600 return errorUnsupportedNode(node);
584 } 601 }
585 602
586 errorUnsupportedNode(tree_ir.DartSpecificNode node) { 603 errorUnsupportedNode(tree_ir.DartSpecificNode node) {
587 throw "Unsupported node in JS backend: $node"; 604 throw "Unsupported node in JS backend: $node";
588 } 605 }
589 } 606 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698