annotate LightClone/Source/VirtualMachine.cpp @ 54:95677f648a2c VirtualMachine Mk2

Refactored VirtualMachine
author koryspansel
date Fri, 30 Sep 2011 18:37:54 -0700
parents 4663f93aefc4
children dc1f4a668d50
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
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
37 const uint32 nFunction = nParameter;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
38 const uint32 nContinuation = nInstructionPointer;
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
39
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
40 PushFrame(nFunction, nContinuation);
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
41 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
42 else
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
43
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
44 if(nInstruction == Instruction_Return)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
45 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
46 if(pFrame)
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
47 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
48 PopFrame();
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
49 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
50 else
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
51 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
52 // no frame to pop, we are done
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
53 return Action_Complete;
0
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
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
57 return Action_None;
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
58 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
59
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
60 /*
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
61 * Reset
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
62 */
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
63 void VirtualMachine::Reset()
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
64 {
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
65 nInstructionPointer = 0;
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
66 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
67
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
68 /*
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
69 * Clear
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
70 */
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
71 void VirtualMachine::Clear()
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
72 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
73 for(uint32 i = 0; i < Capacity; ++i)
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
74 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
75 nMemory[i] = 0;
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
76 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
77 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
78
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
79 /*
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
80 * GetMemorySize
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
81 */
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
82 uint32 VirtualMachine::GetMemorySize() const
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
83 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
84 return Capacity;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
85 }
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
86
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
87 /*
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
88 * GetMemoryPointer
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
89 */
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
90 uint8* VirtualMachine::GetMemoryPointer()
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
91 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
92 return &nMemory[0];
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
93 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
94
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
95 /*
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
96 * PushFrame
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
97 */
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
98 void VirtualMachine::PushFrame(uint32 nFunctionAddress, uint32 nContinuationAddress)
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
99 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
100 Frame* pInstance = pFrame;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
101
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
102 while(pInstance)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
103 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
104 if(pInstance->nAddress == nFunctionAddress && pInstance->nContinuation == nContinuationAddress)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
105 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
106 break;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
107 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
108
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
109 pInstance = pInstance->pLast;
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 if(pInstance)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
113 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
114 while(pFrame && pFrame != pInstance)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
115 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
116 Frame* pValue = pFrame;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
117 pFrame = pValue->pLast;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
118
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
119 kFrameAllocator.Free(pValue);
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
120 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
121
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
122 //ASSERT(pFrame != NULL);
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
123 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
124 else
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
125 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
126 pInstance = kFrameAllocator.Allocate();
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
127 pInstance->nAddress = nFunctionAddress;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
128 pInstance->nContinuation = nContinuationAddress;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
129 pInstance->pLast = pFrame;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
130
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
131 pFrame = pInstance;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
132 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
133
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
134 nInstructionPointer = nFunctionAddress;
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
135 }
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
136
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
137 /*
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
138 * PopFrame
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
139 */
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
140 void VirtualMachine::PopFrame()
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
141 {
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
142 if(pFrame)
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
143 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
144 nInstructionPointer = pFrame->nContinuation;
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
145
54
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
146 Frame* pInstance = pFrame;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
147 pFrame = pInstance->pLast;
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
148
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
149 kFrameAllocator.Free(pInstance);
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
150 }
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
151 else
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
152 {
95677f648a2c Refactored VirtualMachine
koryspansel
parents: 48
diff changeset
153 }
0
7e3a0ae9c016 Initial commit
koryspansel <koryspansel@bendbroadband.com>
parents:
diff changeset
154 }