blob: 8e7f8bdd53ff4988714ad54b689a46f07f7ba6e6 [file] [log] [blame]
// Copyright (c) 2024, 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.
// This test tries to verify that catch entry moves correctly handle
// unboxed parameters and don't try to store values in locations
// where they will be missed by GC.
import 'dart:_internal' show VMInternalsForTesting;
import 'package:expect/expect.dart';
final values = <double>[];
@pragma('vm:never-inline')
void addValue(double v, {bool t = false}) {
values.add(v);
if (t) throw 'throw';
}
@pragma('vm:never-inline')
void tryCatch(double v) {
try {
addValue(v);
// Modify v which would create a catch entry move for it.
// Note: this should not be a constant value, because constant
// value will survive GC.
v *= 2;
addValue(v, t: true);
} catch (e) {
VMInternalsForTesting.collectAllGarbage();
addValue(v);
}
}
void main() {
tryCatch(1.0);
tryCatch(2.0);
Expect.listEquals([1.0, 2.0, 2.0, 2.0, 4.0, 4.0], values);
}