// Copyright (c) 2020, 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 // Check that JumpToFrame does not use LR clobbered by slow path of // TransitionNativeToGenerated. // VMOptions=--use-slow-path import 'dart:ffi'; import 'package:ffi/ffi.dart'; import 'package:expect/expect.dart'; typedef CallbackDartType = Object Function(); typedef CallbackNativeType = Handle Function(); Object alwaysThrows() { throw 'exception'; } void alwaysCatches(CallbackDartType f) { try { propagateError(f()); } catch (e) { Expect.equals('exception', e); return; } Expect.isTrue(false); } void main() { final ptr = Pointer.fromFunction(alwaysThrows); final f = ptr.asFunction(); alwaysCatches(f); } typedef Dart_PropagateError_NativeType = Void Function(Handle); typedef Dart_PropagateError_DartType = void Function(Object); final Dart_PropagateError_DartType propagateError = () { final Pointer<_DartApi> dlapi = NativeApi.initializeApiDLData.cast(); for (int i = 0; dlapi.ref.functions[i].name != nullptr; i++) { final name = dlapi.ref.functions[i].name.cast().toDartString(); if (name == 'Dart_PropagateError') { return dlapi.ref.functions[i].function .cast>() .asFunction(); } } throw 'Not found'; }(); class _DartEntry extends Struct { Pointer name; Pointer function; } class _DartApi extends Struct { @Int32() int major; @Int32() int minor; Pointer<_DartEntry> functions; }