lcode.c 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. ** $Id: $
  3. ** Code generator for Lua
  4. ** See Copyright Notice in lua.h
  5. */
  6. #include "lcode.h"
  7. #include "llex.h"
  8. #include "lmem.h"
  9. #include "lobject.h"
  10. #include "lopcodes.h"
  11. #include "lparser.h"
  12. static Instruction *last_i (FuncState *fs) {
  13. static Instruction dummy = SET_OPCODE(0, ENDCODE);
  14. if (fs->last_pc < 0)
  15. return &dummy;
  16. else
  17. return &fs->f->code[fs->last_pc];
  18. }
  19. int luaK_primitivecode (LexState *ls, Instruction i) {
  20. FuncState *fs = ls->fs;
  21. luaM_growvector(ls->L, fs->f->code, fs->pc, 1, Instruction, codeEM, MAXARG_S);
  22. fs->f->code[fs->pc] = i;
  23. return fs->pc++;
  24. }
  25. int luaK_code (LexState *ls, Instruction i) {
  26. FuncState *fs = ls->fs;
  27. Instruction *last = last_i(fs);
  28. switch (GET_OPCODE(i)) {
  29. case MINUSOP:
  30. switch(GET_OPCODE(*last)) {
  31. case PUSHINT: *last = SETARG_S(*last, -GETARG_S(*last)); break;
  32. case PUSHNUM: *last = SET_OPCODE(*last, PUSHNEGNUM); break;
  33. case PUSHNEGNUM: *last = SET_OPCODE(*last, PUSHNUM); break;
  34. default: fs->last_pc = luaK_primitivecode(ls, i);
  35. }
  36. break;
  37. case GETTABLE:
  38. switch(GET_OPCODE(*last)) {
  39. case PUSHSTRING: *last = SET_OPCODE(*last, GETDOTTED); break;
  40. default: fs->last_pc = luaK_primitivecode(ls, i);
  41. }
  42. break;
  43. case RETCODE:
  44. switch(GET_OPCODE(*last)) {
  45. case CALL:
  46. *last = SET_OPCODE(*last, TAILCALL);
  47. *last = SETARG_B(*last, GETARG_U(i));
  48. break;
  49. default: fs->last_pc = luaK_primitivecode(ls, i);
  50. }
  51. break;
  52. case ADDOP:
  53. switch(GET_OPCODE(*last)) {
  54. case PUSHINT: *last = SET_OPCODE(*last, ADDI); break;
  55. default: fs->last_pc = luaK_primitivecode(ls, i);
  56. }
  57. break;
  58. case SUBOP:
  59. switch(GET_OPCODE(*last)) {
  60. case PUSHINT:
  61. *last = SET_OPCODE(*last, ADDI);
  62. *last = SETARG_S(*last, -GETARG_S(*last));
  63. break;
  64. default: fs->last_pc = luaK_primitivecode(ls, i);
  65. }
  66. break;
  67. default: fs->last_pc = luaK_primitivecode(ls, i);
  68. }
  69. return fs->last_pc;
  70. }
  71. void luaK_fixjump (LexState *ls, int pc, int dest) {
  72. FuncState *fs = ls->fs;
  73. Instruction *jmp = &fs->f->code[pc];
  74. /* jump is relative to position following jump instruction */
  75. *jmp = SETARG_S(*jmp, dest-(pc+1));
  76. fs->last_pc = pc;
  77. }