no_web.dart 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // ignore_for_file: non_constant_identifier_names, prefer_typing_uninitialized_variables, constant_identifier_names, no_leading_underscores_for_local_identifiers
  2. import 'dart:convert' as cvt;
  3. import 'dart:ffi' as ffi;
  4. import 'dart:io';
  5. import 'package:ffi/ffi.dart';
  6. import 'common.dart';
  7. class _Bindings
  8. {
  9. static ffi.DynamicLibrary _load() {
  10. String _libName = "pocketpy";
  11. if (Platform.isIOS) {
  12. return ffi.DynamicLibrary.process();
  13. }
  14. if (Platform.isAndroid || Platform.isLinux) {
  15. return ffi.DynamicLibrary.open('lib$_libName.so');
  16. }
  17. if (Platform.isWindows) {
  18. return ffi.DynamicLibrary.open('$_libName.dll');
  19. }
  20. throw UnsupportedError('Unknown platform: ${Platform.operatingSystem}');
  21. }
  22. static final _lib = _load();
  23. static final pkpy_delete = _lib.lookupFunction<ffi.Void Function(ffi.Pointer p), void Function(ffi.Pointer p)>("pkpy_delete");
  24. static final pkpy_new_repl = _lib.lookupFunction<ffi.Pointer Function(ffi.Pointer vm), ffi.Pointer Function(ffi.Pointer vm)>("pkpy_new_repl");
  25. static final pkpy_repl_input = _lib.lookupFunction<ffi.Int32 Function(ffi.Pointer r, ffi.Pointer<Utf8> line), int Function(ffi.Pointer r, ffi.Pointer<Utf8> line)>("pkpy_repl_input");
  26. static final pkpy_new_vm = _lib.lookupFunction<ffi.Pointer Function(ffi.Bool use_stdio), ffi.Pointer Function(bool use_stdio)>("pkpy_new_vm");
  27. static final pkpy_vm_add_module = _lib.lookupFunction<ffi.Void Function(ffi.Pointer vm, ffi.Pointer<Utf8> name, ffi.Pointer<Utf8> source), void Function(ffi.Pointer vm, ffi.Pointer<Utf8> name, ffi.Pointer<Utf8> source)>("pkpy_vm_add_module");
  28. static final pkpy_vm_eval = _lib.lookupFunction<ffi.Pointer<Utf8> Function(ffi.Pointer vm, ffi.Pointer<Utf8> source), ffi.Pointer<Utf8> Function(ffi.Pointer vm, ffi.Pointer<Utf8> source)>("pkpy_vm_eval");
  29. static final pkpy_vm_exec = _lib.lookupFunction<ffi.Void Function(ffi.Pointer vm, ffi.Pointer<Utf8> source), void Function(ffi.Pointer vm, ffi.Pointer<Utf8> source)>("pkpy_vm_exec");
  30. static final pkpy_vm_get_global = _lib.lookupFunction<ffi.Pointer<Utf8> Function(ffi.Pointer vm, ffi.Pointer<Utf8> name), ffi.Pointer<Utf8> Function(ffi.Pointer vm, ffi.Pointer<Utf8> name)>("pkpy_vm_get_global");
  31. static final pkpy_vm_read_output = _lib.lookupFunction<ffi.Pointer<Utf8> Function(ffi.Pointer vm), ffi.Pointer<Utf8> Function(ffi.Pointer vm)>("pkpy_vm_read_output");
  32. }
  33. class REPL {
  34. late final ffi.Pointer pointer;
  35. REPL(VM vm) {
  36. pointer = _Bindings.pkpy_new_repl(vm.pointer);
  37. }
  38. void dispose() {
  39. _Bindings.pkpy_delete(pointer);
  40. }
  41. /// Input a source line to an interactive console.
  42. int input(String line)
  43. {
  44. var ret = _Bindings.pkpy_repl_input(pointer, _Str(line).p);
  45. return ret;
  46. }
  47. }