]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/example/qi/compiler_tutorial/conjure2/vm.cpp
1 /*=============================================================================
2 Copyright (c) 2001-2011 Joel de Guzman
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 =============================================================================*/
11 # pragma warning(disable: 4800) // forcing value to bool 'true' or 'false'
12 // (performance warning)
17 int vmachine::execute(
18 std::vector
<int> const& code
19 , std::vector
<int>::const_iterator pc
20 , std::vector
<int>::iterator frame_ptr
23 std::vector
<int>::iterator stack_ptr
= frame_ptr
;
30 stack_ptr
[-1] = -stack_ptr
[-1];
34 stack_ptr
[-1] = !bool(stack_ptr
[-1]);
39 stack_ptr
[-1] += stack_ptr
[0];
44 stack_ptr
[-1] -= stack_ptr
[0];
49 stack_ptr
[-1] *= stack_ptr
[0];
54 stack_ptr
[-1] /= stack_ptr
[0];
59 stack_ptr
[-1] = bool(stack_ptr
[-1] == stack_ptr
[0]);
64 stack_ptr
[-1] = bool(stack_ptr
[-1] != stack_ptr
[0]);
69 stack_ptr
[-1] = bool(stack_ptr
[-1] < stack_ptr
[0]);
74 stack_ptr
[-1] = bool(stack_ptr
[-1] <= stack_ptr
[0]);
79 stack_ptr
[-1] = bool(stack_ptr
[-1] > stack_ptr
[0]);
84 stack_ptr
[-1] = bool(stack_ptr
[-1] >= stack_ptr
[0]);
89 stack_ptr
[-1] = bool(stack_ptr
[-1]) && bool(stack_ptr
[0]);
94 stack_ptr
[-1] = bool(stack_ptr
[-1]) || bool(stack_ptr
[0]);
98 *stack_ptr
++ = frame_ptr
[*pc
++];
103 frame_ptr
[*pc
++] = stack_ptr
[0];
107 *stack_ptr
++ = *pc
++;
115 *stack_ptr
++ = false;
123 if (!bool(stack_ptr
[-1]))
139 // a function call is a recursive call to execute
142 , code
.begin() + jump
146 // cleanup after return from function
147 stack_ptr
[-nargs
] = r
; // get return value
148 stack_ptr
-= (nargs
- 1); // the stack will now contain
154 return stack_ptr
[-1];