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

Side by Side Diff: lib/compiler/implementation/ssa/codegen.dart

Issue 10540048: Implement 'as' operator. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: No entries in language.status, vm and dartc already implemented 'as'. Created 8 years, 6 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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 class SsaCodeGeneratorTask extends CompilerTask { 5 class SsaCodeGeneratorTask extends CompilerTask {
6 final JavaScriptBackend backend; 6 final JavaScriptBackend backend;
7 SsaCodeGeneratorTask(JavaScriptBackend backend) 7 SsaCodeGeneratorTask(JavaScriptBackend backend)
8 : this.backend = backend, 8 : this.backend = backend,
9 super(backend.compiler); 9 super(backend.compiler);
10 String get name() => 'SSA code generator'; 10 String get name() => 'SSA code generator';
(...skipping 2476 matching lines...) Expand 10 before | Expand all | Expand 10 after
2487 endExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE); 2487 endExpression(JSPrecedence.LOGICAL_AND_PRECEDENCE);
2488 }); 2488 });
2489 } 2489 }
2490 if (node.nullOk) { 2490 if (node.nullOk) {
2491 expectedPrecedence = oldPrecedence; 2491 expectedPrecedence = oldPrecedence;
2492 endExpression(JSPrecedence.LOGICAL_OR_PRECEDENCE); 2492 endExpression(JSPrecedence.LOGICAL_OR_PRECEDENCE);
2493 } 2493 }
2494 } 2494 }
2495 2495
2496 void visitTypeConversion(HTypeConversion node) { 2496 void visitTypeConversion(HTypeConversion node) {
2497 if (node.isChecked()) { 2497 Map<String, SourceString> castNames = const <SourceString> {
2498 "stringTypeCheck":
2499 const SourceString("stringTypeCast"),
2500 "doubleTypeCheck":
2501 const SourceString("doubleTypeCast"),
2502 "numTypeCheck":
2503 const SourceString("numTypeCast"),
2504 "boolTypeCheck":
2505 const SourceString("boolTypeCast"),
2506 "functionTypeCheck":
2507 const SourceString("functionTypeCast"),
2508 "intTypeCheck":
2509 const SourceString("intTypeCast"),
2510 "stringSuperNativeTypeCheck":
2511 const SourceString("stringSuperNativeTypeCast"),
2512 "stringSuperTypeCheck":
2513 const SourceString("stringSuperTypeCast"),
2514 "listTypeCheck":
2515 const SourceString("listTypeCast"),
2516 "listSuperNativeTypeCheck":
2517 const SourceString("listSuperNativeTypeCast"),
2518 "listSuperTypeCheck":
2519 const SourceString("listSuperTypeCast"),
2520 "callTypeCheck":
2521 const SourceString("callTypeCast"),
2522 "propertyTypeCheck":
2523 const SourceString("propertyTypeCast")
2524 };
2525
2526 if (node.isChecked) {
2498 Element element = node.type.computeType(compiler).element; 2527 Element element = node.type.computeType(compiler).element;
2499 world.registerIsCheck(element); 2528 world.registerIsCheck(element);
2500 SourceString helper; 2529 SourceString helper;
2501 String additionalArgument; 2530 String additionalArgument;
2502 bool nativeCheck = 2531 bool nativeCheck =
2503 backend.emitter.nativeEmitter.requiresNativeIsCheck(element); 2532 backend.emitter.nativeEmitter.requiresNativeIsCheck(element);
2504 beginExpression(JSPrecedence.CALL_PRECEDENCE); 2533 beginExpression(JSPrecedence.CALL_PRECEDENCE);
2505 2534
2506 if (node.isArgumentTypeCheck()) { 2535 if (node.isArgumentTypeCheck) {
2507 buffer.add('if ('); 2536 buffer.add('if (');
2508 if (element == compiler.intClass) { 2537 if (element == compiler.intClass) {
2509 checkInt(node.checkedInput, '!=='); 2538 checkInt(node.checkedInput, '!==');
2510 } else { 2539 } else {
2511 assert(element == compiler.numClass); 2540 assert(element == compiler.numClass);
2512 checkNum(node.checkedInput, '!=='); 2541 checkNum(node.checkedInput, '!==');
2513 } 2542 }
2514 buffer.add(') '); 2543 buffer.add(') ');
2515 generateThrowWithHelper('iae', node.checkedInput); 2544 generateThrowWithHelper('iae', node.checkedInput);
2516 return; 2545 return;
2517 } 2546 }
2518 2547
2519 assert(node.isCheckedModeCheck()); 2548 assert(node.isCheckedModeCheck);
2520 if (element == compiler.stringClass) { 2549 if (element == compiler.stringClass) {
2521 helper = const SourceString('stringTypeCheck'); 2550 helper = const SourceString('stringTypeCheck');
2522 } else if (element == compiler.doubleClass) { 2551 } else if (element == compiler.doubleClass) {
2523 helper = const SourceString('doubleTypeCheck'); 2552 helper = const SourceString('doubleTypeCheck');
2524 } else if (element == compiler.numClass) { 2553 } else if (element == compiler.numClass) {
2525 helper = const SourceString('numTypeCheck'); 2554 helper = const SourceString('numTypeCheck');
2526 } else if (element == compiler.boolClass) { 2555 } else if (element == compiler.boolClass) {
2527 helper = const SourceString('boolTypeCheck'); 2556 helper = const SourceString('boolTypeCheck');
2528 } else if (element == compiler.functionClass || element.isTypedef()) { 2557 } else if (element == compiler.functionClass || element.isTypedef()) {
2529 helper = const SourceString('functionTypeCheck'); 2558 helper = const SourceString('functionTypeCheck');
(...skipping 15 matching lines...) Expand all
2545 helper = const SourceString('listSuperNativeTypeCheck'); 2574 helper = const SourceString('listSuperNativeTypeCheck');
2546 } else { 2575 } else {
2547 helper = const SourceString('listSuperTypeCheck'); 2576 helper = const SourceString('listSuperTypeCheck');
2548 } 2577 }
2549 } else if (nativeCheck) { 2578 } else if (nativeCheck) {
2550 helper = const SourceString('callTypeCheck'); 2579 helper = const SourceString('callTypeCheck');
2551 } else { 2580 } else {
2552 helper = const SourceString('propertyTypeCheck'); 2581 helper = const SourceString('propertyTypeCheck');
2553 } 2582 }
2554 } 2583 }
2584 if (node.isCastTypeCheck) {
2585 helper = castNames[helper.stringValue];
2586 }
2555 Element helperElement = compiler.findHelper(helper); 2587 Element helperElement = compiler.findHelper(helper);
2556 world.registerStaticUse(helperElement); 2588 world.registerStaticUse(helperElement);
2557 buffer.add(compiler.namer.isolateAccess(helperElement)); 2589 buffer.add(compiler.namer.isolateAccess(helperElement));
2558 buffer.add('('); 2590 buffer.add('(');
2559 use(node.checkedInput, JSPrecedence.EXPRESSION_PRECEDENCE); 2591 use(node.checkedInput, JSPrecedence.EXPRESSION_PRECEDENCE);
2560 if (additionalArgument !== null) buffer.add(", '$additionalArgument'"); 2592 if (additionalArgument !== null) buffer.add(", '$additionalArgument'");
2561 buffer.add(')'); 2593 buffer.add(')');
2562 endExpression(JSPrecedence.CALL_PRECEDENCE); 2594 endExpression(JSPrecedence.CALL_PRECEDENCE);
2563 } else { 2595 } else {
2564 use(node.checkedInput, expectedPrecedence); 2596 use(node.checkedInput, expectedPrecedence);
(...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after
3002 startBailoutSwitch(); 3034 startBailoutSwitch();
3003 } 3035 }
3004 } 3036 }
3005 3037
3006 void endLabeledBlock(HLabeledBlockInformation labeledBlockInfo) { 3038 void endLabeledBlock(HLabeledBlockInformation labeledBlockInfo) {
3007 if (labeledBlockInfo.body.start.hasGuards()) { 3039 if (labeledBlockInfo.body.start.hasGuards()) {
3008 endBailoutSwitch(); 3040 endBailoutSwitch();
3009 } 3041 }
3010 } 3042 }
3011 } 3043 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698