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

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

Issue 1083663005: Implement try/catch in the JS backend. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Incorporated review comment.s Created 5 years, 8 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 407 matching lines...) Expand 10 before | Expand all | Expand 10 after
418 @override 418 @override
419 void visitExpressionStatement(tree_ir.ExpressionStatement node) { 419 void visitExpressionStatement(tree_ir.ExpressionStatement node) {
420 accumulator.add(new js.ExpressionStatement( 420 accumulator.add(new js.ExpressionStatement(
421 visitExpression(node.expression))); 421 visitExpression(node.expression)));
422 visitStatement(node.next); 422 visitStatement(node.next);
423 } 423 }
424 424
425 @override 425 @override
426 void visitIf(tree_ir.If node) { 426 void visitIf(tree_ir.If node) {
427 accumulator.add(new js.If(visitExpression(node.condition), 427 accumulator.add(new js.If(visitExpression(node.condition),
428 buildBody(node.thenStatement), 428 buildBodyStatement(node.thenStatement),
429 buildBody(node.elseStatement))); 429 buildBodyStatement(node.elseStatement)));
430 } 430 }
431 431
432 @override 432 @override
433 void visitLabeledStatement(tree_ir.LabeledStatement node) { 433 void visitLabeledStatement(tree_ir.LabeledStatement node) {
434 accumulator.add(buildLabeled(() => buildBody(node.body), 434 accumulator.add(buildLabeled(() => buildBodyStatement(node.body),
435 node.label, 435 node.label,
436 node.next)); 436 node.next));
437 visitStatement(node.next); 437 visitStatement(node.next);
438 } 438 }
439 439
440 js.Statement buildLabeled(js.Statement buildBody(), 440 js.Statement buildLabeled(js.Statement buildBody(),
441 tree_ir.Label label, 441 tree_ir.Label label,
442 tree_ir.Statement fallthroughStatement) { 442 tree_ir.Statement fallthroughStatement) {
443 tree_ir.Statement savedFallthrough = fallthrough; 443 tree_ir.Statement savedFallthrough = fallthrough;
444 fallthrough = fallthroughStatement; 444 fallthrough = fallthroughStatement;
(...skipping 24 matching lines...) Expand all
469 if (accumulator.length == 0) { 469 if (accumulator.length == 0) {
470 return new js.EmptyStatement(); 470 return new js.EmptyStatement();
471 } 471 }
472 if (accumulator.length == 1) { 472 if (accumulator.length == 1) {
473 return accumulator.single; 473 return accumulator.single;
474 } 474 }
475 return new js.Block(accumulator); 475 return new js.Block(accumulator);
476 } 476 }
477 477
478 /// Builds a nested statement. 478 /// Builds a nested statement.
479 js.Statement buildBody(tree_ir.Statement statement) { 479 js.Statement buildBodyStatement(tree_ir.Statement statement) {
480 List<js.Statement> savedAccumulator = accumulator; 480 List<js.Statement> savedAccumulator = accumulator;
481 accumulator = new List<js.Statement>(); 481 accumulator = <js.Statement>[];
482 visitStatement(statement); 482 visitStatement(statement);
483 js.Statement result = _bodyAsStatement(); 483 js.Statement result = _bodyAsStatement();
484 accumulator = savedAccumulator; 484 accumulator = savedAccumulator;
485 return result; 485 return result;
486 } 486 }
487 487
488 js.Block buildBodyBlock(tree_ir.Statement statement) {
489 List<js.Statement> savedAccumulator = accumulator;
490 accumulator = <js.Statement>[];
491 visitStatement(statement);
492 js.Statement result = new js.Block(accumulator);
493 accumulator = savedAccumulator;
494 return result;
495 }
496
488 js.Statement buildWhile(js.Expression condition, 497 js.Statement buildWhile(js.Expression condition,
489 tree_ir.Statement body, 498 tree_ir.Statement body,
490 tree_ir.Label label, 499 tree_ir.Label label,
491 tree_ir.Statement fallthroughStatement) { 500 tree_ir.Statement fallthroughStatement) {
492 return buildLabeled(() => new js.While(condition, buildBody(body)), 501 return buildLabeled(() => new js.While(condition, buildBodyStatement(body)),
493 label, 502 label,
494 fallthroughStatement); 503 fallthroughStatement);
495 } 504 }
496 505
497 @override 506 @override
498 void visitWhileCondition(tree_ir.WhileCondition node) { 507 void visitWhileCondition(tree_ir.WhileCondition node) {
499 accumulator.add( 508 accumulator.add(
500 buildWhile(visitExpression(node.condition), 509 buildWhile(visitExpression(node.condition),
501 node.body, 510 node.body,
502 node.label, 511 node.label,
503 node)); 512 node));
504 visitStatement(node.next); 513 visitStatement(node.next);
505 } 514 }
506 515
507 @override 516 @override
508 void visitWhileTrue(tree_ir.WhileTrue node) { 517 void visitWhileTrue(tree_ir.WhileTrue node) {
509 accumulator.add( 518 accumulator.add(
510 buildWhile(new js.LiteralBool(true), node.body, node.label, node)); 519 buildWhile(new js.LiteralBool(true), node.body, node.label, node));
511 } 520 }
512 521
513 @override 522 @override
514 void visitReturn(tree_ir.Return node) { 523 void visitReturn(tree_ir.Return node) {
515 accumulator.add(new js.Return(visitExpression(node.value))); 524 accumulator.add(new js.Return(visitExpression(node.value)));
516 } 525 }
517 526
518 @override 527 @override
519 void visitTry(tree_ir.Try node) { 528 void visitTry(tree_ir.Try node) {
520 // TODO(kmillikin): implement TryStatement. 529 js.Block tryBlock = buildBodyBlock(node.tryBody);
521 return giveup(node); 530 tree_ir.Variable exceptionVariable = node.catchParameters.first;
531 js.VariableDeclaration exceptionParameter =
532 new js.VariableDeclaration(getVariableName(exceptionVariable));
533 js.Block catchBlock = buildBodyBlock(node.catchBody);
534 js.Catch catchPart = new js.Catch(exceptionParameter, catchBlock);
535 accumulator.add(new js.Try(tryBlock, catchPart, null));
522 } 536 }
523 537
524 @override 538 @override
525 js.Expression visitCreateBox(tree_ir.CreateBox node) { 539 js.Expression visitCreateBox(tree_ir.CreateBox node) {
526 return new js.ObjectInitializer([]); 540 return new js.ObjectInitializer([]);
527 } 541 }
528 542
529 @override 543 @override
530 js.Expression visitCreateInstance(tree_ir.CreateInstance node) { 544 js.Expression visitCreateInstance(tree_ir.CreateInstance node) {
531 ClassElement cls = node.classElement; 545 ClassElement cls = node.classElement;
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
626 640
627 @override 641 @override
628 visitVariableDeclaration(tree_ir.VariableDeclaration node) { 642 visitVariableDeclaration(tree_ir.VariableDeclaration node) {
629 return errorUnsupportedNode(node); 643 return errorUnsupportedNode(node);
630 } 644 }
631 645
632 errorUnsupportedNode(tree_ir.DartSpecificNode node) { 646 errorUnsupportedNode(tree_ir.DartSpecificNode node) {
633 throw "Unsupported node in JS backend: $node"; 647 throw "Unsupported node in JS backend: $node";
634 } 648 }
635 } 649 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart ('k') | pkg/compiler/lib/src/js_backend/codegen/glue.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698