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 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  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_vm_value *var_lookup(const char *name) {
  12. l2_word atom_id = l2_strset_get(&gen.atomset, name);
  13. l2_word id = l2_vm_namespace_get(&vm, &vm.values[vm.fstack[1].ns], atom_id);
  14. return &vm.values[id];
  15. }
  16. static int eval_impl(const char *str, struct l2_parse_error *err) {
  17. r.r.read = l2_io_mem_read;
  18. r.idx = 0;
  19. r.len = strlen(str);
  20. r.mem = str;
  21. l2_lexer_init(&lex, &r.r);
  22. w.w.write = l2_io_mem_write;
  23. w.len = 0;
  24. w.size = 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. free(w.mem);
  29. return -1;
  30. }
  31. l2_vm_init(&vm, w.mem, w.len / sizeof(l2_word));
  32. l2_vm_run(&vm);
  33. free(w.mem);
  34. return 0;
  35. }
  36. #define eval(str) do { \
  37. snow_fail_update(); \
  38. struct l2_parse_error err; \
  39. if (eval_impl(str, &err) < 0) { \
  40. snow_fail("Parsing failed: %i:%i: %s", err.line, err.ch, err.message); \
  41. } \
  42. } while (0)
  43. describe(eval) {
  44. test("assignment") {
  45. eval("foo := 10");
  46. defer(l2_vm_free(&vm));
  47. defer(l2_gen_free(&gen));
  48. asserteq(l2_value_get_type(var_lookup("foo")), L2_VAL_TYPE_REAL);
  49. asserteq(var_lookup("foo")->real, 10);
  50. }
  51. test("var deref assignment") {
  52. eval("foo := 10\nbar := foo");
  53. defer(l2_vm_free(&vm));
  54. defer(l2_gen_free(&gen));
  55. asserteq(l2_value_get_type(var_lookup("foo")), L2_VAL_TYPE_REAL);
  56. asserteq(var_lookup("foo")->real, 10);
  57. asserteq(l2_value_get_type(var_lookup("bar")), L2_VAL_TYPE_REAL);
  58. asserteq(var_lookup("bar")->real, 10);
  59. }
  60. test("string assignment") {
  61. eval("foo := \"hello world\"");
  62. defer(l2_vm_free(&vm));
  63. defer(l2_gen_free(&gen));
  64. asserteq(l2_value_get_type(var_lookup("foo")), L2_VAL_TYPE_BUFFER);
  65. struct l2_vm_value *buf = var_lookup("foo");
  66. asserteq(buf->extra.buf_length, 11);
  67. assert(strncmp(buf->buffer, "hello world", 11) == 0);
  68. }
  69. }