| // 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/expect.dart"; |
| |
| constants() { |
| Expect.equals(0x80000000, 0x80000000 | 0); |
| Expect.equals(0x80000001, 0x80000000 | 1); |
| Expect.equals(0x80000000, 0x80000000 | 0x80000000); |
| Expect.equals(0xFFFFFFFF, 0xFFFF0000 | 0xFFFF); |
| Expect.equals(0x80000000, 0x80000000 & 0xFFFFFFFF); |
| Expect.equals(0x80000000, 0x80000000 & 0x80000000); |
| Expect.equals(0x80000000, 0x80000000 & 0xF0000000); |
| Expect.equals(0x80000000, 0xFFFFFFFF & 0x80000000); |
| Expect.equals(0x80000000, 0x80000000 ^ 0); |
| Expect.equals(0xFFFFFFFF, 0x80000000 ^ 0x7FFFFFFF); |
| Expect.equals(0xFFFFFFFF, 0x7FFFFFFF ^ 0x80000000); |
| Expect.equals(0xF0000000, 0x70000000 ^ 0x80000000); |
| Expect.equals(0x80000000, 1 << 31); |
| Expect.equals(0xFFFFFFF0, 0xFFFFFFF << 4); |
| Expect.equals(0x7FFFFFFF, 0xFFFFFFFF >> 1); |
| Expect.equals( |
| 0xFFFFFFFC, |
| ((((((0xFFFFFFF << 4) // 0xFFFFFFF0 |
| >> |
| 1) // 0x7FFFFFF8 |
| | |
| 0x80000000) // 0xFFFFFFF8 |
| >> |
| 2) // 0x3FFFFFFE |
| ^ |
| 0x40000000) // 0x7FFFFFFE |
| << |
| 1)); |
| } |
| |
| foo(i) { |
| if (i != 0) { |
| y--; |
| foo(i - 1); |
| y++; |
| } |
| } |
| |
| var y; |
| |
| // id returns [x] in a way that should be difficult to predict statically. |
| id(x) { |
| y = x; |
| foo(10); |
| return y; |
| } |
| |
| interceptors() { |
| Expect.equals(0x80000000, id(0x80000000) | id(0)); |
| Expect.equals(0x80000001, id(0x80000000) | id(1)); |
| Expect.equals(0x80000000, id(0x80000000) | id(0x80000000)); |
| Expect.equals(0xFFFFFFFF, id(0xFFFF0000) | id(0xFFFF)); |
| Expect.equals(0x80000000, id(0x80000000) & id(0xFFFFFFFF)); |
| Expect.equals(0x80000000, id(0x80000000) & id(0x80000000)); |
| Expect.equals(0x80000000, id(0x80000000) & id(0xF0000000)); |
| Expect.equals(0x80000000, id(0xFFFFFFFF) & id(0x80000000)); |
| Expect.equals(0x80000000, id(0x80000000) ^ id(0)); |
| Expect.equals(0xFFFFFFFF, id(0x80000000) ^ id(0x7FFFFFFF)); |
| Expect.equals(0xFFFFFFFF, id(0x7FFFFFFF) ^ id(0x80000000)); |
| Expect.equals(0xF0000000, id(0x70000000) ^ id(0x80000000)); |
| Expect.equals(0x80000000, id(1) << id(31)); |
| Expect.equals(0xFFFFFFF0, id(0xFFFFFFF) << id(4)); |
| Expect.equals(0x7FFFFFFF, id(0xFFFFFFFF) >> id(1)); |
| Expect.equals( |
| 0xFFFFFFFC, |
| ((((((id(0xFFFFFFF) << 4) // 0xFFFFFFF0 |
| >> |
| 1) // 0x7FFFFFF8 |
| | |
| 0x80000000) // 0xFFFFFFF8 |
| >> |
| 2) // 0x3FFFFFFE |
| ^ |
| 0x40000000) // 0x7FFFFFFE |
| << |
| 1)); |
| } |
| |
| speculative() { |
| var a = id(0x80000000); |
| var b = id(0); |
| var c = id(1); |
| var d = id(0xFFFF0000); |
| var e = id(0xFFFF); |
| var f = id(0xFFFFFFFF); |
| var g = id(0xF0000000); |
| var h = id(0x7FFFFFFF); |
| var j = id(0x70000000); |
| var k = id(31); |
| var l = id(4); |
| var m = id(0xFFFFFFF); |
| for (int i = 0; i < 1; i++) { |
| Expect.equals(0x80000000, a | b); |
| Expect.equals(0x80000001, a | c); |
| Expect.equals(0x80000000, a | a); |
| Expect.equals(0xFFFFFFFF, d | e); |
| Expect.equals(0x80000000, a & f); |
| Expect.equals(0x80000000, a & a); |
| Expect.equals(0x80000000, a & g); |
| Expect.equals(0x80000000, f & a); |
| Expect.equals(0x80000000, a ^ b); |
| Expect.equals(0xFFFFFFFF, a ^ h); |
| Expect.equals(0xFFFFFFFF, h ^ a); |
| Expect.equals(0xF0000000, j ^ a); |
| Expect.equals(0x80000000, c << k); |
| Expect.equals(0xFFFFFFF0, m << l); |
| Expect.equals(0x7FFFFFFF, f >> c); |
| Expect.equals( |
| 0xFFFFFFFC, |
| ((((((m << 4) // 0xFFFFFFF0 |
| >> |
| 1) // 0x7FFFFFF8 |
| | |
| 0x80000000) // 0xFFFFFFF8 |
| >> |
| 2) // 0x3FFFFFFE |
| ^ |
| 0x40000000) // 0x7FFFFFFE |
| << |
| 1)); |
| } |
| } |
| |
| // Due to bad precedence rules this example was broken in Dart2Js. |
| precedence() { |
| Expect.equals(0x80000000, -1 & 0x80000000); |
| Expect.equals(0x80000000, id(-1) & 0x80000000); |
| Expect.equals(0x80000000, ~(~(0x80000000))); |
| Expect.equals(0x80000000, ~(~(id(0x80000000)))); |
| } |
| |
| main() { |
| constants(); |
| interceptors(); |
| speculative(); |
| precedence(); |
| } |