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.

gen.c 860B

12345678910111213141516171819202122232425262728293031323334353637
  1. #include "gen/gen.h"
  2. #include "bytecode.h"
  3. static void put(struct l2_generator *gen, l2_word word) {
  4. l2_bufio_put_n(&gen->writer, &word, sizeof(word));
  5. }
  6. void l2_gen_init(struct l2_generator *gen) {
  7. l2_strset_init(&gen->atoms);
  8. l2_strset_init(&gen->strings);
  9. }
  10. void l2_gen_free(struct l2_generator *gen) {
  11. l2_strset_free(&gen->atoms);
  12. l2_strset_free(&gen->strings);
  13. }
  14. void l2_gen_stack_frame(struct l2_generator *gen) {
  15. put(gen, L2_OP_ALLOC_NAMESPACE);
  16. }
  17. void l2_gen_assignment(struct l2_generator *gen, char **ident) {
  18. size_t atom_id = l2_strset_put(&gen->atoms, ident);
  19. put(gen, L2_OP_PUSH);
  20. put(gen, atom_id);
  21. put(gen, L2_OP_NAMESPACE_SET);
  22. }
  23. void l2_gen_number(struct l2_generator *gen, double num) {
  24. uint64_t n;
  25. memcpy(&n, &num, sizeof(num));
  26. put(gen, L2_OP_PUSH_2);
  27. put(gen, n >> 32);
  28. put(gen, n);
  29. put(gen, L2_OP_ALLOC_REAL_64);
  30. }