|  | // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file | 
|  | // for details. All rights reserved. Use of this source code is governed by a | 
|  | // BSD-style license that can be found in the LICENSE file. | 
|  |  | 
|  | import 'package:expect/async_helper.dart'; | 
|  | import 'package:expect/expect.dart'; | 
|  | import '../helpers/compiler_helper.dart'; | 
|  |  | 
|  | const String FIB = r""" | 
|  | fib(n) { | 
|  | if (n <= 1) return 1; | 
|  | return add(fib(n - 1), fib(n - 2)); | 
|  | } | 
|  |  | 
|  | // We need this artificial add method because | 
|  | // our optimizer will actually add type checks | 
|  | // for the result of recursively calling fib | 
|  | // which introduces new variables because we | 
|  | // now have multiple users. | 
|  | // The 'if' has been added to avoid inlining of add. | 
|  | add(x, y) { | 
|  | if (x == -1) return x; | 
|  | return x + y; | 
|  | } | 
|  | """; | 
|  |  | 
|  | const String BAR = r""" | 
|  | bar() { | 
|  | var isLeaf = (bar() != null) && bar(); | 
|  | // Because we're using a local variable, the graph gets an empty | 
|  | // block between the [isLeaf] phi and the next instruction that uses | 
|  | // it. The optimizer must take that new block into account in order | 
|  | // to have the phi be generate at use uste. | 
|  | if (isLeaf) return null; | 
|  | return true; | 
|  | } | 
|  | """; | 
|  |  | 
|  | // Test that a synthesized [HTypeConversion] node added due to the is | 
|  | // check is code motion invariant. No 'else' should be generated in | 
|  | // this code snippet (the new [HTypeConversion] is put in the else | 
|  | // branch, but the else branch dominates the rest of the code in this | 
|  | // snippet). | 
|  | const String TEST = r""" | 
|  | foo(a) { | 
|  | if (a is !int) throw a; | 
|  | if (a < 0) throw a; | 
|  | return a + a; | 
|  | } | 
|  | """; | 
|  |  | 
|  | main() { | 
|  | runTests() async { | 
|  | // Make sure we don't introduce a new variable. | 
|  | await compileAndDoNotMatch(FIB, 'fib', RegExp("var $anyIdentifier =")); | 
|  |  | 
|  | await compileAndDoNotMatch(BAR, 'bar', RegExp("isLeaf")); | 
|  |  | 
|  | await compile( | 
|  | TEST, | 
|  | entry: 'foo', | 
|  | check: (String generated) { | 
|  | Expect.isFalse(generated.contains('else')); | 
|  | // Regression check to ensure that there is no floating variable | 
|  | // expression. | 
|  | Expect.isFalse(new RegExp('^[ ]*a;').hasMatch(generated)); | 
|  | }, | 
|  | ); | 
|  | } | 
|  |  | 
|  | asyncTest(() async { | 
|  | print('--test from kernel------------------------------------------------'); | 
|  | await runTests(); | 
|  | }); | 
|  | } |