bytecode.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include "symboltable.h"
  5. #include "tags.h"
  6. #include "globals.h"
  7. #include "stack.h"
  8. #include "gc.h"
  9. unsigned char *bytecode;
  10. scm place;
  11. scm bytecode_args[42];
  12. int bytecode_args_num = 0;
  13. int chr_to_hex(unsigned char x) {
  14. if('0' <= x && x <= '9') {
  15. return x - '0';
  16. }
  17. if('A' <= x && x <= 'F') {
  18. return x - 'A' + 10;
  19. }
  20. fprintf(stderr, "chr_to_hex: %c", x);
  21. exit(-1);
  22. }
  23. scm bytecode_read_n(int n) {
  24. int i;
  25. scm res;
  26. res = 0;
  27. for(i = 0; i < n; i++)
  28. res = res * 0x10 + chr_to_hex(bytecode[place++]);
  29. return res;
  30. }
  31. void bytecode_read_place(unsigned char *place_sort, scm *place_index) {
  32. *place_sort = bytecode[place++];
  33. switch(*place_sort) {
  34. case 'r':
  35. *place_index = 0;
  36. break;
  37. case 'g':
  38. *place_index = bytecode_read_n(4);
  39. break;
  40. case 't':
  41. case 'l':
  42. case 'e':
  43. *place_index = bytecode_read_n(2);
  44. break;
  45. default:
  46. fprintf(stderr, "Unknown place sort %c\n", *place_sort);
  47. exit(-1);
  48. }
  49. }
  50. scm bytecode_read_char();
  51. scm bytecode_read_symb();
  52. scm bytecode_read_strn();
  53. scm bytecode_read_val() {
  54. unsigned char c;
  55. switch(c = bytecode[place++]) {
  56. case 'N':
  57. return atom_tag_null;
  58. case '#':
  59. return bytecode_read_char();
  60. case 'x':
  61. return mk_numb(bytecode_read_n(4));
  62. case 'X':
  63. return mk_numb(bytecode_read_n(16));
  64. case 'S':
  65. return bytecode_read_symb();
  66. case '"':
  67. return bytecode_read_strn();
  68. case 'r':
  69. return vm_reg_ret;
  70. case 'g':
  71. return vm_global_ref(bytecode_read_n(4));
  72. case 't':
  73. return vm_stack_top_ref(bytecode_read_n(2));
  74. case 'l':
  75. return vm_stack_base_ref(bytecode_read_n(2));
  76. case 'e':
  77. return clos_env_ref(vm_reg_env, bytecode_read_n(2));
  78. default:
  79. fprintf(stderr, "bytecode_read_val %c", c);
  80. exit(-1);
  81. }
  82. }
  83. scm bytecode_read_char() {
  84. unsigned char c;
  85. switch(c = bytecode[place++]) {
  86. case 'f':
  87. return atom_tag_fals;
  88. case 't':
  89. return atom_tag_true;
  90. case '\\':
  91. c = bytecode[place++];
  92. return mk_char(c);
  93. case 'N':
  94. return mk_char('\n');
  95. case 'T':
  96. return mk_char('\t');
  97. default:
  98. fprintf(stderr, "bytecode_read_read %c", c);
  99. exit(-1);
  100. }
  101. }
  102. scm bytecode_read_symb() {
  103. char symbol_tmp_buf[512];
  104. int i;
  105. for(i = 0; bytecode[place] != '.'; i++, place++) {
  106. symbol_tmp_buf[i] = bytecode[place];
  107. if(i >= 512-1) {
  108. fprintf(stderr, "bytecode_read_symb");
  109. exit(-1);
  110. }
  111. }
  112. symbol_tmp_buf[i] = '\0';
  113. place++;
  114. return intern(symbol_tmp_buf);
  115. }
  116. void bytecode_read_args() {
  117. bytecode_args_num = 0;
  118. while(bytecode[place] != '.') {
  119. bytecode_args[bytecode_args_num++] = bytecode_read_val();
  120. }
  121. place++;
  122. }
  123. scm bytecode_read_strn() {
  124. char string_tmp_buf[512];
  125. int i;
  126. for(i = 0; bytecode[place] != '.'; i++, place++) {
  127. string_tmp_buf[i] = bytecode[place];
  128. }
  129. string_tmp_buf[i] = '\0';
  130. place++;
  131. return heap_alloc_strn(string_tmp_buf, i);
  132. }