plugin_api.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #pragma once
  2. #include "quickjs-libc.h"
  3. #include "quickjs.h"
  4. #include <stdbool.h>
  5. #include <string.h>
  6. extern JSRuntime *js_runtime;
  7. extern JSContext *js_ctx;
  8. float js_eval(const char *s);
  9. char *js_call(void *p);
  10. JSValue js_call_arg(void *p, int argc, void *argv);
  11. // ██████╗ ███████╗███████╗██╗███╗ ██╗███████╗███████╗
  12. // ██╔══██╗██╔════╝██╔════╝██║████╗ ██║██╔════╝██╔════╝
  13. // ██║ ██║█████╗ █████╗ ██║██╔██╗ ██║█████╗ ███████╗
  14. // ██║ ██║██╔══╝ ██╔══╝ ██║██║╚██╗██║██╔══╝ ╚════██║
  15. // ██████╔╝███████╗██║ ██║██║ ╚████║███████╗███████║
  16. // ╚═════╝ ╚══════╝╚═╝ ╚═╝╚═╝ ╚═══╝╚══════╝╚══════╝
  17. #define FN(name) static JSValue js_##name(JSContext *ctx, JSValue this_val, int argc, JSValue *argv)
  18. #define VOID_FN(name) \
  19. void name(); \
  20. FN(name) { \
  21. name(); \
  22. return JS_UNDEFINED; \
  23. }
  24. #define PTR_FN(name) \
  25. void *name(); \
  26. FN(name) { \
  27. uint64_t result = (uint64_t)name(); \
  28. return JS_NewBigUint64(ctx, result); \
  29. }
  30. #define VOID_FN_STR(name) \
  31. void name(char *s); \
  32. FN(name) { \
  33. char *s = (char *)JS_ToCString(ctx, argv[0]); \
  34. name(s); \
  35. return JS_UNDEFINED; \
  36. }
  37. #define VOID_FN_PTR_STR(name) \
  38. void name(void *p, char *s); \
  39. FN(name) { \
  40. uint64_t p; \
  41. JS_ToBigUint64(ctx, &p, argv[0]); \
  42. char *s = (char *)JS_ToCString(ctx, argv[1]); \
  43. name((void *)p, s); \
  44. return JS_UNDEFINED; \
  45. }
  46. #define VOID_FN_CB(name) \
  47. void name(void *p); \
  48. FN(name) { \
  49. JSValue dup = JS_DupValue(ctx, argv[0]); \
  50. if (JS_IsNull(dup)) { \
  51. name(NULL); \
  52. return JS_UNDEFINED; \
  53. } \
  54. JSValue *p = malloc(sizeof(JSValue)); \
  55. memcpy(p, &dup, sizeof(JSValue)); \
  56. name(p); \
  57. return JS_UNDEFINED; \
  58. }
  59. #define VOID_FN_PTR_CB(name) \
  60. void name(void *p0, void *p1); \
  61. FN(name) { \
  62. uint64_t p0; \
  63. JS_ToBigUint64(ctx, &p0, argv[0]); \
  64. JSValue *p1 = malloc(sizeof(JSValue)); \
  65. JSValue dup = JS_DupValue(ctx, argv[1]); \
  66. memcpy(p1, &dup, sizeof(JSValue)); \
  67. name((void *)p0, p1); \
  68. return JS_UNDEFINED; \
  69. }
  70. #define BIND(name, argc) JS_SetPropertyStr(js_ctx, global_obj, #name, JS_NewCFunction(js_ctx, js_##name, #name, argc))