blob: d380c6d1d358d7cd4c62d070ea7e911dc6cae578 [file] [log] [blame]
// Copyright (c) 2014, 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.
/// Test data for sexpr_test.
library test.sexpr.data;
import 'test_helper.dart';
class TestSpec extends TestSpecBase {
// A [String] or a [Map<String, String>].
final output;
/// True if the test should be skipped when testing analyzer2dart.
final bool skipInAnalyzerFrontend;
const TestSpec(String input, this.output,
{this.skipInAnalyzerFrontend: false}) : super(input);
}
const List<Group> TEST_DATA = const [
const Group('Empty main', const [
const TestSpec('''
main() {}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
foo() {}
main() {
foo();
}
''', '''
(FunctionDefinition main () return
(LetCont ((k0 (v0)
(LetPrim (v1 (Constant (Null)))
(InvokeContinuation return (v1)))))
(InvokeStatic foo () k0)))
''')
]),
const Group('Literals', const [
const TestSpec('''
main() {
return 0;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
main() {
return 1.5;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Double 1.5)))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
main() {
return true;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Bool true)))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
main() {
return false;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Bool false)))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
main() {
return "a";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (String "a")))
(InvokeContinuation return (v0))))
'''),
]),
const Group('Parameters', const [
const TestSpec('''
main(args) {}
''', '''
(FunctionDefinition main (args) return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
main(a, b) {}
''', '''
(FunctionDefinition main (a b) return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
'''),
]),
const Group('Pass arguments', const [
const TestSpec('''
foo(a) {}
main() {
foo(null);
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Null)))
(LetCont ((k0 (v1)
(LetPrim (v2 (Constant (Null)))
(InvokeContinuation return (v2)))))
(InvokeStatic foo (v0) k0))))
'''),
const TestSpec('''
bar(b, c) {}
foo(a) {}
main() {
foo(null);
bar(0, "");
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Null)))
(LetCont ((k0 (v1)
(LetPrim (v2 (Constant (Int 0)))
(LetPrim (v3 (Constant (String "")))
(LetCont ((k1 (v4)
(LetPrim (v5 (Constant (Null)))
(InvokeContinuation return (v5)))))
(InvokeStatic bar (v2 v3) k1))))))
(InvokeStatic foo (v0) k0))))
'''),
const TestSpec('''
foo(a) {}
main() {
return foo(null);
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Null)))
(LetCont ((k0 (v1)
(InvokeContinuation return (v1))))
(InvokeStatic foo (v0) k0))))
'''),
]),
const Group('Local variables', const [
const TestSpec('''
main() {
var a;
return a;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
main() {
var a = 0;
return a;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
main(a) {
return a;
}
''', '''
(FunctionDefinition main (a) return
(InvokeContinuation return (a)))
'''),
]),
const Group('Local variable writes', const <TestSpec>[
const TestSpec('''
main() {
var a;
a = 10;
return a;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Null)))
(LetPrim (v1 (Constant (Int 10)))
(InvokeContinuation return (v1)))))
'''),
const TestSpec('''
main() {
var a = 0;
a = 10;
return a;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (Int 10)))
(InvokeContinuation return (v1)))))
'''),
const TestSpec('''
main() {
var a = 0;
print(a);
a = "";
print(a);
return a;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetCont ((k0 (v1)
(LetPrim (v2 (Constant (String "")))
(LetCont ((k1 (v3)
(InvokeContinuation return (v2))))
(InvokeStatic print (v2) k1)))))
(InvokeStatic print (v0) k0))))
'''),
const TestSpec('''
main(a) {
print(a);
a = "";
print(a);
return a;
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(LetPrim (v1 (Constant (String "")))
(LetCont ((k1 (v2)
(InvokeContinuation return (v1))))
(InvokeStatic print (v1) k1)))))
(InvokeStatic print (a) k0)))
'''),
const TestSpec('''
main(a) {
if (a) {
a = "";
}
print(a);
return a;
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(LetCont ((k1 (v1)
(InvokeContinuation return (v0))))
(InvokeStatic print (v0) k1))))
(LetCont ((k2 ()
(LetPrim (v2 (Constant (String "")))
(InvokeContinuation k0 (v2))))
(k3 ()
(InvokeContinuation k0 (a))))
(Branch (IsTrue a) k2 k3))))
'''),
]),
const Group('Dynamic access', const [
const TestSpec('''
main(a) {
return a.foo;
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(InvokeMethod a foo () k0)))
'''),
const TestSpec('''
main() {
var a = "";
return a.foo;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (String "")))
(LetCont ((k0 (v1)
(InvokeContinuation return (v1))))
(InvokeMethod v0 foo () k0))))
'''),
]),
const Group('Dynamic invocation', const [
const TestSpec('''
main(a) {
return a.foo(0);
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (Constant (Int 0)))
(LetCont ((k0 (v1)
(InvokeContinuation return (v1))))
(InvokeMethod a foo (v0) k0))))
'''),
const TestSpec('''
main() {
var a = "";
return a.foo(0, 1);
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (String "")))
(LetPrim (v1 (Constant (Int 0)))
(LetPrim (v2 (Constant (Int 1)))
(LetCont ((k0 (v3)
(InvokeContinuation return (v3))))
(InvokeMethod v0 foo (v1 v2) k0))))))
'''),
]),
const Group('Binary expressions', const [
const TestSpec('''
main() {
return 0 + "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 + (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 - "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 - (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 * "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 * (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 / "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 / (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 ~/ "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 ~/ (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 < "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 < (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 <= "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 <= (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 > "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 > (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 >= "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 >= (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 << "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 << (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 >> "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 >> (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 & "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 & (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 | "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 | (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 ^ "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 ^ (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 == "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 == (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 != "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(LetCont ((k1 (v3)
(InvokeContinuation return (v3))))
(LetCont ((k2 ()
(LetPrim (v4 (Constant (Bool false)))
(InvokeContinuation k1 (v4))))
(k3 ()
(LetPrim (v5 (Constant (Bool true)))
(InvokeContinuation k1 (v5)))))
(Branch (IsTrue v2) k2 k3)))))
(InvokeMethod v0 == (v1) k0)))))
'''),
const TestSpec('''
main() {
return 0 && "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetCont ((k0 (v1)
(InvokeContinuation return (v1))))
(LetCont ((k1 ()
(LetPrim (v2 (Constant (String "")))
(LetCont ((k2 ()
(LetPrim (v3 (Constant (Bool true)))
(InvokeContinuation k0 (v3))))
(k3 ()
(LetPrim (v4 (Constant (Bool false)))
(InvokeContinuation k0 (v4)))))
(Branch (IsTrue v2) k2 k3))))
(k4 ()
(LetPrim (v5 (Constant (Bool false)))
(InvokeContinuation k0 (v5)))))
(Branch (IsTrue v0) k1 k4)))))
'''),
const TestSpec('''
main() {
return 0 || "";
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetCont ((k0 (v1)
(InvokeContinuation return (v1))))
(LetCont ((k1 ()
(LetPrim (v2 (Constant (Bool true)))
(InvokeContinuation k0 (v2))))
(k2 ()
(LetPrim (v3 (Constant (String "")))
(LetCont ((k3 ()
(LetPrim (v4 (Constant (Bool true)))
(InvokeContinuation k0 (v4))))
(k4 ()
(LetPrim (v5 (Constant (Bool false)))
(InvokeContinuation k0 (v5)))))
(Branch (IsTrue v3) k3 k4)))))
(Branch (IsTrue v0) k1 k2)))))
'''),
const TestSpec('''
main() {
return 0 + "" * 2;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetPrim (v2 (Constant (Int 2)))
(LetCont ((k0 (v3)
(LetCont ((k1 (v4)
(InvokeContinuation return (v4))))
(InvokeMethod v0 + (v3) k1))))
(InvokeMethod v1 * (v2) k0))))))
'''),
const TestSpec('''
main() {
return 0 * "" + 2;
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "")))
(LetCont ((k0 (v2)
(LetPrim (v3 (Constant (Int 2)))
(LetCont ((k1 (v4)
(InvokeContinuation return (v4))))
(InvokeMethod v2 + (v3) k1)))))
(InvokeMethod v0 * (v1) k0)))))
'''),
]),
const Group('If statement', const [
const TestSpec('''
main(a) {
if (a) {
print(0);
}
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 ()
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0)))))
(LetCont ((k1 ()
(LetPrim (v1 (Constant (Int 0)))
(LetCont ((k2 (v2)
(InvokeContinuation k0 ())))
(InvokeStatic print (v1) k2))))
(k3 ()
(InvokeContinuation k0 ())))
(Branch (IsTrue a) k1 k3))))
'''),
const TestSpec('''
main(a) {
if (a) {
print(0);
} else {
print(1);
}
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 ()
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0)))))
(LetCont ((k1 ()
(LetPrim (v1 (Constant (Int 0)))
(LetCont ((k2 (v2)
(InvokeContinuation k0 ())))
(InvokeStatic print (v1) k2))))
(k3 ()
(LetPrim (v3 (Constant (Int 1)))
(LetCont ((k4 (v4)
(InvokeContinuation k0 ())))
(InvokeStatic print (v3) k4)))))
(Branch (IsTrue a) k1 k3))))
'''),
const TestSpec('''
main(a) {
if (a) {
print(0);
} else {
print(1);
print(2);
}
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 ()
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0)))))
(LetCont ((k1 ()
(LetPrim (v1 (Constant (Int 0)))
(LetCont ((k2 (v2)
(InvokeContinuation k0 ())))
(InvokeStatic print (v1) k2))))
(k3 ()
(LetPrim (v3 (Constant (Int 1)))
(LetCont ((k4 (v4)
(LetPrim (v5 (Constant (Int 2)))
(LetCont ((k5 (v6)
(InvokeContinuation k0 ())))
(InvokeStatic print (v5) k5)))))
(InvokeStatic print (v3) k4)))))
(Branch (IsTrue a) k1 k3))))
'''),
]),
const Group('Conditional expression', const [
const TestSpec('''
main(a) {
return a ? print(0) : print(1);
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(LetCont ((k1 ()
(LetPrim (v1 (Constant (Int 0)))
(LetCont ((k2 (v2)
(InvokeContinuation k0 (v2))))
(InvokeStatic print (v1) k2))))
(k3 ()
(LetPrim (v3 (Constant (Int 1)))
(LetCont ((k4 (v4)
(InvokeContinuation k0 (v4))))
(InvokeStatic print (v3) k4)))))
(Branch (IsTrue a) k1 k3))))
'''),
]),
// These test that unreachable statements are skipped within a block.
const Group('Block statements', const <TestSpec>[
const TestSpec('''
main(a) {
return 0;
return 1;
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (Constant (Int 0)))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
main(a) {
if (a) {
return 0;
return 1;
} else {
return 2;
return 3;
}
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 ()
(LetPrim (v0 (Constant (Int 0)))
(InvokeContinuation return (v0))))
(k1 ()
(LetPrim (v1 (Constant (Int 2)))
(InvokeContinuation return (v1)))))
(Branch (IsTrue a) k0 k1)))
'''),
const TestSpec('''
main(a) {
if (a) {
print(0);
return 0;
return 1;
} else {
print(2);
return 2;
return 3;
}
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 ()
(LetPrim (v0 (Constant (Int 0)))
(LetCont ((k1 (v1)
(LetPrim (v2 (Constant (Int 0)))
(InvokeContinuation return (v2)))))
(InvokeStatic print (v0) k1))))
(k2 ()
(LetPrim (v3 (Constant (Int 2)))
(LetCont ((k3 (v4)
(LetPrim (v5 (Constant (Int 2)))
(InvokeContinuation return (v5)))))
(InvokeStatic print (v3) k3)))))
(Branch (IsTrue a) k0 k2)))
'''),
]),
const Group('Constructor invocation', const <TestSpec>[
const TestSpec('''
main(a) {
new Object();
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(LetPrim (v1 (Constant (Null)))
(InvokeContinuation return (v1)))))
(InvokeConstructor Object () k0)))
'''),
const TestSpec('''
main(a) {
new Deprecated("");
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (Constant (String "")))
(LetCont ((k0 (v1)
(LetPrim (v2 (Constant (Null)))
(InvokeContinuation return (v2)))))
(InvokeConstructor Deprecated (v0) k0))))
'''),
]),
const Group('List literal', const <TestSpec>[
const TestSpec('''
main() {
return [];
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (LiteralList ()))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
main() {
return [0];
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (LiteralList (v0)))
(InvokeContinuation return (v1)))))
'''),
const TestSpec('''
main(a) {
return [0, 1, a];
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (Int 1)))
(LetPrim (v2 (LiteralList (v0 v1 a)))
(InvokeContinuation return (v2))))))
'''),
const TestSpec('''
main(a) {
return [0, [1], [a, [3]]];
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (Int 1)))
(LetPrim (v2 (LiteralList (v1)))
(LetPrim (v3 (Constant (Int 3)))
(LetPrim (v4 (LiteralList (v3)))
(LetPrim (v5 (LiteralList (a v4)))
(LetPrim (v6 (LiteralList (v0 v2 v5)))
(InvokeContinuation return (v6))))))))))
'''),
]),
const Group('Map literal', const <TestSpec>[
const TestSpec('''
main() {
return {};
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (LiteralMap () ()))
(InvokeContinuation return (v0))))
'''),
const TestSpec('''
main() {
return {"a": 0};
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (String "a")))
(LetPrim (v1 (Constant (Int 0)))
(LetPrim (v2 (LiteralMap (v0) (v1)))
(InvokeContinuation return (v2))))))
'''),
const TestSpec('''
main(a) {
return {"a": 0, "b": 1, "c": a};
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (Constant (String "a")))
(LetPrim (v1 (Constant (Int 0)))
(LetPrim (v2 (Constant (String "b")))
(LetPrim (v3 (Constant (Int 1)))
(LetPrim (v4 (Constant (String "c")))
(LetPrim (v5 (LiteralMap (v0 v2 v4) (v1 v3 a)))
(InvokeContinuation return (v5)))))))))
'''),
const TestSpec('''
main(a) {
return {0: "a", 1: {2: "b"}, a: {3: "c"}};
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (Constant (Int 0)))
(LetPrim (v1 (Constant (String "a")))
(LetPrim (v2 (Constant (Int 1)))
(LetPrim (v3 (Constant (Int 2)))
(LetPrim (v4 (Constant (String "b")))
(LetPrim (v5 (LiteralMap (v3) (v4)))
(LetPrim (v6 (Constant (Int 3)))
(LetPrim (v7 (Constant (String "c")))
(LetPrim (v8 (LiteralMap (v6) (v7)))
(LetPrim (v9 (LiteralMap (v0 v2 a) (v1 v5 v8)))
(InvokeContinuation return (v9)))))))))))))
'''),
]),
const Group('For loop', const <TestSpec>[
const TestSpec('''
main() {
for (;;) {}
}
''', '''
(FunctionDefinition main () return
(LetCont ((rec k0 ()
(LetPrim (v0 (Constant (Bool true)))
(LetCont ((k1 ()
(LetPrim (v1 (Constant (Null)))
(InvokeContinuation return (v1))))
(k2 ()
(InvokeContinuation rec k0 ())))
(Branch (IsTrue v0) k2 k1)))))
(InvokeContinuation k0 ())))
'''),
const TestSpec('''
main() {
for (var i = 0; i < 10; i = i + 1) {
print(i);
}
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetCont ((rec k0 (v1)
(LetPrim (v2 (Constant (Int 10)))
(LetCont ((k1 (v3)
(LetCont ((k2 ()
(LetPrim (v4 (Constant (Null)))
(InvokeContinuation return (v4))))
(k3 ()
(LetCont ((k4 (v5)
(LetPrim (v6 (Constant (Int 1)))
(LetCont ((k5 (v7)
(InvokeContinuation rec k0 (v7))))
(InvokeMethod v1 + (v6) k5)))))
(InvokeStatic print (v1) k4))))
(Branch (IsTrue v3) k3 k2))))
(InvokeMethod v1 < (v2) k1)))))
(InvokeContinuation k0 (v0)))))
'''),
const TestSpec('''
main(i) {
for (i = 0; i < 10; i = i + 1) {
print(i);
}
}
''', '''
(FunctionDefinition main (i) return
(LetPrim (v0 (Constant (Int 0)))
(LetCont ((rec k0 (v1)
(LetPrim (v2 (Constant (Int 10)))
(LetCont ((k1 (v3)
(LetCont ((k2 ()
(LetPrim (v4 (Constant (Null)))
(InvokeContinuation return (v4))))
(k3 ()
(LetCont ((k4 (v5)
(LetPrim (v6 (Constant (Int 1)))
(LetCont ((k5 (v7)
(InvokeContinuation rec k0 (v7))))
(InvokeMethod v1 + (v6) k5)))))
(InvokeStatic print (v1) k4))))
(Branch (IsTrue v3) k3 k2))))
(InvokeMethod v1 < (v2) k1)))))
(InvokeContinuation k0 (v0)))))
'''),
]),
const Group('While loop', const <TestSpec>[
const TestSpec('''
main() {
while (true) {}
}
''', '''
(FunctionDefinition main () return
(LetCont ((rec k0 ()
(LetPrim (v0 (Constant (Bool true)))
(LetCont ((k1 ()
(LetPrim (v1 (Constant (Null)))
(InvokeContinuation return (v1))))
(k2 ()
(InvokeContinuation rec k0 ())))
(Branch (IsTrue v0) k2 k1)))))
(InvokeContinuation k0 ())))
'''),
const TestSpec('''
main() {
var i = 0;
while (i < 10) {
print(i);
i = i + 1;
}
}
''', '''
(FunctionDefinition main () return
(LetPrim (v0 (Constant (Int 0)))
(LetCont ((rec k0 (v1)
(LetPrim (v2 (Constant (Int 10)))
(LetCont ((k1 (v3)
(LetCont ((k2 ()
(LetPrim (v4 (Constant (Null)))
(InvokeContinuation return (v4))))
(k3 ()
(LetCont ((k4 (v5)
(LetPrim (v6 (Constant (Int 1)))
(LetCont ((k5 (v7)
(InvokeContinuation rec k0 (v7))))
(InvokeMethod v1 + (v6) k5)))))
(InvokeStatic print (v1) k4))))
(Branch (IsTrue v3) k3 k2))))
(InvokeMethod v1 < (v2) k1)))))
(InvokeContinuation k0 (v0)))))
'''),
]),
const Group('Type operators', const <TestSpec>[
const TestSpec('''
main(a) {
return a is String;
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(TypeOperator is a String k0)))
'''),
const TestSpec('''
main(a) {
return a is List<String>;
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(TypeOperator is a List<String> k0)))
'''),
const TestSpec('''
main(a) {
return a is Comparator<String>;
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(TypeOperator is a Comparator<String> k0)))
'''),
const TestSpec('''
main(a) {
return a is! String;
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(LetCont ((k1 (v1)
(InvokeContinuation return (v1))))
(LetCont ((k2 ()
(LetPrim (v2 (Constant (Bool false)))
(InvokeContinuation k1 (v2))))
(k3 ()
(LetPrim (v3 (Constant (Bool true)))
(InvokeContinuation k1 (v3)))))
(Branch (IsTrue v0) k2 k3)))))
(TypeOperator is a String k0)))
'''),
const TestSpec('''
main(a) {
return a as String;
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(TypeOperator as a String k0)))
'''),
]),
const Group('For in loop', const <TestSpec>[
// TODO(johnniwinther): Add tests for `i` as top-level, static and instance
// fields.
const TestSpec('''
main(a) {
for (var i in a) {
print(i);
}
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(LetCont ((rec k1 (v1)
(LetCont ((k2 (v2)
(LetCont ((k3 ()
(LetPrim (v3 (Constant (Null)))
(InvokeContinuation return (v3))))
(k4 ()
(LetPrim (v4 (Constant (Null)))
(LetCont ((k5 (v5)
(LetCont ((k6 (v6)
(InvokeContinuation rec k1 (v1))))
(InvokeStatic print (v5) k6))))
(InvokeMethod v0 current () k5)))))
(Branch (IsTrue v2) k4 k3))))
(InvokeMethod v0 moveNext () k2))))
(InvokeContinuation k1 (a)))))
(InvokeMethod a iterator () k0)))
'''),
const TestSpec('''
main(a) {
for (var i in a) {
print(i);
i = 0;
print(i);
}
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(LetCont ((rec k1 (v1)
(LetCont ((k2 (v2)
(LetCont ((k3 ()
(LetPrim (v3 (Constant (Null)))
(InvokeContinuation return (v3))))
(k4 ()
(LetPrim (v4 (Constant (Null)))
(LetCont ((k5 (v5)
(LetCont ((k6 (v6)
(LetPrim (v7 (Constant (Int 0)))
(LetCont ((k7 (v8)
(InvokeContinuation rec k1 (v1))))
(InvokeStatic print (v7) k7)))))
(InvokeStatic print (v5) k6))))
(InvokeMethod v0 current () k5)))))
(Branch (IsTrue v2) k4 k3))))
(InvokeMethod v0 moveNext () k2))))
(InvokeContinuation k1 (a)))))
(InvokeMethod a iterator () k0)))
'''),
const TestSpec('''
main(a) {
var i;
for (i in a) {
print(i);
}
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (Constant (Null)))
(LetCont ((k0 (v1)
(LetCont ((rec k1 (v2 v3)
(LetCont ((k2 (v4)
(LetCont ((k3 ()
(LetPrim (v5 (Constant (Null)))
(InvokeContinuation return (v5))))
(k4 ()
(LetCont ((k5 (v6)
(LetCont ((k6 (v7)
(InvokeContinuation rec k1 (v2 v6))))
(InvokeStatic print (v6) k6))))
(InvokeMethod v1 current () k5))))
(Branch (IsTrue v4) k4 k3))))
(InvokeMethod v1 moveNext () k2))))
(InvokeContinuation k1 (a v0)))))
(InvokeMethod a iterator () k0))))
'''),
]),
const Group('Local functions', const <TestSpec>[
const TestSpec('''
main(a) {
local() {}
return local();
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (CreateFunction
(FunctionDefinition local () return
(LetPrim (v1 (Constant (Null)))
(InvokeContinuation return (v1))))))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 call () k0))))
'''),
const TestSpec('''
main(a) {
local() {}
var l = local;
return l();
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (CreateFunction
(FunctionDefinition local () return
(LetPrim (v1 (Constant (Null)))
(InvokeContinuation return (v1))))))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 call () k0))))
'''),
const TestSpec('''
main(a) {
return () {}();
}
''', '''
(FunctionDefinition main (a) return
(LetPrim (v0 (CreateFunction
(FunctionDefinition () return
(LetPrim (v1 (Constant (Null)))
(InvokeContinuation return (v1))))))
(LetCont ((k0 (v2)
(InvokeContinuation return (v2))))
(InvokeMethod v0 call () k0))))
'''),
const TestSpec('''
main(a) {
var c = a ? () { return 0; } : () { return 1; }
return c();
}
''', '''
(FunctionDefinition main (a) return
(LetCont ((k0 (v0)
(LetCont ((k1 (v1)
(InvokeContinuation return (v1))))
(InvokeMethod v0 call () k1))))
(LetCont ((k2 ()
(LetPrim (v2 (CreateFunction
(FunctionDefinition () return
(LetPrim (v3 (Constant (Int 0)))
(InvokeContinuation return (v3))))))
(InvokeContinuation k0 (v2))))
(k3 ()
(LetPrim (v4 (CreateFunction
(FunctionDefinition () return
(LetPrim (v5 (Constant (Int 1)))
(InvokeContinuation return (v5))))))
(InvokeContinuation k0 (v4)))))
(Branch (IsTrue a) k2 k3))))
'''),
]),
const Group('Top level field', const <TestSpec>[
const TestSpec('''
var field;
main(args) {
return field;
}
''', const {
'main': '''
(FunctionDefinition main (args) return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(InvokeStatic field () k0)))
''',
'field': '''
(FieldDefinition field)
'''}),
const TestSpec('''
var field = null;
main(args) {
return field;
}
''', const {
'main': '''
(FunctionDefinition main (args) return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(InvokeStatic field () k0)))
''',
'field': '''
(FieldDefinition field () return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
'''}),
const TestSpec('''
var field = 0;
main(args) {
return field;
}
''', const {
'main': '''
(FunctionDefinition main (args) return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(InvokeStatic field () k0)))
''',
'field': '''
(FieldDefinition field () return
(LetPrim (v0 (Constant (Int 0)))
(InvokeContinuation return (v0))))
'''}),
const TestSpec('''
var field;
main(args) {
field = args.length;
return field;
}
''', '''
(FunctionDefinition main (args) return
(LetCont ((k0 (v0)
(LetCont ((k1 (v1)
(LetCont ((k2 (v2)
(InvokeContinuation return (v2))))
(InvokeStatic field () k2))))
(InvokeStatic field (v0) k1))))
(InvokeMethod args length () k0)))
'''),
]),
const Group('Closure variables', const <TestSpec>[
const TestSpec('''
main(x,foo) {
print(x);
getFoo() => foo;
print(getFoo());
}
''', '''
(FunctionDefinition main (x foo) return
(LetCont ((k0 (v0)
(LetPrim (v1 (CreateFunction
(FunctionDefinition getFoo () return
(LetPrim (v2 (GetMutableVariable foo))
(InvokeContinuation return (v2))))))
(LetCont ((k1 (v3)
(LetCont ((k2 (v4)
(LetPrim (v5 (Constant (Null)))
(InvokeContinuation return (v5)))))
(InvokeStatic print (v3) k2))))
(InvokeMethod v1 call () k1)))))
(InvokeStatic print (x) k0)))
''', skipInAnalyzerFrontend: true)
]),
const Group('Constructors', const <TestSpec>[
const TestSpec('''
class C {}
main() {
return new C();
}
''',
const {
'main': '''
(FunctionDefinition main () return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(InvokeConstructor C () k0)))
''',
'C.': '''
(FunctionDefinition () return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
'''}),
const TestSpec('''
class C {
C() {}
}
main() {
return new C();
}
''',
const {
'main': '''
(FunctionDefinition main () return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(InvokeConstructor C () k0)))
''',
'C.': '''
(FunctionDefinition () return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
'''}),
const TestSpec('''
class B {}
class C extends B {
C() {}
}
main() {
return new C();
}
''',
const {
'main': '''
(FunctionDefinition main () return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(InvokeConstructor C () k0)))
''',
'B.': '''
(FunctionDefinition () return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
''',
'C.': '''
(FunctionDefinition () return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
'''}),
const TestSpec('''
class B {
B() {}
}
class C extends B {}
main() {
return new C();
}
''',
const {
'main': '''
(FunctionDefinition main () return
(LetCont ((k0 (v0)
(InvokeContinuation return (v0))))
(InvokeConstructor C () k0)))
''',
'B.': '''
(FunctionDefinition () return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
''',
'C.': '''
(FunctionDefinition () return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
'''}),
]),
const Group('Instance method', const <TestSpec>[
const TestSpec('''
class C {
C() {}
foo() {}
}
main() {
return new C().foo();
}
''',
const {
'main': '''
(FunctionDefinition main () return
(LetCont ((k0 (v0)
(LetCont ((k1 (v1)
(InvokeContinuation return (v1))))
(InvokeMethod v0 foo () k1))))
(InvokeConstructor C () k0)))
''',
'C.foo': '''
(FunctionDefinition foo () return
(LetPrim (v0 (Constant (Null)))
(InvokeContinuation return (v0))))
'''}),
]),
];