1010#include " virtualmachine_p.h"
1111#include " internal/randomgenerator.h"
1212
13- #define MAX_REG_COUNT 1024
14-
1513#define DISPATCH () goto *dispatch_table[*++pos]
1614#define FREE_REGS (count ) regCount -= count
17- #define ADD_RET_VALUE (value ) *regs[regCount++] = value
15+ #define ADD_RET_VALUE (value ) \
16+ if (regCount + 1 >= regsVector.size()) { \
17+ regsVector.reserve (regsVector.size () + 1024 ); \
18+ for (size_t i = 0 ; i < 1024 ; i++) \
19+ regsVector.push_back (new Value ()); \
20+ regs = regsVector.data (); \
21+ } \
22+ *regs[regCount++] = value
1823#define REPLACE_RET_VALUE (value, offset ) *regs[regCount - offset] = value
1924#define GET_NEXT_ARG () constValues[*++pos]
2025#define READ_REG (index, count ) regs[regCount - count + index]
@@ -103,9 +108,10 @@ VirtualMachinePrivate::VirtualMachinePrivate(VirtualMachine *vm, Target *target,
103108 engine(engine),
104109 script(script)
105110{
106- regs = new Value *[MAX_REG_COUNT];
107- for (int i = 0 ; i < MAX_REG_COUNT; i++)
108- regs[i] = new Value ();
111+ regsVector.reserve (1024 );
112+ for (int i = 0 ; i < 1024 ; i++)
113+ regsVector.push_back (new Value ());
114+ regs = regsVector.data ();
109115 loops.reserve (256 );
110116 callTree.reserve (1024 );
111117
@@ -115,9 +121,8 @@ VirtualMachinePrivate::VirtualMachinePrivate(VirtualMachine *vm, Target *target,
115121
116122VirtualMachinePrivate::~VirtualMachinePrivate ()
117123{
118- for (int i = 0 ; i < MAX_REG_COUNT; i++)
119- delete regs[i];
120- delete regs;
124+ for (int i = 0 ; i < regsVector.size (); i++)
125+ delete regsVector[i];
121126}
122127
123128unsigned int *VirtualMachinePrivate::run (unsigned int *pos, bool reset)
0 commit comments