// ignore_for_file: non_constant_identifier_names import 'dart:convert'; import 'dart:ffi' as ffi; import 'package:ffi/ffi.dart'; Map _mappings = {}; class StrWrapper { static final Finalizer> finalizer = Finalizer((p) => malloc.free(p)); late final ffi.Pointer _p; StrWrapper(String s) { _p = s.toNativeUtf8(); finalizer.attach(this, _p); } ffi.Pointer get p => _p; } dynamic invoke_f_any(ffi.Pointer p) { String s = p.toDartString(); var parts = s.split(' '); List args = []; for (int i = 1; i < parts.length; i++) { args.add(jsonDecode(parts[i])); } var f = _mappings[parts[0]]; return Function.apply(f!, args); } int invoke_f_int(ffi.Pointer p) => invoke_f_any(p); double invoke_f_float(ffi.Pointer p) => invoke_f_any(p); bool invoke_f_bool(ffi.Pointer p) => invoke_f_any(p); ffi.Pointer invoke_f_str(ffi.Pointer p) => StrWrapper(invoke_f_any(p)).p; void invoke_f_None(ffi.Pointer p) => invoke_f_any(p); ffi.Pointer f_int() { return ffi.Pointer.fromFunction)>( invoke_f_int, 0); } ffi.Pointer f_float() { return ffi.Pointer.fromFunction)>( invoke_f_float, 0.0); } ffi.Pointer f_bool() { return ffi.Pointer.fromFunction)>( invoke_f_bool, false); } ffi.Pointer f_str() { return ffi.Pointer.fromFunction< ffi.Pointer Function(ffi.Pointer)>(invoke_f_str); } ffi.Pointer f_None() { return ffi.Pointer.fromFunction)>( invoke_f_None); } void register(String? key, Function value) { _mappings[key!] = value; } int t_code() { if (T == int) return 'i'.codeUnitAt(0); if (T == double) return 'f'.codeUnitAt(0); if (T == bool) return 'b'.codeUnitAt(0); if (T == String) return 's'.codeUnitAt(0); return 'N'.codeUnitAt(0); // throw Exception("Type must be int/double/bool/String"); }