| // 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<CallbackNativeType>(alwaysThrows); |
| final f = ptr.asFunction<CallbackDartType>(); |
| 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<Utf8>().toDartString(); |
| if (name == 'Dart_PropagateError') { |
| return dlapi.ref.functions[i].function |
| .cast<NativeFunction<Dart_PropagateError_NativeType>>() |
| .asFunction<Dart_PropagateError_DartType>(); |
| } |
| } |
| throw 'Not found'; |
| }(); |
| |
| class _DartEntry extends Struct { |
| Pointer<Int8> name; |
| Pointer<Void> function; |
| } |
| |
| class _DartApi extends Struct { |
| @Int32() |
| int major; |
| @Int32() |
| int minor; |
| Pointer<_DartEntry> functions; |
| } |