// Copyright (c) 2019, 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.
//
// Helpers for tests which trigger GC in delicate places.

// @dart = 2.9

// ignore: import_internal_library, unused_import
import 'dart:_internal';
import 'dart:ffi';

import 'dylib_utils.dart';

typedef NativeNullaryOp = Void Function();
typedef NullaryOpVoid = void Function();

typedef NativeUnaryOp = Void Function(IntPtr);
typedef UnaryOpVoid = void Function(int);

final DynamicLibrary ffiTestFunctions =
    dlopenPlatformSpecific("ffi_test_functions");

final collectOnNthAllocation = ffiTestFunctions
    .lookupFunction<NativeUnaryOp, UnaryOpVoid>("CollectOnNthAllocation");

extension PointerOffsetBy<T extends NativeType> on Pointer<T> {
  Pointer<T> offsetBy(int bytes) => Pointer.fromAddress(address + bytes);
}

/// Triggers garbage collection.
// Defined in `dart:_internal`.
// ignore: undefined_identifier
void triggerGc() => VMInternalsForTesting.collectAllGarbage();

void Function(String) _namedPrint(String name) {
  if (name != null) {
    return (String value) => print('$name: $value');
  }
  return (String value) => print(value);
}

/// Does a GC and if [doAwait] awaits a future to enable running finalizers.
///
/// Also prints for debug purposes.
///
/// If provided, [name] prefixes the debug prints.
void doGC({String name}) {
  final _print = _namedPrint(name);

  _print('Do GC.');
  triggerGc();
  _print('GC done');
}

void createAndLoseFinalizable(Pointer<IntPtr> token) {
  final myFinalizable = MyFinalizable();
  setTokenFinalizer.attach(myFinalizable, token.cast());
}

final setTokenTo42Ptr =
    ffiTestFunctions.lookup<NativeFinalizerFunction>("SetArgumentTo42");
final setTokenFinalizer = NativeFinalizer(setTokenTo42Ptr);

class MyFinalizable implements Finalizable {}
