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