2
0

helloworld.pp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. {$mode objfpc}
  2. {$h+}
  3. program helloworld;
  4. uses classes,ctypes, wasmtime;
  5. procedure exit_with_error(message : PAnsiChar; error : Pwasmtime_error_t; trap: Pwasm_trap_t); cdecl;
  6. var
  7. error_message : Twasm_byte_vec_t ;
  8. S : AnsiString;
  9. begin
  10. Writeln(stderr, 'error: ', message);
  11. S:='';
  12. if (error <> Nil) then
  13. begin
  14. wasmtime_error_message(error, @error_message);
  15. wasmtime_error_delete(error)
  16. end
  17. else
  18. begin
  19. wasm_trap_message(trap, @error_message);
  20. wasm_trap_delete(trap);
  21. end;
  22. SetLength(S,error_message.size);
  23. Move(error_message.data^,S[1],error_message.size);
  24. Writeln(stderr, S);
  25. wasm_byte_vec_delete(@error_message);
  26. halt(1);
  27. end;
  28. function hello_callback(env : Pointer; caller : Pwasmtime_caller_t; args : pwasmtime_val_t; nargs : size_t; results : pwasmtime_val_t; nresults : size_t) : pwasm_trap_t; cdecl;
  29. begin
  30. Writeln('Calling back...');
  31. Writeln(' Hello World!');
  32. Result:=Nil;
  33. end;
  34. Var
  35. engine : Pwasm_engine_t = Nil;
  36. store : Pwasmtime_store_t = Nil;
  37. context : Pwasmtime_context_t = Nil;
  38. F : TMemoryStream;
  39. wat : Twasm_byte_vec_t;
  40. wasm : twasm_byte_vec_t;
  41. module : Pwasmtime_module_t = Nil;
  42. error : Pwasmtime_error_t = Nil;
  43. hello_ty : Pwasm_functype_t = nil;
  44. hello : Twasmtime_func_t;
  45. trap : Pwasm_trap_t = Nil;
  46. instance : Twasmtime_instance_t;
  47. import : Twasmtime_extern_t;
  48. run : Twasmtime_extern_t;
  49. ok : Byte;
  50. begin
  51. Writeln('Loading wasm library');
  52. Loadwasmtime('./'+libwasmtime);
  53. Writeln('Initializing...');
  54. engine := wasm_engine_new();
  55. store:=wasmtime_store_new(engine, nil,nil);
  56. context:=wasmtime_store_context(store);
  57. F:=TMemoryStream.Create;
  58. try
  59. F.LoadFromFile('hello.wat');
  60. wasm_byte_vec_new_uninitialized(@wat, F.Size);
  61. Move(F.Memory^,wat.data^,F.Size);
  62. finally
  63. F.Free;
  64. end;
  65. error:=wasmtime_wat2wasm(PAnsiChar(wat.data), wat.size, @wasm);
  66. if (error<>Nil) then
  67. exit_with_error('failed to parse wat', error, Nil);
  68. wasm_byte_vec_delete(@wat);
  69. Writeln('Compiling module...');
  70. error:=wasmtime_module_new(engine, Puint8_t(wasm.data), wasm.size, @module);
  71. wasm_byte_vec_delete(@wasm);
  72. if (error <> nil) then
  73. exit_with_error('failed to compile module', error, nil);
  74. Writeln('Creating callback...');
  75. hello_ty:=wasm_functype_new_0_0();
  76. wasmtime_func_new(context, hello_ty, @hello_callback, Nil, Nil, @hello);
  77. Writeln('Instantiating module...');
  78. import.kind:=WASMTIME_EXTERN_FUNC;
  79. import.of_.func:=hello;
  80. error:=wasmtime_instance_new(context, module, @import, 1, @instance, @trap);
  81. if (error<>nil) or (trap <>Nil) then
  82. exit_with_error('failed to instantiate', error, trap);
  83. Writeln('Extracting export...');
  84. ok:=wasmtime_instance_export_get(context, @instance, PAnsiChar('run'), 3, @run) ;
  85. if OK=0 then
  86. exit_with_error('failed to get run export', nil, nil);
  87. if run.kind<>WASMTIME_EXTERN_FUNC then
  88. exit_with_error('run is not a function', nil, nil);
  89. Writeln('Calling export...');
  90. error:=wasmtime_func_call(context, @run.of_.func, nil, 0, nil, 0, @trap);
  91. if (error<>nil) or (trap<>nil) then
  92. exit_with_error('failed to call function', error, trap);
  93. Writeln('All finished!');
  94. wasmtime_module_delete(module);
  95. wasmtime_store_delete(store);
  96. wasm_engine_delete(engine);
  97. end.