blob: 5e1f8cd83839f244ddb6322a91b60750c719f2a7 [file] [log] [blame]
// Copyright (c) 2021, 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.
// @dart = 2.9
// VMOptions=
// VMOptions=--use_slow_path
import "package:expect/expect.dart";
@pragma("vm:never-inline")
dynamic hiddenSmi() {
try {
throw 42;
} catch (e) {
return e;
}
return 0;
}
@pragma("vm:never-inline")
dynamic hiddenMint() {
try {
throw 0x8000000000000000;
} catch (e) {
return e;
}
return 0;
}
@pragma("vm:never-inline")
dynamic hiddenDouble() {
try {
throw 3.0;
} catch (e) {
return e;
}
return 0;
}
@pragma("vm:never-inline")
dynamic hiddenCustom() {
try {
throw new Custom();
} catch (e) {
return e;
}
return 0;
}
class Custom {
operator +(other) => "add";
operator -(other) => "sub";
operator *(other) => "mul";
operator ~/(other) => "div";
operator %(other) => "mod";
operator &(other) => "and";
operator |(other) => "or";
operator ^(other) => "xor";
operator <<(other) => "sll";
operator >>(other) => "sra";
}
main() {
Expect.equals(44, hiddenSmi() + 2);
Expect.equals(40, hiddenSmi() - 2);
Expect.equals(84, hiddenSmi() * 2);
Expect.equals(21, hiddenSmi() ~/ 2);
Expect.equals(0, hiddenSmi() % 2);
Expect.equals(2, hiddenSmi() & 2);
Expect.equals(42, hiddenSmi() | 2);
Expect.equals(40, hiddenSmi() ^ 2);
Expect.equals(168, hiddenSmi() << 2);
Expect.equals(10, hiddenSmi() >> 2);
Expect.equals(-9223372036854775806, hiddenMint() + 2);
Expect.equals(9223372036854775806, hiddenMint() - 2);
Expect.equals(0, hiddenMint() * 2);
Expect.equals(-4611686018427387904, hiddenMint() ~/ 2);
Expect.equals(0, hiddenMint() % 2);
Expect.equals(0, hiddenMint() & 2);
Expect.equals(-9223372036854775806, hiddenMint() | 2);
Expect.equals(-9223372036854775806, hiddenMint() ^ 2);
Expect.equals(0, hiddenMint() << 2);
Expect.equals(-2305843009213693952, hiddenMint() >> 2);
Expect.equals(5.0, hiddenDouble() + 2);
Expect.equals(1.0, hiddenDouble() - 2);
Expect.equals(6.0, hiddenDouble() * 2);
Expect.equals(1, hiddenDouble() ~/ 2);
Expect.equals(1.0, hiddenDouble() % 2);
Expect.throws(() => hiddenDouble() & 2, (e) => e is NoSuchMethodError);
Expect.throws(() => hiddenDouble() | 2, (e) => e is NoSuchMethodError);
Expect.throws(() => hiddenDouble() ^ 2, (e) => e is NoSuchMethodError);
Expect.throws(() => hiddenDouble() << 2, (e) => e is NoSuchMethodError);
Expect.throws(() => hiddenDouble() >> 2, (e) => e is NoSuchMethodError);
Expect.equals("add", hiddenCustom() + 2);
Expect.equals("sub", hiddenCustom() - 2);
Expect.equals("mul", hiddenCustom() * 2);
Expect.equals("div", hiddenCustom() ~/ 2);
Expect.equals("mod", hiddenCustom() % 2);
Expect.equals("and", hiddenCustom() & 2);
Expect.equals("or", hiddenCustom() | 2);
Expect.equals("xor", hiddenCustom() ^ 2);
Expect.equals("sll", hiddenCustom() << 2);
Expect.equals("sra", hiddenCustom() >> 2);
}