vm.cpp 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. /*=============================================================================
  2. Copyright (c) 2001-2011 Joel de Guzman
  3. Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. =============================================================================*/
  6. #include "vm.hpp"
  7. namespace client
  8. {
  9. void vmachine::execute(std::vector<int> const& code)
  10. {
  11. std::vector<int>::const_iterator pc = code.begin();
  12. std::vector<int>::iterator locals = stack.begin();
  13. stack_ptr = stack.begin();
  14. while (pc != code.end())
  15. {
  16. switch (*pc++)
  17. {
  18. case op_neg:
  19. stack_ptr[-1] = -stack_ptr[-1];
  20. break;
  21. case op_add:
  22. --stack_ptr;
  23. stack_ptr[-1] += stack_ptr[0];
  24. break;
  25. case op_sub:
  26. --stack_ptr;
  27. stack_ptr[-1] -= stack_ptr[0];
  28. break;
  29. case op_mul:
  30. --stack_ptr;
  31. stack_ptr[-1] *= stack_ptr[0];
  32. break;
  33. case op_div:
  34. --stack_ptr;
  35. stack_ptr[-1] /= stack_ptr[0];
  36. break;
  37. case op_load:
  38. *stack_ptr++ = locals[*pc++];
  39. break;
  40. case op_store:
  41. --stack_ptr;
  42. locals[*pc++] = stack_ptr[0];
  43. break;
  44. case op_int:
  45. *stack_ptr++ = *pc++;
  46. break;
  47. case op_stk_adj:
  48. stack_ptr = stack.begin() + *pc++;
  49. break;
  50. }
  51. }
  52. }
  53. }