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.

main.c 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "vm/vm.h"
  2. #include "bitset.h"
  3. #include <stdio.h>
  4. #include <string.h>
  5. void print_var(struct l2_vm_value *val) {
  6. switch (val->flags & 0x0f) {
  7. case L2_VAL_TYPE_NONE:
  8. printf("NONE\n");
  9. break;
  10. case L2_VAL_TYPE_INTEGER:
  11. printf("INTEGER %zi\n", val->integer);
  12. break;
  13. case L2_VAL_TYPE_REAL:
  14. printf("REAL %f\n", val->real);
  15. break;
  16. case L2_VAL_TYPE_ARRAY:
  17. {
  18. if (val->data == NULL) {
  19. printf("ARRAY, empty\n");
  20. return;
  21. }
  22. struct l2_vm_array *arr = (struct l2_vm_array *)val->data;
  23. printf("ARRAY, len %zu\n", arr->len);
  24. for (size_t i = 0; i < arr->len; ++i) {
  25. printf(" %zu: %u\n", i, arr->data[i]);
  26. }
  27. }
  28. break;
  29. case L2_VAL_TYPE_BUFFER:
  30. {
  31. if (val->data == NULL) {
  32. printf("BUFFER, empty\n");
  33. return;
  34. }
  35. struct l2_vm_buffer *buf = (struct l2_vm_buffer *)val->data;
  36. printf("BUFFER, len %zu\n", buf->len);
  37. for (size_t i = 0; i < buf->len; ++i) {
  38. printf(" %zu: %c\n", i, buf->data[i]);
  39. }
  40. }
  41. break;
  42. case L2_VAL_TYPE_NAMESPACE:
  43. {
  44. if (val->data == NULL) {
  45. printf("NAMESPACE, empty\n");
  46. return;
  47. }
  48. struct l2_vm_namespace *ns = (struct l2_vm_namespace *)val->data;
  49. printf("NAMESPACE, len %zu\n", ns->len);
  50. }
  51. break;
  52. }
  53. }
  54. int main() {
  55. l2_word ops[] = {
  56. L2_OP_PUSH, 100,
  57. L2_OP_PUSH, 100,
  58. L2_OP_ADD,
  59. L2_OP_ALLOC_INTEGER_32,
  60. L2_OP_PUSH, 21 /* offset */,
  61. L2_OP_PUSH, 5 /* length */,
  62. L2_OP_ALLOC_BUFFER_STATIC,
  63. L2_OP_POP,
  64. L2_OP_PUSH, 16,
  65. L2_OP_CALL,
  66. L2_OP_HALT,
  67. L2_OP_PUSH, 53,
  68. L2_OP_ALLOC_INTEGER_32,
  69. L2_OP_ALLOC_NAMESPACE,
  70. L2_OP_HALT,
  71. 0, 0,
  72. };
  73. memcpy(&ops[21], "Hello", 5);
  74. struct l2_vm vm;
  75. l2_vm_init(&vm, ops, sizeof(ops) / sizeof(*ops));
  76. l2_vm_run(&vm);
  77. printf("Stack:\n");
  78. for (l2_word i = 0; i < vm.sptr; ++i) {
  79. printf(" %i: %i\n", i, vm.stack[i]);
  80. }
  81. printf("Heap:\n");
  82. for (l2_word i = 0; i < vm.valuessize; ++i) {
  83. if (l2_bitset_get(&vm.valueset, i)) {
  84. printf(" %u: ", i);
  85. print_var(&vm.values[i]);
  86. }
  87. }
  88. l2_vm_gc(&vm);
  89. printf("Heap:\n");
  90. for (l2_word i = 0; i < vm.valuessize; ++i) {
  91. if (l2_bitset_get(&vm.valueset, i)) {
  92. printf(" %u: ", i);
  93. print_var(&vm.values[i]);
  94. }
  95. }
  96. l2_vm_free(&vm);
  97. }