blob: f82f15b17567fe3dd1ebfe80cda1b975261b1a9f [file] [log] [blame]
// Copyright (c) 2011, 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 'compiler_helper.dart';
const String TEST_ONE = r"""
sum(a, b) {
var c = 0;
for (var d = a; d < b; d += 1) c = c + d;
return c;
}
""";
const String TEST_TWO = r"""
foo(int a) {
return -a;
}
""";
const String TEST_TWO_WITH_BAILOUT = r"""
foo(int a) {
for (int b = 0; b < 1; b++) {
a = -a;
}
return a;
}
""";
const String TEST_THREE = r"""
foo(a) {
for (int b = 0; b < 10; b++) print(a[b]);
}
""";
const String TEST_FOUR = r"""
foo(String a) {
print(a[0]); // Force a type guard.
while (true) print(a.length);
}
""";
const String TEST_FIVE = r"""
foo(a) {
a[0] = 1;
print(a[1]);
}
""";
const String TEST_FIVE_WITH_BAILOUT = r"""
foo(a) {
for (int i = 0; i < 1; i++) {
a[0] = 1;
print(a[1]);
}
}
""";
const String TEST_SIX = r"""
foo(a) {
print(a[0]);
while (true) {
a[0] = a[1];
}
}
""";
main() {
compileAndMatchFuzzy(TEST_ONE, 'sum', "x \\+= x");
compileAndMatchFuzzy(TEST_ONE, 'sum', "typeof x !== 'number'");
var generated = compile(TEST_TWO, entry: 'foo');
RegExp regexp = new RegExp(getNumberTypeCheck('a'));
Expect.isTrue(!regexp.hasMatch(generated));
regexp = new RegExp('-a');
Expect.isTrue(!regexp.hasMatch(generated));
generated = compile(TEST_TWO_WITH_BAILOUT, entry: 'foo');
regexp = new RegExp(getNumberTypeCheck('a'));
Expect.isTrue(regexp.hasMatch(generated));
regexp = new RegExp('-a');
Expect.isTrue(regexp.hasMatch(generated));
generated = compile(TEST_THREE, entry: 'foo');
regexp = new RegExp("a[$anyIdentifier]");
Expect.isTrue(regexp.hasMatch(generated));
generated = compile(TEST_FOUR, entry: 'foo');
regexp = new RegExp("a.length");
Expect.isTrue(regexp.hasMatch(generated));
generated = compile(TEST_FIVE, entry: 'foo');
regexp = new RegExp('a.constructor !== Array');
Expect.isTrue(!regexp.hasMatch(generated));
Expect.isTrue(generated.contains('index'));
Expect.isTrue(generated.contains('indexSet'));
generated = compile(TEST_FIVE_WITH_BAILOUT, entry: 'foo');
regexp = new RegExp('a.constructor !== Array');
Expect.isTrue(regexp.hasMatch(generated));
Expect.isTrue(!generated.contains('index'));
Expect.isTrue(!generated.contains('indexSet'));
generated = compile(TEST_SIX, entry: 'foo');
regexp = new RegExp('a.constructor !== Array');
Expect.isTrue(regexp.hasMatch(generated));
Expect.isTrue(!generated.contains('index'));
Expect.isTrue(!generated.contains('indexSet'));
}