| 141 | }; |
| 142 | |
| 143 | void vmachine::execute(std::vector<int> const& code) |
| 144 | { |
| 145 | std::vector<int>::const_iterator pc = code.begin(); |
| 146 | stack_ptr = stack.begin(); |
| 147 | |
| 148 | while (pc != code.end()) |
| 149 | { |
| 150 | switch (*pc++) |
| 151 | { |
| 152 | case op_neg: |
| 153 | stack_ptr[-1] = -stack_ptr[-1]; |
| 154 | break; |
| 155 | |
| 156 | case op_add: |
| 157 | --stack_ptr; |
| 158 | stack_ptr[-1] += stack_ptr[0]; |
| 159 | break; |
| 160 | |
| 161 | case op_sub: |
| 162 | --stack_ptr; |
| 163 | stack_ptr[-1] -= stack_ptr[0]; |
| 164 | break; |
| 165 | |
| 166 | case op_mul: |
| 167 | --stack_ptr; |
| 168 | stack_ptr[-1] *= stack_ptr[0]; |
| 169 | break; |
| 170 | |
| 171 | case op_div: |
| 172 | --stack_ptr; |
| 173 | stack_ptr[-1] /= stack_ptr[0]; |
| 174 | break; |
| 175 | |
| 176 | case op_int: |
| 177 | *stack_ptr++ = *pc++; |
| 178 | break; |
| 179 | } |
| 180 | } |
| 181 | } |
| 182 | |
| 183 | /////////////////////////////////////////////////////////////////////////// |
| 184 | // The Compiler |