// 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.

// 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 dlapi = NativeApi.initializeApiDLData.cast<_DartApi>();
  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';
}();

final class _DartEntry extends Struct {
  external Pointer<Int8> name;
  external Pointer<Void> function;
}

final class _DartApi extends Struct {
  @Int32()
  external int major;
  @Int32()
  external int minor;
  external Pointer<_DartEntry> functions;
}
