You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

eval.t.c 1.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. #include "parse/parse.h"
  2. #include "vm/vm.h"
  3. #include "vm/print.h"
  4. #include <stdio.h>
  5. #include <snow/snow.h>
  6. static struct l2_lexer lex;
  7. static struct l2_io_mem_reader r;
  8. static struct l2_generator gen;
  9. static struct l2_io_mem_writer w;
  10. static struct l2_vm vm;
  11. static struct l2_parse_error err;
  12. static struct l2_vm_value *var_lookup(const char *name) {
  13. l2_word atom_id = l2_strset_get(&gen.atoms, name);
  14. l2_word id = l2_vm_namespace_get(&vm.values[vm.nstack[0]], atom_id);
  15. return &vm.values[id];
  16. }
  17. static int exec(const char *str) {
  18. r.r.read = l2_io_mem_read;
  19. r.idx = 0;
  20. r.len = strlen(str);
  21. r.mem = str;
  22. l2_lexer_init(&lex, &r.r);
  23. w.w.write = l2_io_mem_write;
  24. w.len = 0;
  25. w.mem = NULL;
  26. l2_gen_init(&gen, (struct l2_io_writer *)&w);
  27. if (l2_parse_program(&lex, &gen, &err) < 0) {
  28. return -1;
  29. }
  30. l2_vm_init(&vm, (l2_word *)w.mem, w.len / sizeof(l2_word));
  31. l2_vm_run(&vm);
  32. free(w.mem);
  33. return 0;
  34. }
  35. describe(exec) {
  36. test("exec assignment") {
  37. exec("foo := 10");
  38. defer(l2_vm_free(&vm));
  39. defer(l2_gen_free(&gen));
  40. assert(l2_vm_value_type(var_lookup("foo")) == L2_VAL_TYPE_REAL);
  41. assert(var_lookup("foo")->real == 10);
  42. }
  43. }