annotate LightClone/Source/VirtualMachine.cpp @ 57:dc1f4a668d50

Fix issues with VM refactor
author koryspansel <koryspansel@bendbroadband.com>
date Fri, 30 Sep 2011 20:26:44 -0700
parents 95677f648a2c
children 1fe27776627e
rev   line source
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
1 /*
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
2 * VirtualMachine.cpp
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
3 */
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
4
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
5 #include "VirtualMachine.h"
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
6
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
7 /*
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
8 * VirtualMachine
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
9 */
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
10 VirtualMachine::VirtualMachine() : nInstructionPointer(0), pFrame(NULL)
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
11 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
12 Clear();
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
13 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
14
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
15 /*
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
16 * Step
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
17 */
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
18 uint32 VirtualMachine::Step()
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
19 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
20 const uint8 nInstruction = Advance();
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
21 TRACE("Read instruction %d at address %d\n", nInstruction, nInstructionPointer - 1);
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
22
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
23 if(nInstruction == Instruction_Action)
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
24 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
25 const uint8 nParameter = Advance();
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
26 TRACE(" -- Action Decoded: %d\n", nParameter);
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
27
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
28 return nParameter;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
29 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
30 else
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
31
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
32 if(nInstruction == Instruction_Call)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
33 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
34 const uint8 nParameter = Advance();
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
35 TRACE(" -- Call Decoded: %d\n", nParameter);
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
36
57
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
37 PushFrame(nParameter, nInstructionPointer);
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
38 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
39 else
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
40
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
41 if(nInstruction == Instruction_Return)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
42 {
57
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
43 if(!pFrame)
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
44 {
57
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
45 // top level, program is complete
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
46 return Action_Complete;
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
47 }
57
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
48
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
49 PopFrame();
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
50 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
51
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
52 return Action_None;
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
53 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
54
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
55 /*
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
56 * Reset
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
57 */
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
58 void VirtualMachine::Reset()
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
59 {
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
60 nInstructionPointer = 0;
57
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
61
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
62 while(pFrame)
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
63 {
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
64 Frame* pInstance = pFrame;
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
65 pFrame = pInstance->pLast;
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
66
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
67 kFrameAllocator.Free(pInstance);
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
68 }
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
69 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
70
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
71 /*
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
72 * Clear
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
73 */
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
74 void VirtualMachine::Clear()
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
75 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
76 for(uint32 i = 0; i < Capacity; ++i)
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
77 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
78 nMemory[i] = 0;
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
79 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
80 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
81
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
82 /*
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
83 * GetMemorySize
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
84 */
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
85 uint32 VirtualMachine::GetMemorySize() const
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
86 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
87 return Capacity;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
88 }
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
89
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
90 /*
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
91 * GetMemoryPointer
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
92 */
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
93 uint8* VirtualMachine::GetMemoryPointer()
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
94 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
95 return &nMemory[0];
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
96 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
97
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
98 /*
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
99 * PushFrame
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
100 */
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
101 void VirtualMachine::PushFrame(uint32 nFunctionAddress, uint32 nContinuationAddress)
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
102 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
103 Frame* pInstance = pFrame;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
104
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
105 while(pInstance)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
106 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
107 if(pInstance->nAddress == nFunctionAddress && pInstance->nContinuation == nContinuationAddress)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
108 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
109 break;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
110 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
111
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
112 pInstance = pInstance->pLast;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
113 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
114
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
115 if(pInstance)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
116 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
117 while(pFrame && pFrame != pInstance)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
118 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
119 Frame* pValue = pFrame;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
120 pFrame = pValue->pLast;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
121
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
122 kFrameAllocator.Free(pValue);
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
123 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
124
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
125 //ASSERT(pFrame != NULL);
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
126 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
127 else
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
128 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
129 pInstance = kFrameAllocator.Allocate();
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
130 pInstance->nAddress = nFunctionAddress;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
131 pInstance->nContinuation = nContinuationAddress;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
132 pInstance->pLast = pFrame;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
133
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
134 pFrame = pInstance;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
135 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
136
57
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
137 uint32 nDepth = 0;
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
138 pInstance = pFrame;
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
139 while(pInstance)
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
140 {
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
141 ++nDepth;
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
142 pInstance = pInstance->pLast;
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
143 }
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
144
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
145 TRACE("Stack Depth: %d\n", nDepth);
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
146
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
147 nInstructionPointer = nFunctionAddress;
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
148 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
149
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
150 /*
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
151 * PopFrame
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
152 */
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
153 void VirtualMachine::PopFrame()
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
154 {
57
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
155 //ASSERT(pFrame != NULL);
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
156 nInstructionPointer = pFrame->nContinuation;
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
157
57
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
158 Frame* pInstance = pFrame;
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
159 pFrame = pInstance->pLast;
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
160
dc1f4a668d50 Fix issues with VM refactor
koryspansel <koryspansel@bendbroadband.com>
parents: 54
diff changeset
161 kFrameAllocator.Free(pInstance);
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
162 }