exec_gravity.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //
  2. // Sample code to demonstrate how to execute Gravity code from C
  3. // Created by Marco Bambini on 06/03/2017.
  4. //
  5. #include <stdio.h>
  6. #include "gravity_compiler.h"
  7. #include "gravity_macros.h"
  8. #include "gravity_core.h"
  9. #include "gravity_vm.h"
  10. // gravity func source code
  11. static const char *source = "func add (a, b) {return a + b;}; \
  12. func mul (a, b) {return a * b;};";
  13. // error callback
  14. static void report_error (gravity_vm *vm, error_type_t error_type, const char *message,
  15. error_desc_t error_desc, void *xdata) {
  16. #pragma unused(vm, xdata)
  17. const char *type = "N/A";
  18. switch (error_type) {
  19. case GRAVITY_ERROR_NONE: type = "NONE"; break;
  20. case GRAVITY_ERROR_SYNTAX: type = "SYNTAX"; break;
  21. case GRAVITY_ERROR_SEMANTIC: type = "SEMANTIC"; break;
  22. case GRAVITY_ERROR_RUNTIME: type = "RUNTIME"; break;
  23. case GRAVITY_WARNING: type = "WARNING"; break;
  24. case GRAVITY_ERROR_IO: type = "I/O"; break;
  25. }
  26. if (error_type == GRAVITY_ERROR_RUNTIME) printf("RUNTIME ERROR: ");
  27. else printf("%s ERROR on %d (%d,%d): ", type, error_desc.fileid, error_desc.lineno, error_desc.colno);
  28. printf("%s\n", message);
  29. }
  30. int main(int argc, const char * argv[]) {
  31. // setup a minimal delegate
  32. gravity_delegate_t delegate = {
  33. .error_callback = report_error
  34. };
  35. // compile source into a closure
  36. gravity_compiler_t *compiler = gravity_compiler_create(&delegate);
  37. gravity_closure_t *closure = gravity_compiler_run(compiler, source, strlen(source), 0, true, true);
  38. if (!closure) return -1;
  39. // setup a new VM and a new fiber
  40. gravity_vm *vm = gravity_vm_new(&delegate);
  41. // transfer memory from compiler to VM and then free compiler
  42. gravity_compiler_transfer(compiler, vm);
  43. gravity_compiler_free(compiler);
  44. // load closure into VM context
  45. gravity_vm_loadclosure(vm, closure);
  46. // create parameters (that must be boxed) for the closure
  47. gravity_value_t n1 = VALUE_FROM_INT(30);
  48. gravity_value_t n2 = VALUE_FROM_INT(50);
  49. gravity_value_t params[2] = {n1, n2};
  50. // lookup add closure
  51. gravity_value_t add = gravity_vm_getvalue(vm, "add", strlen("add"));
  52. if (!VALUE_ISA_CLOSURE(add)) return -2;
  53. // execute add closure and print result
  54. if (gravity_vm_runclosure(vm, VALUE_AS_CLOSURE(add), add, params, 2)) {
  55. gravity_value_t result = gravity_vm_result(vm);
  56. printf("add result ");
  57. gravity_value_dump(vm, result, NULL, 0);
  58. }
  59. // lookup mul closure
  60. gravity_value_t mul = gravity_vm_getvalue(vm, "mul", strlen("mul"));
  61. if (!VALUE_ISA_CLOSURE(mul)) return -3;
  62. // execute mul closure and print result
  63. if (gravity_vm_runclosure(vm, VALUE_AS_CLOSURE(mul), mul, params, 2)) {
  64. gravity_value_t result = gravity_vm_result(vm);
  65. printf("mul result ");
  66. gravity_value_dump(vm, result, NULL, 0);
  67. }
  68. // free vm and core classes
  69. gravity_vm_free(vm);
  70. gravity_core_free();
  71. return 0;
  72. }